file:/local_home/local_home/hugo/neurospaces_project/heccer/source/c/snapshots/0/tests/code/channel2-nernst1.c (Mon Jun 16 00:03:52 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: 3,
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: 1,
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 ChannelActInact caiCaP =
299: {
300: //m administrative overhead
301:
302: {
303: //m type of structure
304:
305: MATH_TYPE_ChannelActInact,
306: },
307:
308: //m first set of descriptive values, alphabetical order
309:
310: //m initial reversal potential
311:
312: 0.1470214874,
313:
314: //m get reversal potential from this intermediary, -1 for none
315:
316: 3,
317:
318: //m maximal conductance when all channels are permissive
319:
320: 1.57921e-08,
321:
322: //m contributes to this concentration pool, -1 for none, boolean indicator only.
323:
324: 1,
325:
326: //m activation description
327:
328: {
329: //m power, for a standard heccer, something between 1 and 4 or so.
330:
331: 1,
332:
333: //m gate definition
334:
335: {
336: //m initial value, commonly forward over backward steady states
337:
338: 0.001391094927,
339:
340: //m corresponding index in tables, set to -1 for initialization.
341:
342: -1,
343:
344: {
345: //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
346:
347: {
348: //m multiplier
349:
350: 8.50e3,
351:
352: //m multiplier membrane dependence, 0.0 for no dependence
353:
354: 0.0,
355:
356: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
357:
358: 0.0,
359:
360: //m choose between nominator or denominator, 1 means nominator, -1
361: //m means denominator
362:
363: -1.0,
364:
365: //m nominator or denominator offset
366:
367: 1.0,
368:
369: //m membrane offset
370:
371: -0.0080,
372:
373: //m denormalized time constant
374:
375: -12.5e-3,
376: },
377:
378: //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
379:
380: {
381: //m multiplier
382:
383: 35.0e3,
384:
385: //m multiplier membrane dependence, 0.0 for no dependence
386:
387: 0.0,
388:
389: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
390:
391: 0.0,
392:
393: //m choose between nominator or denominator, 1 means nominator, -1
394: //m means denominator
395:
396: -1.0,
397:
398: //m nominator or denominator offset
399:
400: 1.0,
401:
402: //m membrane offset
403:
404: 0.074,
405:
406: //m denormalized time constant
407:
408: 14.5e-3,
409: },
410: },
411: },
412: },
413:
414: //m inactivation description
415:
416: {
417: //m power, for a standard heccer, something between 1 and 4 or so.
418:
419: 1,
420:
421: //m gate definition
422:
423: {
424: //m initial value, commonly forward over backward steady states
425:
426: 0.9868968318,
427:
428: //m corresponding index in tables, set to -1 for initialization.
429:
430: -1,
431:
432: {
433: //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
434:
435: {
436: //m multiplier
437:
438: 0.0015e3,
439:
440: //m multiplier membrane dependence, 0.0 for no dependence
441:
442: 0.0,
443:
444: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
445:
446: 0.0,
447:
448: //m choose between nominator or denominator, 1 means nominator, -1
449: //m means denominator
450:
451: -1.0,
452:
453: //m nominator or denominator offset
454:
455: 1.0,
456:
457: //m membrane offset
458:
459: 0.029,
460:
461: //m denormalized time constant
462:
463: 8.0e-3,
464: },
465:
466: //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
467:
468: {
469: //m multiplier
470:
471: 0.0055e3,
472:
473: //m multiplier membrane dependence, 0.0 for no dependence
474:
475: 0.0,
476:
477: //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
478:
479: 0.0,
480:
481: //m choose between nominator or denominator, 1 means nominator, -1
482: //m means denominator
483:
484: -1.0,
485:
486: //m nominator or denominator offset
487:
488: 1.0,
489:
490: //m membrane offset
491:
492: 0.023,
493:
494: //m denormalized time constant
495:
496: -8.0e-3,
497: },
498: },
499: },
500: },
501: };
502:
503:
504: struct ExponentialDecay exdecCa =
505: {
506: //m administrative overhead
507:
508: {
509: //m type of structure
510:
511: MATH_TYPE_ExponentialDecay,
512: },
513:
514: //m initial value
515:
516: 4e-5,
517:
518: //m beta
519:
520: 7.579027046e+10,
521:
522: //m steady state
523:
524: 4e-05,
525:
526: //m tau
527:
528: 0.00010,
529:
530: //m external contribution delivered by these intermediaries
531:
532: {
533: 0,
534: 1,
535: -1,
536: -1,
537: },
538: };
539:
540:
541: struct InternalNernst inCa =
542: {
543: //m administrative overhead
544:
545: {
546: //m type of structure
547:
548: MATH_TYPE_InternalNernst,
549: },
550:
551: //m nernst constant
552:
553: 0.013363,
554:
555: //m link to internal concentration
556:
557: 2,
558:
559: //m constant external concentration
560:
561: 2.4000,
562:
563: //m initial nernst potential
564:
565: 0.1470214874,
566: };
567:
568:
569: int piC2m[] =
570: {
571: 4,
572: -1,
573: };
574:
575:
576: struct MathComponentArray mca =
577: {
578: //m number of math components
579:
580: 4,
581:
582: //m math component data
583:
584: NULL,
585:
586: //m math component index, initialize to NULL
587:
588: NULL,
589:
590: };
591:
592:
593: struct Intermediary inter =
594: {
595: //m compartment array
596:
597: 1,
598:
599: &comp,
600:
601: //m all other mathematical components
602:
603: &mca,
604:
605: //m compartment 2 first mechanism number
606:
607: piC2m,
608: };
609:
610:
611: int main(int argc, char *argv[])
612: {
613: //- determine intermediary size, and allocate
614:
615: struct MathComponentInfo *pmciCaT = MathComponentInfoLookup(caiCaT.mc.iType);
616:
617: struct MathComponentInfo *pmciCaP = MathComponentInfoLookup(caiCaP.mc.iType);
618:
619: struct MathComponentInfo *pmciCa = MathComponentInfoLookup(exdecCa.mc.iType);
620:
621: struct MathComponentInfo *pmciNernst = MathComponentInfoLookup(inCa.mc.iType);
622:
623: int iChars = pmciCaT->iChars + pmciCaP->iChars + pmciCa->iChars + pmciNernst->iChars;
624:
625: void *pmc = calloc(sizeof(char), iChars);
626:
627: //- prepare the mechanism intermediary
628:
629: struct ChannelActInact *pcaiCaT = (struct ChannelActInact *)pmc;
630:
631: *pcaiCaT = caiCaT;
632:
633: struct ChannelActInact *pcaiCaP = (struct ChannelActInact *)&((char *)pcaiCaT)[pmciCaT->iChars];
634:
635: *pcaiCaP = caiCaP;
636:
637: struct ExponentialDecay *pexdec = (struct ExponentialDecay *)&((char *)pcaiCaP)[pmciCaP->iChars];
638:
639: *pexdec = exdecCa;
640:
641: struct InternalNernst *pin = (struct InternalNernst *)&((char *)pexdec)[pmciCa->iChars];
642:
643: *pin = inCa;
644:
645: //- link the intermediary
646:
647: mca.pmc = pmc;
648:
649: //- do the simulation
650:
651: simulate(argc,argv);
652: }
653:
654:
655: #define main(argc,argv) simulate(argc,argv)
656:
657: //t this prototype can give warning and perhaps errors.
658:
659: int main(int argc, char *argv[]);
660:
661:
662: #include "main.c"
663:
664:
665:
Generated by Xrefactory version 2.0.14 on Thu Jul 24 22:41:20 2008