48 #ifndef Xyce_N_DEV_Neuron_CommonEquations_h
49 #define Xyce_N_DEV_Neuron_CommonEquations_h
87 template <
typename ScalarT>
88 static ScalarT
alphaN(
const ScalarT & Vn1)
90 ScalarT vDiff = 1000.0 * Vn1;
92 if ((vDiff > 9.99) && (vDiff < 10.01) )
94 r = 1.0/(10.0 * ( std::exp( (10.0 - vDiff)/10.0 )));
99 (100.0 * ( std::exp( (10.0 - vDiff)/10.0 ) - 1.0 ));
105 template <
typename ScalarT>
106 static ScalarT
betaN(
const ScalarT & Vn1)
108 ScalarT vDiff = 1000.0 * Vn1;
109 ScalarT r = 0.125 * std::exp( -vDiff/80.0 );
115 template <
typename ScalarT>
116 static ScalarT
alphaM(
const ScalarT & Vn1)
118 ScalarT vDiff = 1000.0 * Vn1;
120 if ((vDiff > 24.99) && (vDiff < 25.01) )
123 (( std::exp( (25.0 - vDiff)/10.0 )));
128 (10.0 * ( std::exp( (25.0 - vDiff)/10.0 ) - 1.0 ));
134 template <
typename ScalarT>
135 static ScalarT
betaM(
const ScalarT & Vn1)
137 ScalarT vDiff = 1000.0 * Vn1;
138 ScalarT r = 4.0 * std::exp( -vDiff/18.0 );
144 template <
typename ScalarT>
145 static ScalarT
alphaH(
const ScalarT & Vn1)
147 ScalarT vDiff = 1000.0 * Vn1;
148 ScalarT r = 0.07 * std::exp( -vDiff/20.0 );
153 template <
typename ScalarT>
154 static ScalarT
betaH(
const ScalarT & Vn1)
156 ScalarT vDiff = 1000.0 * Vn1;
157 ScalarT r = 1.0 / ( std::exp( (30.0 - vDiff)/10.0 ) + 1.0 );
223 template <
typename ScalarT>
224 static ScalarT
aInf(
const ScalarT Vin)
226 ScalarT vScaled = 1000.0 * Vin;
227 ScalarT r = std::pow( ((0.0761 * std::exp(0.0314 * (vScaled+94.22))) / (1.0+std::exp(0.0346*(vScaled+1.17)))), 1.0/3.0);
231 template <
typename ScalarT>
232 static ScalarT
aTau(
const ScalarT Vin)
234 ScalarT vScaled = 1000.0 * Vin;
235 ScalarT r = (0.3632 + 1.158 / (1.0 + std::exp(0.0497 * (vScaled + 55.96)))) / 1000.0;
240 template <
typename ScalarT>
241 static ScalarT
bInf(
const ScalarT Vin)
243 ScalarT vScaled = 1000.0 * Vin;
244 ScalarT r = std::pow( (1.0 / (1.0 + std::exp(0.0688*(vScaled+53.3)))), 4.0);
248 template <
typename ScalarT>
249 static ScalarT
bTau(
const ScalarT Vin)
251 ScalarT vScaled = 1000.0 * Vin;
252 ScalarT r = (1.24 + 2.678 / (1.0 + std::exp(0.0624 * (vScaled + 50.0)))) / 1000.0;
257 template <
typename ScalarT>
258 static ScalarT
M_Inf(
const ScalarT Vin)
260 ScalarT vScaled = 1000.0 * Vin;
261 ScalarT r = 1.0/(1.0 + std::exp(-(vScaled+57)/6.2));
265 template <
typename ScalarT>
266 static ScalarT
M_Tau(
const ScalarT Vin)
268 ScalarT vScaled = 1000.0 * Vin;
269 ScalarT r = (0.612 + 1.0/(std::exp(-(vScaled+132)/16.7) + std::exp((vScaled+16.8)/18.2)) ) / 1000.0;
273 template <
typename ScalarT>
274 static ScalarT
H_Inf(
const ScalarT Vin)
276 ScalarT vScaled = 1000.0 * Vin;
277 ScalarT r = 1.0 / (1.0 + std::exp((vScaled+81)/4.0));
281 template <
typename ScalarT>
282 static ScalarT
H_Tau(
const ScalarT Vin)
284 ScalarT vScaled = 1000.0 * Vin;
286 if( vScaled < -80.0 )
288 r = std::exp( (vScaled + 467)/66.6 ) / 1000.0;
292 r = ( 28.0 + std::exp(-(vScaled+22.0)/10.5)) / 1000.0;
298 template <
typename ScalarT>
299 static ScalarT
C_Inf(
const ScalarT Vin,
const ScalarT CaConc)
301 ScalarT vScaled = 1000.0 * Vin;
302 ScalarT r = (CaConc / (CaConc + 3.0)) * (1.0 / (1.0 + std::exp(-(vScaled+28.3)/12.6 )));
306 template <
typename ScalarT>
307 static ScalarT
C_Tau(
const ScalarT Vin)
309 ScalarT vScaled = 1000.0 * Vin;
310 ScalarT r = (90.3 - 75.1/(1.0 + std::exp(-(vScaled+46)/22.7))) / 1000.0;
316 template <
typename ScalarT>
317 static ScalarT
kcl1EquF(
const ScalarT& Vn1,
const ScalarT& Vn2,
const ScalarT& n,
const ScalarT& m,
const ScalarT& h,
318 const ScalarT& a,
const ScalarT& b,
const ScalarT& MC,
const ScalarT& HC,
const ScalarT& CC,
319 const ScalarT& memG,
const ScalarT& restV,
const ScalarT& Kg,
const ScalarT& Ke,
const ScalarT& NaG,
const ScalarT& NaE,
320 const ScalarT& Ag,
const ScalarT& Ae,
const ScalarT& CaTg,
const ScalarT& CaE,
const ScalarT& KCaG)
322 ScalarT powN = n * n * n * n;
323 ScalarT powM = m * m * m;
324 ScalarT powA = a * a * a;
325 ScalarT powMC = MC * MC;
326 ScalarT powCC = CC * CC * CC * CC;
327 ScalarT r = memG * (Vn1 - Vn2 - restV) + Kg * powN * (Vn1 - Vn2 - Ke ) + NaG * powM * h * (Vn1 - Vn2 - NaE )
328 + Ag * powA * b * (Vn1 - Vn2 - Ae) + CaTg * powMC * HC * (Vn1 - Vn2 - CaE) + KCaG * powCC * (Vn1 - Vn2 - Ke);
332 template <
typename ScalarT>
333 static ScalarT
kcl1EquQ(
const ScalarT& Vn1,
const ScalarT& Vn2,
const ScalarT& memC )
335 ScalarT r = memC * (Vn1 - Vn2);
340 template <
typename ScalarT>
341 static ScalarT
kcl2EquF(
const ScalarT& Vn1,
const ScalarT& Vn2,
const ScalarT& n,
const ScalarT& m,
const ScalarT& h,
342 const ScalarT& a,
const ScalarT& b,
const ScalarT& MC,
const ScalarT& HC,
const ScalarT& CC,
343 const ScalarT& memG,
const ScalarT& restV,
const ScalarT& Kg,
const ScalarT& Ke,
const ScalarT& NaG,
const ScalarT& NaE,
344 const ScalarT& Ag,
const ScalarT& Ae,
const ScalarT& CaTg,
const ScalarT& CaE,
const ScalarT& KCaG)
346 ScalarT powN = n * n * n * n;
347 ScalarT powM = m * m * m;
348 ScalarT powA = a * a * a;
349 ScalarT powMC = MC * MC;
350 ScalarT powCC = CC * CC * CC * CC;
351 ScalarT r = -1.0 * (memG * (Vn1 - Vn2 - restV) + Kg * powN * (Vn1 - Vn2 - Ke ) + NaG * powM * h * (Vn1 - Vn2 - NaE )
352 + Ag * powA * b * (Vn1 - Vn2 - Ae) + CaTg * powMC * HC * (Vn1 - Vn2 - CaE) + KCaG * powCC * (Vn1 - Vn2 - Ke) );
356 template <
typename ScalarT>
357 static ScalarT
kcl2EquQ(
const ScalarT& Vn1,
const ScalarT& Vn2,
const ScalarT& memC )
359 ScalarT r = -1.0 * memC * (Vn1 - Vn2);
365 template <
typename ScalarT>
366 static ScalarT
HH_Vseg_F(
const ScalarT& Vseg,
const ScalarT& n,
const ScalarT& m,
const ScalarT& h,
367 const ScalarT& memG,
const ScalarT& restV,
const ScalarT& Kg,
const ScalarT& Ke,
const ScalarT& NaG,
const ScalarT& NaE )
369 ScalarT n4 = n * n * n * n;
370 ScalarT m3 = m * m * m;
371 ScalarT r = memG * (Vseg - restV) + Kg * n4 * (Vseg - Ke ) + NaG * m3 * h * (Vseg - NaE );
376 template <
typename ScalarT>
377 static ScalarT HH_Vseg_Q(
const ScalarT& Vseg,
const ScalarT& memC )
379 ScalarT r = memC * Vn1;
385 template <
typename ScalarT>
386 static ScalarT
nEquF(
const ScalarT& Vn,
const ScalarT& n)
388 ScalarT alpha = alphaN<ScalarT>(Vn);
389 ScalarT beta = betaN<ScalarT>(Vn);
390 ScalarT r = (alpha + beta) * n - alpha;
394 template <
typename ScalarT>
395 static ScalarT
nEquQ(
const ScalarT& n )
402 template <
typename ScalarT>
403 static ScalarT
mEquF(
const ScalarT& Vn,
const ScalarT& m )
405 ScalarT alpha = alphaM<ScalarT>(Vn);
406 ScalarT beta = betaM<ScalarT>(Vn);
407 ScalarT r = (alpha + beta) * m - alpha;
411 template <
typename ScalarT>
412 static ScalarT
mEquQ(
const ScalarT& m )
419 template <
typename ScalarT>
420 static ScalarT
hEquF(
const ScalarT& Vn,
const ScalarT& h )
422 ScalarT alpha = alphaH<ScalarT>(Vn);
423 ScalarT beta = betaH<ScalarT>(Vn);
424 ScalarT r = (alpha + beta) * h - alpha;
428 template <
typename ScalarT>
429 static ScalarT
hEquQ(
const ScalarT& h )
436 template <
typename ScalarT>
437 static ScalarT
aEquF(
const ScalarT& Vn1,
const ScalarT& a,
const ScalarT& Vrest )
440 ScalarT Inf = aInf<ScalarT>(vDiff);
441 ScalarT Tau = aTau<ScalarT>(vDiff);
442 ScalarT r = (a - Inf)/Tau;
446 template <
typename ScalarT>
447 static ScalarT
aEquQ(
const ScalarT& a )
454 template <
typename ScalarT>
455 static ScalarT
bEquF(
const ScalarT& Vn1,
const ScalarT& b,
const ScalarT& Vrest )
458 ScalarT Inf = bInf<ScalarT>(vDiff);
459 ScalarT Tau = bTau<ScalarT>(vDiff);
460 ScalarT r = (b - Inf)/Tau;
464 template <
typename ScalarT>
465 static ScalarT
bEquQ(
const ScalarT& b )
472 template <
typename ScalarT>
473 static ScalarT
M_EquF(
const ScalarT& Vn1,
const ScalarT& M,
const ScalarT& Vrest )
476 ScalarT Inf = M_Inf<ScalarT>(vDiff);
477 ScalarT Tau = M_Tau<ScalarT>(vDiff);
478 ScalarT r = (M - Inf)/Tau;
482 template <
typename ScalarT>
483 static ScalarT
M_EquQ(
const ScalarT& M )
490 template <
typename ScalarT>
491 static ScalarT
H_EquF(
const ScalarT& Vn1,
const ScalarT& H,
const ScalarT& Vrest )
494 ScalarT Inf = H_Inf<ScalarT>(vDiff);
495 ScalarT Tau = H_Tau<ScalarT>(vDiff);
496 ScalarT r = (H - Inf)/Tau;
500 template <
typename ScalarT>
501 static ScalarT
H_EquQ(
const ScalarT& H )
508 template <
typename ScalarT>
509 static ScalarT
C_EquF(
const ScalarT& Vn1,
const ScalarT& C,
const ScalarT& CaConc,
const ScalarT& Vrest )
512 ScalarT Inf = C_Inf<ScalarT>(vDiff, CaConc);
513 ScalarT Tau = C_Tau<ScalarT>(vDiff);
514 ScalarT r = (C - Inf)/Tau;
518 template <
typename ScalarT>
519 static ScalarT
C_EquQ(
const ScalarT& C )
526 template <
typename ScalarT>
527 static ScalarT
Ca_EquF(
const ScalarT& Vn1,
const ScalarT& Vn2,
const ScalarT& MC,
const ScalarT& HC,
const ScalarT& Ca,
528 const ScalarT& CaTg,
const ScalarT& CaE,
const ScalarT& CaGamma,
const ScalarT& CaTau )
530 ScalarT r = CaGamma * CaTg * MC * MC * HC * (Vn1 - Vn2 - CaE) + Ca / CaTau;
534 template <
typename ScalarT>
549 template <
typename ScalarT>
550 static ScalarT
kcl1EquF(
const ScalarT& VSeg,
const ScalarT& VSegP,
const ScalarT & VSegN,
const ScalarT& n,
const ScalarT& m,
const ScalarT& h,
551 const ScalarT& a,
const ScalarT& b,
const ScalarT& MC,
const ScalarT& HC,
const ScalarT& CC,
552 const ScalarT& gPrev,
const ScalarT& gNext,
553 const ScalarT& memG,
const ScalarT& restV,
const ScalarT& Kg,
const ScalarT& Ke,
const ScalarT& NaG,
const ScalarT& NaE,
554 const ScalarT& Ag,
const ScalarT& Ae,
const ScalarT& CaTg,
const ScalarT& CaE,
const ScalarT& KCaG)
556 ScalarT powN = n * n * n * n;
557 ScalarT powM = m * m * m;
558 ScalarT powA = a * a * a;
559 ScalarT powMC = MC * MC;
560 ScalarT powCC = CC * CC * CC * CC;
561 ScalarT r = memG * (VSeg - restV) - gNext * (VSegN - VSeg) - gPrev * (VSegP - VSeg);
567 template <
typename ScalarT>
568 static ScalarT
kcl1EquQ(
const ScalarT& VSeg,
const ScalarT& memC )
570 ScalarT r = memC * VSeg;
576 template <
typename ScalarT>
577 static ScalarT
Ca_EquF(
const ScalarT& Vn1,
const ScalarT& MC,
const ScalarT& HC,
const ScalarT& Ca,
578 const ScalarT& CaTg,
const ScalarT& CaE,
const ScalarT& CaGamma,
const ScalarT& CaTau )
580 ScalarT r = CaGamma * CaTg * MC * MC * HC * (Vn1 - CaE) + Ca / CaTau;