46 #include <Xyce_config.h>
60 #include <N_ERH_ErrorMgr.h>
64 #include <N_LAS_Vector.h>
65 #include <N_LAS_Matrix.h>
66 #include <N_UTL_FeatureTest.h>
83 .setDescription(
"Membrane capacitance");
89 .setDescription(
"Leak current reversal potential");
95 .setDescription(
"Membrane conductance");
101 .setDescription(
"Potassium reversal potential");
107 .setDescription(
"Potassium base conductance");
113 .setDescription(
"Sodium reversal potential");
119 .setDescription(
"Sodium base conductance");
125 .setDescription(
"Resting potential");
165 bool bsuccess =
true;
183 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
306 const std::vector<int> & extLIDVecRef)
311 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
313 Xyce::dout() << std::endl << section_divider << std::endl;
314 Xyce::dout() <<
" Instance::registerLIDs" << std::endl;
315 Xyce::dout() <<
" name = " <<
getName() << std::endl;
328 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) )
330 Xyce::dout() <<
" li_Pos = " <<
li_Pos << std::endl
331 <<
" li_Neg = " <<
li_Neg << std::endl
332 <<
" li_nPro = " <<
li_nPro << std::endl
333 <<
" li_mPro = " <<
li_mPro << std::endl
334 <<
" li_hPro = " <<
li_hPro << std::endl;
337 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) )
339 Xyce::dout() << section_divider << std::endl;
441 bool bsuccess =
true;
449 double v1Now = (*solVectorPtr)[
li_Pos];
450 double v2Now = (*solVectorPtr)[
li_Neg];
451 double nNow = (*solVectorPtr)[
li_nPro];
452 double mNow = (*solVectorPtr)[
li_mPro];
453 double hNow = (*solVectorPtr)[
li_hPro];
461 const int numDeriv = 5;
462 Sacado::Fad::SFad<double,5> v1Var( numDeriv, 0, v1Now );
463 Sacado::Fad::SFad<double,5> v2Var( numDeriv, 1, v2Now );
464 Sacado::Fad::SFad<double,5> nVar( numDeriv, 2, nNow );
465 Sacado::Fad::SFad<double,5> mVar( numDeriv, 3, mNow );
466 Sacado::Fad::SFad<double,5> hVar( numDeriv, 4, hNow );
468 Sacado::Fad::SFad<double,5> gMemVar(
model_.
gMem );
469 Sacado::Fad::SFad<double,5> eLeakVar(
model_.
eLeak );
470 Sacado::Fad::SFad<double,5> gKVar(
model_.
gK );
471 Sacado::Fad::SFad<double,5> eKVar(
model_.
eK );
472 Sacado::Fad::SFad<double,5> gNaVar(
model_.
gNa );
473 Sacado::Fad::SFad<double,5> eNaVar(
model_.
eNa );
476 Sacado::Fad::SFad<double,5> resultFad;
477 resultFad =
kcl1EquF( v1Var, v2Var, nVar, mVar, hVar, gMemVar, eLeakVar, gKVar, eKVar, gNaVar, eNaVar );
486 resultFad =
kcl2EquF( v1Var, v2Var, nVar, mVar, hVar, gMemVar, eLeakVar, gKVar, eKVar, gNaVar, eNaVar );
497 const int numDeriv = 2;
498 Sacado::Fad::SFad<double,2> v1Var( numDeriv, 0, v1Now );
499 Sacado::Fad::SFad<double,2> v2Var( numDeriv, 1, v2Now );
502 Sacado::Fad::SFad<double,2> cMemVar(
model_.
cMem );
504 Sacado::Fad::SFad<double,2> resultFad;
505 resultFad =
kcl1EquQ( v1Var, v2Var, cMemVar );
510 resultFad =
kcl2EquQ( v1Var, v2Var, cMemVar );
518 const int numDeriv = 3;
519 Sacado::Fad::SFad<double,3> v1Var( numDeriv, 0, v1Now );
520 Sacado::Fad::SFad<double,3> v2Var( numDeriv, 1, v2Now );
521 Sacado::Fad::SFad<double,3> nVar( numDeriv, 2, nNow );
523 Sacado::Fad::SFad<double,3> vRestVar(
model_.
vRest );
525 Sacado::Fad::SFad<double,3> resultFad =
nEquF( v1Var, v2Var, nVar, vRestVar);
532 const int numDeriv = 1;
533 Sacado::Fad::SFad<double,1> nVar( numDeriv, 0, nNow );
535 Sacado::Fad::SFad<double,1> resultFad =
nEquQ( nVar );
542 const int numDeriv = 3;
543 Sacado::Fad::SFad<double,3> v1Var( numDeriv, 0, v1Now );
544 Sacado::Fad::SFad<double,3> v2Var( numDeriv, 1, v2Now );
545 Sacado::Fad::SFad<double,3> mVar( numDeriv, 2, mNow );
547 Sacado::Fad::SFad<double,3> vRestVar(
model_.
vRest );
549 Sacado::Fad::SFad<double,3> resultFad =
mEquF( v1Var, v2Var, mVar, vRestVar );
556 const int numDeriv = 1;
557 Sacado::Fad::SFad<double,1> mVar( numDeriv, 0, mNow );
559 Sacado::Fad::SFad<double,1> resultFad =
mEquQ( mVar );
566 const int numDeriv = 3;
567 Sacado::Fad::SFad<double,3> v1Var( numDeriv, 0, v1Now );
568 Sacado::Fad::SFad<double,3> v2Var( numDeriv, 1, v2Now );
569 Sacado::Fad::SFad<double,3> hVar( numDeriv, 2, hNow );
571 Sacado::Fad::SFad<double,3> vRestVar(
model_.
vRest );
573 Sacado::Fad::SFad<double,3> resultFad =
hEquF( v1Var, v2Var, hVar, vRestVar );
580 const int numDeriv = 1;
581 Sacado::Fad::SFad<double,1> hVar( numDeriv, 0, hNow );
583 Sacado::Fad::SFad<double,1> resultFad =
hEquQ( hVar );
597 Xyce::dout() <<
"Instance::updateIntermediateVars()" << std::endl
598 <<
"vRest(input) = " << vRest << std::endl
599 <<
"v1 = " << v1Now << std::endl
600 <<
"v2 = " << v2Now << std::endl
601 <<
"nNow = " << nNow << std::endl
602 <<
"mNow = " << mNow << std::endl
603 <<
"hNow = " << hNow << std::endl
607 <<
"dkcl1F_dn = " <<
dkcl1F_dn << std::endl
608 <<
"dkcl1F_dm = " <<
dkcl1F_dm << std::endl
609 <<
"dkcl1F_dh = " <<
dkcl1F_dh << std::endl
613 <<
"dkcl2F_dn = " <<
dkcl2F_dn << std::endl
614 <<
"dkcl2F_dm = " <<
dkcl2F_dm << std::endl
615 <<
"dkcl2F_dh = " <<
dkcl2F_dh << std::endl
616 <<
"alphaN = " << alphaN<double>( v1Now, v2Now, vRest) << std::endl
617 <<
"betaN = " << betaN<double>( v1Now, v2Now, vRest) << std::endl
619 <<
"dnF_dV1 = " <<
dnF_dV1 << std::endl
620 <<
"dnF_dV2 = " <<
dnF_dV2 << std::endl
621 <<
"dnF_dn = " <<
dnF_dn << std::endl
623 <<
"dnQ_dn = " <<
dnQ_dn << std::endl
624 <<
"alphaM = " << alphaM<double>( v1Now, v2Now, vRest) << std::endl
625 <<
"betaM = " << betaM<double>( v1Now, v2Now, vRest) << std::endl
627 <<
"dmF_dV1 = " <<
dmF_dV1 << std::endl
628 <<
"dmF_dV2 = " <<
dmF_dV2 << std::endl
629 <<
"dmF_dm = " <<
dmF_dm << std::endl
631 <<
"dmQ_dm = " <<
dmQ_dm << std::endl
632 <<
"alphaH = " << alphaH<double>( v1Now, v2Now, vRest) << std::endl
633 <<
"betaH = " << betaH<double>( v1Now, v2Now, vRest) << std::endl
635 <<
"dhF_dV1 = " <<
dhF_dV1 << std::endl
636 <<
"dhF_dV2 = " <<
dhF_dV2 << std::endl
637 <<
"dhF_dh = " <<
dhF_dh << std::endl
639 <<
"dhQ_dh = " <<
dhQ_dh << std::endl
655 bool bsuccess =
true;
678 bool bsuccess =
true;
701 bool bsuccess =
true;
755 bool bsuccess =
true;
790 bool bsuccess =
true;
831 bool bsuccess =
true;
875 std::vector<Instance*>::iterator iter;
879 for (iter=first; iter!=last; ++iter)
881 (*iter)->processParams();
899 :
DeviceModel(MB, configuration.getModelParameters(), factory_block)
930 std::vector<Instance*>::iterator iter;
934 for (iter=first; iter!=last; ++iter)
952 std::vector<Instance*>::const_iterator iter;
960 os <<
"Number of Neuron instances: " << isize << std::endl;
961 os <<
" name=\t\tmodelName\tParameters" << std::endl;
962 for (i=0, iter=first; iter!=last; ++iter, ++i)
964 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
989 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1008 (*it)->updatePrimaryState();
1022 .registerDevice(
"neuron", 9)
1023 .registerModelType(
"neuron", 9);
const InstanceName & getName() const
bool updateDependentParameters()
bool processParams()
processParams
const DeviceOptions & deviceOptions_
static ScalarT nEquF(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &n, const ScalarT &Vrest)
Descriptor & addPar(const char *parName, T default_value, T U::*varPtr)
Adds the parameter description to the parameter map.
Linear::Vector * nextSolVectorPtr
std::vector< int > devConMap
Linear::Vector * daeQVectorPtr
static ScalarT hEquF(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &h, const ScalarT &Vrest)
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)
void loadNodeSymbols(Util::SymbolTable &symbol_table) const
Populates and returns the store name map.
virtual void forEachInstance(DeviceInstanceOp &op) const
Apply a device instance "op" to all instances associated with this model.
static Device * factory(const Configuration &configuration, const FactoryBlock &factory_block)
static ScalarT kcl1EquF(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &n, const ScalarT &m, const ScalarT &h, const ScalarT &memG, const ScalarT &leakE, const ScalarT &Kg, const ScalarT &Ke, const ScalarT &NaG, const ScalarT &NaE)
InstanceVector::const_iterator getInstanceEnd() const
Returns an iterator to the ending of the vector of all instances created for this device...
virtual void registerJacLIDs(const JacobianStamp &jacLIDVec)
bool updateSecondaryState()
static ScalarT kcl1EquQ(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &memC)
Instance(const Configuration &configuration, const InstanceBlock &IB, Model &Miter, const FactoryBlock &factory_block)
bool processInstanceParams()
processInstanceParams
InstanceVector::const_iterator getInstanceBegin() const
Returns an iterator to the beginning of the vector of all instances created for this device...
std::vector< Param > params
Parameters from the line.
const std::string & getName() const
void registerJacLIDs(const std::vector< std::vector< int > > &jacLIDVec)
The FactoryBlock contains parameters needed by the device, instance and model creation functions...
static ScalarT mEquQ(const ScalarT &m)
virtual bool updateState(double *solVec, double *staVec, double *stoVec)
Updates the devices state information.
static void loadInstanceParameters(ParametricData< Instance > &instance_parameters)
bool updateIntermediateVars()
static void loadModelParameters(ParametricData< Model > &model_parameters)
virtual std::ostream & printOutInstances(std::ostream &os) const
Linear::Vector * nextStaVectorPtr
static Config< T > & addConfiguration()
Adds the device to the Xyce device configuration.
static ScalarT hEquQ(const ScalarT &h)
Linear::Matrix * dFdxMatrixPtr
static ScalarT nEquQ(const ScalarT &n)
The Device class is an interface for device implementations.
std::vector< Instance * > instanceContainer
const SolverState & solverState_
Class Configuration contains device configuration data.
void registerStateLIDs(const std::vector< int > &staLIDVecRef)
const SolverState & getSolverState() const
static ScalarT kcl2EquF(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &n, const ScalarT &m, const ScalarT &h, const ScalarT &memG, const ScalarT &leakE, const ScalarT &Kg, const ScalarT &Ke, const ScalarT &NaG, const ScalarT &NaE)
static ScalarT kcl2EquQ(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &memC)
Linear::Vector * daeFVectorPtr
bool updateTemperature(const double &temp_tmp)
static ScalarT mEquF(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &m, const ScalarT &Vrest)
const std::vector< std::vector< int > > & jacobianStamp() const
void varTypes(std::vector< char > &varTypeVec)
static std::vector< std::vector< int > > jacStamp
const ExternData & extData
ModelBlock represents a .MODEL line from the netlist.
bool updatePrimaryState()
Manages parameter binding for class C.
InstanceBlock represent a device instance line from the netlist.
void registerLIDs(const std::vector< int > &intLIDVecRef, const std::vector< int > &extLIDVecRef)
Linear::Matrix * dQdxMatrixPtr
void setModParams(const std::vector< Param > ¶ms)