kernel_gpu_opencl.cl 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445
  1. // #ifdef __cplusplus
  2. // extern "C" {
  3. // #endif
  4. //========================================================================================================================================================================================================200
  5. // DEFINE/INCLUDE
  6. //========================================================================================================================================================================================================200
  7. //======================================================================================================================================================150
  8. // DEFINE (need to define because cannot include ../common.h file for some reason
  9. //======================================================================================================================================================150
  10. #define fp float
  11. //======================================================================================================================================================150
  12. // END
  13. //======================================================================================================================================================150
  14. //========================================================================================================================================================================================================200
  15. // KERNEL_ECC
  16. //========================================================================================================================================================================================================200
  17. void
  18. kernel_ecc( fp timeinst,
  19. __global fp *d_initvalu,
  20. __global fp *d_finavalu,
  21. int valu_offset,
  22. __global fp *d_params){
  23. //=====================================================================
  24. // VARIABLES
  25. //=====================================================================
  26. // input parameters
  27. fp cycleLength;
  28. // variable references // GET VARIABLES FROM MEMORY AND SAVE LOCALLY !!!!!!!!!!!!!!!!!!
  29. int offset_1;
  30. int offset_2;
  31. int offset_3;
  32. int offset_4;
  33. int offset_5;
  34. int offset_6;
  35. int offset_7;
  36. int offset_8;
  37. int offset_9;
  38. int offset_10;
  39. int offset_11;
  40. int offset_12;
  41. int offset_13;
  42. int offset_14;
  43. int offset_15;
  44. int offset_16;
  45. int offset_17;
  46. int offset_18;
  47. int offset_19;
  48. int offset_20;
  49. int offset_21;
  50. int offset_22;
  51. int offset_23;
  52. int offset_24;
  53. int offset_25;
  54. int offset_26;
  55. int offset_27;
  56. int offset_28;
  57. int offset_29;
  58. int offset_30;
  59. int offset_31;
  60. int offset_32;
  61. int offset_33;
  62. int offset_34;
  63. int offset_35;
  64. int offset_36;
  65. int offset_37;
  66. int offset_38;
  67. int offset_39;
  68. int offset_40;
  69. int offset_41;
  70. int offset_42;
  71. int offset_43;
  72. int offset_44;
  73. int offset_45;
  74. int offset_46;
  75. // stored input array
  76. fp d_initvalu_1;
  77. fp d_initvalu_2;
  78. fp d_initvalu_3;
  79. fp d_initvalu_4;
  80. fp d_initvalu_5;
  81. fp d_initvalu_6;
  82. fp d_initvalu_7;
  83. fp d_initvalu_8;
  84. fp d_initvalu_9;
  85. fp d_initvalu_10;
  86. fp d_initvalu_11;
  87. fp d_initvalu_12;
  88. fp d_initvalu_13;
  89. fp d_initvalu_14;
  90. fp d_initvalu_15;
  91. fp d_initvalu_16;
  92. fp d_initvalu_17;
  93. fp d_initvalu_18;
  94. fp d_initvalu_19;
  95. fp d_initvalu_20;
  96. fp d_initvalu_21;
  97. // fp d_initvalu_22;
  98. fp d_initvalu_23;
  99. fp d_initvalu_24;
  100. fp d_initvalu_25;
  101. fp d_initvalu_26;
  102. fp d_initvalu_27;
  103. fp d_initvalu_28;
  104. fp d_initvalu_29;
  105. fp d_initvalu_30;
  106. fp d_initvalu_31;
  107. fp d_initvalu_32;
  108. fp d_initvalu_33;
  109. fp d_initvalu_34;
  110. fp d_initvalu_35;
  111. fp d_initvalu_36;
  112. fp d_initvalu_37;
  113. fp d_initvalu_38;
  114. fp d_initvalu_39;
  115. fp d_initvalu_40;
  116. // fp d_initvalu_41;
  117. // fp d_initvalu_42;
  118. // fp d_initvalu_43;
  119. // fp d_initvalu_44;
  120. // fp d_initvalu_45;
  121. // fp d_initvalu_46;
  122. // matlab constants undefined in c
  123. fp pi;
  124. // Constants
  125. fp R; // [J/kmol*K]
  126. fp Frdy; // [C/mol]
  127. fp Temp; // [K] 310
  128. fp FoRT; //
  129. fp Cmem; // [F] membrane capacitance
  130. fp Qpow;
  131. // Cell geometry
  132. fp cellLength; // cell length [um]
  133. fp cellRadius; // cell radius [um]
  134. // fp junctionLength; // junc length [um]
  135. // fp junctionRadius; // junc radius [um]
  136. // fp distSLcyto; // dist. SL to cytosol [um]
  137. // fp distJuncSL; // dist. junc to SL [um]
  138. // fp DcaJuncSL; // Dca junc to SL [cm^2/sec]
  139. // fp DcaSLcyto; // Dca SL to cyto [cm^2/sec]
  140. // fp DnaJuncSL; // Dna junc to SL [cm^2/sec]
  141. // fp DnaSLcyto; // Dna SL to cyto [cm^2/sec]
  142. fp Vcell; // [L]
  143. fp Vmyo;
  144. fp Vsr;
  145. fp Vsl;
  146. fp Vjunc;
  147. // fp SAjunc; // [um^2]
  148. // fp SAsl; // [um^2]
  149. fp J_ca_juncsl; // [L/msec]
  150. fp J_ca_slmyo; // [L/msec]
  151. fp J_na_juncsl; // [L/msec]
  152. fp J_na_slmyo; // [L/msec]
  153. // Fractional currents in compartments
  154. fp Fjunc;
  155. fp Fsl;
  156. fp Fjunc_CaL;
  157. fp Fsl_CaL;
  158. // Fixed ion concentrations
  159. fp Cli; // Intracellular Cl [mM]
  160. fp Clo; // Extracellular Cl [mM]
  161. fp Ko; // Extracellular K [mM]
  162. fp Nao; // Extracellular Na [mM]
  163. fp Cao; // Extracellular Ca [mM]
  164. fp Mgi; // Intracellular Mg [mM]
  165. // Nernst Potentials
  166. fp ena_junc; // [mV]
  167. fp ena_sl; // [mV]
  168. fp ek; // [mV]
  169. fp eca_junc; // [mV]
  170. fp eca_sl; // [mV]
  171. fp ecl; // [mV]
  172. // Na transport parameters
  173. fp GNa; // [mS/uF]
  174. fp GNaB; // [mS/uF]
  175. fp IbarNaK; // [uA/uF]
  176. fp KmNaip; // [mM]
  177. fp KmKo; // [mM]
  178. // fp Q10NaK;
  179. // fp Q10KmNai;
  180. // K current parameters
  181. fp pNaK;
  182. fp GtoSlow; // [mS/uF]
  183. fp GtoFast; // [mS/uF]
  184. fp gkp;
  185. // Cl current parameters
  186. fp GClCa; // [mS/uF]
  187. fp GClB; // [mS/uF]
  188. fp KdClCa; // [mM] // [mM]
  189. // I_Ca parameters
  190. fp pNa; // [cm/sec]
  191. fp pCa; // [cm/sec]
  192. fp pK; // [cm/sec]
  193. // fp KmCa; // [mM]
  194. fp Q10CaL;
  195. // Ca transport parameters
  196. fp IbarNCX; // [uA/uF]
  197. fp KmCai; // [mM]
  198. fp KmCao; // [mM]
  199. fp KmNai; // [mM]
  200. fp KmNao; // [mM]
  201. fp ksat; // [none]
  202. fp nu; // [none]
  203. fp Kdact; // [mM]
  204. fp Q10NCX; // [none]
  205. fp IbarSLCaP; // [uA/uF]
  206. fp KmPCa; // [mM]
  207. fp GCaB; // [uA/uF]
  208. fp Q10SLCaP; // [none] // [none]
  209. // SR flux parameters
  210. fp Q10SRCaP; // [none]
  211. fp Vmax_SRCaP; // [mM/msec] (mmol/L cytosol/msec)
  212. fp Kmf; // [mM]
  213. fp Kmr; // [mM]L cytosol
  214. fp hillSRCaP; // [mM]
  215. fp ks; // [1/ms]
  216. fp koCa; // [mM^-2 1/ms]
  217. fp kom; // [1/ms]
  218. fp kiCa; // [1/mM/ms]
  219. fp kim; // [1/ms]
  220. fp ec50SR; // [mM]
  221. // Buffering parameters
  222. fp Bmax_Naj; // [mM]
  223. fp Bmax_Nasl; // [mM]
  224. fp koff_na; // [1/ms]
  225. fp kon_na; // [1/mM/ms]
  226. fp Bmax_TnClow; // [mM], TnC low affinity
  227. fp koff_tncl; // [1/ms]
  228. fp kon_tncl; // [1/mM/ms]
  229. fp Bmax_TnChigh; // [mM], TnC high affinity
  230. fp koff_tnchca; // [1/ms]
  231. fp kon_tnchca; // [1/mM/ms]
  232. fp koff_tnchmg; // [1/ms]
  233. fp kon_tnchmg; // [1/mM/ms]
  234. // fp Bmax_CaM; // [mM], CaM buffering
  235. // fp koff_cam; // [1/ms]
  236. // fp kon_cam; // [1/mM/ms]
  237. fp Bmax_myosin; // [mM], Myosin buffering
  238. fp koff_myoca; // [1/ms]
  239. fp kon_myoca; // [1/mM/ms]
  240. fp koff_myomg; // [1/ms]
  241. fp kon_myomg; // [1/mM/ms]
  242. fp Bmax_SR; // [mM]
  243. fp koff_sr; // [1/ms]
  244. fp kon_sr; // [1/mM/ms]
  245. fp Bmax_SLlowsl; // [mM], SL buffering
  246. fp Bmax_SLlowj; // [mM]
  247. fp koff_sll; // [1/ms]
  248. fp kon_sll; // [1/mM/ms]
  249. fp Bmax_SLhighsl; // [mM]
  250. fp Bmax_SLhighj; // [mM]
  251. fp koff_slh; // [1/ms]
  252. fp kon_slh; // [1/mM/ms]
  253. fp Bmax_Csqn; // 140e-3*Vmyo/Vsr; [mM]
  254. fp koff_csqn; // [1/ms]
  255. fp kon_csqn; // [1/mM/ms]
  256. // I_Na: Fast Na Current
  257. fp am;
  258. fp bm;
  259. fp ah;
  260. fp bh;
  261. fp aj;
  262. fp bj;
  263. fp I_Na_junc;
  264. fp I_Na_sl;
  265. // fp I_Na;
  266. // I_nabk: Na Background Current
  267. fp I_nabk_junc;
  268. fp I_nabk_sl;
  269. // fp I_nabk;
  270. // I_nak: Na/K Pump Current
  271. fp sigma;
  272. fp fnak;
  273. fp I_nak_junc;
  274. fp I_nak_sl;
  275. fp I_nak;
  276. // I_kr: Rapidly Activating K Current
  277. fp gkr;
  278. fp xrss;
  279. fp tauxr;
  280. fp rkr;
  281. fp I_kr;
  282. // I_ks: Slowly Activating K Current
  283. fp pcaks_junc;
  284. fp pcaks_sl;
  285. fp gks_junc;
  286. fp gks_sl;
  287. fp eks;
  288. fp xsss;
  289. fp tauxs;
  290. fp I_ks_junc;
  291. fp I_ks_sl;
  292. fp I_ks;
  293. // I_kp: Plateau K current
  294. fp kp_kp;
  295. fp I_kp_junc;
  296. fp I_kp_sl;
  297. fp I_kp;
  298. // I_to: Transient Outward K Current (slow and fast components)
  299. fp xtoss;
  300. fp ytoss;
  301. fp rtoss;
  302. fp tauxtos;
  303. fp tauytos;
  304. fp taurtos;
  305. fp I_tos;
  306. //
  307. fp tauxtof;
  308. fp tauytof;
  309. fp I_tof;
  310. fp I_to;
  311. // I_ki: Time-Independent K Current
  312. fp aki;
  313. fp bki;
  314. fp kiss;
  315. fp I_ki;
  316. // I_ClCa: Ca-activated Cl Current, I_Clbk: background Cl Current
  317. fp I_ClCa_junc;
  318. fp I_ClCa_sl;
  319. fp I_ClCa;
  320. fp I_Clbk;
  321. // I_Ca: L-type Calcium Current
  322. fp dss;
  323. fp taud;
  324. fp fss;
  325. fp tauf;
  326. //
  327. fp ibarca_j;
  328. fp ibarca_sl;
  329. fp ibark;
  330. fp ibarna_j;
  331. fp ibarna_sl;
  332. fp I_Ca_junc;
  333. fp I_Ca_sl;
  334. fp I_Ca;
  335. fp I_CaK;
  336. fp I_CaNa_junc;
  337. fp I_CaNa_sl;
  338. // fp I_CaNa;
  339. // fp I_Catot;
  340. // I_ncx: Na/Ca Exchanger flux
  341. fp Ka_junc;
  342. fp Ka_sl;
  343. fp s1_junc;
  344. fp s1_sl;
  345. fp s2_junc;
  346. fp s3_junc;
  347. fp s2_sl;
  348. fp s3_sl;
  349. fp I_ncx_junc;
  350. fp I_ncx_sl;
  351. fp I_ncx;
  352. // I_pca: Sarcolemmal Ca Pump Current
  353. fp I_pca_junc;
  354. fp I_pca_sl;
  355. fp I_pca;
  356. // I_cabk: Ca Background Current
  357. fp I_cabk_junc;
  358. fp I_cabk_sl;
  359. fp I_cabk;
  360. // SR fluxes: Calcium Release, SR Ca pump, SR Ca leak
  361. fp MaxSR;
  362. fp MinSR;
  363. fp kCaSR;
  364. fp koSRCa;
  365. fp kiSRCa;
  366. fp RI;
  367. fp J_SRCarel; // [mM/ms]
  368. fp J_serca;
  369. fp J_SRleak; // [mM/ms]
  370. // Cytosolic Ca Buffers
  371. fp J_CaB_cytosol;
  372. // Junctional and SL Ca Buffers
  373. fp J_CaB_junction;
  374. fp J_CaB_sl;
  375. // SR Ca Concentrations
  376. fp oneovervsr;
  377. // Sodium Concentrations
  378. fp I_Na_tot_junc; // [uA/uF]
  379. fp I_Na_tot_sl; // [uA/uF]
  380. fp oneovervsl;
  381. // Potassium Concentration
  382. fp I_K_tot;
  383. // Calcium Concentrations
  384. fp I_Ca_tot_junc; // [uA/uF]
  385. fp I_Ca_tot_sl; // [uA/uF]
  386. // fp junc_sl;
  387. // fp sl_junc;
  388. // fp sl_myo;
  389. // fp myo_sl;
  390. // Simulation type
  391. int state; // 0-none; 1-pace; 2-vclamp
  392. fp I_app;
  393. fp V_hold;
  394. fp V_test;
  395. fp V_clamp;
  396. fp R_clamp;
  397. // Membrane Potential
  398. fp I_Na_tot; // [uA/uF]
  399. fp I_Cl_tot; // [uA/uF]
  400. fp I_Ca_tot;
  401. fp I_tot;
  402. //=====================================================================
  403. // EXECUTION
  404. //=====================================================================
  405. // input parameters
  406. cycleLength = d_params[15];
  407. // variable references
  408. offset_1 = valu_offset;
  409. offset_2 = valu_offset+1;
  410. offset_3 = valu_offset+2;
  411. offset_4 = valu_offset+3;
  412. offset_5 = valu_offset+4;
  413. offset_6 = valu_offset+5;
  414. offset_7 = valu_offset+6;
  415. offset_8 = valu_offset+7;
  416. offset_9 = valu_offset+8;
  417. offset_10 = valu_offset+9;
  418. offset_11 = valu_offset+10;
  419. offset_12 = valu_offset+11;
  420. offset_13 = valu_offset+12;
  421. offset_14 = valu_offset+13;
  422. offset_15 = valu_offset+14;
  423. offset_16 = valu_offset+15;
  424. offset_17 = valu_offset+16;
  425. offset_18 = valu_offset+17;
  426. offset_19 = valu_offset+18;
  427. offset_20 = valu_offset+19;
  428. offset_21 = valu_offset+20;
  429. offset_22 = valu_offset+21;
  430. offset_23 = valu_offset+22;
  431. offset_24 = valu_offset+23;
  432. offset_25 = valu_offset+24;
  433. offset_26 = valu_offset+25;
  434. offset_27 = valu_offset+26;
  435. offset_28 = valu_offset+27;
  436. offset_29 = valu_offset+28;
  437. offset_30 = valu_offset+29;
  438. offset_31 = valu_offset+30;
  439. offset_32 = valu_offset+31;
  440. offset_33 = valu_offset+32;
  441. offset_34 = valu_offset+33;
  442. offset_35 = valu_offset+34;
  443. offset_36 = valu_offset+35;
  444. offset_37 = valu_offset+36;
  445. offset_38 = valu_offset+37;
  446. offset_39 = valu_offset+38;
  447. offset_40 = valu_offset+39;
  448. offset_41 = valu_offset+40;
  449. offset_42 = valu_offset+41;
  450. offset_43 = valu_offset+42;
  451. offset_44 = valu_offset+43;
  452. offset_45 = valu_offset+44;
  453. offset_46 = valu_offset+45;
  454. // stored input array
  455. d_initvalu_1 = d_initvalu[offset_1];
  456. d_initvalu_2 = d_initvalu[offset_2];
  457. d_initvalu_3 = d_initvalu[offset_3];
  458. d_initvalu_4 = d_initvalu[offset_4];
  459. d_initvalu_5 = d_initvalu[offset_5];
  460. d_initvalu_6 = d_initvalu[offset_6];
  461. d_initvalu_7 = d_initvalu[offset_7];
  462. d_initvalu_8 = d_initvalu[offset_8];
  463. d_initvalu_9 = d_initvalu[offset_9];
  464. d_initvalu_10 = d_initvalu[offset_10];
  465. d_initvalu_11 = d_initvalu[offset_11];
  466. d_initvalu_12 = d_initvalu[offset_12];
  467. d_initvalu_13 = d_initvalu[offset_13];
  468. d_initvalu_14 = d_initvalu[offset_14];
  469. d_initvalu_15 = d_initvalu[offset_15];
  470. d_initvalu_16 = d_initvalu[offset_16];
  471. d_initvalu_17 = d_initvalu[offset_17];
  472. d_initvalu_18 = d_initvalu[offset_18];
  473. d_initvalu_19 = d_initvalu[offset_19];
  474. d_initvalu_20 = d_initvalu[offset_20];
  475. d_initvalu_21 = d_initvalu[offset_21];
  476. // d_initvalu_22 = d_initvalu[offset_22];
  477. d_initvalu_23 = d_initvalu[offset_23];
  478. d_initvalu_24 = d_initvalu[offset_24];
  479. d_initvalu_25 = d_initvalu[offset_25];
  480. d_initvalu_26 = d_initvalu[offset_26];
  481. d_initvalu_27 = d_initvalu[offset_27];
  482. d_initvalu_28 = d_initvalu[offset_28];
  483. d_initvalu_29 = d_initvalu[offset_29];
  484. d_initvalu_30 = d_initvalu[offset_30];
  485. d_initvalu_31 = d_initvalu[offset_31];
  486. d_initvalu_32 = d_initvalu[offset_32];
  487. d_initvalu_33 = d_initvalu[offset_33];
  488. d_initvalu_34 = d_initvalu[offset_34];
  489. d_initvalu_35 = d_initvalu[offset_35];
  490. d_initvalu_36 = d_initvalu[offset_36];
  491. d_initvalu_37 = d_initvalu[offset_37];
  492. d_initvalu_38 = d_initvalu[offset_38];
  493. d_initvalu_39 = d_initvalu[offset_39];
  494. d_initvalu_40 = d_initvalu[offset_40];
  495. // d_initvalu_41 = d_initvalu[offset_41];
  496. // d_initvalu_42 = d_initvalu[offset_42];
  497. // d_initvalu_43 = d_initvalu[offset_43];
  498. // d_initvalu_44 = d_initvalu[offset_44];
  499. // d_initvalu_45 = d_initvalu[offset_45];
  500. // d_initvalu_46 = d_initvalu[offset_46];
  501. // matlab constants undefined in c
  502. pi = 3.1416;
  503. // Constants
  504. R = 8314; // [J/kmol*K]
  505. Frdy = 96485; // [C/mol]
  506. Temp = 310; // [K] 310
  507. FoRT = Frdy/R/Temp; //
  508. Cmem = 1.3810e-10; // [F] membrane capacitance
  509. Qpow = (Temp-310)/10;
  510. // Cell geometry
  511. cellLength = 100; // cell length [um]
  512. cellRadius = 10.25; // cell radius [um]
  513. // junctionLength = 160e-3; // junc length [um]
  514. // junctionRadius = 15e-3; // junc radius [um]
  515. // distSLcyto = 0.45; // dist. SL to cytosol [um]
  516. // distJuncSL = 0.5; // dist. junc to SL [um]
  517. // DcaJuncSL = 1.64e-6; // Dca junc to SL [cm^2/sec]
  518. // DcaSLcyto = 1.22e-6; // Dca SL to cyto [cm^2/sec]
  519. // DnaJuncSL = 1.09e-5; // Dna junc to SL [cm^2/sec]
  520. // DnaSLcyto = 1.79e-5; // Dna SL to cyto [cm^2/sec]
  521. Vcell = pi*pow(cellRadius,2)*cellLength*1e-15; // [L]
  522. Vmyo = 0.65*Vcell;
  523. Vsr = 0.035*Vcell;
  524. Vsl = 0.02*Vcell;
  525. Vjunc = 0.0539*0.01*Vcell;
  526. // SAjunc = 20150*pi*2*junctionLength*junctionRadius; // [um^2]
  527. // SAsl = pi*2*cellRadius*cellLength; // [um^2]
  528. J_ca_juncsl = 1/1.2134e12; // [L/msec]
  529. J_ca_slmyo = 1/2.68510e11; // [L/msec]
  530. J_na_juncsl = 1/(1.6382e12/3*100); // [L/msec]
  531. J_na_slmyo = 1/(1.8308e10/3*100); // [L/msec]
  532. // Fractional currents in compartments
  533. Fjunc = 0.11;
  534. Fsl = 1-Fjunc;
  535. Fjunc_CaL = 0.9;
  536. Fsl_CaL = 1-Fjunc_CaL;
  537. // Fixed ion concentrations
  538. Cli = 15; // Intracellular Cl [mM]
  539. Clo = 150; // Extracellular Cl [mM]
  540. Ko = 5.4; // Extracellular K [mM]
  541. Nao = 140; // Extracellular Na [mM]
  542. Cao = 1.8; // Extracellular Ca [mM]
  543. Mgi = 1; // Intracellular Mg [mM]
  544. // Nernst Potentials
  545. ena_junc = (1/FoRT)*log(Nao/d_initvalu_32); // [mV]
  546. ena_sl = (1/FoRT)*log(Nao/d_initvalu_33); // [mV]
  547. ek = (1/FoRT)*log(Ko/d_initvalu_35); // [mV]
  548. eca_junc = (1/FoRT/2)*log(Cao/d_initvalu_36); // [mV]
  549. eca_sl = (1/FoRT/2)*log(Cao/d_initvalu_37); // [mV]
  550. ecl = (1/FoRT)*log(Cli/Clo); // [mV]
  551. // Na transport parameters
  552. GNa = 16.0; // [mS/uF]
  553. GNaB = 0.297e-3; // [mS/uF]
  554. IbarNaK = 1.90719; // [uA/uF]
  555. KmNaip = 11; // [mM]
  556. KmKo = 1.5; // [mM]
  557. // Q10NaK = 1.63;
  558. // Q10KmNai = 1.39;
  559. // K current parameters
  560. pNaK = 0.01833;
  561. GtoSlow = 0.06; // [mS/uF]
  562. GtoFast = 0.02; // [mS/uF]
  563. gkp = 0.001;
  564. // Cl current parameters
  565. GClCa = 0.109625; // [mS/uF]
  566. GClB = 9e-3; // [mS/uF]
  567. KdClCa = 100e-3; // [mM]
  568. // I_Ca parameters
  569. pNa = 1.5e-8; // [cm/sec]
  570. pCa = 5.4e-4; // [cm/sec]
  571. pK = 2.7e-7; // [cm/sec]
  572. // KmCa = 0.6e-3; // [mM]
  573. Q10CaL = 1.8;
  574. // Ca transport parameters
  575. IbarNCX = 9.0; // [uA/uF]
  576. KmCai = 3.59e-3; // [mM]
  577. KmCao = 1.3; // [mM]
  578. KmNai = 12.29; // [mM]
  579. KmNao = 87.5; // [mM]
  580. ksat = 0.27; // [none]
  581. nu = 0.35; // [none]
  582. Kdact = 0.256e-3; // [mM]
  583. Q10NCX = 1.57; // [none]
  584. IbarSLCaP = 0.0673; // [uA/uF]
  585. KmPCa = 0.5e-3; // [mM]
  586. GCaB = 2.513e-4; // [uA/uF]
  587. Q10SLCaP = 2.35; // [none]
  588. // SR flux parameters
  589. Q10SRCaP = 2.6; // [none]
  590. Vmax_SRCaP = 2.86e-4; // [mM/msec] (mmol/L cytosol/msec)
  591. Kmf = 0.246e-3; // [mM]
  592. Kmr = 1.7; // [mM]L cytosol
  593. hillSRCaP = 1.787; // [mM]
  594. ks = 25; // [1/ms]
  595. koCa = 10; // [mM^-2 1/ms]
  596. kom = 0.06; // [1/ms]
  597. kiCa = 0.5; // [1/mM/ms]
  598. kim = 0.005; // [1/ms]
  599. ec50SR = 0.45; // [mM]
  600. // Buffering parameters
  601. Bmax_Naj = 7.561; // [mM]
  602. Bmax_Nasl = 1.65; // [mM]
  603. koff_na = 1e-3; // [1/ms]
  604. kon_na = 0.1e-3; // [1/mM/ms]
  605. Bmax_TnClow = 70e-3; // [mM], TnC low affinity
  606. koff_tncl = 19.6e-3; // [1/ms]
  607. kon_tncl = 32.7; // [1/mM/ms]
  608. Bmax_TnChigh = 140e-3; // [mM], TnC high affinity
  609. koff_tnchca = 0.032e-3; // [1/ms]
  610. kon_tnchca = 2.37; // [1/mM/ms]
  611. koff_tnchmg = 3.33e-3; // [1/ms]
  612. kon_tnchmg = 3e-3; // [1/mM/ms]
  613. // Bmax_CaM = 24e-3; // [mM], CaM buffering
  614. // koff_cam = 238e-3; // [1/ms]
  615. // kon_cam = 34; // [1/mM/ms]
  616. Bmax_myosin = 140e-3; // [mM], Myosin buffering
  617. koff_myoca = 0.46e-3; // [1/ms]
  618. kon_myoca = 13.8; // [1/mM/ms]
  619. koff_myomg = 0.057e-3; // [1/ms]
  620. kon_myomg = 0.0157; // [1/mM/ms]
  621. Bmax_SR = 19*0.9e-3; // [mM]
  622. koff_sr = 60e-3; // [1/ms]
  623. kon_sr = 100; // [1/mM/ms]
  624. Bmax_SLlowsl = 37.38e-3*Vmyo/Vsl; // [mM], SL buffering
  625. Bmax_SLlowj = 4.62e-3*Vmyo/Vjunc*0.1; // [mM]
  626. koff_sll = 1300e-3; // [1/ms]
  627. kon_sll = 100; // [1/mM/ms]
  628. Bmax_SLhighsl = 13.35e-3*Vmyo/Vsl; // [mM]
  629. Bmax_SLhighj = 1.65e-3*Vmyo/Vjunc*0.1; // [mM]
  630. koff_slh = 30e-3; // [1/ms]
  631. kon_slh = 100; // [1/mM/ms]
  632. Bmax_Csqn = 2.7; // 140e-3*Vmyo/Vsr; [mM]
  633. koff_csqn = 65; // [1/ms]
  634. kon_csqn = 100; // [1/mM/ms]
  635. // I_Na: Fast Na Current
  636. am = 0.32*(d_initvalu_39+47.13)/(1-exp(-0.1*(d_initvalu_39+47.13)));
  637. bm = 0.08*exp(-d_initvalu_39/11);
  638. if(d_initvalu_39 >= -40){
  639. ah = 0; aj = 0;
  640. bh = 1/(0.13*(1+exp(-(d_initvalu_39+10.66)/11.1)));
  641. bj = 0.3*exp(-2.535e-7*d_initvalu_39)/(1+exp(-0.1*(d_initvalu_39+32)));
  642. }
  643. else{
  644. ah = 0.135*exp((80+d_initvalu_39)/-6.8);
  645. bh = 3.56*exp(0.079*d_initvalu_39)+3.1e5*exp(0.35*d_initvalu_39);
  646. aj = (-127140*exp(0.2444*d_initvalu_39)-3.474e-5*exp(-0.04391*d_initvalu_39))*(d_initvalu_39+37.78)/(1+exp(0.311*(d_initvalu_39+79.23)));
  647. bj = 0.1212*exp(-0.01052*d_initvalu_39)/(1+exp(-0.1378*(d_initvalu_39+40.14)));
  648. }
  649. d_finavalu[offset_1] = am*(1-d_initvalu_1)-bm*d_initvalu_1;
  650. d_finavalu[offset_2] = ah*(1-d_initvalu_2)-bh*d_initvalu_2;
  651. d_finavalu[offset_3] = aj*(1-d_initvalu_3)-bj*d_initvalu_3;
  652. I_Na_junc = Fjunc*GNa*pow(d_initvalu_1,3)*d_initvalu_2*d_initvalu_3*(d_initvalu_39-ena_junc);
  653. I_Na_sl = Fsl*GNa*pow(d_initvalu_1,3)*d_initvalu_2*d_initvalu_3*(d_initvalu_39-ena_sl);
  654. // I_Na = I_Na_junc+I_Na_sl;
  655. // I_nabk: Na Background Current
  656. I_nabk_junc = Fjunc*GNaB*(d_initvalu_39-ena_junc);
  657. I_nabk_sl = Fsl*GNaB*(d_initvalu_39-ena_sl);
  658. // I_nabk = I_nabk_junc+I_nabk_sl;
  659. // I_nak: Na/K Pump Current
  660. sigma = (exp(Nao/67.3)-1)/7;
  661. fnak = 1/(1+0.1245*exp(-0.1*d_initvalu_39*FoRT)+0.0365*sigma*exp(-d_initvalu_39*FoRT));
  662. I_nak_junc = Fjunc*IbarNaK*fnak*Ko /(1+pow((KmNaip/d_initvalu_32),4)) /(Ko+KmKo);
  663. I_nak_sl = Fsl*IbarNaK*fnak*Ko /(1+pow((KmNaip/d_initvalu_33),4)) /(Ko+KmKo);
  664. I_nak = I_nak_junc+I_nak_sl;
  665. // I_kr: Rapidly Activating K Current
  666. gkr = 0.03*sqrt(Ko/5.4);
  667. xrss = 1/(1+exp(-(d_initvalu_39+50)/7.5));
  668. tauxr = 1/(0.00138*(d_initvalu_39+7)/(1-exp(-0.123*(d_initvalu_39+7)))+6.1e-4*(d_initvalu_39+10)/(exp(0.145*(d_initvalu_39+10))-1));
  669. d_finavalu[offset_12] = (xrss-d_initvalu_12)/tauxr;
  670. rkr = 1/(1+exp((d_initvalu_39+33)/22.4));
  671. I_kr = gkr*d_initvalu_12*rkr*(d_initvalu_39-ek);
  672. // I_ks: Slowly Activating K Current
  673. pcaks_junc = -log10(d_initvalu_36)+3.0;
  674. pcaks_sl = -log10(d_initvalu_37)+3.0;
  675. gks_junc = 0.07*(0.057 +0.19/(1+ exp((-7.2+pcaks_junc)/0.6)));
  676. gks_sl = 0.07*(0.057 +0.19/(1+ exp((-7.2+pcaks_sl)/0.6)));
  677. eks = (1/FoRT)*log((Ko+pNaK*Nao)/(d_initvalu_35+pNaK*d_initvalu_34));
  678. xsss = 1/(1+exp(-(d_initvalu_39-1.5)/16.7));
  679. tauxs = 1/(7.19e-5*(d_initvalu_39+30)/(1-exp(-0.148*(d_initvalu_39+30)))+1.31e-4*(d_initvalu_39+30)/(exp(0.0687*(d_initvalu_39+30))-1));
  680. d_finavalu[offset_13] = (xsss-d_initvalu_13)/tauxs;
  681. I_ks_junc = Fjunc*gks_junc*pow(d_initvalu_12,2)*(d_initvalu_39-eks);
  682. I_ks_sl = Fsl*gks_sl*pow(d_initvalu_13,2)*(d_initvalu_39-eks);
  683. I_ks = I_ks_junc+I_ks_sl;
  684. // I_kp: Plateau K current
  685. kp_kp = 1/(1+exp(7.488-d_initvalu_39/5.98));
  686. I_kp_junc = Fjunc*gkp*kp_kp*(d_initvalu_39-ek);
  687. I_kp_sl = Fsl*gkp*kp_kp*(d_initvalu_39-ek);
  688. I_kp = I_kp_junc+I_kp_sl;
  689. // I_to: Transient Outward K Current (slow and fast components)
  690. xtoss = 1/(1+exp(-(d_initvalu_39+3.0)/15));
  691. ytoss = 1/(1+exp((d_initvalu_39+33.5)/10));
  692. rtoss = 1/(1+exp((d_initvalu_39+33.5)/10));
  693. tauxtos = 9/(1+exp((d_initvalu_39+3.0)/15))+0.5;
  694. tauytos = 3e3/(1+exp((d_initvalu_39+60.0)/10))+30;
  695. taurtos = 2800/(1+exp((d_initvalu_39+60.0)/10))+220;
  696. d_finavalu[offset_8] = (xtoss-d_initvalu_8)/tauxtos;
  697. d_finavalu[offset_9] = (ytoss-d_initvalu_9)/tauytos;
  698. d_finavalu[offset_40]= (rtoss-d_initvalu_40)/taurtos;
  699. I_tos = GtoSlow*d_initvalu_8*(d_initvalu_9+0.5*d_initvalu_40)*(d_initvalu_39-ek); // [uA/uF]
  700. //
  701. tauxtof = 3.5*exp(-d_initvalu_39*d_initvalu_39/30/30)+1.5;
  702. tauytof = 20.0/(1+exp((d_initvalu_39+33.5)/10))+20.0;
  703. d_finavalu[offset_10] = (xtoss-d_initvalu_10)/tauxtof;
  704. d_finavalu[offset_11] = (ytoss-d_initvalu_11)/tauytof;
  705. I_tof = GtoFast*d_initvalu_10*d_initvalu_11*(d_initvalu_39-ek);
  706. I_to = I_tos + I_tof;
  707. // I_ki: Time-Independent K Current
  708. aki = 1.02/(1+exp(0.2385*(d_initvalu_39-ek-59.215)));
  709. bki =(0.49124*exp(0.08032*(d_initvalu_39+5.476-ek)) + exp(0.06175*(d_initvalu_39-ek-594.31))) /(1 + exp(-0.5143*(d_initvalu_39-ek+4.753)));
  710. kiss = aki/(aki+bki);
  711. I_ki = 0.9*sqrt(Ko/5.4)*kiss*(d_initvalu_39-ek);
  712. // I_ClCa: Ca-activated Cl Current, I_Clbk: background Cl Current
  713. I_ClCa_junc = Fjunc*GClCa/(1+KdClCa/d_initvalu_36)*(d_initvalu_39-ecl);
  714. I_ClCa_sl = Fsl*GClCa/(1+KdClCa/d_initvalu_37)*(d_initvalu_39-ecl);
  715. I_ClCa = I_ClCa_junc+I_ClCa_sl;
  716. I_Clbk = GClB*(d_initvalu_39-ecl);
  717. // I_Ca: L-type Calcium Current
  718. dss = 1/(1+exp(-(d_initvalu_39+14.5)/6.0));
  719. taud = dss*(1-exp(-(d_initvalu_39+14.5)/6.0))/(0.035*(d_initvalu_39+14.5));
  720. fss = 1/(1+exp((d_initvalu_39+35.06)/3.6))+0.6/(1+exp((50-d_initvalu_39)/20));
  721. tauf = 1/(0.0197*exp(-pow(0.0337*(d_initvalu_39+14.5),2))+0.02);
  722. d_finavalu[offset_4] = (dss-d_initvalu_4)/taud;
  723. d_finavalu[offset_5] = (fss-d_initvalu_5)/tauf;
  724. d_finavalu[offset_6] = 1.7*d_initvalu_36*(1-d_initvalu_6)-11.9e-3*d_initvalu_6; // fCa_junc
  725. d_finavalu[offset_7] = 1.7*d_initvalu_37*(1-d_initvalu_7)-11.9e-3*d_initvalu_7; // fCa_sl
  726. //
  727. ibarca_j = pCa*4*(d_initvalu_39*Frdy*FoRT) * (0.341*d_initvalu_36*exp(2*d_initvalu_39*FoRT)-0.341*Cao) /(exp(2*d_initvalu_39*FoRT)-1);
  728. ibarca_sl = pCa*4*(d_initvalu_39*Frdy*FoRT) * (0.341*d_initvalu_37*exp(2*d_initvalu_39*FoRT)-0.341*Cao) /(exp(2*d_initvalu_39*FoRT)-1);
  729. ibark = pK*(d_initvalu_39*Frdy*FoRT)*(0.75*d_initvalu_35*exp(d_initvalu_39*FoRT)-0.75*Ko) /(exp(d_initvalu_39*FoRT)-1);
  730. ibarna_j = pNa*(d_initvalu_39*Frdy*FoRT) *(0.75*d_initvalu_32*exp(d_initvalu_39*FoRT)-0.75*Nao) /(exp(d_initvalu_39*FoRT)-1);
  731. ibarna_sl = pNa*(d_initvalu_39*Frdy*FoRT) *(0.75*d_initvalu_33*exp(d_initvalu_39*FoRT)-0.75*Nao) /(exp(d_initvalu_39*FoRT)-1);
  732. I_Ca_junc = (Fjunc_CaL*ibarca_j*d_initvalu_4*d_initvalu_5*(1-d_initvalu_6)*pow(Q10CaL,Qpow))*0.45;
  733. I_Ca_sl = (Fsl_CaL*ibarca_sl*d_initvalu_4*d_initvalu_5*(1-d_initvalu_7)*pow(Q10CaL,Qpow))*0.45;
  734. I_Ca = I_Ca_junc+I_Ca_sl;
  735. d_finavalu[offset_43]=-I_Ca*Cmem/(Vmyo*2*Frdy)*1e3;
  736. I_CaK = (ibark*d_initvalu_4*d_initvalu_5*(Fjunc_CaL*(1-d_initvalu_6)+Fsl_CaL*(1-d_initvalu_7))*pow(Q10CaL,Qpow))*0.45;
  737. I_CaNa_junc = (Fjunc_CaL*ibarna_j*d_initvalu_4*d_initvalu_5*(1-d_initvalu_6)*pow(Q10CaL,Qpow))*0.45;
  738. I_CaNa_sl = (Fsl_CaL*ibarna_sl*d_initvalu_4*d_initvalu_5*(1-d_initvalu_7)*pow(Q10CaL,Qpow))*0.45;
  739. // I_CaNa = I_CaNa_junc+I_CaNa_sl;
  740. // I_Catot = I_Ca+I_CaK+I_CaNa;
  741. // I_ncx: Na/Ca Exchanger flux
  742. Ka_junc = 1/(1+pow((Kdact/d_initvalu_36),3));
  743. Ka_sl = 1/(1+pow((Kdact/d_initvalu_37),3));
  744. s1_junc = exp(nu*d_initvalu_39*FoRT)*pow(d_initvalu_32,3)*Cao;
  745. s1_sl = exp(nu*d_initvalu_39*FoRT)*pow(d_initvalu_33,3)*Cao;
  746. s2_junc = exp((nu-1)*d_initvalu_39*FoRT)*pow(Nao,3)*d_initvalu_36;
  747. s3_junc = (KmCai*pow(Nao,3)*(1+pow((d_initvalu_32/KmNai),3))+pow(KmNao,3)*d_initvalu_36+ pow(KmNai,3)*Cao*(1+d_initvalu_36/KmCai)+KmCao*pow(d_initvalu_32,3)+pow(d_initvalu_32,3)*Cao+pow(Nao,3)*d_initvalu_36)*(1+ksat*exp((nu-1)*d_initvalu_39*FoRT));
  748. s2_sl = exp((nu-1)*d_initvalu_39*FoRT)*pow(Nao,3)*d_initvalu_37;
  749. s3_sl = (KmCai*pow(Nao,3)*(1+pow((d_initvalu_33/KmNai),3)) + pow(KmNao,3)*d_initvalu_37+pow(KmNai,3)*Cao*(1+d_initvalu_37/KmCai)+KmCao*pow(d_initvalu_33,3)+pow(d_initvalu_33,3)*Cao+pow(Nao,3)*d_initvalu_37)*(1+ksat*exp((nu-1)*d_initvalu_39*FoRT));
  750. I_ncx_junc = Fjunc*IbarNCX*pow(Q10NCX,Qpow)*Ka_junc*(s1_junc-s2_junc)/s3_junc;
  751. I_ncx_sl = Fsl*IbarNCX*pow(Q10NCX,Qpow)*Ka_sl*(s1_sl-s2_sl)/s3_sl;
  752. I_ncx = I_ncx_junc+I_ncx_sl;
  753. d_finavalu[offset_45]=2*I_ncx*Cmem/(Vmyo*2*Frdy)*1e3;
  754. // I_pca: Sarcolemmal Ca Pump Current
  755. I_pca_junc = Fjunc*pow(Q10SLCaP,Qpow)*IbarSLCaP*pow(d_initvalu_36,(fp)(1.6))/(pow(KmPCa,(fp)(1.6))+pow(d_initvalu_36,(fp)(1.6)));
  756. I_pca_sl = Fsl*pow(Q10SLCaP,Qpow)*IbarSLCaP*pow(d_initvalu_37,(fp)(1.6))/(pow(KmPCa,(fp)(1.6))+pow(d_initvalu_37,(fp)(1.6)));
  757. I_pca = I_pca_junc+I_pca_sl;
  758. d_finavalu[offset_44]=-I_pca*Cmem/(Vmyo*2*Frdy)*1e3;
  759. // I_cabk: Ca Background Current
  760. I_cabk_junc = Fjunc*GCaB*(d_initvalu_39-eca_junc);
  761. I_cabk_sl = Fsl*GCaB*(d_initvalu_39-eca_sl);
  762. I_cabk = I_cabk_junc+I_cabk_sl;
  763. d_finavalu[offset_46]=-I_cabk*Cmem/(Vmyo*2*Frdy)*1e3;
  764. // SR fluxes: Calcium Release, SR Ca pump, SR Ca leak
  765. MaxSR = 15;
  766. MinSR = 1;
  767. kCaSR = MaxSR - (MaxSR-MinSR)/(1+pow(ec50SR/d_initvalu_31,(fp)(2.5)));
  768. koSRCa = koCa/kCaSR;
  769. kiSRCa = kiCa*kCaSR;
  770. RI = 1-d_initvalu_14-d_initvalu_15-d_initvalu_16;
  771. d_finavalu[offset_14] = (kim*RI-kiSRCa*d_initvalu_36*d_initvalu_14)-(koSRCa*pow(d_initvalu_36,2)*d_initvalu_14-kom*d_initvalu_15); // R
  772. d_finavalu[offset_15] = (koSRCa*pow(d_initvalu_36,2)*d_initvalu_14-kom*d_initvalu_15)-(kiSRCa*d_initvalu_36*d_initvalu_15-kim*d_initvalu_16); // O
  773. d_finavalu[offset_16] = (kiSRCa*d_initvalu_36*d_initvalu_15-kim*d_initvalu_16)-(kom*d_initvalu_16-koSRCa*pow(d_initvalu_36,2)*RI); // I
  774. J_SRCarel = ks*d_initvalu_15*(d_initvalu_31-d_initvalu_36); // [mM/ms]
  775. J_serca = pow(Q10SRCaP,Qpow)*Vmax_SRCaP*(pow((d_initvalu_38/Kmf),hillSRCaP)-pow((d_initvalu_31/Kmr),hillSRCaP))
  776. /(1+pow((d_initvalu_38/Kmf),hillSRCaP)+pow((d_initvalu_31/Kmr),hillSRCaP));
  777. J_SRleak = 5.348e-6*(d_initvalu_31-d_initvalu_36); // [mM/ms]
  778. // Sodium and Calcium Buffering
  779. d_finavalu[offset_17] = kon_na*d_initvalu_32*(Bmax_Naj-d_initvalu_17)-koff_na*d_initvalu_17; // NaBj [mM/ms]
  780. d_finavalu[offset_18] = kon_na*d_initvalu_33*(Bmax_Nasl-d_initvalu_18)-koff_na*d_initvalu_18; // NaBsl [mM/ms]
  781. // Cytosolic Ca Buffers
  782. d_finavalu[offset_19] = kon_tncl*d_initvalu_38*(Bmax_TnClow-d_initvalu_19)-koff_tncl*d_initvalu_19; // TnCL [mM/ms]
  783. d_finavalu[offset_20] = kon_tnchca*d_initvalu_38*(Bmax_TnChigh-d_initvalu_20-d_initvalu_21)-koff_tnchca*d_initvalu_20; // TnCHc [mM/ms]
  784. d_finavalu[offset_21] = kon_tnchmg*Mgi*(Bmax_TnChigh-d_initvalu_20-d_initvalu_21)-koff_tnchmg*d_initvalu_21; // TnCHm [mM/ms]
  785. d_finavalu[offset_22] = 0; // CaM [mM/ms]
  786. d_finavalu[offset_23] = kon_myoca*d_initvalu_38*(Bmax_myosin-d_initvalu_23-d_initvalu_24)-koff_myoca*d_initvalu_23; // Myosin_ca [mM/ms]
  787. d_finavalu[offset_24] = kon_myomg*Mgi*(Bmax_myosin-d_initvalu_23-d_initvalu_24)-koff_myomg*d_initvalu_24; // Myosin_mg [mM/ms]
  788. d_finavalu[offset_25] = kon_sr*d_initvalu_38*(Bmax_SR-d_initvalu_25)-koff_sr*d_initvalu_25; // SRB [mM/ms]
  789. J_CaB_cytosol = d_finavalu[offset_19] + d_finavalu[offset_20] + d_finavalu[offset_21] + d_finavalu[offset_22] + d_finavalu[offset_23] + d_finavalu[offset_24] + d_finavalu[offset_25];
  790. // Junctional and SL Ca Buffers
  791. d_finavalu[offset_26] = kon_sll*d_initvalu_36*(Bmax_SLlowj-d_initvalu_26)-koff_sll*d_initvalu_26; // SLLj [mM/ms]
  792. d_finavalu[offset_27] = kon_sll*d_initvalu_37*(Bmax_SLlowsl-d_initvalu_27)-koff_sll*d_initvalu_27; // SLLsl [mM/ms]
  793. d_finavalu[offset_28] = kon_slh*d_initvalu_36*(Bmax_SLhighj-d_initvalu_28)-koff_slh*d_initvalu_28; // SLHj [mM/ms]
  794. d_finavalu[offset_29] = kon_slh*d_initvalu_37*(Bmax_SLhighsl-d_initvalu_29)-koff_slh*d_initvalu_29; // SLHsl [mM/ms]
  795. J_CaB_junction = d_finavalu[offset_26]+d_finavalu[offset_28];
  796. J_CaB_sl = d_finavalu[offset_27]+d_finavalu[offset_29];
  797. // SR Ca Concentrations
  798. d_finavalu[offset_30] = kon_csqn*d_initvalu_31*(Bmax_Csqn-d_initvalu_30)-koff_csqn*d_initvalu_30; // Csqn [mM/ms]
  799. oneovervsr = 1/Vsr;
  800. d_finavalu[offset_31] = J_serca*Vmyo*oneovervsr-(J_SRleak*Vmyo*oneovervsr+J_SRCarel)-d_finavalu[offset_30]; // Ca_sr [mM/ms] %Ratio 3 leak current
  801. // Sodium Concentrations
  802. I_Na_tot_junc = I_Na_junc+I_nabk_junc+3*I_ncx_junc+3*I_nak_junc+I_CaNa_junc; // [uA/uF]
  803. I_Na_tot_sl = I_Na_sl+I_nabk_sl+3*I_ncx_sl+3*I_nak_sl+I_CaNa_sl; // [uA/uF]
  804. d_finavalu[offset_32] = -I_Na_tot_junc*Cmem/(Vjunc*Frdy)+J_na_juncsl/Vjunc*(d_initvalu_33-d_initvalu_32)-d_finavalu[offset_17];
  805. oneovervsl = 1/Vsl;
  806. d_finavalu[offset_33] = -I_Na_tot_sl*Cmem*oneovervsl/Frdy+J_na_juncsl*oneovervsl*(d_initvalu_32-d_initvalu_33)+J_na_slmyo*oneovervsl*(d_initvalu_34-d_initvalu_33)-d_finavalu[offset_18];
  807. d_finavalu[offset_34] = J_na_slmyo/Vmyo*(d_initvalu_33-d_initvalu_34); // [mM/msec]
  808. // Potassium Concentration
  809. I_K_tot = I_to+I_kr+I_ks+I_ki-2*I_nak+I_CaK+I_kp; // [uA/uF]
  810. d_finavalu[offset_35] = 0; // [mM/msec]
  811. // Calcium Concentrations
  812. I_Ca_tot_junc = I_Ca_junc+I_cabk_junc+I_pca_junc-2*I_ncx_junc; // [uA/uF]
  813. I_Ca_tot_sl = I_Ca_sl+I_cabk_sl+I_pca_sl-2*I_ncx_sl; // [uA/uF]
  814. d_finavalu[offset_36] = -I_Ca_tot_junc*Cmem/(Vjunc*2*Frdy)+J_ca_juncsl/Vjunc*(d_initvalu_37-d_initvalu_36)
  815. - J_CaB_junction+(J_SRCarel)*Vsr/Vjunc+J_SRleak*Vmyo/Vjunc; // Ca_j
  816. d_finavalu[offset_37] = -I_Ca_tot_sl*Cmem/(Vsl*2*Frdy)+J_ca_juncsl/Vsl*(d_initvalu_36-d_initvalu_37)
  817. + J_ca_slmyo/Vsl*(d_initvalu_38-d_initvalu_37)-J_CaB_sl; // Ca_sl
  818. d_finavalu[offset_38] = -J_serca-J_CaB_cytosol +J_ca_slmyo/Vmyo*(d_initvalu_37-d_initvalu_38);
  819. // junc_sl=J_ca_juncsl/Vsl*(d_initvalu_36-d_initvalu_37);
  820. // sl_junc=J_ca_juncsl/Vjunc*(d_initvalu_37-d_initvalu_36);
  821. // sl_myo=J_ca_slmyo/Vsl*(d_initvalu_38-d_initvalu_37);
  822. // myo_sl=J_ca_slmyo/Vmyo*(d_initvalu_37-d_initvalu_38);
  823. // Simulation type
  824. state = 1;
  825. switch(state){
  826. case 0:
  827. I_app = 0;
  828. break;
  829. case 1: // pace w/ current injection at cycleLength 'cycleLength'
  830. if(fmod(timeinst,cycleLength) <= 5){
  831. I_app = 9.5;
  832. }
  833. else{
  834. I_app = 0.0;
  835. }
  836. break;
  837. case 2:
  838. V_hold = -55;
  839. V_test = 0;
  840. if(timeinst>0.5 & timeinst<200.5){
  841. V_clamp = V_test;
  842. }
  843. else{
  844. V_clamp = V_hold;
  845. }
  846. R_clamp = 0.04;
  847. I_app = (V_clamp-d_initvalu_39)/R_clamp;
  848. break;
  849. }
  850. // Membrane Potential
  851. I_Na_tot = I_Na_tot_junc + I_Na_tot_sl; // [uA/uF]
  852. I_Cl_tot = I_ClCa+I_Clbk; // [uA/uF]
  853. I_Ca_tot = I_Ca_tot_junc+I_Ca_tot_sl;
  854. I_tot = I_Na_tot+I_Cl_tot+I_Ca_tot+I_K_tot;
  855. d_finavalu[offset_39] = -(I_tot-I_app);
  856. // Set unused output values to 0 (MATLAB does it by default)
  857. d_finavalu[offset_41] = 0;
  858. d_finavalu[offset_42] = 0;
  859. }
  860. //========================================================================================================================================================================================================200
  861. // KERNEL_CAM
  862. //========================================================================================================================================================================================================200
  863. void
  864. kernel_cam( fp timeinst,
  865. __global fp *d_initvalu,
  866. __global fp *d_finavalu,
  867. int valu_offset,
  868. __global fp *d_params,
  869. int params_offset,
  870. __global fp *d_com,
  871. int com_offset,
  872. fp Ca){
  873. //=====================================================================
  874. // VARIABLES
  875. //=====================================================================
  876. // inputs
  877. // fp CaMtot;
  878. fp Btot;
  879. fp CaMKIItot;
  880. fp CaNtot;
  881. fp PP1tot;
  882. fp K;
  883. fp Mg;
  884. // variable references
  885. int offset_1;
  886. int offset_2;
  887. int offset_3;
  888. int offset_4;
  889. int offset_5;
  890. int offset_6;
  891. int offset_7;
  892. int offset_8;
  893. int offset_9;
  894. int offset_10;
  895. int offset_11;
  896. int offset_12;
  897. int offset_13;
  898. int offset_14;
  899. int offset_15;
  900. // decoding input array
  901. fp CaM;
  902. fp Ca2CaM;
  903. fp Ca4CaM;
  904. fp CaMB;
  905. fp Ca2CaMB;
  906. fp Ca4CaMB;
  907. fp Pb2;
  908. fp Pb;
  909. fp Pt;
  910. fp Pt2;
  911. fp Pa;
  912. fp Ca4CaN;
  913. fp CaMCa4CaN;
  914. fp Ca2CaMCa4CaN;
  915. fp Ca4CaMCa4CaN;
  916. // Ca/CaM parameters
  917. fp Kd02; // [uM^2]
  918. fp Kd24; // [uM^2]
  919. fp k20; // [s^-1]
  920. fp k02; // [uM^-2 s^-1]
  921. fp k42; // [s^-1]
  922. fp k24; // [uM^-2 s^-1]
  923. // CaM buffering (B) parameters
  924. fp k0Boff; // [s^-1]
  925. fp k0Bon; // [uM^-1 s^-1] kon = koff/Kd
  926. fp k2Boff; // [s^-1]
  927. fp k2Bon; // [uM^-1 s^-1]
  928. fp k4Boff; // [s^-1]
  929. fp k4Bon; // [uM^-1 s^-1]
  930. // using thermodynamic constraints
  931. fp k20B; // [s^-1] thermo constraint on loop 1
  932. fp k02B; // [uM^-2 s^-1]
  933. fp k42B; // [s^-1] thermo constraint on loop 2
  934. fp k24B; // [uM^-2 s^-1]
  935. // Wi Wa Wt Wp
  936. fp kbi; // [s^-1] (Ca4CaM dissocation from Wb)
  937. fp kib; // [uM^-1 s^-1]
  938. fp kpp1; // [s^-1] (PP1-dep dephosphorylation rates)
  939. fp Kmpp1; // [uM]
  940. fp kib2;
  941. fp kb2i;
  942. fp kb24;
  943. fp kb42;
  944. fp kta; // [s^-1] (Ca4CaM dissociation from Wt)
  945. fp kat; // [uM^-1 s^-1] (Ca4CaM reassociation with Wa)
  946. fp kt42;
  947. fp kt24;
  948. fp kat2;
  949. fp kt2a;
  950. // CaN parameters
  951. fp kcanCaoff; // [s^-1]
  952. fp kcanCaon; // [uM^-1 s^-1]
  953. fp kcanCaM4on; // [uM^-1 s^-1]
  954. fp kcanCaM4off; // [s^-1]
  955. fp kcanCaM2on;
  956. fp kcanCaM2off;
  957. fp kcanCaM0on;
  958. fp kcanCaM0off;
  959. fp k02can;
  960. fp k20can;
  961. fp k24can;
  962. fp k42can;
  963. // CaM Reaction fluxes
  964. fp rcn02;
  965. fp rcn24;
  966. // CaM buffer fluxes
  967. fp B;
  968. fp rcn02B;
  969. fp rcn24B;
  970. fp rcn0B;
  971. fp rcn2B;
  972. fp rcn4B;
  973. // CaN reaction fluxes
  974. fp Ca2CaN;
  975. fp rcnCa4CaN;
  976. fp rcn02CaN;
  977. fp rcn24CaN;
  978. fp rcn0CaN;
  979. fp rcn2CaN;
  980. fp rcn4CaN;
  981. // CaMKII reaction fluxes
  982. fp Pix;
  983. fp rcnCKib2;
  984. fp rcnCKb2b;
  985. fp rcnCKib;
  986. fp T;
  987. fp kbt;
  988. fp rcnCKbt;
  989. fp rcnCKtt2;
  990. fp rcnCKta;
  991. fp rcnCKt2a;
  992. fp rcnCKt2b2;
  993. fp rcnCKai;
  994. // CaM equations
  995. fp dCaM;
  996. fp dCa2CaM;
  997. fp dCa4CaM;
  998. fp dCaMB;
  999. fp dCa2CaMB;
  1000. fp dCa4CaMB;
  1001. // CaMKII equations
  1002. fp dPb2; // Pb2
  1003. fp dPb; // Pb
  1004. fp dPt; // Pt
  1005. fp dPt2; // Pt2
  1006. fp dPa; // Pa
  1007. // CaN equations
  1008. fp dCa4CaN; // Ca4CaN
  1009. fp dCaMCa4CaN; // CaMCa4CaN
  1010. fp dCa2CaMCa4CaN; // Ca2CaMCa4CaN
  1011. fp dCa4CaMCa4CaN; // Ca4CaMCa4CaN
  1012. //=====================================================================
  1013. // EXECUTION
  1014. //=====================================================================
  1015. // inputs
  1016. // CaMtot = d_params[params_offset];
  1017. Btot = d_params[params_offset+1];
  1018. CaMKIItot = d_params[params_offset+2];
  1019. CaNtot = d_params[params_offset+3];
  1020. PP1tot = d_params[params_offset+4];
  1021. K = d_params[16];
  1022. Mg = d_params[17];
  1023. // variable references
  1024. offset_1 = valu_offset;
  1025. offset_2 = valu_offset+1;
  1026. offset_3 = valu_offset+2;
  1027. offset_4 = valu_offset+3;
  1028. offset_5 = valu_offset+4;
  1029. offset_6 = valu_offset+5;
  1030. offset_7 = valu_offset+6;
  1031. offset_8 = valu_offset+7;
  1032. offset_9 = valu_offset+8;
  1033. offset_10 = valu_offset+9;
  1034. offset_11 = valu_offset+10;
  1035. offset_12 = valu_offset+11;
  1036. offset_13 = valu_offset+12;
  1037. offset_14 = valu_offset+13;
  1038. offset_15 = valu_offset+14;
  1039. // decoding input array
  1040. CaM = d_initvalu[offset_1];
  1041. Ca2CaM = d_initvalu[offset_2];
  1042. Ca4CaM = d_initvalu[offset_3];
  1043. CaMB = d_initvalu[offset_4];
  1044. Ca2CaMB = d_initvalu[offset_5];
  1045. Ca4CaMB = d_initvalu[offset_6];
  1046. Pb2 = d_initvalu[offset_7];
  1047. Pb = d_initvalu[offset_8];
  1048. Pt = d_initvalu[offset_9];
  1049. Pt2 = d_initvalu[offset_10];
  1050. Pa = d_initvalu[offset_11];
  1051. Ca4CaN = d_initvalu[offset_12];
  1052. CaMCa4CaN = d_initvalu[offset_13];
  1053. Ca2CaMCa4CaN = d_initvalu[offset_14];
  1054. Ca4CaMCa4CaN = d_initvalu[offset_15];
  1055. // Ca/CaM parameters
  1056. if (Mg <= 1){
  1057. Kd02 = 0.0025*(1+K/0.94-Mg/0.012)*(1+K/8.1+Mg/0.022); // [uM^2]
  1058. Kd24 = 0.128*(1+K/0.64+Mg/0.0014)*(1+K/13.0-Mg/0.153); // [uM^2]
  1059. }
  1060. else{
  1061. Kd02 = 0.0025*(1+K/0.94-1/0.012+(Mg-1)/0.060)*(1+K/8.1+1/0.022+(Mg-1)/0.068); // [uM^2]
  1062. Kd24 = 0.128*(1+K/0.64+1/0.0014+(Mg-1)/0.005)*(1+K/13.0-1/0.153+(Mg-1)/0.150); // [uM^2]
  1063. }
  1064. k20 = 10; // [s^-1]
  1065. k02 = k20/Kd02; // [uM^-2 s^-1]
  1066. k42 = 500; // [s^-1]
  1067. k24 = k42/Kd24; // [uM^-2 s^-1]
  1068. // CaM buffering (B) parameters
  1069. k0Boff = 0.0014; // [s^-1]
  1070. k0Bon = k0Boff/0.2; // [uM^-1 s^-1] kon = koff/Kd
  1071. k2Boff = k0Boff/100; // [s^-1]
  1072. k2Bon = k0Bon; // [uM^-1 s^-1]
  1073. k4Boff = k2Boff; // [s^-1]
  1074. k4Bon = k0Bon; // [uM^-1 s^-1]
  1075. // using thermodynamic constraints
  1076. k20B = k20/100; // [s^-1] thermo constraint on loop 1
  1077. k02B = k02; // [uM^-2 s^-1]
  1078. k42B = k42; // [s^-1] thermo constraint on loop 2
  1079. k24B = k24; // [uM^-2 s^-1]
  1080. // Wi Wa Wt Wp
  1081. kbi = 2.2; // [s^-1] (Ca4CaM dissocation from Wb)
  1082. kib = kbi/33.5e-3; // [uM^-1 s^-1]
  1083. kpp1 = 1.72; // [s^-1] (PP1-dep dephosphorylation rates)
  1084. Kmpp1 = 11.5; // [uM]
  1085. kib2 = kib;
  1086. kb2i = kib2*5;
  1087. kb24 = k24;
  1088. kb42 = k42*33.5e-3/5;
  1089. kta = kbi/1000; // [s^-1] (Ca4CaM dissociation from Wt)
  1090. kat = kib; // [uM^-1 s^-1] (Ca4CaM reassociation with Wa)
  1091. kt42 = k42*33.5e-6/5;
  1092. kt24 = k24;
  1093. kat2 = kib;
  1094. kt2a = kib*5;
  1095. // CaN parameters
  1096. kcanCaoff = 1; // [s^-1]
  1097. kcanCaon = kcanCaoff/0.5; // [uM^-1 s^-1]
  1098. kcanCaM4on = 46; // [uM^-1 s^-1]
  1099. kcanCaM4off = 0.0013; // [s^-1]
  1100. kcanCaM2on = kcanCaM4on;
  1101. kcanCaM2off = 2508*kcanCaM4off;
  1102. kcanCaM0on = kcanCaM4on;
  1103. kcanCaM0off = 165*kcanCaM2off;
  1104. k02can = k02;
  1105. k20can = k20/165;
  1106. k24can = k24;
  1107. k42can = k20/2508;
  1108. // CaM Reaction fluxes
  1109. rcn02 = k02*pow(Ca,2)*CaM - k20*Ca2CaM;
  1110. rcn24 = k24*pow(Ca,2)*Ca2CaM - k42*Ca4CaM;
  1111. // CaM buffer fluxes
  1112. B = Btot - CaMB - Ca2CaMB - Ca4CaMB;
  1113. rcn02B = k02B*pow(Ca,2)*CaMB - k20B*Ca2CaMB;
  1114. rcn24B = k24B*pow(Ca,2)*Ca2CaMB - k42B*Ca4CaMB;
  1115. rcn0B = k0Bon*CaM*B - k0Boff*CaMB;
  1116. rcn2B = k2Bon*Ca2CaM*B - k2Boff*Ca2CaMB;
  1117. rcn4B = k4Bon*Ca4CaM*B - k4Boff*Ca4CaMB;
  1118. // CaN reaction fluxes
  1119. Ca2CaN = CaNtot - Ca4CaN - CaMCa4CaN - Ca2CaMCa4CaN - Ca4CaMCa4CaN;
  1120. rcnCa4CaN = kcanCaon*pow(Ca,2)*Ca2CaN - kcanCaoff*Ca4CaN;
  1121. rcn02CaN = k02can*pow(Ca,2)*CaMCa4CaN - k20can*Ca2CaMCa4CaN;
  1122. rcn24CaN = k24can*pow(Ca,2)*Ca2CaMCa4CaN - k42can*Ca4CaMCa4CaN;
  1123. rcn0CaN = kcanCaM0on*CaM*Ca4CaN - kcanCaM0off*CaMCa4CaN;
  1124. rcn2CaN = kcanCaM2on*Ca2CaM*Ca4CaN - kcanCaM2off*Ca2CaMCa4CaN;
  1125. rcn4CaN = kcanCaM4on*Ca4CaM*Ca4CaN - kcanCaM4off*Ca4CaMCa4CaN;
  1126. // CaMKII reaction fluxes
  1127. Pix = 1 - Pb2 - Pb - Pt - Pt2 - Pa;
  1128. rcnCKib2 = kib2*Ca2CaM*Pix - kb2i*Pb2;
  1129. rcnCKb2b = kb24*pow(Ca,2)*Pb2 - kb42*Pb;
  1130. rcnCKib = kib*Ca4CaM*Pix - kbi*Pb;
  1131. T = Pb + Pt + Pt2 + Pa;
  1132. kbt = 0.055*T + 0.0074*pow(T,2) + 0.015*pow(T,3);
  1133. rcnCKbt = kbt*Pb - kpp1*PP1tot*Pt/(Kmpp1+CaMKIItot*Pt);
  1134. rcnCKtt2 = kt42*Pt - kt24*pow(Ca,2)*Pt2;
  1135. rcnCKta = kta*Pt - kat*Ca4CaM*Pa;
  1136. rcnCKt2a = kt2a*Pt2 - kat2*Ca2CaM*Pa;
  1137. rcnCKt2b2 = kpp1*PP1tot*Pt2/(Kmpp1+CaMKIItot*Pt2);
  1138. rcnCKai = kpp1*PP1tot*Pa/(Kmpp1+CaMKIItot*Pa);
  1139. // CaM equations
  1140. dCaM = 1e-3*(-rcn02 - rcn0B - rcn0CaN);
  1141. dCa2CaM = 1e-3*(rcn02 - rcn24 - rcn2B - rcn2CaN + CaMKIItot*(-rcnCKib2 + rcnCKt2a) );
  1142. dCa4CaM = 1e-3*(rcn24 - rcn4B - rcn4CaN + CaMKIItot*(-rcnCKib+rcnCKta) );
  1143. dCaMB = 1e-3*(rcn0B-rcn02B);
  1144. dCa2CaMB = 1e-3*(rcn02B + rcn2B - rcn24B);
  1145. dCa4CaMB = 1e-3*(rcn24B + rcn4B);
  1146. // CaMKII equations
  1147. dPb2 = 1e-3*(rcnCKib2 - rcnCKb2b + rcnCKt2b2); // Pb2
  1148. dPb = 1e-3*(rcnCKib + rcnCKb2b - rcnCKbt); // Pb
  1149. dPt = 1e-3*(rcnCKbt-rcnCKta-rcnCKtt2); // Pt
  1150. dPt2 = 1e-3*(rcnCKtt2-rcnCKt2a-rcnCKt2b2); // Pt2
  1151. dPa = 1e-3*(rcnCKta+rcnCKt2a-rcnCKai); // Pa
  1152. // CaN equations
  1153. dCa4CaN = 1e-3*(rcnCa4CaN - rcn0CaN - rcn2CaN - rcn4CaN); // Ca4CaN
  1154. dCaMCa4CaN = 1e-3*(rcn0CaN - rcn02CaN); // CaMCa4CaN
  1155. dCa2CaMCa4CaN = 1e-3*(rcn2CaN+rcn02CaN-rcn24CaN); // Ca2CaMCa4CaN
  1156. dCa4CaMCa4CaN = 1e-3*(rcn4CaN+rcn24CaN); // Ca4CaMCa4CaN
  1157. // encode output array
  1158. d_finavalu[offset_1] = dCaM;
  1159. d_finavalu[offset_2] = dCa2CaM;
  1160. d_finavalu[offset_3] = dCa4CaM;
  1161. d_finavalu[offset_4] = dCaMB;
  1162. d_finavalu[offset_5] = dCa2CaMB;
  1163. d_finavalu[offset_6] = dCa4CaMB;
  1164. d_finavalu[offset_7] = dPb2;
  1165. d_finavalu[offset_8] = dPb;
  1166. d_finavalu[offset_9] = dPt;
  1167. d_finavalu[offset_10] = dPt2;
  1168. d_finavalu[offset_11] = dPa;
  1169. d_finavalu[offset_12] = dCa4CaN;
  1170. d_finavalu[offset_13] = dCaMCa4CaN;
  1171. d_finavalu[offset_14] = dCa2CaMCa4CaN;
  1172. d_finavalu[offset_15] = dCa4CaMCa4CaN;
  1173. // write to global variables for adjusting Ca buffering in EC coupling model
  1174. d_finavalu[com_offset] = 1e-3*(2*CaMKIItot*(rcnCKtt2-rcnCKb2b) - 2*(rcn02+rcn24+rcn02B+rcn24B+rcnCa4CaN+rcn02CaN+rcn24CaN)); // [uM/msec]
  1175. //d_finavalu[JCa] = 1; // [uM/msec]
  1176. }
  1177. //========================================================================================================================================================================================================200
  1178. // KERNEL
  1179. //========================================================================================================================================================================================================200
  1180. __kernel void
  1181. kernel_gpu_opencl( int timeinst,
  1182. __global fp *d_initvalu,
  1183. __global fp *d_finavalu,
  1184. __global fp *d_params,
  1185. __global fp *d_com)
  1186. {
  1187. //======================================================================================================================================================150
  1188. // VARIABLES
  1189. //======================================================================================================================================================150
  1190. // CUDA indexes
  1191. int bx; // get current horizontal block index (0-n)
  1192. int tx; // get current horizontal thread index (0-n)
  1193. // pointers
  1194. int valu_offset; // inivalu and finavalu offset
  1195. int params_offset; // parameters offset
  1196. int com_offset; // kernel1-kernel2 communication offset
  1197. // module parameters
  1198. fp CaDyad; // from ECC model, *** Converting from [mM] to [uM] ***
  1199. fp CaSL; // from ECC model, *** Converting from [mM] to [uM] ***
  1200. fp CaCyt; // from ECC model, *** Converting from [mM] to [uM] ***
  1201. //======================================================================================================================================================150
  1202. // COMPUTATION
  1203. //======================================================================================================================================================150
  1204. // indexes
  1205. // bx = blockIdx.x; // get current horizontal block index (0-n)
  1206. // tx = threadIdx.x; // get current horizontal thread index (0-n)
  1207. bx = get_group_id(0); // get current horizontal block index (0-n)
  1208. tx = get_local_id(0); // get current horizontal thread index (0-n)
  1209. //====================================================================================================100
  1210. // ECC
  1211. //====================================================================================================100
  1212. // limit to useful threads
  1213. if(bx == 0){ // first processor runs ECC
  1214. if(tx == 0){ // only 1 thread runs it, since its a sequential code
  1215. // thread offset
  1216. valu_offset = 0; //
  1217. // ecc function
  1218. kernel_ecc( timeinst,
  1219. d_initvalu,
  1220. d_finavalu,
  1221. valu_offset,
  1222. d_params);
  1223. }
  1224. }
  1225. //====================================================================================================100
  1226. // CAM x 3
  1227. //====================================================================================================100
  1228. // limit to useful threads
  1229. else if(bx == 1){ // second processor runs CAMs (in parallel with ECC)
  1230. if(tx == 0){ // only 1 thread runs it, since its a sequential code
  1231. // specific
  1232. valu_offset = 46;
  1233. params_offset = 0;
  1234. com_offset = 0;
  1235. CaDyad = d_initvalu[35]*1e3; // from ECC model, *** Converting from [mM] to [uM] ***
  1236. // cam function for Dyad
  1237. kernel_cam( timeinst,
  1238. d_initvalu,
  1239. d_finavalu,
  1240. valu_offset,
  1241. d_params,
  1242. params_offset,
  1243. d_com,
  1244. com_offset,
  1245. CaDyad);
  1246. // specific
  1247. valu_offset = 61;
  1248. params_offset = 5;
  1249. com_offset = 1;
  1250. CaSL = d_initvalu[36]*1e3; // from ECC model, *** Converting from [mM] to [uM] ***
  1251. // cam function for Dyad
  1252. kernel_cam( timeinst,
  1253. d_initvalu,
  1254. d_finavalu,
  1255. valu_offset,
  1256. d_params,
  1257. params_offset,
  1258. d_com,
  1259. com_offset,
  1260. CaSL);
  1261. // specific
  1262. valu_offset = 76;
  1263. params_offset = 10;
  1264. com_offset = 2;
  1265. CaCyt = d_initvalu[37]*1e3; // from ECC model, *** Converting from [mM] to [uM] ***
  1266. // cam function for Dyad
  1267. kernel_cam( timeinst,
  1268. d_initvalu,
  1269. d_finavalu,
  1270. valu_offset,
  1271. d_params,
  1272. params_offset,
  1273. d_com,
  1274. com_offset,
  1275. CaCyt);
  1276. }
  1277. }
  1278. //====================================================================================================100
  1279. // END
  1280. //====================================================================================================100
  1281. //======================================================================================================================================================150
  1282. // END
  1283. //======================================================================================================================================================150
  1284. }
  1285. //========================================================================================================================================================================================================200
  1286. // END
  1287. //========================================================================================================================================================================================================200
  1288. // #ifdef __cplusplus
  1289. // }
  1290. // #endif