46 #include <Xyce_config.h>
60 #include <N_ERH_ErrorMgr.h>
62 #include <N_LAS_Vector.h>
63 #include <N_LAS_Matrix.h>
64 #include <N_UTL_FeatureTest.h>
81 .setDescription(
"Membrane capacitance");
87 .setDescription(
"Membrane conductance");
93 .setDescription(
"Resting potential");
99 .setDescription(
"Potassium resting potential");
105 .setDescription(
"Potassium base conductance");
111 .setDescription(
"Sodium resting potential");
117 .setDescription(
"Sodium base conductance");
123 .setDescription(
"a-current rest potential");
129 .setDescription(
"a-current base conductance");
135 .setDescription(
"Calcium rest potential");
141 .setDescription(
"Calcium base conductance");
147 .setDescription(
"Potassium-calcium rest potential");
153 .setDescription(
"Potassium-calcium base conductance");
159 .setDescription(
"initial intra-cellular calcium concentration");
165 .setDescription(
"calcium current to concentration multiplier");
171 .setDescription(
"calcium removal time constant");
209 bool bsuccess =
true;
226 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
367 const std::vector<int> & extLIDVecRef)
372 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
374 Xyce::dout() << std::endl << section_divider << std::endl;
375 Xyce::dout() <<
" Instance::registerLIDs" << std::endl;
376 Xyce::dout() <<
" name = " <<
getName() << std::endl;
395 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) )
397 Xyce::dout() <<
" li_Pos = " <<
li_Pos << std::endl
398 <<
" li_Neg = " <<
li_Neg << std::endl
399 <<
" li_nPro = " <<
li_nPro << std::endl
400 <<
" li_mPro = " <<
li_mPro << std::endl
401 <<
" li_hPro = " <<
li_hPro << std::endl
402 <<
" li_aPro = " <<
li_aPro << std::endl
403 <<
" li_bPro = " <<
li_bPro << std::endl
404 <<
" li_M_Pro = " <<
li_M_Pro << std::endl
405 <<
" li_H_Pro = " <<
li_H_Pro << std::endl
406 <<
" li_cPro = " <<
li_cPro << std::endl
407 <<
" li_CaPro = " <<
li_CaPro << std::endl;
410 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) )
412 Xyce::dout() << section_divider << std::endl;
551 bool bsuccess =
true;
559 double v1Now = (*solVectorPtr)[
li_Pos];
560 double v2Now = (*solVectorPtr)[
li_Neg];
561 double nNow = (*solVectorPtr)[
li_nPro];
562 double mNow = (*solVectorPtr)[
li_mPro];
563 double hNow = (*solVectorPtr)[
li_hPro];
564 double aNow = (*solVectorPtr)[
li_aPro];
565 double bNow = (*solVectorPtr)[
li_bPro];
566 double M_Now = (*solVectorPtr)[
li_M_Pro];
567 double H_Now = (*solVectorPtr)[
li_H_Pro];
568 double cNow = (*solVectorPtr)[
li_cPro];
569 double CaNow = (*solVectorPtr)[
li_CaPro];
575 Sacado::Fad::SFad<double,10> v1Var( 10, 0, v1Now );
576 Sacado::Fad::SFad<double,10> v2Var( 10, 1, v2Now );
577 Sacado::Fad::SFad<double,10> nVar( 10, 2, nNow );
578 Sacado::Fad::SFad<double,10> mVar( 10, 3, mNow );
579 Sacado::Fad::SFad<double,10> hVar( 10, 4, hNow );
580 Sacado::Fad::SFad<double,10> aVar( 10, 5, aNow );
581 Sacado::Fad::SFad<double,10> bVar( 10, 6, bNow );
582 Sacado::Fad::SFad<double,10> M_Var( 10, 7, M_Now );
583 Sacado::Fad::SFad<double,10> H_Var( 10, 8, H_Now );
584 Sacado::Fad::SFad<double,10> cVar( 10, 9, cNow );
587 Sacado::Fad::SFad<double,10> gMemVar(
model_.
gMem );
588 Sacado::Fad::SFad<double,10> vRestVar(
model_.
vRest );
589 Sacado::Fad::SFad<double,10> gKVar(
model_.
gK );
590 Sacado::Fad::SFad<double,10> eKVar(
model_.
eK );
591 Sacado::Fad::SFad<double,10> gNaVar(
model_.
gNa );
592 Sacado::Fad::SFad<double,10> eNaVar(
model_.
eNa );
593 Sacado::Fad::SFad<double,10> gAVar(
model_.
gA );
594 Sacado::Fad::SFad<double,10> eAVar(
model_.
eA );
595 Sacado::Fad::SFad<double,10> gCaVar(
model_.
gCa );
596 Sacado::Fad::SFad<double,10> eCaVar(
model_.
eCa );
597 Sacado::Fad::SFad<double,10> gKCaVar(
model_.
gKCa );
598 Sacado::Fad::SFad<double,10> CaInitVar(
model_.
CaInit );
600 Sacado::Fad::SFad<double,10> CaTauVar(
model_.
CaTau );
603 Sacado::Fad::SFad<double,10> resultFad;
604 resultFad =
kcl1EquF( v1Var, v2Var, nVar, mVar, hVar, aVar, bVar, M_Var, H_Var, cVar, gMemVar, vRestVar, gKVar, eKVar, gNaVar, eNaVar, gAVar, eAVar, gCaVar, eCaVar, gKCaVar);
618 resultFad =
kcl2EquF( v1Var, v2Var, nVar, mVar, hVar, aVar, bVar, M_Var, H_Var, cVar, gMemVar, vRestVar, gKVar, eKVar, gNaVar, eNaVar, gAVar, eAVar, gCaVar, eCaVar, gKCaVar);
633 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
634 Sacado::Fad::SFad<double,2> v2Var( 2, 1, v2Now );
637 Sacado::Fad::SFad<double,2> cMemVar(
model_.
cMem );
639 Sacado::Fad::SFad<double,2> resultFad;
640 resultFad =
kcl1EquQ( v1Var, v2Var, cMemVar );
645 resultFad =
kcl2EquQ( v1Var, v2Var, cMemVar );
653 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
654 Sacado::Fad::SFad<double,2> nVar( 2, 1, nNow );
656 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
658 Sacado::Fad::SFad<double,2> resultFad =
nEquF( v1Var, nVar, vRestVar);
665 Sacado::Fad::SFad<double,1> nVar( 1, 0, nNow );
667 Sacado::Fad::SFad<double,1> resultFad =
nEquQ( nVar );
674 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
675 Sacado::Fad::SFad<double,2> mVar( 2, 1, mNow );
677 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
679 Sacado::Fad::SFad<double,2> resultFad =
mEquF( v1Var, mVar, vRestVar );
685 Sacado::Fad::SFad<double,1> mVar( 1, 0, mNow );
687 Sacado::Fad::SFad<double,1> resultFad =
mEquQ( mVar );
694 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
695 Sacado::Fad::SFad<double,2> hVar( 2, 1, hNow );
697 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
699 Sacado::Fad::SFad<double,2> resultFad =
hEquF( v1Var, hVar, vRestVar );
705 Sacado::Fad::SFad<double,1> hVar( 1, 0, hNow );
707 Sacado::Fad::SFad<double,1> resultFad =
hEquQ( hVar );
714 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
715 Sacado::Fad::SFad<double,2> aVar( 2, 1, aNow );
717 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
719 Sacado::Fad::SFad<double,2> resultFad =
aEquF( v1Var, aVar, vRestVar );
725 Sacado::Fad::SFad<double,1> aVar( 1, 0, aNow );
727 Sacado::Fad::SFad<double,1> resultFad =
aEquQ( aVar );
734 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
735 Sacado::Fad::SFad<double,2> bVar( 2, 1, bNow );
737 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
739 Sacado::Fad::SFad<double,2> resultFad =
bEquF( v1Var, bVar, vRestVar );
745 Sacado::Fad::SFad<double,1> bVar( 1, 0, bNow );
747 Sacado::Fad::SFad<double,1> resultFad =
aEquQ( bVar );
754 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
755 Sacado::Fad::SFad<double,2> M_Var( 2, 1, M_Now );
757 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
759 Sacado::Fad::SFad<double,2> resultFad =
M_EquF( v1Var, M_Var, vRestVar );
765 Sacado::Fad::SFad<double,1> M_Var( 1, 0, M_Now );
767 Sacado::Fad::SFad<double,1> resultFad =
aEquQ( M_Var );
774 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
775 Sacado::Fad::SFad<double,2> H_Var( 2, 1, H_Now );
777 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
779 Sacado::Fad::SFad<double,2> resultFad =
H_EquF( v1Var, H_Var, vRestVar );
785 Sacado::Fad::SFad<double,1> H_Var( 1, 0, H_Now );
787 Sacado::Fad::SFad<double,1> resultFad =
H_EquQ( H_Var );
794 Sacado::Fad::SFad<double,3> v1Var( 3, 0, v1Now );
795 Sacado::Fad::SFad<double,3> cVar( 3, 1, cNow );
796 Sacado::Fad::SFad<double,3> CaVar( 3, 2, CaNow );
798 Sacado::Fad::SFad<double,3> vRestVar(
model_.
vRest );
800 Sacado::Fad::SFad<double,3> resultFad =
C_EquF( v1Var, cVar, CaVar, vRestVar );
807 Sacado::Fad::SFad<double,1> cVar( 1, 0, cNow );
809 Sacado::Fad::SFad<double,1> resultFad =
C_EquQ( cVar );
816 Sacado::Fad::SFad<double,5> v1Var( 5, 0, v1Now );
817 Sacado::Fad::SFad<double,5> v2Var( 5, 1, v2Now );
818 Sacado::Fad::SFad<double,5> M_Var( 5, 2, M_Now );
819 Sacado::Fad::SFad<double,5> H_Var( 5, 3, H_Now );
820 Sacado::Fad::SFad<double,5> CaVar( 5, 4, CaNow );
823 Sacado::Fad::SFad<double,5> gCaVar(
model_.
gCa );
824 Sacado::Fad::SFad<double,5> eCaVar(
model_.
gCa );
826 Sacado::Fad::SFad<double,5> CaTauVar(
model_.
CaTau );
828 Sacado::Fad::SFad<double,5> resultFad =
Ca_EquF( v1Var, v2Var, M_Var, H_Var, CaVar, gCaVar, eCaVar, CaGammaVar, CaTauVar );
837 Sacado::Fad::SFad<double,1> CaVar( 1, 0, CaNow );
839 Sacado::Fad::SFad<double,1> resultFad =
Ca_EquQ( CaVar );
852 Xyce::dout() <<
"Instance::updateIntermediateVars()" << std::endl
853 <<
"v1 = " << v1Now << std::endl
854 <<
"v2 = " << v2Now << std::endl
855 <<
"nNow = " << nNow << std::endl
856 <<
"mNow = " << mNow << std::endl
857 <<
"hNow = " << hNow << std::endl
858 <<
"aNow = " << aNow << std::endl
859 <<
"bNow = " << bNow << std::endl
860 <<
"M_Now = " << M_Now << std::endl
861 <<
"H_Now = " << H_Now << std::endl
862 <<
"cNow = " << cNow << std::endl
863 <<
"CaNow = " << CaNow << std::endl
867 <<
"dkcl1F_dn = " <<
dkcl1F_dn << std::endl
868 <<
"dkcl1F_dm = " <<
dkcl1F_dm << std::endl
869 <<
"dkcl1F_dh = " <<
dkcl1F_dh << std::endl
873 <<
"dkcl2F_dn = " <<
dkcl2F_dn << std::endl
874 <<
"dkcl2F_dm = " <<
dkcl2F_dm << std::endl
875 <<
"dkcl2F_dh = " <<
dkcl2F_dh << std::endl
876 <<
"alphaN = " << alphaN<double>( v1Now ) << std::endl
877 <<
"betaN = " << betaN<double>( v1Now ) << std::endl
879 <<
"dnF_dV1 = " <<
dnF_dV1 << std::endl
880 <<
"dnF_dn = " <<
dnF_dn << std::endl
882 <<
"dnQ_dn = " <<
dnQ_dn << std::endl
883 <<
"alphaM = " << alphaM<double>( v1Now ) << std::endl
884 <<
"betaM = " << betaM<double>( v1Now ) << std::endl
886 <<
"dmF_dV1 = " <<
dmF_dV1 << std::endl
887 <<
"dmF_dm = " <<
dmF_dm << std::endl
889 <<
"dmQ_dm = " <<
dmQ_dm << std::endl
890 <<
"alphaH = " << alphaH<double>( v1Now ) << std::endl
891 <<
"betaH = " << betaH<double>( v1Now ) << std::endl
893 <<
"dhF_dV1 = " <<
dhF_dV1 << std::endl
894 <<
"dhF_dh = " <<
dhF_dh << std::endl
896 <<
"dhQ_dh = " <<
dhQ_dh << std::endl
898 <<
"aInf = " << aInf<double>( v1Now ) << std::endl
899 <<
"aTau = " << aTau<double>( v1Now ) << std::endl
901 <<
"daF_dV1 = " <<
daF_dV1 << std::endl
902 <<
"daF_da = " <<
daF_da << std::endl
904 <<
"daQ_da = " <<
daQ_da << std::endl
906 <<
"bInf = " << bInf<double>( v1Now ) << std::endl
907 <<
"bTau = " << bTau<double>( v1Now ) << std::endl
909 <<
"dbF_dV1 = " <<
dbF_dV1 << std::endl
910 <<
"dbF_db = " <<
dbF_db << std::endl
912 <<
"dbQ_db = " <<
dbQ_db << std::endl
914 <<
"M_Inf = " << M_Inf<double>( v1Now ) << std::endl
915 <<
"M_Tau = " << M_Tau<double>( v1Now ) << std::endl
917 <<
"dMF_dV1 = " <<
dMF_dV1 << std::endl
918 <<
"dMF_dM = " <<
dMF_dM << std::endl
920 <<
"dMQ_dM = " <<
dMQ_dM << std::endl
922 <<
"H_Inf = " << H_Inf<double>( v1Now ) << std::endl
923 <<
"H_Tau = " << H_Tau<double>( v1Now ) << std::endl
925 <<
"dHF_dV1 = " <<
dHF_dV1 << std::endl
926 <<
"dHF_dH = " <<
dHF_dH << std::endl
928 <<
"dHQ_dH = " <<
dHQ_dH << std::endl
931 <<
"dcF_dV1 = " <<
dcF_dV1 << std::endl
932 <<
"dcF_dc = " <<
dcF_dc << std::endl
934 <<
"dcQ_dc = " <<
dcQ_dc << std::endl
937 <<
"dCaF_dV1 = " <<
dCaF_dV1 << std::endl
938 <<
"dCaF_dV2 = " <<
dCaF_dV2 << std::endl
939 <<
"dCaF_dM = " <<
dCaF_dM << std::endl
940 <<
"dCaF_dH = " <<
dCaF_dH << std::endl
941 <<
"dCaF_dCa = " <<
dCaF_dCa << std::endl
943 <<
"dCaQ_dCa = " <<
dCaQ_dCa << std::endl
961 bool bsuccess =
true;
984 bool bsuccess =
true;
1006 bool bsuccess =
true;
1071 bool bsuccess =
true;
1110 bool bsuccess =
true;
1180 bool bsuccess =
true;
1224 std::vector<Instance*>::iterator iter;
1228 for (iter=first; iter!=last; ++iter)
1230 (*iter)->processParams();
1248 :
DeviceModel(MB, configuration.getModelParameters(), factory_block)
1279 std::vector<Instance*>::iterator iter;
1283 for (iter=first; iter!=last; ++iter)
1302 std::vector<Instance*>::const_iterator iter;
1310 os <<
"Number of Neuron instances: " << isize << std::endl;
1311 os <<
" name=\t\tmodelName\tParameters" << std::endl;
1312 for (i=0, iter=first; iter!=last; ++iter, ++i)
1314 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
1339 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1353 .registerDevice(
"neuron", 2)
1354 .registerModelType(
"neuron", 2);
const InstanceName & getName() const
void registerLIDs(const std::vector< int > &intLIDVecRef, const std::vector< int > &extLIDVecRef)
static ScalarT C_EquF(const ScalarT &Vn1, const ScalarT &C, const ScalarT &CaConc, const ScalarT &Vrest)
static ScalarT H_EquF(const ScalarT &Vn1, const ScalarT &H, const ScalarT &Vrest)
bool updateDependentParameters()
const SolverState & solverState_
Descriptor & addPar(const char *parName, T default_value, T U::*varPtr)
Adds the parameter description to the parameter map.
static Device * factory(const Configuration &configuration, const FactoryBlock &factory_block)
void registerStateLIDs(const std::vector< int > &staLIDVecRef)
Linear::Vector * nextSolVectorPtr
Linear::Vector * daeQVectorPtr
bool updatePrimaryState()
Pure virtual class to augment a linear system.
void addInternalNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
static ScalarT H_EquQ(const ScalarT &H)
static ScalarT kcl2EquF(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &n, const ScalarT &m, const ScalarT &h, const ScalarT &a, const ScalarT &b, const ScalarT &MC, const ScalarT &HC, const ScalarT &CC, const ScalarT &memG, const ScalarT &restV, const ScalarT &Kg, const ScalarT &Ke, const ScalarT &NaG, const ScalarT &NaE, const ScalarT &Ag, const ScalarT &Ae, const ScalarT &CaTg, const ScalarT &CaE, const ScalarT &KCaG)
static void loadModelParameters(ParametricData< Model > &model_parameters)
static ScalarT mEquF(const ScalarT &Vn1, const ScalarT &m, const ScalarT &Vrest)
bool processInstanceParams()
processInstanceParams
virtual void registerJacLIDs(const JacobianStamp &jacLIDVec)
static ScalarT nEquQ(const ScalarT &n)
static ScalarT hEquQ(const ScalarT &h)
void loadNodeSymbols(Util::SymbolTable &symbol_table) const
Populates and returns the store name map.
static ScalarT aEquF(const ScalarT &Vn1, const ScalarT &a, const ScalarT &Vrest)
std::vector< Param > params
Parameters from the line.
static void loadInstanceParameters(ParametricData< Instance > &instance_parameters)
const std::string & getName() const
static ScalarT aEquQ(const ScalarT &a)
bool processParams()
processParams
static ScalarT Ca_EquQ(const ScalarT &Ca)
The FactoryBlock contains parameters needed by the device, instance and model creation functions...
bool updateIntermediateVars()
const DeviceOptions & deviceOptions_
static ScalarT kcl1EquQ(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &memC)
static ScalarT kcl1EquF(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &n, const ScalarT &m, const ScalarT &h, const ScalarT &a, const ScalarT &b, const ScalarT &MC, const ScalarT &HC, const ScalarT &CC, const ScalarT &memG, const ScalarT &restV, const ScalarT &Kg, const ScalarT &Ke, const ScalarT &NaG, const ScalarT &NaE, const ScalarT &Ag, const ScalarT &Ae, const ScalarT &CaTg, const ScalarT &CaE, const ScalarT &KCaG)
static ScalarT M_EquF(const ScalarT &Vn1, const ScalarT &M, const ScalarT &Vrest)
bool updateTemperature(const double &temp_tmp)
Linear::Vector * nextStaVectorPtr
static Config< T > & addConfiguration()
Adds the device to the Xyce device configuration.
Linear::Matrix * dFdxMatrixPtr
static ScalarT bEquF(const ScalarT &Vn1, const ScalarT &b, const ScalarT &Vrest)
virtual void forEachInstance(DeviceInstanceOp &op) const
Apply a device instance "op" to all instances associated with this model.
The Device class is an interface for device implementations.
static ScalarT nEquF(const ScalarT &Vn1, const ScalarT &n, const ScalarT &Vrest)
Class Configuration contains device configuration data.
Instance(const Configuration &configuration, const InstanceBlock &IB, Model &Miter, const FactoryBlock &factory_block)
const SolverState & getSolverState() const
static ScalarT Ca_EquF(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &MC, const ScalarT &HC, const ScalarT &Ca, const ScalarT &CaTg, const ScalarT &CaE, const ScalarT &CaGamma, const ScalarT &CaTau)
static ScalarT C_EquQ(const ScalarT &C)
void registerJacLIDs(const std::vector< std::vector< int > > &jacLIDVec)
Linear::Vector * daeFVectorPtr
static ScalarT mEquQ(const ScalarT &m)
std::vector< Instance * > instanceContainer
static std::vector< std::vector< int > > jacStamp
bool updateSecondaryState()
virtual std::ostream & printOutInstances(std::ostream &os) const
const ExternData & extData
ModelBlock represents a .MODEL line from the netlist.
Manages parameter binding for class C.
InstanceBlock represent a device instance line from the netlist.
Linear::Matrix * dQdxMatrixPtr
const std::vector< std::vector< int > > & jacobianStamp() const
void varTypes(std::vector< char > &varTypeVec)
static ScalarT kcl2EquQ(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &memC)
void setModParams(const std::vector< Param > ¶ms)
static ScalarT hEquF(const ScalarT &Vn1, const ScalarT &h, const ScalarT &Vrest)