file:/local_home/local_home/hugo/neurospaces_project/heccer/source/c/snapshots/0/tests/code/channel2-nernst2.c (Mon Jun 16 00:04:03 2008
) HOME
1: //
2: // Heccer : a compartmental solver that implements efficient Crank-Nicolson
3: // integration for neuronal models.
4: //
5:
6: //////////////////////////////////////////////////////////////////////////////
7: //'
8: //' Heccer : testbed C implementation
9: //'
10: //' Copyright (C) 2006-2008 Hugo Cornelis
11: //'
12: //' functional ideas .. Hugo Cornelis, hugo.cornelis@gmail.com
13: //'
14: //' coding ............ Hugo Cornelis, hugo.cornelis@gmail.com
15: //'
16: //////////////////////////////////////////////////////////////////////////////
17:
18:
19: #include <stdlib.h>
20:
21: #include "../../heccer/compartment.h"
22: #include "../../heccer/heccer.h"
23: #include "../../heccer/mathcomponent.h"
24:
25:
26: #define HECCER_TEST_REPORTING_GRANULARITY 100000
27: #define HECCER_TEST_STEPS 1000000
28: #define HECCER_TEST_TESTED_THINGS ( HECCER_DUMP_VM_COMPARTMENT_MATRIX \
29: | HECCER_DUMP_VM_COMPARTMENT_DATA \
30: | HECCER_DUMP_VM_COMPARTMENT_OPERATIONS \
31: | HECCER_DUMP_VM_CHANNEL_POOL_FLUXES \
32: | HECCER_DUMP_VM_MECHANISM_DATA \
33: | HECCER_DUMP_VM_MECHANISM_OPERATIONS \
34: | HECCER_DUMP_VM_SUMMARY \
35: )
36: #define HECCER_TEST_TIME_GRANULARITY (1e-14)
37: #define HECCER_TEST_TIME_STEP (1e-11)
38:
39:
40: struct Compartment comp =
41: {
42: //m administrative overhead
43:
44: {
45: //m type of structure
46:
47: MATH_TYPE_Compartment,
48: },
49:
50: //m index of parent compartment, -1 for none
51:
52: -1,
53:
54: /* //m first mechanism */
55:
56: /* NULL, */
57:
58: /* //m number of mechanisms */
59:
60: /* 0, */
61:
62: //m descriptive values, alphabetical order
63:
64: /* double dCm; */
65:
66: 5.755329373e-12, // unscaled 0.0164,
67:
68: /* double dEm; */
69:
70: -0.08,
71:
72: /* double dInitVm; */
73:
74: -0.068,
75:
76: /* double dInject; */
77:
78: 1e-9,
79:
80: /* double dRa; */
81:
82: 772813.4375, // unscaled 2.5,
83:
84: /* double dRm; */
85:
86: 8.548598272e9, // unscaled 3
87: };
88:
89:
90: //v first calcium channel
91:
92: struct ChannelActInact caiCaT =
93: {
94: //m administrative overhead
95:
96: {
97: //m type of structure
98:
99: MATH_TYPE_ChannelActInact,
100: },
101:
102: //m first set of descriptive values, alphabetical order
103:
104: //m initial reversal potential
105:
106: 0.1470214874,
107:
108: //m get reversal potential from this intermediary, -1 for none
109:
110: 1,
111:
112: //m maximal conductance when all channels are permissive
113:
114: 1.754672296e-09,
115:
116: //m contributes to this concentration pool, -1 for none, boolean indicator only.
117:
118: 4,
119:
120: //m activation description
121:
122: {
123: //m power, for a standard heccer, something between 1 and 4 or so.
124:
125: 1,
126:
127: //m gate definition
128:
129: {
130: //m initial value, commonly forward over backward steady states
131:
132: 0.038918706451336625,
133:
134: //m corresponding index in tables, set to -1 for initialization.
135:
136: -1,
137:
138: {
139: //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
140:
141: {
142: //m multiplier
143:
144: 2.6e3,
145:
146: //m multiplier membrane dependence, 0.0 for no dependence
147:
148: 0.0,
149:
150: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
151:
152: 0.0,
153:
154: //m choose between nominator or denominator, 1 means nominator, -1
155: //m means denominator
156:
157: -1.0,
158:
159: //m nominator or denominator offset
160:
161: 1.0,
162:
163: //m membrane offset
164:
165: 0.021,
166:
167: //m denormalized time constant
168:
169: -8e-3,
170: },
171:
172: //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
173:
174: {
175: //m multiplier
176:
177: 0.18e3,
178:
179: //m multiplier membrane dependence, 0.0 for no dependence
180:
181: 0.0,
182:
183: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
184:
185: 0.0,
186:
187: //m choose between nominator or denominator, 1 means nominator, -1
188: //m means denominator
189:
190: -1.0,
191:
192: //m nominator or denominator offset
193:
194: 1.0,
195:
196: //m membrane offset
197:
198: 0.04,
199:
200: //m denormalized time constant
201:
202: 4e-3,
203: },
204: },
205: },
206: },
207:
208: //m inactivation description
209:
210: {
211: //m power, for a standard heccer, something between 1 and 4 or so.
212:
213: 1,
214:
215: //m gate definition
216:
217: {
218: //m initial value, commonly forward over backward steady states
219:
220: 0.082602128127539254,
221:
222: //m corresponding index in tables, set to -1 for initialization.
223:
224: -1,
225:
226: {
227: //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
228:
229: {
230: //m multiplier
231:
232: 0.0025e3,
233:
234: //m multiplier membrane dependence, 0.0 for no dependence
235:
236: 0.0,
237:
238: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
239:
240: 0.0,
241:
242: //m choose between nominator or denominator, 1 means nominator, -1
243: //m means denominator
244:
245: -1.0,
246:
247: //m nominator or denominator offset
248:
249: 1.0,
250:
251: //m membrane offset
252:
253: 0.04,
254:
255: //m denormalized time constant
256:
257: 8e-3,
258: },
259:
260: //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
261:
262: {
263: //m multiplier
264:
265: 0.19e3,
266:
267: //m multiplier membrane dependence, 0.0 for no dependence
268:
269: 0.0,
270:
271: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
272:
273: 0.0,
274:
275: //m choose between nominator or denominator, 1 means nominator, -1
276: //m means denominator
277:
278: -1.0,
279:
280: //m nominator or denominator offset
281:
282: 1.0,
283:
284: //m membrane offset
285:
286: 0.05,
287:
288: //m denormalized time constant
289:
290: -10.0e-3,
291: },
292: },
293: },
294: },
295: };
296:
297:
298: struct InternalNernst inCa1 =
299: {
300: //m administrative overhead
301:
302: {
303: //m type of structure
304:
305: MATH_TYPE_InternalNernst,
306: },
307:
308: //m nernst constant
309:
310: 0.013363,
311:
312: //m link to internal concentration
313:
314: 4,
315:
316: //m constant external concentration
317:
318: 2.4000,
319:
320: //m initial nernst potential
321:
322: 0.1470214874,
323: };
324:
325:
326: struct ChannelActInact caiCaP =
327: {
328: //m administrative overhead
329:
330: {
331: //m type of structure
332:
333: MATH_TYPE_ChannelActInact,
334: },
335:
336: //m first set of descriptive values, alphabetical order
337:
338: //m initial reversal potential
339:
340: 0.1470214874,
341:
342: //m get reversal potential from this intermediary, -1 for none
343:
344: 3,
345:
346: //m maximal conductance when all channels are permissive
347:
348: 1.57921e-08,
349:
350: //m contributes to this concentration pool, -1 for none, boolean indicator only.
351:
352: 4,
353:
354: //m activation description
355:
356: {
357: //m power, for a standard heccer, something between 1 and 4 or so.
358:
359: 1,
360:
361: //m gate definition
362:
363: {
364: //m initial value, commonly forward over backward steady states
365:
366: 0.001391094927,
367:
368: //m corresponding index in tables, set to -1 for initialization.
369:
370: -1,
371:
372: {
373: //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
374:
375: {
376: //m multiplier
377:
378: 8.50e3,
379:
380: //m multiplier membrane dependence, 0.0 for no dependence
381:
382: 0.0,
383:
384: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
385:
386: 0.0,
387:
388: //m choose between nominator or denominator, 1 means nominator, -1
389: //m means denominator
390:
391: -1.0,
392:
393: //m nominator or denominator offset
394:
395: 1.0,
396:
397: //m membrane offset
398:
399: -0.0080,
400:
401: //m denormalized time constant
402:
403: -12.5e-3,
404: },
405:
406: //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
407:
408: {
409: //m multiplier
410:
411: 35.0e3,
412:
413: //m multiplier membrane dependence, 0.0 for no dependence
414:
415: 0.0,
416:
417: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
418:
419: 0.0,
420:
421: //m choose between nominator or denominator, 1 means nominator, -1
422: //m means denominator
423:
424: -1.0,
425:
426: //m nominator or denominator offset
427:
428: 1.0,
429:
430: //m membrane offset
431:
432: 0.074,
433:
434: //m denormalized time constant
435:
436: 14.5e-3,
437: },
438: },
439: },
440: },
441:
442: //m inactivation description
443:
444: {
445: //m power, for a standard heccer, something between 1 and 4 or so.
446:
447: 1,
448:
449: //m gate definition
450:
451: {
452: //m initial value, commonly forward over backward steady states
453:
454: 0.9868968318,
455:
456: //m corresponding index in tables, set to -1 for initialization.
457:
458: -1,
459:
460: {
461: //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
462:
463: {
464: //m multiplier
465:
466: 0.0015e3,
467:
468: //m multiplier membrane dependence, 0.0 for no dependence
469:
470: 0.0,
471:
472: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
473:
474: 0.0,
475:
476: //m choose between nominator or denominator, 1 means nominator, -1
477: //m means denominator
478:
479: -1.0,
480:
481: //m nominator or denominator offset
482:
483: 1.0,
484:
485: //m membrane offset
486:
487: 0.029,
488:
489: //m denormalized time constant
490:
491: 8.0e-3,
492: },
493:
494: //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
495:
496: {
497: //m multiplier
498:
499: 0.0055e3,
500:
501: //m multiplier membrane dependence, 0.0 for no dependence
502:
503: 0.0,
504:
505: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
506:
507: 0.0,
508:
509: //m choose between nominator or denominator, 1 means nominator, -1
510: //m means denominator
511:
512: -1.0,
513:
514: //m nominator or denominator offset
515:
516: 1.0,
517:
518: //m membrane offset
519:
520: 0.023,
521:
522: //m denormalized time constant
523:
524: -8.0e-3,
525: },
526: },
527: },
528: },
529: };
530:
531:
532: struct InternalNernst inCa2 =
533: {
534: //m administrative overhead
535:
536: {
537: //m type of structure
538:
539: MATH_TYPE_InternalNernst,
540: },
541:
542: //m nernst constant
543:
544: 0.013363,
545:
546: //m link to internal concentration
547:
548: 4,
549:
550: //m constant external concentration
551:
552: 2.4000,
553:
554: //m initial nernst potential
555:
556: 0.1470214874,
557: };
558:
559:
560: struct ExponentialDecay exdecCa =
561: {
562: //m administrative overhead
563:
564: {
565: //m type of structure
566:
567: MATH_TYPE_ExponentialDecay,
568: },
569:
570: //m initial value
571:
572: 4e-5,
573:
574: //m beta
575:
576: 7.579027046e+10,
577:
578: //m steady state
579:
580: 4e-05,
581:
582: //m tau
583:
584: 0.00010,
585:
586: //m external contribution delivered by these intermediaries
587:
588: {
589: 0,
590: 2,
591: -1,
592: -1,
593: },
594: };
595:
596:
597: int piC2m[] =
598: {
599: 5,
600: -1,
601: };
602:
603:
604: struct MathComponentArray mca =
605: {
606: //m number of math components
607:
608: 5,
609:
610: //m math component data
611:
612: NULL,
613:
614: //m math component index, initialize to NULL
615:
616: NULL,
617:
618: };
619:
620:
621: struct Intermediary inter =
622: {
623: //m compartment array
624:
625: 1,
626:
627: &comp,
628:
629: //m all other mathematical components
630:
631: &mca,
632:
633: //m compartment 2 first mechanism number
634:
635: piC2m,
636: };
637:
638:
639: int main(int argc, char *argv[])
640: {
641: //- determine intermediary size, and allocate
642:
643: struct MathComponentInfo *pmciCaT = MathComponentInfoLookup(caiCaT.mc.iType);
644:
645: struct MathComponentInfo *pmciCaP = MathComponentInfoLookup(caiCaP.mc.iType);
646:
647: struct MathComponentInfo *pmciCa = MathComponentInfoLookup(exdecCa.mc.iType);
648:
649: struct MathComponentInfo *pmciNernst1 = MathComponentInfoLookup(inCa1.mc.iType);
650:
651: struct MathComponentInfo *pmciNernst2 = MathComponentInfoLookup(inCa2.mc.iType);
652:
653: int iChars = pmciCaT->iChars + pmciCaP->iChars + pmciCa->iChars + pmciNernst1->iChars + pmciNernst2->iChars;
654:
655: void *pmc = calloc(sizeof(char), iChars);
656:
657: //- prepare the mechanism intermediary
658:
659: struct ChannelActInact *pcaiCaT = (struct ChannelActInact *)pmc;
660:
661: *pcaiCaT = caiCaT;
662:
663: struct InternalNernst *pin1 = (struct InternalNernst *)&((char *)pcaiCaT)[pmciCaT->iChars];
664:
665: *pin1 = inCa1;
666:
667: struct ChannelActInact *pcaiCaP = (struct ChannelActInact *)&((char *)pin1)[pmciNernst1->iChars];
668:
669: *pcaiCaP = caiCaP;
670:
671: struct InternalNernst *pin2 = (struct InternalNernst *)&((char *)pcaiCaP)[pmciCaP->iChars];
672:
673: *pin2 = inCa2;
674:
675: struct ExponentialDecay *pexdec = (struct ExponentialDecay *)&((char *)pin2)[pmciNernst2->iChars];
676:
677: *pexdec = exdecCa;
678:
679: //- link the intermediary
680:
681: mca.pmc = pmc;
682:
683: //- do the simulation
684:
685: simulate(argc,argv);
686: }
687:
688:
689: #define main(argc,argv) simulate(argc,argv)
690:
691: //t this prototype can give warning and perhaps errors.
692:
693: int main(int argc, char *argv[]);
694:
695:
696: #include "main.c"
697:
698:
699:
Generated by Xrefactory version 2.0.14 on Thu Jul 24 22:41:20 2008