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/heccer.h" 23: #include "../../heccer/perfectclamp.h" 24: 25: 26: #include "main.h" 27: 28: 29: #define HECCER_TEST_REPORTING_GRANULARITY 100 30: #define HECCER_TEST_STEPS 1000 31: #define HECCER_TEST_TESTED_THINGS ( HECCER_DUMP_VM_COMPARTMENT_MATRIX \ 32: | HECCER_DUMP_VM_MECHANISM_OPERATIONS \ 33: ) 34: #define HECCER_TEST_TIME_STEP (3e-6) 35: 36: 37: struct Compartment comp[] = 38: { 39: { 40: //m administrative overhead 41: 42: { 43: //m type of structure 44: 45: MATH_TYPE_Compartment, 46: }, 47: 48: //m index of parent compartment, -1 for none 49: 50: -1, 51: 52: /* //m first mechanism */ 53: 54: /* NULL, */ 55: 56: /* //m number of mechanisms */ 57: 58: /* 0, */ 59: 60: //m descriptive values, alphabetical order 61: 62: /* double dCm; */ 63: 64: 4.575370291e-11, // unscaled 0.0164, 65: 66: /* double dEm; */ 67: 68: -0.08, 69: 70: /* double dInitVm; */ 71: 72: -0.068, 73: 74: /* double dInject; */ 75: 76: 1e-8, 77: 78: /* double dRa; */ 79: 80: 36050196.88, // unscaled 2.5, 81: 82: /* double dRm; */ 83: 84: 3584409.28, // unscaled 3 85: }, 86: /* [ /Purkinje/soma ] */ 87: /* activation = 0 */ 88: /* Vm = -0.0680000037 */ 89: /* previous_state = 0 */ 90: /* Im = 0.00378972129 */ 91: /* Em = -0.07999999821 */ 92: /* Rm = 358440928 */ 93: /* Cm = 4.575370291e-11 */ 94: /* Ra = 360501.9688 */ 95: /* inject = 0 */ 96: /* dia = 2.979999954e-05 */ 97: /* len = 0 */ 98: /* initVm = -0.0680000037 */ 99: /* somatopetal = none */ 100: /* somatopetaltag = 1 */ 101: /* somatofugal = /Purkinje/main */ 102: /* somatofugaltag = 0 */ 103: 104: { 105: //m administrative overhead 106: 107: { 108: //m type of structure 109: 110: MATH_TYPE_Compartment, 111: }, 112: 113: //m index of parent compartment, -1 for none 114: 115: 0, 116: 117: /* //m first mechanism */ 118: 119: /* NULL, */ 120: 121: /* //m number of mechanisms */ 122: 123: /* 0, */ 124: 125: //m descriptive values, alphabetical order 126: 127: /* double dCm; */ 128: 129: 5.755329373e-12, // unscaled 0.0164, 130: 131: /* double dEm; */ 132: 133: -0.08, 134: 135: /* double dInitVm; */ 136: 137: -0.068, 138: 139: /* double dInject; */ 140: 141: 0, 142: 143: /* double dRa; */ 144: 145: 77281343.75, // unscaled 2.5, 146: 147: /* double dRm; */ 148: 149: 85485982.720, // unscaled 3 150: }, 151: /* [ /Purkinje/main ] */ 152: /* activation = 0 */ 153: /* Vm = -0.0680000037 */ 154: /* previous_state = 0 */ 155: /* Im = 0.03594784066 */ 156: /* Em = -0.07999999821 */ 157: /* Rm = 8548598272 */ 158: /* Cm = 5.755329373e-12 */ 159: /* Ra = 772813.4375 */ 160: /* inject = 0 */ 161: /* dia = 7.720000212e-06 */ 162: /* len = 1.446968781e-05 */ 163: /* initVm = -0.0680000037 */ 164: /* somatopetal = /Purkinje/soma */ 165: /* somatopetaltag = 0 */ 166: /* somatofugal = /Purkinje/main[1] */ 167: /* somatofugaltag = 0 */ 168: 169: { 170: //m administrative overhead 171: 172: { 173: //m type of structure 174: 175: MATH_TYPE_Compartment, 176: }, 177: 178: //m index of parent compartment, -1 for none 179: 180: 1, 181: 182: /* //m first mechanism */ 183: 184: /* NULL, */ 185: 186: /* //m number of mechanisms */ 187: 188: /* 0, */ 189: 190: //m descriptive values, alphabetical order 191: 192: /* double dCm; */ 193: 194: 9.952665428e-12, // unscaled 0.0164, 195: 196: /* double dEm; */ 197: 198: -0.08, 199: 200: /* double dInitVm; */ 201: 202: -0.068, 203: 204: /* double dInject; */ 205: 206: 0, 207: 208: /* double dRa; */ 209: 210: 110708325, // unscaled 2.5, 211: 212: /* double dRm; */ 213: 214: 49433994.240, // unscaled 3 215: }, 216: /* [ /Purkinje/main[1] ] */ 217: /* activation = 0 */ 218: /* Vm = -0.0680000037 */ 219: /* previous_state = 0 */ 220: /* Im = 0.03594784066 */ 221: /* Em = -0.07999999821 */ 222: /* Rm = 4943399424 */ 223: /* Cm = 9.952665428e-12 */ 224: /* Ra = 1107083.25 */ 225: /* inject = 0 */ 226: /* dia = 8.220000382e-06 */ 227: /* len = 2.350032264e-05 */ 228: /* initVm = -0.0680000037 */ 229: /* somatopetal = /Purkinje/main */ 230: /* somatopetaltag = 0 */ 231: /* somatofugal = /Purkinje/main[2] /Purkinje/b0s01 */ 232: /* somatofugaltag = 0 */ 233: 234: { 235: //m administrative overhead 236: 237: { 238: //m type of structure 239: 240: MATH_TYPE_Compartment, 241: }, 242: 243: //m index of parent compartment, -1 for none 244: 245: 2, 246: 247: /* //m first mechanism */ 248: 249: /* NULL, */ 250: 251: /* //m number of mechanisms */ 252: 253: /* 0, */ 254: 255: //m descriptive values, alphabetical order 256: 257: /* double dCm; */ 258: 259: 3.048169139e-12, // unscaled 0.0164, 260: 261: /* double dEm; */ 262: 263: -0.08, 264: 265: /* double dInitVm; */ 266: 267: -0.068, 268: 269: /* double dInject; */ 270: 271: 0, 272: 273: /* double dRa; */ 274: 275: 30664696.88, // unscaled 2.5, 276: 277: /* double dRm; */ 278: 279: 1.614083584e+8, // unscaled 3 280: }, 281: /* [ /Purkinje/main[2] ] */ 282: /* activation = 0 */ 283: /* Vm = -0.0680000037 */ 284: /* previous_state = 0 */ 285: /* Im = 0.03594784439 */ 286: /* Em = -0.07999999821 */ 287: /* Rm = 1.614083584e+10 */ 288: /* Cm = 3.048169139e-12 */ 289: /* Ra = 306646.9688 */ 290: /* inject = 0 */ 291: /* dia = 8.500000149e-06 */ 292: /* len = 6.960275186e-06 */ 293: /* initVm = -0.0680000037 */ 294: /* somatopetal = /Purkinje/main[1] */ 295: /* somatopetaltag = 0 */ 296: /* somatofugal = /Purkinje/main[3] /Purkinje/b0s02 */ 297: /* somatofugaltag = 0 */ 298: 299: { 300: //m administrative overhead 301: 302: { 303: //m type of structure 304: 305: MATH_TYPE_Compartment, 306: }, 307: 308: //m index of parent compartment, -1 for none 309: 310: 3, 311: 312: /* //m first mechanism */ 313: 314: /* NULL, */ 315: 316: /* //m number of mechanisms */ 317: 318: /* 0, */ 319: 320: //m descriptive values, alphabetical order 321: 322: /* double dCm; */ 323: 324: 1.866796431e-12, // unscaled 0.0164, 325: 326: /* double dEm; */ 327: 328: -0.08, 329: 330: /* double dInitVm; */ 331: 332: -0.068, 333: 334: /* double dInject; */ 335: 336: 0, 337: 338: /* double dRa; */ 339: 340: 14715007.81, // unscaled 2.5, 341: 342: /* double dRm; */ 343: 344: 2.635531059e+8, // unscaled 3 345: }, 346: /* [ /Purkinje/main[3] ] */ 347: /* activation = 0 */ 348: /* Vm = -0.0680000037 */ 349: /* previous_state = 0 */ 350: /* Im = 0.03594784439 */ 351: /* Em = -0.07999999821 */ 352: /* Rm = 2.635531059e+10 */ 353: /* Cm = 1.866796431e-12 */ 354: /* Ra = 147150.0781 */ 355: /* inject = 0 */ 356: /* dia = 9.22000072e-06 */ 357: /* len = 3.929816558e-06 */ 358: /* initVm = -0.0680000037 */ 359: /* somatopetal = /Purkinje/main[2] */ 360: /* somatopetaltag = 0 */ 361: /* somatofugal = /Purkinje/main[4] */ 362: /* somatofugaltag = 0 */ 363: 364: { 365: //m administrative overhead 366: 367: { 368: //m type of structure 369: 370: MATH_TYPE_Compartment, 371: }, 372: 373: //m index of parent compartment, -1 for none 374: 375: 4, 376: 377: /* //m first mechanism */ 378: 379: /* NULL, */ 380: 381: /* //m number of mechanisms */ 382: 383: /* 0, */ 384: 385: //m descriptive values, alphabetical order 386: 387: /* double dCm; */ 388: 389: 3.81543408e-12, // unscaled 0.0164, 390: 391: /* double dEm; */ 392: 393: -0.08, 394: 395: /* double dInitVm; */ 396: 397: -0.068, 398: 399: /* double dInject; */ 400: 401: 0, 402: 403: /* double dRa; */ 404: 405: 33550193.75, // unscaled 2.5, 406: 407: /* double dRm; */ 408: 409: 1.289499341e+8, // unscaled 3 410: }, 411: /* [ /Purkinje/main[4] ] */ 412: /* activation = 0 */ 413: /* Vm = -0.0680000037 */ 414: /* previous_state = 0 */ 415: /* Im = 0.03594784439 */ 416: /* Em = -0.07999999821 */ 417: /* Rm = 1.289499341e+10 */ 418: /* Cm = 3.81543408e-12 */ 419: /* Ra = 335501.9375 */ 420: /* inject = 0 */ 421: /* dia = 8.890000572e-06 */ 422: /* len = 8.330066521e-06 */ 423: /* initVm = -0.0680000037 */ 424: /* somatopetal = /Purkinje/main[3] */ 425: /* somatopetaltag = 0 */ 426: /* somatofugal = /Purkinje/main[5] */ 427: /* somatofugaltag = 0 */ 428: 429: { 430: //m administrative overhead 431: 432: { 433: //m type of structure 434: 435: MATH_TYPE_Compartment, 436: }, 437: 438: //m index of parent compartment, -1 for none 439: 440: 5, 441: 442: /* //m first mechanism */ 443: 444: /* NULL, */ 445: 446: /* //m number of mechanisms */ 447: 448: /* 0, */ 449: 450: //m descriptive values, alphabetical order 451: 452: /* double dCm; */ 453: 454: 2.239454065e-12, // unscaled 0.0164, 455: 456: /* double dEm; */ 457: 458: -0.08, 459: 460: /* double dInitVm; */ 461: 462: -0.068, 463: 464: /* double dInject; */ 465: 466: 0, 467: 468: /* double dRa; */ 469: 470: 23012895.31, // unscaled 2.5, 471: 472: /* double dRm; */ 473: 474: 2.196964147e+8, // unscaled 3 475: }, 476: /* [ /Purkinje/main[5] ] */ 477: /* activation = 0 */ 478: /* Vm = -0.0680000037 */ 479: /* previous_state = 0 */ 480: /* Im = 0.03594784439 */ 481: /* Em = -0.07999999821 */ 482: /* Rm = 2.196964147e+10 */ 483: /* Cm = 2.239454065e-12 */ 484: /* Ra = 230128.9531 */ 485: /* inject = 0 */ 486: /* dia = 8.439999874e-06 */ 487: /* len = 5.149985554e-06 */ 488: /* initVm = -0.0680000037 */ 489: /* somatopetal = /Purkinje/main[4] */ 490: /* somatopetaltag = 0 */ 491: /* somatofugal = /Purkinje/main[6] /Purkinje/b0s03 */ 492: /* somatofugaltag = 0 */ 493: 494: { 495: //m administrative overhead 496: 497: { 498: //m type of structure 499: 500: MATH_TYPE_Compartment, 501: }, 502: 503: //m index of parent compartment, -1 for none 504: 505: 6, 506: 507: /* //m first mechanism */ 508: 509: /* NULL, */ 510: 511: /* //m number of mechanisms */ 512: 513: /* 0, */ 514: 515: //m descriptive values, alphabetical order 516: 517: /* double dCm; */ 518: 519: 1.754059463e-12, // unscaled 0.0164, 520: 521: /* double dEm; */ 522: 523: -0.08, 524: 525: /* double dInitVm; */ 526: 527: -0.068, 528: 529: /* double dInject; */ 530: 531: 0, 532: 533: /* double dRa; */ 534: 535: 16978185.94, // unscaled 2.5, 536: 537: /* double dRm; */ 538: 539: 2.804921958e+8, // unscaled 3 540: }, 541: /* [ /Purkinje/main[6] ] */ 542: /* activation = 0 */ 543: /* Vm = -0.0680000037 */ 544: /* previous_state = 0 */ 545: /* Im = 0.03594784439 */ 546: /* Em = -0.07999999821 */ 547: /* Rm = 2.804921958e+10 */ 548: /* Cm = 1.754059463e-12 */ 549: /* Ra = 169781.8594 */ 550: /* inject = 0 */ 551: /* dia = 8.609999895e-06 */ 552: /* len = 3.954098247e-06 */ 553: /* initVm = -0.0680000037 */ 554: /* somatopetal = /Purkinje/main[5] */ 555: /* somatopetaltag = 0 */ 556: /* somatofugal = /Purkinje/main[7] /Purkinje/b0s04 */ 557: /* somatofugaltag = 0 */ 558: 559: { 560: //m administrative overhead 561: 562: { 563: //m type of structure 564: 565: MATH_TYPE_Compartment, 566: }, 567: 568: //m index of parent compartment, -1 for none 569: 570: 7, 571: 572: /* //m first mechanism */ 573: 574: /* NULL, */ 575: 576: /* //m number of mechanisms */ 577: 578: /* 0, */ 579: 580: //m descriptive values, alphabetical order 581: 582: /* double dCm; */ 583: 584: 3.37096605e-12, // unscaled 0.0164, 585: 586: /* double dEm; */ 587: 588: -0.08, 589: 590: /* double dInitVm; */ 591: 592: -0.068, 593: 594: /* double dInject; */ 595: 596: 0, 597: 598: /* double dRa; */ 599: 600: 44225412.5, // unscaled 2.5, 601: 602: /* double dRm; */ 603: 604: 1.459522355e+8, // unscaled 3 605: }, 606: /* [ /Purkinje/main[7] ] */ 607: /* activation = 0 */ 608: /* Vm = -0.0680000037 */ 609: /* previous_state = 0 */ 610: /* Im = 0.03594784811 */ 611: /* Em = -0.07999999821 */ 612: /* Rm = 1.459522355e+10 */ 613: /* Cm = 3.37096605e-12 */ 614: /* Ra = 442254.125 */ 615: /* inject = 0 */ 616: /* dia = 7.780000487e-06 */ 617: /* len = 8.409710063e-06 */ 618: /* initVm = -0.0680000037 */ 619: /* somatopetal = /Purkinje/main[6] */ 620: /* somatopetaltag = 0 */ 621: /* somatofugal = /Purkinje/main[8] */ 622: /* somatofugaltag = 0 */ 623: 624: { 625: //m administrative overhead 626: 627: { 628: //m type of structure 629: 630: MATH_TYPE_Compartment, 631: }, 632: 633: //m index of parent compartment, -1 for none 634: 635: 8, 636: 637: /* //m first mechanism */ 638: 639: /* NULL, */ 640: 641: /* //m number of mechanisms */ 642: 643: /* 0, */ 644: 645: //m descriptive values, alphabetical order 646: 647: /* double dCm; */ 648: 649: 5.048512389e-12, // unscaled 0.0164, 650: 651: /* double dEm; */ 652: 653: -0.08, 654: 655: /* double dInitVm; */ 656: 657: -0.068, 658: 659: /* double dInject; */ 660: 661: 0, 662: 663: /* double dRa; */ 664: 665: 51879109.38, // unscaled 2.5, 666: 667: /* double dRm; */ 668: 669: 97454448.640, // unscaled 3 670: }, 671: /* [ /Purkinje/main[8] ] */ 672: /* activation = 0 */ 673: /* Vm = -0.0680000037 */ 674: /* previous_state = 0 */ 675: /* Im = 0.03594784066 */ 676: /* Em = -0.07999999821 */ 677: /* Rm = 9745444864 */ 678: /* Cm = 5.048512389e-12 */ 679: /* Ra = 518791.0938 */ 680: /* inject = 0 */ 681: /* dia = 8.439999874e-06 */ 682: /* len = 1.160986722e-05 */ 683: /* initVm = -0.0680000037 */ 684: /* somatopetal = /Purkinje/main[7] */ 685: /* somatopetaltag = 0 */ 686: /* somatofugal = /Purkinje/br1 /Purkinje/br2 */ 687: /* somatofugaltag = 0 */ 688: 689: }; 690: 691: 692: int piC2m[] = 693: { 694: 0, 695: 0, 696: 0, 697: 0, 698: 0, 699: 0, 700: 0, 701: 0, 702: 0, 703: 0, 704: -1, 705: }; 706: 707: 708: struct Intermediary inter = 709: { 710: //m compartment array 711: 712: 10, 713: 714: comp, 715: 716: //m all other mathematical components 717: 718: NULL, 719: 720: //m compartment 2 first mechanism number 721: 722: piC2m, 723: }; 724: 725: 726: int main(int argc, char *argv[]) 727: { 728: //- allocate a voltage clamp object 729: 730: ppc = PerfectClampNew("pc object"); 731: 732: //- set fields 733: 734: double dCommand = 0.1; 735: 736: PerfectClampSetFields(ppc, dCommand, NULL); 737: 738: //d connect the voltage clamp object with the compartment of interest 739: 740: #define HECCER_TEST_INITIATE \ 741: double *pdVm = HeccerAddressCompartmentVariable(pheccer, 0, "Vm"); \ 742: PerfectClampAddVariable(ppc, pdVm) 743: 744: //d schedule the voltage clamper 745: 746: #define HECCER_TEST_SCHEDULE PerfectClampSingleStep(ppc, dSimulationTime) 747: 748: //- do the simulation 749: 750: simulate(argc, argv); 751: } 752: 753: 754: #define main(argc,argv) simulate(argc,argv) 755: 756: //t this prototype can give warning and perhaps errors. 757: 758: int main(int argc, char *argv[]); 759: 760: 761: #include "main.c" 762: 763: 764: