46 #ifndef Xyce_N_DEV_Neuron2_h
47 #define Xyce_N_DEV_Neuron2_h
71 static const char *
name() {
return "Neuron";}
99 static std::vector< std::vector<int> >
jacStamp;
114 void registerLIDs(
const std::vector<int> & intLIDVecRef,
115 const std::vector<int> & extLIDVecRef );
120 const std::vector< std::vector<int> > &
jacobianStamp()
const;
121 void registerJacLIDs(
const std::vector< std::vector<int> > & jacLIDVec );
131 void varTypes( std::vector<char> & varTypeVec );
158 template <
typename ScalarT>
159 static ScalarT
alphaN(
const ScalarT Vin)
161 ScalarT vScaled = 1000.0 * Vin;
162 ScalarT r = 1000.0 * (0.02 * (vScaled + 45.7)) / (1.0 - std::exp(-0.1*(vScaled+45.7)));
167 template <
typename ScalarT>
168 static ScalarT
betaN(
const ScalarT Vin)
170 ScalarT vScaled = 1000.0 * Vin;
171 ScalarT r = 1000.0 * 0.25 * std::exp( -0.0125 * (vScaled + 55.7));
177 template <
typename ScalarT>
178 static ScalarT
alphaM(
const ScalarT Vin)
180 ScalarT vScaled = 1000.0 * Vin;
181 ScalarT r = 1000.0 * (0.38 * (vScaled + 29.7)) / (1.0 - std::exp(-0.1*(vScaled+29.7)));
186 template <
typename ScalarT>
187 static ScalarT
betaM(
const ScalarT Vin)
189 ScalarT vScaled = 1000.0 * Vin;
190 ScalarT r = 1000.0 * 15.2 * std::exp( -0.0556 * (vScaled + 54.7));
195 template <
typename ScalarT>
196 static ScalarT
alphaH(
const ScalarT Vin)
198 ScalarT vScaled = 1000.0 * Vin;
199 ScalarT r = 1000.0 * 0.266 * std::exp( -0.05 * (vScaled + 48.0));
204 template <
typename ScalarT>
205 static ScalarT
betaH(
const ScalarT Vin)
207 ScalarT vScaled = 1000.0 * Vin;
208 ScalarT r = 1000.0 * 3.8 / (1.0 + std::exp(-0.1*(vScaled+18.0)));
214 template <
typename ScalarT>
215 static ScalarT
aInf(
const ScalarT Vin)
217 ScalarT vScaled = 1000.0 * Vin;
218 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);
222 template <
typename ScalarT>
223 static ScalarT
aTau(
const ScalarT Vin)
225 ScalarT vScaled = 1000.0 * Vin;
226 ScalarT r = (0.3632 + 1.158 / (1.0 + std::exp(0.0497 * (vScaled + 55.96)))) / 1000.0;
231 template <
typename ScalarT>
232 static ScalarT
bInf(
const ScalarT Vin)
234 ScalarT vScaled = 1000.0 * Vin;
235 ScalarT r = std::pow( (1.0 / (1.0 + std::exp(0.0688*(vScaled+53.3)))), 4.0);
239 template <
typename ScalarT>
240 static ScalarT
bTau(
const ScalarT Vin)
242 ScalarT vScaled = 1000.0 * Vin;
243 ScalarT r = (1.24 + 2.678 / (1.0 + std::exp(0.0624 * (vScaled + 50.0)))) / 1000.0;
248 template <
typename ScalarT>
249 static ScalarT
M_Inf(
const ScalarT Vin)
251 ScalarT vScaled = 1000.0 * Vin;
252 ScalarT r = 1.0/(1.0 + std::exp(-(vScaled+57)/6.2));
256 template <
typename ScalarT>
257 static ScalarT
M_Tau(
const ScalarT Vin)
259 ScalarT vScaled = 1000.0 * Vin;
260 ScalarT r = (0.612 + 1.0/(std::exp(-(vScaled+132)/16.7) + std::exp((vScaled+16.8)/18.2)) ) / 1000.0;
264 template <
typename ScalarT>
265 static ScalarT
H_Inf(
const ScalarT Vin)
267 ScalarT vScaled = 1000.0 * Vin;
268 ScalarT r = 1.0 / (1.0 + std::exp((vScaled+81)/4.0));
272 template <
typename ScalarT>
273 static ScalarT
H_Tau(
const ScalarT Vin)
275 ScalarT vScaled = 1000.0 * Vin;
277 if( vScaled < -80.0 )
279 r = std::exp( (vScaled + 467)/66.6 ) / 1000.0;
283 r = ( 28.0 + std::exp(-(vScaled+22.0)/10.5)) / 1000.0;
289 template <
typename ScalarT>
290 static ScalarT
C_Inf(
const ScalarT Vin,
const ScalarT CaConc)
292 ScalarT vScaled = 1000.0 * Vin;
293 ScalarT r = (CaConc / (CaConc + 3.0)) * (1.0 / (1.0 + std::exp(-(vScaled+28.3)/12.6 )));
297 template <
typename ScalarT>
298 static ScalarT
C_Tau(
const ScalarT Vin)
300 ScalarT vScaled = 1000.0 * Vin;
301 ScalarT r = (90.3 - 75.1/(1.0 + std::exp(-(vScaled+46)/22.7))) / 1000.0;
308 template <
typename ScalarT>
309 static ScalarT
kcl1EquF(
const ScalarT& Vn1,
const ScalarT& Vn2,
const ScalarT& n,
const ScalarT& m,
const ScalarT& h,
310 const ScalarT& a,
const ScalarT& b,
const ScalarT& MC,
const ScalarT& HC,
const ScalarT& CC,
311 const ScalarT& memG,
const ScalarT& restV,
const ScalarT& Kg,
const ScalarT& Ke,
const ScalarT& NaG,
const ScalarT& NaE,
312 const ScalarT& Ag,
const ScalarT& Ae,
const ScalarT& CaTg,
const ScalarT& CaE,
const ScalarT& KCaG)
314 ScalarT powN = n * n * n * n;
315 ScalarT powM = m * m * m;
316 ScalarT powA = a * a * a;
317 ScalarT powMC = MC * MC;
318 ScalarT powCC = CC * CC * CC * CC;
319 ScalarT r = memG * (Vn1 - Vn2 - restV) + Kg * powN * (Vn1 - Vn2 - Ke ) + NaG * powM * h * (Vn1 - Vn2 - NaE )
320 + Ag * powA * b * (Vn1 - Vn2 - Ae) + CaTg * powMC * HC * (Vn1 - Vn2 - CaE) + KCaG * powCC * (Vn1 - Vn2 - Ke);
324 template <
typename ScalarT>
325 static ScalarT
kcl1EquQ(
const ScalarT& Vn1,
const ScalarT& Vn2,
const ScalarT& memC )
327 ScalarT r = memC * (Vn1 - Vn2);
332 template <
typename ScalarT>
333 static ScalarT
kcl2EquF(
const ScalarT& Vn1,
const ScalarT& Vn2,
const ScalarT& n,
const ScalarT& m,
const ScalarT& h,
334 const ScalarT& a,
const ScalarT& b,
const ScalarT& MC,
const ScalarT& HC,
const ScalarT& CC,
335 const ScalarT& memG,
const ScalarT& restV,
const ScalarT& Kg,
const ScalarT& Ke,
const ScalarT& NaG,
const ScalarT& NaE,
336 const ScalarT& Ag,
const ScalarT& Ae,
const ScalarT& CaTg,
const ScalarT& CaE,
const ScalarT& KCaG)
338 ScalarT powN = n * n * n * n;
339 ScalarT powM = m * m * m;
340 ScalarT powA = a * a * a;
341 ScalarT powMC = MC * MC;
342 ScalarT powCC = CC * CC * CC * CC;
343 ScalarT r = -1.0 * (memG * (Vn1 - Vn2 - restV) + Kg * powN * (Vn1 - Vn2 - Ke ) + NaG * powM * h * (Vn1 - Vn2 - NaE )
344 + Ag * powA * b * (Vn1 - Vn2 - Ae) + CaTg * powMC * HC * (Vn1 - Vn2 - CaE) + KCaG * powCC * (Vn1 - Vn2 - Ke) );
348 template <
typename ScalarT>
349 static ScalarT
kcl2EquQ(
const ScalarT& Vn1,
const ScalarT& Vn2,
const ScalarT& memC )
351 ScalarT r = -1.0 * memC * (Vn1 - Vn2);
356 template <
typename ScalarT>
357 static ScalarT
nEquF(
const ScalarT& Vn1,
const ScalarT& n,
const ScalarT& Vrest )
360 ScalarT alpha = alphaN<ScalarT>(vDiff);
361 ScalarT beta = betaN<ScalarT>(vDiff);
362 ScalarT r = (alpha + beta) * n - alpha;
366 template <
typename ScalarT>
367 static ScalarT
nEquQ(
const ScalarT& n )
374 template <
typename ScalarT>
375 static ScalarT
mEquF(
const ScalarT& Vn1,
const ScalarT& m,
const ScalarT& Vrest )
378 ScalarT alpha = alphaM<ScalarT>(vDiff);
379 ScalarT beta = betaM<ScalarT>(vDiff);
380 ScalarT r = (alpha + beta) * m - alpha;
384 template <
typename ScalarT>
385 static ScalarT
mEquQ(
const ScalarT& m )
392 template <
typename ScalarT>
393 static ScalarT
hEquF(
const ScalarT& Vn1,
const ScalarT& h,
const ScalarT& Vrest )
396 ScalarT alpha = alphaH<ScalarT>(vDiff);
397 ScalarT beta = betaH<ScalarT>(vDiff);
398 ScalarT r = (alpha + beta) * h - alpha;
402 template <
typename ScalarT>
403 static ScalarT
hEquQ(
const ScalarT& h )
410 template <
typename ScalarT>
411 static ScalarT
aEquF(
const ScalarT& Vn1,
const ScalarT& a,
const ScalarT& Vrest )
414 ScalarT Inf = aInf<ScalarT>(vDiff);
415 ScalarT Tau = aTau<ScalarT>(vDiff);
416 ScalarT r = (a - Inf)/Tau;
420 template <
typename ScalarT>
421 static ScalarT
aEquQ(
const ScalarT& a )
428 template <
typename ScalarT>
429 static ScalarT
bEquF(
const ScalarT& Vn1,
const ScalarT& b,
const ScalarT& Vrest )
432 ScalarT Inf = bInf<ScalarT>(vDiff);
433 ScalarT Tau = bTau<ScalarT>(vDiff);
434 ScalarT r = (b - Inf)/Tau;
438 template <
typename ScalarT>
439 static ScalarT
bEquQ(
const ScalarT& b )
446 template <
typename ScalarT>
447 static ScalarT
M_EquF(
const ScalarT& Vn1,
const ScalarT& M,
const ScalarT& Vrest )
450 ScalarT Inf = M_Inf<ScalarT>(vDiff);
451 ScalarT Tau = M_Tau<ScalarT>(vDiff);
452 ScalarT r = (M - Inf)/Tau;
456 template <
typename ScalarT>
457 static ScalarT
M_EquQ(
const ScalarT& M )
464 template <
typename ScalarT>
465 static ScalarT
H_EquF(
const ScalarT& Vn1,
const ScalarT& H,
const ScalarT& Vrest )
468 ScalarT Inf = H_Inf<ScalarT>(vDiff);
469 ScalarT Tau = H_Tau<ScalarT>(vDiff);
470 ScalarT r = (H - Inf)/Tau;
474 template <
typename ScalarT>
475 static ScalarT
H_EquQ(
const ScalarT& H )
482 template <
typename ScalarT>
483 static ScalarT
C_EquF(
const ScalarT& Vn1,
const ScalarT& C,
const ScalarT& CaConc,
const ScalarT& Vrest )
486 ScalarT Inf = C_Inf<ScalarT>(vDiff, CaConc);
487 ScalarT Tau = C_Tau<ScalarT>(vDiff);
488 ScalarT r = (C - Inf)/Tau;
492 template <
typename ScalarT>
493 static ScalarT
C_EquQ(
const ScalarT& C )
500 template <
typename ScalarT>
501 static ScalarT
Ca_EquF(
const ScalarT& Vn1,
const ScalarT& Vn2,
const ScalarT& MC,
const ScalarT& HC,
const ScalarT& Ca,
502 const ScalarT& CaTg,
const ScalarT& CaE,
const ScalarT& CaGamma,
const ScalarT& CaTau )
504 ScalarT r = CaGamma * CaTg * MC * MC * HC * (Vn1 - Vn2 - CaE) + Ca / CaTau;
508 template <
typename ScalarT>