46 #include <Xyce_config.h>
51 #include <N_UTL_Misc.h>
61 #include <N_ERH_ErrorMgr.h>
63 #include <N_LAS_Vector.h>
64 #include <N_LAS_Matrix.h>
123 std::vector<std::vector<int> >
156 bool bsuccess =
true;
173 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
297 const std::vector<int> & extLIDVecRef)
302 #ifdef Xyce_DEBUG_DEVICE
305 Xyce::dout() << std::endl << section_divider << std::endl;
306 Xyce::dout() <<
" Instance::registerLIDs" << std::endl;
307 Xyce::dout() <<
" name = " <<
getName() << std::endl;
321 #ifdef Xyce_DEBUG_DEVICE
324 Xyce::dout() <<
" li_Pos = " <<
li_Pos << std::endl
325 <<
" li_Neg = " <<
li_Neg << std::endl
326 <<
" li_nPro = " <<
li_nPro << std::endl
327 <<
" li_mPro = " <<
li_mPro << std::endl
328 <<
" li_hPro = " <<
li_hPro << std::endl;
332 #ifdef Xyce_DEBUG_DEVICE
335 Xyce::dout() << section_divider << std::endl;
395 bool returnVal=
false;
470 bool bsuccess =
true;
478 double v1Now = (*solVectorPtr)[
li_Pos];
479 double v2Now = (*solVectorPtr)[
li_Neg];
480 double nNow = (*solVectorPtr)[
li_nPro];
481 double mNow = (*solVectorPtr)[
li_mPro];
482 double hNow = (*solVectorPtr)[
li_hPro];
490 const int numDeriv = 5;
491 Sacado::Fad::SFad<double,5> v1Var( numDeriv, 0, v1Now );
492 Sacado::Fad::SFad<double,5> v2Var( numDeriv, 1, v2Now );
493 Sacado::Fad::SFad<double,5> nVar( numDeriv, 2, nNow );
494 Sacado::Fad::SFad<double,5> mVar( numDeriv, 3, mNow );
495 Sacado::Fad::SFad<double,5> hVar( numDeriv, 4, hNow );
497 Sacado::Fad::SFad<double,5> gMemVar(
model_.
gMem );
498 Sacado::Fad::SFad<double,5> eLeakVar(
model_.
eLeak );
499 Sacado::Fad::SFad<double,5> gKVar(
model_.
gK );
500 Sacado::Fad::SFad<double,5> eKVar(
model_.
eK );
501 Sacado::Fad::SFad<double,5> gNaVar(
model_.
gNa );
502 Sacado::Fad::SFad<double,5> eNaVar(
model_.
eNa );
505 Sacado::Fad::SFad<double,5> resultFad;
506 resultFad =
kcl1EquF( v1Var, v2Var, nVar, mVar, hVar, gMemVar, eLeakVar, gKVar, eKVar, gNaVar, eNaVar );
515 resultFad =
kcl2EquF( v1Var, v2Var, nVar, mVar, hVar, gMemVar, eLeakVar, gKVar, eKVar, gNaVar, eNaVar );
526 const int numDeriv = 2;
527 Sacado::Fad::SFad<double,2> v1Var( numDeriv, 0, v1Now );
528 Sacado::Fad::SFad<double,2> v2Var( numDeriv, 1, v2Now );
531 Sacado::Fad::SFad<double,2> cMemVar(
model_.
cMem );
533 Sacado::Fad::SFad<double,2> resultFad;
534 resultFad =
kcl1EquQ( v1Var, v2Var, cMemVar );
539 resultFad =
kcl2EquQ( v1Var, v2Var, cMemVar );
547 const int numDeriv = 3;
548 Sacado::Fad::SFad<double,3> v1Var( numDeriv, 0, v1Now );
549 Sacado::Fad::SFad<double,3> v2Var( numDeriv, 1, v2Now );
550 Sacado::Fad::SFad<double,3> nVar( numDeriv, 2, nNow );
552 Sacado::Fad::SFad<double,3> vRestVar(
model_.
vRest );
554 Sacado::Fad::SFad<double,3> resultFad =
nEquF( v1Var, v2Var, nVar, vRestVar);
561 const int numDeriv = 1;
562 Sacado::Fad::SFad<double,1> nVar( numDeriv, 0, nNow );
564 Sacado::Fad::SFad<double,1> resultFad =
nEquQ( nVar );
571 const int numDeriv = 3;
572 Sacado::Fad::SFad<double,3> v1Var( numDeriv, 0, v1Now );
573 Sacado::Fad::SFad<double,3> v2Var( numDeriv, 1, v2Now );
574 Sacado::Fad::SFad<double,3> mVar( numDeriv, 2, mNow );
576 Sacado::Fad::SFad<double,3> vRestVar(
model_.
vRest );
578 Sacado::Fad::SFad<double,3> resultFad =
mEquF( v1Var, v2Var, mVar, vRestVar );
585 const int numDeriv = 1;
586 Sacado::Fad::SFad<double,1> mVar( numDeriv, 0, mNow );
588 Sacado::Fad::SFad<double,1> resultFad =
mEquQ( mVar );
595 const int numDeriv = 3;
596 Sacado::Fad::SFad<double,3> v1Var( numDeriv, 0, v1Now );
597 Sacado::Fad::SFad<double,3> v2Var( numDeriv, 1, v2Now );
598 Sacado::Fad::SFad<double,3> hVar( numDeriv, 2, hNow );
600 Sacado::Fad::SFad<double,3> vRestVar(
model_.
vRest );
602 Sacado::Fad::SFad<double,3> resultFad =
hEquF( v1Var, v2Var, hVar, vRestVar );
609 const int numDeriv = 1;
610 Sacado::Fad::SFad<double,1> hVar( numDeriv, 0, hNow );
612 Sacado::Fad::SFad<double,1> resultFad =
hEquQ( hVar );
623 #ifdef Xyce_DEBUG_DEVICE
627 Xyce::dout() <<
"Instance::updateIntermediateVars()" << std::endl
628 <<
"vRest(input) = " << vRest << std::endl
629 <<
"v1 = " << v1Now << std::endl
630 <<
"v2 = " << v2Now << std::endl
631 <<
"nNow = " << nNow << std::endl
632 <<
"mNow = " << mNow << std::endl
633 <<
"hNow = " << hNow << std::endl
637 <<
"dkcl1F_dn = " <<
dkcl1F_dn << std::endl
638 <<
"dkcl1F_dm = " <<
dkcl1F_dm << std::endl
639 <<
"dkcl1F_dh = " <<
dkcl1F_dh << std::endl
643 <<
"dkcl2F_dn = " <<
dkcl2F_dn << std::endl
644 <<
"dkcl2F_dm = " <<
dkcl2F_dm << std::endl
645 <<
"dkcl2F_dh = " <<
dkcl2F_dh << std::endl
646 <<
"alphaN = " << alphaN<double>( v1Now, v2Now, vRest) << std::endl
647 <<
"betaN = " << betaN<double>( v1Now, v2Now, vRest) << std::endl
649 <<
"dnF_dV1 = " <<
dnF_dV1 << std::endl
650 <<
"dnF_dV2 = " <<
dnF_dV2 << std::endl
651 <<
"dnF_dn = " <<
dnF_dn << std::endl
653 <<
"dnQ_dn = " <<
dnQ_dn << std::endl
654 <<
"alphaM = " << alphaM<double>( v1Now, v2Now, vRest) << std::endl
655 <<
"betaM = " << betaM<double>( v1Now, v2Now, vRest) << std::endl
657 <<
"dmF_dV1 = " <<
dmF_dV1 << std::endl
658 <<
"dmF_dV2 = " <<
dmF_dV2 << std::endl
659 <<
"dmF_dm = " <<
dmF_dm << std::endl
661 <<
"dmQ_dm = " <<
dmQ_dm << std::endl
662 <<
"alphaH = " << alphaH<double>( v1Now, v2Now, vRest) << std::endl
663 <<
"betaH = " << betaH<double>( v1Now, v2Now, vRest) << std::endl
665 <<
"dhF_dV1 = " <<
dhF_dV1 << std::endl
666 <<
"dhF_dV2 = " <<
dhF_dV2 << std::endl
667 <<
"dhF_dh = " <<
dhF_dh << std::endl
669 <<
"dhQ_dh = " <<
dhQ_dh << std::endl
686 bool bsuccess =
true;
709 bool bsuccess =
true;
732 bool bsuccess =
true;
786 bool bsuccess =
true;
821 bool bsuccess =
true;
862 bool bsuccess =
true;
906 std::vector<Instance*>::iterator iter;
910 for (iter=first; iter!=last; ++iter)
912 (*iter)->processParams();
930 :
DeviceModel(MB, configuration.getModelParameters(), factory_block)
961 std::vector<Instance*>::iterator iter;
965 for (iter=first; iter!=last; ++iter)
983 std::vector<Instance*>::const_iterator iter;
991 os <<
"Number of Neuron instances: " << isize << std::endl;
992 os <<
" name=\t\tmodelName\tParameters" << std::endl;
993 for (i=0, iter=first; iter!=last; ++iter, ++i)
995 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
1020 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1038 (*it)->updatePrimaryState();
1053 .registerDevice(
"neuron", 1)
1054 .registerModelType(
"neuron", 1);