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(
"Leak current reversal potential");
93 .setDescription(
"Membrane conductance");
99 .setDescription(
"Potassium reversal potential");
105 .setDescription(
"Potassium base conductance");
111 .setDescription(
"Sodium reversal potential");
117 .setDescription(
"Sodium base conductance");
123 .setDescription(
"Resting potential");
126 std::vector<std::vector<int> >
159 bool bsuccess =
true;
176 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
300 const std::vector<int> & extLIDVecRef)
305 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
307 Xyce::dout() << std::endl << section_divider << std::endl;
308 Xyce::dout() <<
" Instance::registerLIDs" << std::endl;
309 Xyce::dout() <<
" name = " <<
getName() << std::endl;
322 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) )
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;
331 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) )
333 Xyce::dout() << section_divider << std::endl;
435 bool bsuccess =
true;
443 double v1Now = (*solVectorPtr)[
li_Pos];
444 double v2Now = (*solVectorPtr)[
li_Neg];
445 double nNow = (*solVectorPtr)[
li_nPro];
446 double mNow = (*solVectorPtr)[
li_mPro];
447 double hNow = (*solVectorPtr)[
li_hPro];
455 const int numDeriv = 5;
456 Sacado::Fad::SFad<double,5> v1Var( numDeriv, 0, v1Now );
457 Sacado::Fad::SFad<double,5> v2Var( numDeriv, 1, v2Now );
458 Sacado::Fad::SFad<double,5> nVar( numDeriv, 2, nNow );
459 Sacado::Fad::SFad<double,5> mVar( numDeriv, 3, mNow );
460 Sacado::Fad::SFad<double,5> hVar( numDeriv, 4, hNow );
462 Sacado::Fad::SFad<double,5> gMemVar(
model_.
gMem );
463 Sacado::Fad::SFad<double,5> eLeakVar(
model_.
eLeak );
464 Sacado::Fad::SFad<double,5> gKVar(
model_.
gK );
465 Sacado::Fad::SFad<double,5> eKVar(
model_.
eK );
466 Sacado::Fad::SFad<double,5> gNaVar(
model_.
gNa );
467 Sacado::Fad::SFad<double,5> eNaVar(
model_.
eNa );
470 Sacado::Fad::SFad<double,5> resultFad;
471 resultFad =
kcl1EquF( v1Var, v2Var, nVar, mVar, hVar, gMemVar, eLeakVar, gKVar, eKVar, gNaVar, eNaVar );
480 resultFad =
kcl2EquF( v1Var, v2Var, nVar, mVar, hVar, gMemVar, eLeakVar, gKVar, eKVar, gNaVar, eNaVar );
491 const int numDeriv = 2;
492 Sacado::Fad::SFad<double,2> v1Var( numDeriv, 0, v1Now );
493 Sacado::Fad::SFad<double,2> v2Var( numDeriv, 1, v2Now );
496 Sacado::Fad::SFad<double,2> cMemVar(
model_.
cMem );
498 Sacado::Fad::SFad<double,2> resultFad;
499 resultFad =
kcl1EquQ( v1Var, v2Var, cMemVar );
504 resultFad =
kcl2EquQ( v1Var, v2Var, cMemVar );
512 const int numDeriv = 3;
513 Sacado::Fad::SFad<double,3> v1Var( numDeriv, 0, v1Now );
514 Sacado::Fad::SFad<double,3> v2Var( numDeriv, 1, v2Now );
515 Sacado::Fad::SFad<double,3> nVar( numDeriv, 2, nNow );
517 Sacado::Fad::SFad<double,3> vRestVar(
model_.
vRest );
519 Sacado::Fad::SFad<double,3> resultFad =
nEquF( v1Var, v2Var, nVar, vRestVar);
526 const int numDeriv = 1;
527 Sacado::Fad::SFad<double,1> nVar( numDeriv, 0, nNow );
529 Sacado::Fad::SFad<double,1> resultFad =
nEquQ( nVar );
536 const int numDeriv = 3;
537 Sacado::Fad::SFad<double,3> v1Var( numDeriv, 0, v1Now );
538 Sacado::Fad::SFad<double,3> v2Var( numDeriv, 1, v2Now );
539 Sacado::Fad::SFad<double,3> mVar( numDeriv, 2, mNow );
541 Sacado::Fad::SFad<double,3> vRestVar(
model_.
vRest );
543 Sacado::Fad::SFad<double,3> resultFad =
mEquF( v1Var, v2Var, mVar, vRestVar );
550 const int numDeriv = 1;
551 Sacado::Fad::SFad<double,1> mVar( numDeriv, 0, mNow );
553 Sacado::Fad::SFad<double,1> resultFad =
mEquQ( mVar );
560 const int numDeriv = 3;
561 Sacado::Fad::SFad<double,3> v1Var( numDeriv, 0, v1Now );
562 Sacado::Fad::SFad<double,3> v2Var( numDeriv, 1, v2Now );
563 Sacado::Fad::SFad<double,3> hVar( numDeriv, 2, hNow );
565 Sacado::Fad::SFad<double,3> vRestVar(
model_.
vRest );
567 Sacado::Fad::SFad<double,3> resultFad =
hEquF( v1Var, v2Var, hVar, vRestVar );
574 const int numDeriv = 1;
575 Sacado::Fad::SFad<double,1> hVar( numDeriv, 0, hNow );
577 Sacado::Fad::SFad<double,1> resultFad =
hEquQ( hVar );
591 Xyce::dout() <<
"Instance::updateIntermediateVars()" << std::endl
592 <<
"vRest(input) = " << vRest << std::endl
593 <<
"v1 = " << v1Now << std::endl
594 <<
"v2 = " << v2Now << std::endl
595 <<
"nNow = " << nNow << std::endl
596 <<
"mNow = " << mNow << std::endl
597 <<
"hNow = " << hNow << std::endl
601 <<
"dkcl1F_dn = " <<
dkcl1F_dn << std::endl
602 <<
"dkcl1F_dm = " <<
dkcl1F_dm << std::endl
603 <<
"dkcl1F_dh = " <<
dkcl1F_dh << std::endl
607 <<
"dkcl2F_dn = " <<
dkcl2F_dn << std::endl
608 <<
"dkcl2F_dm = " <<
dkcl2F_dm << std::endl
609 <<
"dkcl2F_dh = " <<
dkcl2F_dh << std::endl
610 <<
"alphaN = " << alphaN<double>( v1Now, v2Now, vRest) << std::endl
611 <<
"betaN = " << betaN<double>( v1Now, v2Now, vRest) << std::endl
613 <<
"dnF_dV1 = " <<
dnF_dV1 << std::endl
614 <<
"dnF_dV2 = " <<
dnF_dV2 << std::endl
615 <<
"dnF_dn = " <<
dnF_dn << std::endl
617 <<
"dnQ_dn = " <<
dnQ_dn << std::endl
618 <<
"alphaM = " << alphaM<double>( v1Now, v2Now, vRest) << std::endl
619 <<
"betaM = " << betaM<double>( v1Now, v2Now, vRest) << std::endl
621 <<
"dmF_dV1 = " <<
dmF_dV1 << std::endl
622 <<
"dmF_dV2 = " <<
dmF_dV2 << std::endl
623 <<
"dmF_dm = " <<
dmF_dm << std::endl
625 <<
"dmQ_dm = " <<
dmQ_dm << std::endl
626 <<
"alphaH = " << alphaH<double>( v1Now, v2Now, vRest) << std::endl
627 <<
"betaH = " << betaH<double>( v1Now, v2Now, vRest) << std::endl
629 <<
"dhF_dV1 = " <<
dhF_dV1 << std::endl
630 <<
"dhF_dV2 = " <<
dhF_dV2 << std::endl
631 <<
"dhF_dh = " <<
dhF_dh << std::endl
633 <<
"dhQ_dh = " <<
dhQ_dh << std::endl
649 bool bsuccess =
true;
672 bool bsuccess =
true;
695 bool bsuccess =
true;
749 bool bsuccess =
true;
784 bool bsuccess =
true;
825 bool bsuccess =
true;
869 std::vector<Instance*>::iterator iter;
873 for (iter=first; iter!=last; ++iter)
875 (*iter)->processParams();
893 :
DeviceModel(MB, configuration.getModelParameters(), factory_block)
924 std::vector<Instance*>::iterator iter;
928 for (iter=first; iter!=last; ++iter)
946 std::vector<Instance*>::const_iterator iter;
954 os <<
"Number of Neuron instances: " << isize << std::endl;
955 os <<
" name=\t\tmodelName\tParameters" << std::endl;
956 for (i=0, iter=first; iter!=last; ++iter, ++i)
958 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
983 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1001 (*it)->updatePrimaryState();
1016 .registerDevice(
"neuron", 1)
1017 .registerModelType(
"neuron", 1);
const InstanceName & getName() const
static ScalarT hEquF(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &h, const ScalarT &Vrest)
bool processParams()
processParams
bool updateDependentParameters()
const DeviceOptions & deviceOptions_
static ScalarT kcl1EquQ(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &memC)
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
Pure virtual class to augment a linear system.
void registerStateLIDs(const std::vector< int > &staLIDVecRef)
void addInternalNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
static ScalarT hEquQ(const ScalarT &h)
static ScalarT nEquF(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &n, const ScalarT &Vrest)
InstanceVector::const_iterator getInstanceEnd() const
Returns an iterator to the ending of the vector of all instances created for this device...
bool updateSecondaryState()
virtual void registerJacLIDs(const JacobianStamp &jacLIDVec)
std::vector< Instance * > instanceContainer
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
static void loadInstanceParameters(ParametricData< Instance > &instance_parameters)
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)
The FactoryBlock contains parameters needed by the device, instance and model creation functions...
bool updateIntermediateVars()
Linear::Vector * nextStaVectorPtr
static ScalarT nEquQ(const ScalarT &n)
bool updatePrimaryState()
static Config< T > & addConfiguration()
Adds the device to the Xyce device configuration.
Linear::Matrix * dFdxMatrixPtr
bool updateTemperature(const double &temp_tmp)
The Device class is an interface for device implementations.
static std::vector< std::vector< int > > jacStamp
void registerLIDs(const std::vector< int > &intLIDVecRef, const std::vector< int > &extLIDVecRef)
virtual void forEachInstance(DeviceInstanceOp &op) const
Apply a device instance "op" to all instances associated with this model.
const SolverState & solverState_
static ScalarT mEquF(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &m, const ScalarT &Vrest)
Class Configuration contains device configuration data.
void loadNodeSymbols(Util::SymbolTable &symbol_table) const
Populates and returns the store name map.
const std::vector< std::vector< int > > & jacobianStamp() const
void varTypes(std::vector< char > &varTypeVec)
const SolverState & getSolverState() const
static ScalarT mEquQ(const ScalarT &m)
static ScalarT kcl2EquQ(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &memC)
virtual bool updateState(double *solVec, double *staVec, double *stoVec)
Updates the devices state information.
Linear::Vector * daeFVectorPtr
static Device * factory(const Configuration &configuration, const FactoryBlock &factory_block)
void registerJacLIDs(const std::vector< std::vector< int > > &jacLIDVec)
static void loadModelParameters(ParametricData< Model > &model_parameters)
const ExternData & extData
Instance(const Configuration &configuration, const InstanceBlock &IB, Model &Miter, const FactoryBlock &factory_block)
ModelBlock represents a .MODEL line from the netlist.
Manages parameter binding for class C.
InstanceBlock represent a device instance line from the netlist.
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)
Linear::Matrix * dQdxMatrixPtr
virtual std::ostream & printOutInstances(std::ostream &os) const
void setModParams(const std::vector< Param > ¶ms)