file:/local_home/local_home/hugo/neurospaces_project/heccer/source/c/snapshots/0/tests/code/pool1-feedback2.c        (Mon Jun 16 00:03:49 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: 
  24: 
  25: #define HECCER_TEST_REPORTING_GRANULARITY 100
  26: #define HECCER_TEST_STEPS 1000
  27: #define HECCER_TEST_TESTED_THINGS ( HECCER_DUMP_VM_COMPARTMENT_MATRIX \
  28:                                     | HECCER_DUMP_VM_COMPARTMENT_DATA \
  29:                                     | HECCER_DUMP_VM_COMPARTMENT_OPERATIONS \
  30:                                     | HECCER_DUMP_VM_MECHANISM_DATA \
  31:                                     | HECCER_DUMP_VM_MECHANISM_OPERATIONS \
  32:                                     | HECCER_DUMP_VM_SUMMARY \
  33:         )
  34: #define HECCER_TEST_TIME_STEP (1e-6)
  35: 
  36: 
  37: struct Compartment comp =
  38: {
  39:     //m administrative overhead
  40: 
  41:     {
  42:         //m type of structure
  43: 
  44:         MATH_TYPE_Compartment,
  45:     },
  46: 
  47:     //m index of parent compartment, -1 for none
  48: 
  49:     -1,
  50: 
  51: /*      //m first mechanism */
  52: 
  53: /*      NULL, */
  54: 
  55: /*      //m number of mechanisms */
  56: 
  57: /*      0, */
  58: 
  59:     //m descriptive values, alphabetical order
  60: 
  61: /*     double dCm; */
  62: 
  63:     5.755329373e-12, // unscaled 0.0164,
  64: 
  65: /*     double dEm; */
  66: 
  67:     -0.08,
  68: 
  69: /*     double dInitVm; */
  70: 
  71:     -0.068,
  72: 
  73: /*     double dInject;           */
  74: 
  75:     0,
  76: 
  77: /*     double dRa; */
  78: 
  79:     772813.4375, // unscaled 2.5,
  80: 
  81: /*     double dRm; */
  82: 
  83:     8.548598272e9, // unscaled 3
  84: };
  85: 
  86: 
  87: struct ChannelActInact caiCaT =
  88: {
  89:     //m administrative overhead
  90: 
  91:     {
  92:         //m type of structure
  93: 
  94:         MATH_TYPE_ChannelActInact,
  95:     },
  96: 
  97:     //m first set of descriptive values, alphabetical order
  98: 
  99:     //m initial reversal potential
 100: 
 101:     0.14702148735523224,
 102: 
 103:     //m get reversal potential from this intermediary, -1 for none
 104: 
 105:     -1,
 106: 
 107:     //m maximal conductance when all channels are permissive
 108: 
 109:     1.7546722963501793e-09,
 110: 
 111:     //m contributes to this concentration pool, -1 for none, boolean indicator only.
 112: 
 113:     1,
 114: 
 115:     //m activation description
 116: 
 117:     {
 118:         //m power, for a standard heccer, something between 1 and 4 or so.
 119: 
 120:         1,
 121: 
 122:         //m gate definition
 123: 
 124:         {
 125:             //m initial value, commonly forward over backward steady states
 126: 
 127:             0.03891870645,
 128: 
 129:             //m corresponding index in tables, set to -1 for initialization.
 130: 
 131:             -1,
 132: 
 133:             {
 134:                 //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
 135: 
 136:                 {
 137:                     //m multiplier
 138: 
 139:                     2.6e3,
 140: 
 141:                     //m multiplier membrane dependence, 0.0 for no dependence
 142: 
 143:                     0.0,
 144: 
 145:                     //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 146: 
 147:                     0.0,
 148: 
 149:                     //m choose between nominator or denominator, 1 means nominator, -1
 150:                     //m means denominator
 151: 
 152:                     -1.0,
 153: 
 154:                     //m nominator or denominator offset
 155: 
 156:                     1.0,
 157: 
 158:                     //m membrane offset
 159: 
 160:                     0.021,
 161: 
 162:                     //m denormalized time constant
 163: 
 164:                     -8e-3,
 165:                 },
 166: 
 167:                 //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
 168: 
 169:                 {
 170:                     //m multiplier
 171: 
 172:                     0.18e3,
 173: 
 174:                     //m multiplier membrane dependence, 0.0 for no dependence
 175: 
 176:                     0.0,
 177: 
 178:                     //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 179: 
 180:                     0.0,
 181: 
 182:                     //m choose between nominator or denominator, 1 means nominator, -1
 183:                     //m means denominator
 184: 
 185:                     -1.0,
 186: 
 187:                     //m nominator or denominator offset
 188: 
 189:                     1.0,
 190: 
 191:                     //m membrane offset
 192: 
 193:                     0.04,
 194: 
 195:                     //m denormalized time constant
 196: 
 197:                     4e-3,
 198:                 },
 199:             },
 200:         },
 201:     },
 202: 
 203:     //m inactivation description
 204: 
 205:     {
 206:         //m power, for a standard heccer, something between 1 and 4 or so.
 207: 
 208:         1,
 209: 
 210:         //m gate definition
 211: 
 212:         {
 213:             //m initial value, commonly forward over backward steady states
 214: 
 215:             0.08260212813,
 216: 
 217:             //m corresponding index in tables, set to -1 for initialization.
 218: 
 219:             -1,
 220: 
 221:             {
 222:                 //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
 223: 
 224:                 {
 225:                     //m multiplier
 226: 
 227:                     0.0025e3,
 228: 
 229:                     //m multiplier membrane dependence, 0.0 for no dependence
 230: 
 231:                     0.0,
 232: 
 233:                     //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 234: 
 235:                     0.0,
 236: 
 237:                     //m choose between nominator or denominator, 1 means nominator, -1
 238:                     //m means denominator
 239: 
 240:                     -1.0,
 241: 
 242:                     //m nominator or denominator offset
 243: 
 244:                     1.0,
 245: 
 246:                     //m membrane offset
 247: 
 248:                     0.04,
 249: 
 250:                     //m denormalized time constant
 251: 
 252:                     8e-3,
 253:                 },
 254: 
 255:                 //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
 256: 
 257:                 {
 258:                     //m multiplier
 259: 
 260:                     0.19e3,
 261: 
 262:                     //m multiplier membrane dependence, 0.0 for no dependence
 263: 
 264:                     0.0,
 265: 
 266:                     //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 267: 
 268:                     0.0,
 269: 
 270:                     //m choose between nominator or denominator, 1 means nominator, -1
 271:                     //m means denominator
 272: 
 273:                     -1.0,
 274: 
 275:                     //m nominator or denominator offset
 276: 
 277:                     1.0,
 278: 
 279:                     //m membrane offset
 280: 
 281:                     0.05,
 282: 
 283:                     //m denormalized time constant
 284: 
 285:                     -10.0e-3,
 286:                 },
 287:             },
 288:         },
 289:     },
 290: };
 291: 
 292: 
 293: struct ExponentialDecay exdecCa =
 294: {
 295:     //m administrative overhead
 296: 
 297:     {
 298:         //m type of structure
 299: 
 300:         MATH_TYPE_ExponentialDecay,
 301:     },
 302: 
 303:     //m initial value
 304: 
 305:     4e-5,
 306: 
 307:     //m beta
 308: 
 309:     7.579027046e+10,
 310: 
 311:     //m steady state
 312: 
 313:     4e-05,
 314: 
 315:     //m tau
 316: 
 317:     0.00010,
 318: 
 319:     //m external contribution delivered by these intermediaries
 320: 
 321:     {
 322:         0,
 323:         -1,
 324:         -1,
 325:         -1,
 326:     },
 327: };
 328: 
 329: 
 330: struct ChannelActConc cacKC =
 331: {
 332:     //m administrative overhead
 333: 
 334:     {
 335:         //m type of structure
 336: 
 337:         MATH_TYPE_ChannelActConc,
 338:     },
 339: 
 340:     //m first set of descriptive values, alphabetical order
 341: 
 342:     //m initial reversal potential
 343: 
 344:     85,
 345: 
 346:     //m get reversal potential from this intermediary, -1 for none
 347: 
 348:     -1,
 349: 
 350:     //m maximal conductance when all channels are permissive
 351: 
 352:     2.80747571e-07,
 353: 
 354:     //m contributes to this concentration pool, -1 for none, boolean indicator only.
 355: 
 356:     -1,
 357: 
 358:     //m activation description
 359: 
 360:     {
 361:         //m power, for a standard heccer, something between 1 and 4 or so.
 362: 
 363:         1,
 364: 
 365:         //m gate definition
 366: 
 367:         {
 368:             //m initial value, commonly forward over backward steady states
 369: 
 370:             0.063531859768213905,
 371: 
 372:             //m corresponding index in tables, set to -1 for initialization.
 373: 
 374:             -1,
 375: 
 376:             {
 377:                 //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
 378: 
 379:                 {
 380:                     //m multiplier
 381: 
 382:                     7.5e3,
 383: 
 384:                     //m multiplier membrane dependence, 0.0 for no dependence
 385: 
 386:                     0.0,
 387: 
 388:                     //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 389: 
 390:                     0.0,
 391: 
 392:                     //m choose between nominator or denominator, 1 means nominator, -1
 393:                     //m means denominator
 394: 
 395:                     -1.0,
 396: 
 397:                     //m nominator or denominator offset
 398: 
 399:                     0.0,
 400: 
 401:                     //m membrane offset
 402: 
 403:                     0.0,
 404: 
 405:                     //m denormalized time constant
 406: 
 407:                     1e12,
 408:                 },
 409: 
 410:                 //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
 411: 
 412:                 {
 413:                     //m multiplier
 414: 
 415:                     0.11e3,
 416: 
 417:                     //m multiplier membrane dependence, 0.0 for no dependence
 418: 
 419:                     0.0,
 420: 
 421:                     //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 422: 
 423:                     0.0,
 424: 
 425:                     //m choose between nominator or denominator, 1 means nominator, -1
 426:                     //m means denominator
 427: 
 428:                     -1.0,
 429: 
 430:                     //m nominator or denominator offset
 431: 
 432:                     0.0,
 433: 
 434:                     //m membrane offset
 435: 
 436:                     -0.035,
 437: 
 438:                     //m denormalized time constant
 439: 
 440:                     14.9e-3,
 441:                 },
 442:             },
 443:         },
 444:     },
 445: 
 446:     //m activator dependence description
 447: 
 448:     {
 449:         //m power, for a standard heccer, something between 1 and 4 or so.
 450: 
 451:         2,
 452: 
 453:         //m activator definition
 454: 
 455:         {
 456:             //m initial value, commonly steady state
 457: 
 458:             0.0099009900989999993,
 459: 
 460:             //m corresponding index in tables, set to -1 for initialization.
 461: 
 462:             -1,
 463: 
 464:             //m is activated by the output of this mechanism, must be filled in
 465: 
 466:             1,
 467: 
 468:             {
 469:                 //m basal level, A in EDS1994
 470: 
 471:                 4.0e-3,
 472: 
 473:                 //m time constant, B in EDS1994
 474: 
 475:                 0.010,
 476:             },
 477:         },
 478:     },
 479: };
 480: 
 481: 
 482: int piC2m[] =
 483: {
 484:     3,
 485:     -1,
 486: };
 487: 
 488: 
 489: struct MathComponentArray mca =
 490: {
 491:     //m number of math components
 492: 
 493:     3,
 494: 
 495:     //m math component data
 496: 
 497:     NULL,
 498: 
 499:     //m math component index, initialize to NULL
 500: 
 501:     NULL,
 502: 
 503: };
 504: 
 505: 
 506: struct Intermediary inter =
 507: {
 508:     //m compartment array
 509: 
 510:     1,
 511: 
 512:     &comp,
 513: 
 514:     //m all other mathematical components
 515: 
 516:     &mca,
 517: 
 518:     //m compartment 2 first mechanism number
 519: 
 520:     piC2m,
 521: };
 522: 
 523: 
 524: int main(int argc, char *argv[])
 525: {
 526:     //- determine intermediary size, and allocate
 527: 
 528:     struct MathComponentInfo *pmciCaT = MathComponentInfoLookup(caiCaT.mc.iType);
 529: 
 530:     struct MathComponentInfo *pmciCa = MathComponentInfoLookup(exdecCa.mc.iType);
 531: 
 532:     struct MathComponentInfo *pmciKC = MathComponentInfoLookup(cacKC.mc.iType);
 533: 
 534:     int iChars = pmciCaT->iChars + pmciCa->iChars + pmciKC->iChars;
 535: 
 536:     void *pmc = calloc(sizeof(char), iChars);
 537: 
 538:     //- prepare the mechanism intermediary
 539: 
 540:     struct ChannelActInact *pcai = (struct ChannelActInact *)pmc;
 541: 
 542:     *pcai = caiCaT;
 543: 
 544:     struct ExponentialDecay *pexdec = (struct ExponentialDecay *)&((char *)pcai)[pmciCaT->iChars];
 545: 
 546:     *pexdec = exdecCa;
 547: 
 548:     struct ChannelActConc *pcac = (struct ChannelActConc *)&((char *)pexdec)[pmciCa->iChars];
 549: 
 550:     *pcac = cacKC;
 551: 
 552:     //- link the intermediary
 553: 
 554:     mca.pmc = pmc;
 555: 
 556:     //- do the simulation
 557: 
 558:     simulate(argc,argv);
 559: }
 560: 
 561: 
 562: #define main(argc,argv) simulate(argc,argv)
 563: 
 564: //t this prototype can give warning and perhaps errors.
 565: 
 566: int main(int argc, char *argv[]);
 567: 
 568: 
 569: #include "main.c"
 570: 
 571: 
 572: 








































Generated by Xrefactory version 2.0.14 on Thu Jul 24 22:41:20 2008