file:/local_home/local_home/hugo/neurospaces_project/heccer/source/c/snapshots/0/tests/code/doublea-aggregator.c        (Wed Jul 2 11:04:13 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: 
  25: 
  26: #define HECCER_TEST_OPTIONS (HECCER_OPTION_ENABLE_AGGREGATORS | HECCER_OPTION_ENABLE_INDIVIDUAL_CURRENTS)
  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:                                     | HECCER_DUMP_VM_AGGREGATORS \
  34:         )
  35: #define HECCER_TEST_TIME_STEP (6e-6)
  36: 
  37: 
  38: struct Compartment pcomp[] =
  39: {
  40:     {
  41:         //m administrative overhead
  42: 
  43:         {
  44:             //m type of structure
  45: 
  46:             MATH_TYPE_Compartment,
  47: 
  48: #ifdef HECCER_SOURCE_NEUROSPACES
  49: 
  50:             //m identification
  51: 
  52:             ADDRESSING_NEUROSPACES_2_HECCER(1000),
  53: 
  54: #endif
  55: 
  56: #ifdef HECCER_SOURCE_TYPING
  57: 
  58:             //m model source type number
  59: 
  60:             //! source typing is used to compute aggregate currents ao
  61:             //! things.
  62: 
  63:             -1,
  64: 
  65: #endif
  66: 
  67:         },
  68: 
  69:         //m index of parent compartment, -1 for none
  70: 
  71:         -1,
  72: 
  73: /*      //m first mechanism */
  74: 
  75: /*      NULL, */
  76: 
  77: /*      //m number of mechanisms */
  78: 
  79: /*      0, */
  80: 
  81:         //m descriptive values, alphabetical order
  82: 
  83: /*     double dCm; */
  84: 
  85:         4.57537e-11, // unscaled 0.0164,
  86: 
  87: /*     double dEm; */
  88: 
  89:         -0.08,
  90: 
  91: /*     double dInitVm; */
  92: 
  93:         -0.028,
  94: 
  95: /*     double dInject;           */
  96: 
  97:         0,
  98: 
  99: /*     double dRa; */
 100: 
 101:         360502, // unscaled 2.5,
 102: 
 103: /*     double dRm; */
 104: 
 105:         3.58441e+08, // unscaled 1
 106:     },
 107: 
 108:     {
 109:         //m administrative overhead
 110: 
 111:         {
 112:             //m type of structure
 113: 
 114:             MATH_TYPE_Compartment,
 115: 
 116: #ifdef HECCER_SOURCE_NEUROSPACES
 117: 
 118:             //m identification
 119: 
 120:             ADDRESSING_NEUROSPACES_2_HECCER(2000),
 121: 
 122: #endif
 123: 
 124: #ifdef HECCER_SOURCE_TYPING
 125: 
 126:             //m model source type number
 127: 
 128:             //! source typing is used to compute aggregate currents ao
 129:             //! things.
 130: 
 131:             -1,
 132: 
 133: #endif
 134: 
 135:         },
 136: 
 137:         //m index of parent compartment, -1 for none
 138: 
 139:         0,
 140: 
 141: /*      //m first mechanism */
 142: 
 143: /*      NULL, */
 144: 
 145: /*      //m number of mechanisms */
 146: 
 147: /*      0, */
 148: 
 149:         //m descriptive values, alphabetical order
 150: 
 151: /*     double dCm; */
 152: 
 153:         5.755329373e-12, // unscaled 0.0164,
 154: 
 155: /*     double dEm; */
 156: 
 157:         -0.08,
 158: 
 159: /*     double dInitVm; */
 160: 
 161:         -0.068,
 162: 
 163: /*     double dInject;           */
 164: 
 165:         0,
 166: 
 167: /*     double dRa; */
 168: 
 169:         772813.4375, // unscaled 2.5,
 170: 
 171: /*     double dRm; */
 172: 
 173:         8.548598272e9, // unscaled 3
 174:     },
 175: };
 176: 
 177: 
 178: //v a simple fast sodium channel
 179: 
 180: struct ChannelActInact pcaiCaT[] =
 181: {
 182:     {
 183:         //m administrative overhead
 184: 
 185:         {
 186:             //m type of structure
 187: 
 188:             MATH_TYPE_ChannelActInact,
 189: 
 190: #ifdef HECCER_SOURCE_NEUROSPACES
 191: 
 192:             //m identification
 193: 
 194:             ADDRESSING_NEUROSPACES_2_HECCER(3000),
 195: 
 196: #endif
 197: 
 198: #ifdef HECCER_SOURCE_TYPING
 199: 
 200:             //m model source type number
 201: 
 202:             //! source typing is used to compute aggregate currents ao
 203:             //! things.
 204: 
 205:             0,
 206: 
 207: #endif
 208: 
 209:         },
 210: 
 211:         //m first set of descriptive values, alphabetical order
 212: 
 213:         //m initial reversal potential
 214: 
 215:         0.1375262439,
 216: 
 217:         //m get reversal potential from this intermediary, -1 for none
 218: 
 219:         -1,
 220: 
 221:         //m maximal conductance when all channels are permissive
 222: 
 223:         1.394928884e-08,
 224: 
 225:         //m contributes to this concentration pool, -1 for none, boolean indicator only.
 226: 
 227:         1,
 228: 
 229:         //m activation description
 230: 
 231:         {
 232:             //m power, for a standard heccer, something between 1 and 4 or so.
 233: 
 234:             1,
 235: 
 236:             //m gate definition
 237: 
 238:             {
 239:                 //m initial value, commonly forward over backward steady states
 240: 
 241:                 0.038918706451336625,
 242: 
 243:                 //m corresponding index in tables, set to -1 for initialization.
 244: 
 245:                 -1,
 246: 
 247:                 {
 248:                     //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
 249: 
 250:                     {
 251:                         //m multiplier
 252: 
 253:                         2.6e3,
 254: 
 255:                         //m multiplier membrane dependence, 0.0 for no dependence
 256: 
 257:                         0.0,
 258: 
 259:                         //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 260: 
 261:                         0.0,
 262: 
 263:                         //m choose between nominator or denominator, 1 means nominator, -1
 264:                         //m means denominator
 265: 
 266:                         -1.0,
 267: 
 268:                         //m nominator or denominator offset
 269: 
 270:                         1.0,
 271: 
 272:                         //m membrane offset
 273: 
 274:                         0.021,
 275: 
 276:                         //m denormalized time constant
 277: 
 278:                         -8e-3,
 279:                     },
 280: 
 281:                     //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
 282: 
 283:                     {
 284:                         //m multiplier
 285: 
 286:                         0.18e3,
 287: 
 288:                         //m multiplier membrane dependence, 0.0 for no dependence
 289: 
 290:                         0.0,
 291: 
 292:                         //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 293: 
 294:                         0.0,
 295: 
 296:                         //m choose between nominator or denominator, 1 means nominator, -1
 297:                         //m means denominator
 298: 
 299:                         -1.0,
 300: 
 301:                         //m nominator or denominator offset
 302: 
 303:                         1.0,
 304: 
 305:                         //m membrane offset
 306: 
 307:                         0.04,
 308: 
 309:                         //m denormalized time constant
 310: 
 311:                         4e-3,
 312:                     },
 313:                 },
 314:             },
 315:         },
 316: 
 317:         //m inactivation description
 318: 
 319:         {
 320:             //m power, for a standard heccer, something between 1 and 4 or so.
 321: 
 322:             1,
 323: 
 324:             //m gate definition
 325: 
 326:             {
 327:                 //m initial value, commonly forward over backward steady states
 328: 
 329:                 0.082602128127539254,
 330: 
 331:                 //m corresponding index in tables, set to -1 for initialization.
 332: 
 333:                 -1,
 334: 
 335:                 {
 336:                     //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
 337: 
 338:                     {
 339:                         //m multiplier
 340: 
 341:                         0.0025e3,
 342: 
 343:                         //m multiplier membrane dependence, 0.0 for no dependence
 344: 
 345:                         0.0,
 346: 
 347:                         //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 348: 
 349:                         0.0,
 350: 
 351:                         //m choose between nominator or denominator, 1 means nominator, -1
 352:                         //m means denominator
 353: 
 354:                         -1.0,
 355: 
 356:                         //m nominator or denominator offset
 357: 
 358:                         1.0,
 359: 
 360:                         //m membrane offset
 361: 
 362:                         0.04,
 363: 
 364:                         //m denormalized time constant
 365: 
 366:                         8e-3,
 367:                     },
 368: 
 369:                     //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
 370: 
 371:                     {
 372:                         //m multiplier
 373: 
 374:                         0.19e3,
 375: 
 376:                         //m multiplier membrane dependence, 0.0 for no dependence
 377: 
 378:                         0.0,
 379: 
 380:                         //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 381: 
 382:                         0.0,
 383: 
 384:                         //m choose between nominator or denominator, 1 means nominator, -1
 385:                         //m means denominator
 386: 
 387:                         -1.0,
 388: 
 389:                         //m nominator or denominator offset
 390: 
 391:                         1.0,
 392: 
 393:                         //m membrane offset
 394: 
 395:                         0.05,
 396: 
 397:                         //m denormalized time constant
 398: 
 399:                         -10.0e-3,
 400:                     },
 401:                 },
 402:             },
 403:         },
 404:     },
 405: 
 406:     {
 407:         //m administrative overhead
 408: 
 409:         {
 410:             //m type of structure
 411: 
 412:             MATH_TYPE_ChannelActInact,
 413: 
 414: #ifdef HECCER_SOURCE_NEUROSPACES
 415: 
 416:             //m identification
 417: 
 418:             ADDRESSING_NEUROSPACES_2_HECCER(4000),
 419: 
 420: #endif
 421: 
 422: #ifdef HECCER_SOURCE_TYPING
 423: 
 424:             //m model source type number
 425: 
 426:             //! source typing is used to compute aggregate currents ao
 427:             //! things.
 428: 
 429:             0,
 430: 
 431: #endif
 432: 
 433:         },
 434: 
 435:         //m first set of descriptive values, alphabetical order
 436: 
 437:         //m initial reversal potential
 438: 
 439:         0.1470214874,
 440: 
 441:         //m get reversal potential from this intermediary, -1 for none
 442: 
 443:         -1,
 444: 
 445:         //m maximal conductance when all channels are permissive
 446: 
 447:         1.754672296e-09,
 448: 
 449:         //m contributes to this concentration pool, -1 for none, boolean indicator only.
 450: 
 451:         3,
 452: 
 453:         //m activation description
 454: 
 455:         {
 456:             //m power, for a standard heccer, something between 1 and 4 or so.
 457: 
 458:             1,
 459: 
 460:             //m gate definition
 461: 
 462:             {
 463:                 //m initial value, commonly forward over backward steady states
 464: 
 465:                 0.038918706451336625,
 466: 
 467:                 //m corresponding index in tables, set to -1 for initialization.
 468: 
 469:                 -1,
 470: 
 471:                 {
 472:                     //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
 473: 
 474:                     {
 475:                         //m multiplier
 476: 
 477:                         2.6e3,
 478: 
 479:                         //m multiplier membrane dependence, 0.0 for no dependence
 480: 
 481:                         0.0,
 482: 
 483:                         //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 484: 
 485:                         0.0,
 486: 
 487:                         //m choose between nominator or denominator, 1 means nominator, -1
 488:                         //m means denominator
 489: 
 490:                         -1.0,
 491: 
 492:                         //m nominator or denominator offset
 493: 
 494:                         1.0,
 495: 
 496:                         //m membrane offset
 497: 
 498:                         0.021,
 499: 
 500:                         //m denormalized time constant
 501: 
 502:                         -8e-3,
 503:                     },
 504: 
 505:                     //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
 506: 
 507:                     {
 508:                         //m multiplier
 509: 
 510:                         0.18e3,
 511: 
 512:                         //m multiplier membrane dependence, 0.0 for no dependence
 513: 
 514:                         0.0,
 515: 
 516:                         //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 517: 
 518:                         0.0,
 519: 
 520:                         //m choose between nominator or denominator, 1 means nominator, -1
 521:                         //m means denominator
 522: 
 523:                         -1.0,
 524: 
 525:                         //m nominator or denominator offset
 526: 
 527:                         1.0,
 528: 
 529:                         //m membrane offset
 530: 
 531:                         0.04,
 532: 
 533:                         //m denormalized time constant
 534: 
 535:                         4e-3,
 536:                     },
 537:                 },
 538:             },
 539:         },
 540: 
 541:         //m inactivation description
 542: 
 543:         {
 544:             //m power, for a standard heccer, something between 1 and 4 or so.
 545: 
 546:             1,
 547: 
 548:             //m gate definition
 549: 
 550:             {
 551:                 //m initial value, commonly forward over backward steady states
 552: 
 553:                 0.082602128127539254,
 554: 
 555:                 //m corresponding index in tables, set to -1 for initialization.
 556: 
 557:                 -1,
 558: 
 559:                 {
 560:                     //m forward kinetiks, commonly denoted with alpha or non-perm to perm rate
 561: 
 562:                     {
 563:                         //m multiplier
 564: 
 565:                         0.0025e3,
 566: 
 567:                         //m multiplier membrane dependence, 0.0 for no dependence
 568: 
 569:                         0.0,
 570: 
 571:                         //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 572: 
 573:                         0.0,
 574: 
 575:                         //m choose between nominator or denominator, 1 means nominator, -1
 576:                         //m means denominator
 577: 
 578:                         -1.0,
 579: 
 580:                         //m nominator or denominator offset
 581: 
 582:                         1.0,
 583: 
 584:                         //m membrane offset
 585: 
 586:                         0.04,
 587: 
 588:                         //m denormalized time constant
 589: 
 590:                         8e-3,
 591:                     },
 592: 
 593:                     //m backward kinetiks, commonly denoted with beta or perm to non-perm rate
 594: 
 595:                     {
 596:                         //m multiplier
 597: 
 598:                         0.19e3,
 599: 
 600:                         //m multiplier membrane dependence, 0.0 for no dependence
 601: 
 602:                         0.0,
 603: 
 604:                         //m 2b: multiplier membrane dependence offset, 0.0 for no dependence
 605: 
 606:                         0.0,
 607: 
 608:                         //m choose between nominator or denominator, 1 means nominator, -1
 609:                         //m means denominator
 610: 
 611:                         -1.0,
 612: 
 613:                         //m nominator or denominator offset
 614: 
 615:                         1.0,
 616: 
 617:                         //m membrane offset
 618: 
 619:                         0.05,
 620: 
 621:                         //m denormalized time constant
 622: 
 623:                         -10.0e-3,
 624:                     },
 625:                 },
 626:             },
 627:         },
 628:     },
 629: };
 630: 
 631: 
 632: struct ExponentialDecay pexdecCa[] =
 633: {
 634:     {
 635:         //m administrative overhead
 636: 
 637:         {
 638:             //m type of structure
 639: 
 640:             MATH_TYPE_ExponentialDecay,
 641: 
 642: #ifdef HECCER_SOURCE_NEUROSPACES
 643: 
 644:             //m identification
 645: 
 646:             ADDRESSING_NEUROSPACES_2_HECCER(5000),
 647: 
 648: #endif
 649: 
 650: #ifdef HECCER_SOURCE_TYPING
 651: 
 652:             //m model source type number
 653: 
 654:             //! source typing is used to compute aggregate currents ao
 655:             //! things.
 656: 
 657:             1,
 658: 
 659: #endif
 660: 
 661:         },
 662: 
 663:         //m initial value
 664: 
 665:         4e-5,
 666: 
 667:         //m beta
 668: 
 669:         7.579027046e+10,
 670: 
 671:         //m steady state
 672: 
 673:         4e-05,
 674: 
 675:         //m tau
 676: 
 677:         0.00010,
 678: 
 679:         //m external contribution delivered by these intermediaries
 680: 
 681:         {
 682:             0,
 683:             -1,
 684:             -1,
 685:             -1,
 686:         },
 687:     },
 688: 
 689:     {
 690:         //m administrative overhead
 691: 
 692:         {
 693:             //m type of structure
 694: 
 695:             MATH_TYPE_ExponentialDecay,
 696: 
 697: #ifdef HECCER_SOURCE_NEUROSPACES
 698: 
 699:             //m identification
 700: 
 701:             ADDRESSING_NEUROSPACES_2_HECCER(6000),
 702: 
 703: #endif
 704: 
 705: #ifdef HECCER_SOURCE_TYPING
 706: 
 707:             //m model source type number
 708: 
 709:             //! source typing is used to compute aggregate currents ao
 710:             //! things.
 711: 
 712:             1,
 713: 
 714: #endif
 715: 
 716:         },
 717: 
 718:         //m initial value
 719: 
 720:         4e-5,
 721: 
 722:         //m beta
 723: 
 724:         9412391936.0,
 725: 
 726:         //m steady state
 727: 
 728:         4e-05,
 729: 
 730:         //m tau
 731: 
 732:         0.00020,
 733: 
 734:         //m external contribution delivered by these intermediaries
 735: 
 736:         {
 737:             2,
 738:             -1,
 739:             -1,
 740:             -1,
 741:         },
 742:     }
 743: };
 744: 
 745: 
 746: int piC2m[] =
 747: {
 748:     2,
 749:     4,
 750:     -1,
 751: };
 752: 
 753: 
 754: struct MathComponentArray mca =
 755: {
 756:     //m number of math components
 757: 
 758:     4,
 759: 
 760:     //m math component data
 761: 
 762:     NULL,
 763: 
 764:     //m math component index, initialize to NULL
 765: 
 766:     NULL,
 767: 
 768: };
 769: 
 770: 
 771: struct Intermediary inter =
 772: {
 773:     //m compartment array
 774: 
 775:     2,
 776: 
 777:     pcomp,
 778: 
 779:     //m all other mathematical components
 780: 
 781:     &mca,
 782: 
 783:     //m compartment 2 first mechanism number
 784: 
 785:     piC2m,
 786: };
 787: 
 788: 
 789: int main(int argc, char *argv[])
 790: {
 791:     //- determine intermediary size, and allocate
 792: 
 793:     struct MathComponentInfo *pmciCa = MathComponentInfoLookup(pexdecCa[0].mc.iType);
 794: 
 795:     struct MathComponentInfo *pmciCaT = MathComponentInfoLookup(pcaiCaT[0].mc.iType);
 796: 
 797:     int iChars = 2 * pmciCaT->iChars + 2 * pmciCa->iChars;
 798: 
 799:     void *pmc = calloc(sizeof(char), iChars);
 800: 
 801:     //- prepare the mechanism intermediary
 802: 
 803:     struct ChannelActInact *pcai0 = (struct ChannelActInact *)pmc;
 804: 
 805:     *pcai0 = pcaiCaT[0];
 806: 
 807:     struct ExponentialDecay *pexdec0 = (struct ExponentialDecay *)&((char *)pcai0)[pmciCaT->iChars];
 808: 
 809:     *pexdec0 = pexdecCa[0];
 810: 
 811:     struct ChannelActInact *pcai1 = (struct ChannelActInact *)&((char *)pexdec0)[pmciCa->iChars];
 812: 
 813:     *pcai1 = pcaiCaT[1];
 814: 
 815:     struct ExponentialDecay *pexdec1 = (struct ExponentialDecay *)&((char *)pcai1)[pmciCaT->iChars];
 816: 
 817:     *pexdec1 = pexdecCa[1];
 818: 
 819:     //- link the intermediary
 820: 
 821:     mca.pmc = pmc;
 822: 
 823:     //- do the simulation
 824: 
 825:     simulate(argc,argv);
 826: }
 827: 
 828: 
 829: #define main(argc,argv) simulate(argc,argv)
 830: 
 831: //t this prototype can give warning and perhaps errors.
 832: 
 833: int main(int argc, char *argv[]);
 834: 
 835: 
 836: #include "main.c"
 837: 
 838: 
 839: 








































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