46 #ifndef Xyce_N_DEV_Neuron4_h
47 #define Xyce_N_DEV_Neuron4_h
72 static const char *
name() {
return "Neuron";}
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 );
157 template <
typename ScalarT>
158 static ScalarT
alphaN(
const ScalarT Vin)
160 ScalarT vScaled = 1000.0 * Vin;
161 ScalarT r = 1000.0 * (0.02 * (vScaled + 45.7)) / (1.0 - std::exp(-0.1*(vScaled+45.7)));
166 template <
typename ScalarT>
167 static ScalarT
betaN(
const ScalarT Vin)
169 ScalarT vScaled = 1000.0 * Vin;
170 ScalarT r = 1000.0 * 0.25 * std::exp( -0.0125 * (vScaled + 55.7));
176 template <
typename ScalarT>
177 static ScalarT
alphaM(
const ScalarT Vin)
179 ScalarT vScaled = 1000.0 * Vin;
180 ScalarT r = 1000.0 * (0.38 * (vScaled + 29.7)) / (1.0 - std::exp(-0.1*(vScaled+29.7)));
185 template <
typename ScalarT>
186 static ScalarT
betaM(
const ScalarT Vin)
188 ScalarT vScaled = 1000.0 * Vin;
189 ScalarT r = 1000.0 * 15.2 * std::exp( -0.0556 * (vScaled + 54.7));
194 template <
typename ScalarT>
195 static ScalarT
alphaH(
const ScalarT Vin)
197 ScalarT vScaled = 1000.0 * Vin;
198 ScalarT r = 1000.0 * 0.266 * std::exp( -0.05 * (vScaled + 48.0));
203 template <
typename ScalarT>
204 static ScalarT
betaH(
const ScalarT Vin)
206 ScalarT vScaled = 1000.0 * Vin;
207 ScalarT r = 1000.0 * 3.8 / (1.0 + std::exp(-0.1*(vScaled+18.0)));
213 template <
typename ScalarT>
214 static ScalarT
aInf(
const ScalarT Vin)
216 ScalarT vScaled = 1000.0 * Vin;
217 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);
221 template <
typename ScalarT>
222 static ScalarT
aTau(
const ScalarT Vin)
224 ScalarT vScaled = 1000.0 * Vin;
225 ScalarT r = (0.3632 + 1.158 / (1.0 + std::exp(0.0497 * (vScaled + 55.96)))) / 1000.0;
229 template <
typename ScalarT>
230 static ScalarT
bInf(
const ScalarT Vin)
232 ScalarT vScaled = 1000.0 * Vin;
233 ScalarT r = std::pow( (1.0 / (1.0 + std::exp(0.0688*(vScaled+53.3)))), 4.0);
237 template <
typename ScalarT>
238 static ScalarT
bTau(
const ScalarT Vin)
240 ScalarT vScaled = 1000.0 * Vin;
241 ScalarT r = (1.24 + 2.678 / (1.0 + std::exp(0.0624 * (vScaled + 50.0)))) / 1000.0;
246 template <
typename ScalarT>
247 static ScalarT
M_Inf(
const ScalarT Vin)
249 ScalarT vScaled = 1000.0 * Vin;
250 ScalarT r = 1.0/(1.0 + std::exp(-(vScaled+57)/6.2));
254 template <
typename ScalarT>
255 static ScalarT
M_Tau(
const ScalarT Vin)
257 ScalarT vScaled = 1000.0 * Vin;
258 ScalarT r = (0.612 + 1.0/(std::exp(-(vScaled+132)/16.7) + std::exp((vScaled+16.8)/18.2)) ) / 1000.0;
262 template <
typename ScalarT>
263 static ScalarT
H_Inf(
const ScalarT Vin)
265 ScalarT vScaled = 1000.0 * Vin;
266 ScalarT r = 1.0 / (1.0 + std::exp((vScaled+81)/4.0));
270 template <
typename ScalarT>
271 static ScalarT
H_Tau(
const ScalarT Vin)
273 ScalarT vScaled = 1000.0 * Vin;
275 if( vScaled < -80.0 )
277 r = std::exp( (vScaled + 467)/66.6 ) / 1000.0;
281 r = ( 28.0 + std::exp(-(vScaled+22.0)/10.5)) / 1000.0;
287 template <
typename ScalarT>
288 static ScalarT
C_Inf(
const ScalarT Vin,
const ScalarT CaConc)
290 ScalarT vScaled = 1000.0 * Vin;
291 ScalarT r = (CaConc / (CaConc + 3.0)) * (1.0 / (1.0 + std::exp(-(vScaled+28.3)/12.6 )));
295 template <
typename ScalarT>
296 static ScalarT
C_Tau(
const ScalarT Vin)
298 ScalarT vScaled = 1000.0 * Vin;
299 ScalarT r = (90.3 - 75.1/(1.0 + std::exp(-(vScaled+46)/22.7))) / 1000.0;
306 template <
typename ScalarT>
307 static ScalarT
kcl1EquF(
const ScalarT& VSeg,
const ScalarT& VSegP,
const ScalarT & VSegN,
const ScalarT& n,
const ScalarT& m,
const ScalarT& h,
308 const ScalarT& a,
const ScalarT& b,
const ScalarT& MC,
const ScalarT& HC,
const ScalarT& CC,
309 const ScalarT& gPrev,
const ScalarT& gNext,
310 const ScalarT& memG,
const ScalarT& restV,
const ScalarT& Kg,
const ScalarT& Ke,
const ScalarT& NaG,
const ScalarT& NaE,
311 const ScalarT& Ag,
const ScalarT& Ae,
const ScalarT& CaTg,
const ScalarT& CaE,
const ScalarT& KCaG)
313 ScalarT powN = n * n * n * n;
314 ScalarT powM = m * m * m;
315 ScalarT powA = a * a * a;
316 ScalarT powMC = MC * MC;
317 ScalarT powCC = CC * CC * CC * CC;
318 ScalarT r = memG * (VSeg - restV) + Kg * powN * (VSeg - Ke ) + NaG * powM * h * (VSeg - NaE )
319 + Ag * powA * b * (VSeg - Ae) + CaTg * powMC * HC * (VSeg - CaE) + KCaG * powCC * (VSeg - Ke) - gNext * (VSegN - VSeg) - gPrev * (VSegP - VSeg);
323 template <
typename ScalarT>
324 static ScalarT
kcl1EquQ(
const ScalarT& VSeg,
const ScalarT& memC )
326 ScalarT r = memC * VSeg;
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);
357 template <
typename ScalarT>
358 static ScalarT
nEquF(
const ScalarT& Vn1,
const ScalarT& n,
const ScalarT& Vrest )
361 ScalarT alpha = alphaN<ScalarT>(vDiff);
362 ScalarT beta = betaN<ScalarT>(vDiff);
363 ScalarT r = (alpha + beta) * n - alpha;
367 template <
typename ScalarT>
368 static ScalarT
nEquQ(
const ScalarT& n )
375 template <
typename ScalarT>
376 static ScalarT
mEquF(
const ScalarT& Vn1,
const ScalarT& m,
const ScalarT& Vrest )
379 ScalarT alpha = alphaM<ScalarT>(vDiff);
380 ScalarT beta = betaM<ScalarT>(vDiff);
381 ScalarT r = (alpha + beta) * m - alpha;
385 template <
typename ScalarT>
386 static ScalarT
mEquQ(
const ScalarT& m )
393 template <
typename ScalarT>
394 static ScalarT
hEquF(
const ScalarT& Vn1,
const ScalarT& h,
const ScalarT& Vrest )
397 ScalarT alpha = alphaH<ScalarT>(vDiff);
398 ScalarT beta = betaH<ScalarT>(vDiff);
399 ScalarT r = (alpha + beta) * h - alpha;
403 template <
typename ScalarT>
404 static ScalarT
hEquQ(
const ScalarT& h )
411 template <
typename ScalarT>
412 static ScalarT
aEquF(
const ScalarT& Vn1,
const ScalarT& a,
const ScalarT& Vrest )
415 ScalarT Inf = aInf<ScalarT>(vDiff);
416 ScalarT Tau = aTau<ScalarT>(vDiff);
417 ScalarT r = (a - Inf)/Tau;
421 template <
typename ScalarT>
422 static ScalarT
aEquQ(
const ScalarT& a )
429 template <
typename ScalarT>
430 static ScalarT
bEquF(
const ScalarT& Vn1,
const ScalarT& b,
const ScalarT& Vrest )
433 ScalarT Inf = bInf<ScalarT>(vDiff);
434 ScalarT Tau = bTau<ScalarT>(vDiff);
435 ScalarT r = (b - Inf)/Tau;
439 template <
typename ScalarT>
440 static ScalarT
bEquQ(
const ScalarT& b )
447 template <
typename ScalarT>
448 static ScalarT
M_EquF(
const ScalarT& Vn1,
const ScalarT& M,
const ScalarT& Vrest )
451 ScalarT Inf = M_Inf<ScalarT>(vDiff);
452 ScalarT Tau = M_Tau<ScalarT>(vDiff);
453 ScalarT r = (M - Inf)/Tau;
457 template <
typename ScalarT>
458 static ScalarT
M_EquQ(
const ScalarT& M )
465 template <
typename ScalarT>
466 static ScalarT
H_EquF(
const ScalarT& Vn1,
const ScalarT& H,
const ScalarT& Vrest )
469 ScalarT Inf = H_Inf<ScalarT>(vDiff);
470 ScalarT Tau = H_Tau<ScalarT>(vDiff);
471 ScalarT r = (H - Inf)/Tau;
475 template <
typename ScalarT>
476 static ScalarT
H_EquQ(
const ScalarT& H )
483 template <
typename ScalarT>
484 static ScalarT
C_EquF(
const ScalarT& Vn1,
const ScalarT& C,
const ScalarT& CaConc,
const ScalarT& Vrest )
487 ScalarT Inf = C_Inf<ScalarT>(vDiff, CaConc);
488 ScalarT Tau = C_Tau<ScalarT>(vDiff);
489 ScalarT r = (C - Inf)/Tau;
493 template <
typename ScalarT>
494 static ScalarT
C_EquQ(
const ScalarT& C )
501 template <
typename ScalarT>
502 static ScalarT
Ca_EquF(
const ScalarT& Vn1,
const ScalarT& MC,
const ScalarT& HC,
const ScalarT& Ca,
503 const ScalarT& CaTg,
const ScalarT& CaE,
const ScalarT& CaGamma,
const ScalarT& CaTau )
505 ScalarT r = CaGamma * CaTg * MC * MC * HC * (Vn1 - CaE) + Ca / CaTau;
509 template <
typename ScalarT>
581 std::vector<double>
segF_dVp,
segF_dV,
segF_dVn,
segF_dn,
segF_dm,
segF_dh,
segF_da,
segF_db,
segF_dM,
segF_dH,
segF_dc;