file:/local_home/local_home/hugo/neurospaces_project/heccer/source/c/snapshots/0/tests/code/hh1.c        (Mon Jun 16 00:04:08 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/addressing.h"
  22: #include "../../heccer/compartment.h"
  23: #include "../../heccer/heccer.h"
  24: #include "../../heccer/mathcomponent.h"
  25: #include "../../heccer/output.h"
  26: 
  27: 
  28: /* #define HECCER_TEST_INTERVAL_DEFAULT_START                   (-0.1) */
  29: /* #define HECCER_TEST_INTERVAL_DEFAULT_END                     (0.05) */
  30: /* #define HECCER_TEST_INTERVAL_DEFAULT_ENTRIES                 3000 */
  31: #define HECCER_TEST_REPORTING_GRANULARITY 10000
  32: #define HECCER_TEST_STEPS 40000
  33: #define HECCER_TEST_TESTED_THINGS ( HECCER_DUMP_VM_COMPARTMENT_MATRIX \
  34:                                     | HECCER_DUMP_VM_COMPARTMENT_DATA \
  35:                                     | HECCER_DUMP_VM_COMPARTMENT_OPERATIONS \
  36:                                     | HECCER_DUMP_VM_MECHANISM_DATA \
  37:                                     | HECCER_DUMP_VM_MECHANISM_OPERATIONS \
  38:                                     | HECCER_DUMP_VM_SUMMARY \
  39:         )
  40: #define HECCER_TEST_TIME_STEP (5e-7)
  41: 
  42: 
  43: struct Compartment compSoma =
  44: {
  45:     //m administrative overhead
  46: 
  47:     {
  48:         //m type of structure
  49: 
  50:         MATH_TYPE_Compartment,
  51:     },
  52: 
  53:     //m index of parent compartment, -1 for none
  54: 
  55:     -1,
  56: 
  57: /*     //m first mechanism */
  58: 
  59: /*     NULL, */
  60: 
  61: /*     //m number of mechanisms */
  62: 
  63: /*     0, */
  64: 
  65:     //m descriptive values, alphabetical order
  66: 
  67: /*     double dCm; */
  68: 
  69:     2.827430998e-11,
  70: 
  71: /*     double dEm; */
  72: 
  73:     -0.05939999968,
  74: 
  75: /*     double dInitVm; */
  76: 
  77:     -0.070,
  78: 
  79: /*     double dInject;           */
  80: 
  81:     3e-10,
  82: 
  83: /*     double dRa; */
  84: 
  85:     12732.40625,
  86: 
  87: /*     double dRm; */
  88: 
  89:     117891472,
  90: };
  91: 
  92: 
  93: //v a simple fast sodium channel
  94: 
  95: struct ChannelActInact caiNa =
  96: {
  97:     //m administrative overhead
  98: 
  99:     {
 100:         //m type of structure
 101: 
 102:         MATH_TYPE_ChannelActInact,
 103:     },
 104: 
 105:     //m first set of descriptive values, alphabetical order
 106: 
 107:     //m initial reversal potential
 108: 
 109:     0.045,
 110: 
 111:     //m get reversal potential from this intermediary, -1 for none
 112: 
 113:     -1,
 114: 
 115:     //m maximal conductance when all channels are permissive
 116: 
 117:     3.392917279e-06,
 118: 
 119:     //m contributes to this concentration pool, -1 for none, boolean indicator only.
 120: 
 121:     -1,
 122: 
 123:     //m activation description
 124: 
 125:     {
 126:         //m power, for a standard heccer, something between 1 and 4 or so.
 127: 
 128:         3,
 129: 
 130:         //m gate definition
 131: 
 132:         {
 133:             //m initial value, commonly forward over backward steady states
 134: 
 135:             0.05293248736,
 136: 
 137:             //m corresponding index in tables, set to -1 for initialization.
 138: 
 139:             -1,
 140: 
 141:             {
 142:                 //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
 143: 
 144:                 {
 145:                     //m multiplier
 146: 
 147:                     -4500,
 148: 
 149:                     //m multiplier membrane dependence, 0.0 for no dependence
 150: 
 151:                     0.1e6,
 152: 
 153:                     //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 154: 
 155:                     0.0,
 156: 
 157:                     //m choose between nominator or denominator, 1 means nominator, -1
 158:                     //m means denominator
 159: 
 160:                     -1.0,
 161: 
 162:                     //m nominator or denominator offset
 163: 
 164:                     -1.0,
 165: 
 166:                     //m membrane offset
 167: 
 168:                     0.045,
 169: 
 170:                     //m denormalized time constant
 171: 
 172:                     -0.01,
 173:                 },
 174: 
 175:                 //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
 176: 
 177:                 {
 178:                     //m multiplier
 179: 
 180:                     4e3,
 181: 
 182:                     //m multiplier membrane dependence, 0.0 for no dependence
 183: 
 184:                     0.0,
 185: 
 186:                     //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 187: 
 188:                     1.0,
 189: 
 190:                     //m choose between nominator or denominator, 1 means nominator, -1
 191:                     //m means denominator
 192: 
 193:                     -1.0,
 194: 
 195:                     //m nominator or denominator offset
 196: 
 197:                     0.0,
 198: 
 199:                     //m membrane offset
 200: 
 201:                     0.07,
 202: 
 203:                     //m denormalized time constant
 204: 
 205:                     18e-3,
 206:                 },
 207:             },
 208:         },
 209:     },
 210: 
 211:     //m inactivation description
 212: 
 213:     {
 214:         //m power, for a standard heccer, something between 1 and 4 or so.
 215: 
 216:         1,
 217: 
 218:         //m gate definition
 219: 
 220:         {
 221:             //m initial value, commonly forward over backward steady states
 222: 
 223:             0.5961207962,
 224: 
 225:             //m corresponding index in tables, set to -1 for initialization.
 226: 
 227:             -1,
 228: 
 229:             {
 230:                 //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
 231: 
 232:                 {
 233:                     //m multiplier
 234: 
 235:                     70,
 236: 
 237:                     //m multiplier membrane dependence, 0.0 for no dependence
 238: 
 239:                     0.0,
 240: 
 241:                     //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 242: 
 243:                     0.0,
 244: 
 245:                     //m choose between nominator or denominator, 1 means nominator, -1
 246:                     //m means denominator
 247: 
 248:                     -1.0,
 249: 
 250:                     //m nominator or denominator offset
 251: 
 252:                     0.0,
 253: 
 254:                     //m membrane offset
 255: 
 256:                     0.07,
 257: 
 258:                     //m denormalized time constant
 259: 
 260:                     0.02,
 261:                 },
 262: 
 263:                 //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
 264: 
 265:                 {
 266:                     //m multiplier
 267: 
 268:                     1.0e3,
 269: 
 270:                     //m multiplier membrane dependence, 0.0 for no dependence
 271: 
 272:                     0.0,
 273: 
 274:                     //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 275: 
 276:                     1.0,
 277: 
 278:                     //m choose between nominator or denominator, 1 means nominator, -1
 279:                     //m means denominator
 280: 
 281:                     -1.0,
 282: 
 283:                     //m nominator or denominator offset
 284: 
 285:                     1.0,
 286: 
 287:                     //m membrane offset
 288: 
 289:                     0.04,
 290: 
 291:                     //m denormalized time constant
 292: 
 293:                     -10.0e-3,
 294:                 },
 295:             },
 296:         },
 297:     },
 298: };
 299: 
 300: 
 301: struct ChannelAct caK =
 302: {
 303:     //m administrative overhead
 304: 
 305:     {
 306:         //m type of structure
 307: 
 308:         MATH_TYPE_ChannelAct,
 309:     },
 310: 
 311:     //m first set of descriptive values, alphabetical order
 312: 
 313:     //m initial reversal potential
 314: 
 315:     -0.08200000226,
 316: 
 317:     //m get reversal potential from this intermediary, -1 for none
 318: 
 319:     -1,
 320: 
 321:     //m maximal conductance when all channels are permissive
 322: 
 323:     1.017875206e-06,
 324: 
 325:     //m contributes to this concentration pool, -1 for none, boolean indicator only.
 326: 
 327:     -1,
 328: 
 329:     //m activation description
 330: 
 331:     {
 332:         //m power, for a standard heccer, something between 1 and 4 or so.
 333: 
 334:         4,
 335: 
 336:         //m gate definition
 337: 
 338:         {
 339:             //m initial value, commonly forward over backward steady states
 340: 
 341:             0.3176768857,
 342: 
 343:             //m corresponding index in tables, set to -1 for initialization.
 344: 
 345:             -1,
 346: 
 347:             {
 348:                 //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
 349: 
 350:                 {
 351:                     //m multiplier
 352: 
 353:                     -600,
 354: 
 355:                     //m multiplier membrane dependence, 0.0 for no dependence
 356: 
 357:                     10000,
 358: 
 359:                     //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 360: 
 361:                     0.0,
 362: 
 363:                     //m choose between nominator or denominator, 1 means nominator, -1
 364:                     //m means denominator
 365: 
 366:                     -1.0,
 367: 
 368:                     //m nominator or denominator offset
 369: 
 370:                     -1.0,
 371: 
 372:                     //m membrane offset
 373: 
 374:                     60e-3,
 375: 
 376:                     //m denormalized time constant
 377: 
 378:                     -10.0e-3,
 379:                 },
 380: 
 381:                 //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
 382: 
 383:                 {
 384:                     //m multiplier
 385: 
 386:                     125,
 387: 
 388:                     //m multiplier membrane dependence, 0.0 for no dependence
 389: 
 390:                     0.0,
 391: 
 392:                     //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 393: 
 394:                     1.0,
 395: 
 396:                     //m choose between nominator or denominator, 1 means nominator, -1
 397:                     //m means denominator
 398: 
 399:                     -1.0,
 400: 
 401:                     //m nominator or denominator offset
 402: 
 403:                     0.0,
 404: 
 405:                     //m membrane offset
 406: 
 407:                     70e-3,
 408: 
 409:                     //m denormalized time constant
 410: 
 411:                     80e-3,
 412:                 },
 413:             },
 414:         },
 415:     },
 416: };
 417: 
 418: 
 419: int piC2m[] =
 420: {
 421:     2,
 422:     -1,
 423: };
 424: 
 425: 
 426: struct MathComponentArray mca =
 427: {
 428:     //m number of math components
 429: 
 430:     2,
 431: 
 432:     //m math component data
 433: 
 434:     NULL,
 435: 
 436:     //m math component index, initialize to NULL
 437: 
 438:     NULL,
 439: 
 440: };
 441: 
 442: 
 443: struct Intermediary inter =
 444: {
 445:     //m compartment array
 446: 
 447:     1,
 448: 
 449:     &compSoma,
 450: 
 451:     //m all other mathematical components
 452: 
 453:     &mca,
 454: 
 455:     //m compartment 2 first mechanism number
 456: 
 457:     piC2m,
 458: };
 459: 
 460: 
 461: struct OutputGenerator * pogVm = NULL;
 462: 
 463: double *pdVm = NULL;
 464: 
 465: char pcStep[100] = "";
 466: 
 467: #include "main.h"
 468: 
 469: 
 470: int main(int argc, char *argv[])
 471: {
 472:     //- set default result : ok
 473: 
 474:     int iResult = EXIT_SUCCESS;
 475: 
 476:     //- determine intermediary size, and allocate
 477: 
 478:     struct MathComponentInfo *pmciNa = MathComponentInfoLookup(caiNa.mc.iType);
 479: 
 480:     struct MathComponentInfo *pmciK = MathComponentInfoLookup(caK.mc.iType);
 481: 
 482:     int iChars = pmciNa->iChars + pmciK->iChars;;
 483: 
 484:     void *pmc = calloc(sizeof(char), iChars);
 485: 
 486:     //- prepare the mechanism intermediary
 487: 
 488:     struct ChannelActInact *pcaiNa = (struct ChannelActInact *)pmc;
 489: 
 490:     *pcaiNa = caiNa;
 491: 
 492:     struct ChannelAct *pcaK = (struct ChannelAct *)&((char *)pcaiNa)[pmciNa->iChars];
 493: 
 494:     *pcaK = caK;
 495: 
 496:     //- link the intermediary
 497: 
 498:     mca.pmc = pmc;
 499: 
 500:     //- create output elements
 501: 
 502:     pogVm = OutputGeneratorNew("/tmp/output");
 503: 
 504: //d generate output of membrane potential each step
 505: 
 506: #define HECCER_TEST_INITIATE \
 507:     pdVm = HeccerAddressCompartmentVariable(pheccer, 0, "Vm"); \
 508:     OutputGeneratorAddVariable(pogVm, "Vm", pdVm)
 509: 
 510: //d generate output of membrane potential each step
 511: 
 512: #define HECCER_TEST_OUTPUT OutputGeneratorAnnotatedStep(pogVm, sprintf(pcStep, "%i", i) ? pcStep : "sprintf() failed")
 513: 
 514:     //- do the simulation
 515: 
 516:     simulate(argc,argv);
 517: 
 518:     //- finish the simulation output
 519: 
 520:     OutputGeneratorFinish(pogVm);
 521: 
 522:     //- add the simulation output to the program output
 523: 
 524:     WriteOutput("/tmp/output");
 525: 
 526:     //- return result
 527: 
 528:     return(iResult);
 529: }
 530: 
 531: 
 532: #define main(argc,argv) simulate(argc,argv)
 533: 
 534: //t this prototype can give warning and perhaps errors.
 535: 
 536: int main(int argc, char *argv[]);
 537: 
 538: 
 539: #include "main.c"
 540: 
 541: 
 542: 








































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