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),
297 const std::vector<int> & extLIDVecRef)
302 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
304 Xyce::dout() << std::endl << section_divider << std::endl;
305 Xyce::dout() <<
" Instance::registerLIDs" << std::endl;
306 Xyce::dout() <<
" name = " <<
getName() << std::endl;
319 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) )
321 Xyce::dout() <<
" li_Pos = " <<
li_Pos << std::endl
322 <<
" li_Neg = " <<
li_Neg << std::endl
323 <<
" li_nPro = " <<
li_nPro << std::endl
324 <<
" li_mPro = " <<
li_mPro << std::endl
325 <<
" li_hPro = " <<
li_hPro << std::endl;
328 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) )
330 Xyce::dout() << section_divider << std::endl;
432 bool bsuccess =
true;
440 double v1Now = (*solVectorPtr)[
li_Pos];
441 double v2Now = (*solVectorPtr)[
li_Neg];
442 double nNow = (*solVectorPtr)[
li_nPro];
443 double mNow = (*solVectorPtr)[
li_mPro];
444 double hNow = (*solVectorPtr)[
li_hPro];
452 const int numDeriv = 5;
453 Sacado::Fad::SFad<double,5> v1Var( numDeriv, 0, v1Now );
454 Sacado::Fad::SFad<double,5> v2Var( numDeriv, 1, v2Now );
455 Sacado::Fad::SFad<double,5> nVar( numDeriv, 2, nNow );
456 Sacado::Fad::SFad<double,5> mVar( numDeriv, 3, mNow );
457 Sacado::Fad::SFad<double,5> hVar( numDeriv, 4, hNow );
459 Sacado::Fad::SFad<double,5> gMemVar(
model_.
gMem );
460 Sacado::Fad::SFad<double,5> eLeakVar(
model_.
eLeak );
461 Sacado::Fad::SFad<double,5> gKVar(
model_.
gK );
462 Sacado::Fad::SFad<double,5> eKVar(
model_.
eK );
463 Sacado::Fad::SFad<double,5> gNaVar(
model_.
gNa );
464 Sacado::Fad::SFad<double,5> eNaVar(
model_.
eNa );
467 Sacado::Fad::SFad<double,5> resultFad;
468 resultFad =
kcl1EquF( v1Var, v2Var, nVar, mVar, hVar, gMemVar, eLeakVar, gKVar, eKVar, gNaVar, eNaVar );
477 resultFad =
kcl2EquF( v1Var, v2Var, nVar, mVar, hVar, gMemVar, eLeakVar, gKVar, eKVar, gNaVar, eNaVar );
488 const int numDeriv = 2;
489 Sacado::Fad::SFad<double,2> v1Var( numDeriv, 0, v1Now );
490 Sacado::Fad::SFad<double,2> v2Var( numDeriv, 1, v2Now );
493 Sacado::Fad::SFad<double,2> cMemVar(
model_.
cMem );
495 Sacado::Fad::SFad<double,2> resultFad;
496 resultFad =
kcl1EquQ( v1Var, v2Var, cMemVar );
501 resultFad =
kcl2EquQ( v1Var, v2Var, cMemVar );
509 const int numDeriv = 3;
510 Sacado::Fad::SFad<double,3> v1Var( numDeriv, 0, v1Now );
511 Sacado::Fad::SFad<double,3> v2Var( numDeriv, 1, v2Now );
512 Sacado::Fad::SFad<double,3> nVar( numDeriv, 2, nNow );
514 Sacado::Fad::SFad<double,3> vRestVar(
model_.
vRest );
516 Sacado::Fad::SFad<double,3> resultFad =
nEquF( v1Var, v2Var, nVar, vRestVar);
523 const int numDeriv = 1;
524 Sacado::Fad::SFad<double,1> nVar( numDeriv, 0, nNow );
526 Sacado::Fad::SFad<double,1> resultFad =
nEquQ( nVar );
533 const int numDeriv = 3;
534 Sacado::Fad::SFad<double,3> v1Var( numDeriv, 0, v1Now );
535 Sacado::Fad::SFad<double,3> v2Var( numDeriv, 1, v2Now );
536 Sacado::Fad::SFad<double,3> mVar( numDeriv, 2, mNow );
538 Sacado::Fad::SFad<double,3> vRestVar(
model_.
vRest );
540 Sacado::Fad::SFad<double,3> resultFad =
mEquF( v1Var, v2Var, mVar, vRestVar );
547 const int numDeriv = 1;
548 Sacado::Fad::SFad<double,1> mVar( numDeriv, 0, mNow );
550 Sacado::Fad::SFad<double,1> resultFad =
mEquQ( mVar );
557 const int numDeriv = 3;
558 Sacado::Fad::SFad<double,3> v1Var( numDeriv, 0, v1Now );
559 Sacado::Fad::SFad<double,3> v2Var( numDeriv, 1, v2Now );
560 Sacado::Fad::SFad<double,3> hVar( numDeriv, 2, hNow );
562 Sacado::Fad::SFad<double,3> vRestVar(
model_.
vRest );
564 Sacado::Fad::SFad<double,3> resultFad =
hEquF( v1Var, v2Var, hVar, vRestVar );
571 const int numDeriv = 1;
572 Sacado::Fad::SFad<double,1> hVar( numDeriv, 0, hNow );
574 Sacado::Fad::SFad<double,1> resultFad =
hEquQ( hVar );
588 Xyce::dout() <<
"Instance::updateIntermediateVars()" << std::endl
589 <<
"vRest(input) = " << vRest << std::endl
590 <<
"v1 = " << v1Now << std::endl
591 <<
"v2 = " << v2Now << std::endl
592 <<
"nNow = " << nNow << std::endl
593 <<
"mNow = " << mNow << std::endl
594 <<
"hNow = " << hNow << std::endl
598 <<
"dkcl1F_dn = " <<
dkcl1F_dn << std::endl
599 <<
"dkcl1F_dm = " <<
dkcl1F_dm << std::endl
600 <<
"dkcl1F_dh = " <<
dkcl1F_dh << std::endl
604 <<
"dkcl2F_dn = " <<
dkcl2F_dn << std::endl
605 <<
"dkcl2F_dm = " <<
dkcl2F_dm << std::endl
606 <<
"dkcl2F_dh = " <<
dkcl2F_dh << std::endl
607 <<
"alphaN = " << alphaN<double>( v1Now, v2Now, vRest) << std::endl
608 <<
"betaN = " << betaN<double>( v1Now, v2Now, vRest) << std::endl
610 <<
"dnF_dV1 = " <<
dnF_dV1 << std::endl
611 <<
"dnF_dV2 = " <<
dnF_dV2 << std::endl
612 <<
"dnF_dn = " <<
dnF_dn << std::endl
614 <<
"dnQ_dn = " <<
dnQ_dn << std::endl
615 <<
"alphaM = " << alphaM<double>( v1Now, v2Now, vRest) << std::endl
616 <<
"betaM = " << betaM<double>( v1Now, v2Now, vRest) << std::endl
618 <<
"dmF_dV1 = " <<
dmF_dV1 << std::endl
619 <<
"dmF_dV2 = " <<
dmF_dV2 << std::endl
620 <<
"dmF_dm = " <<
dmF_dm << std::endl
622 <<
"dmQ_dm = " <<
dmQ_dm << std::endl
623 <<
"alphaH = " << alphaH<double>( v1Now, v2Now, vRest) << std::endl
624 <<
"betaH = " << betaH<double>( v1Now, v2Now, vRest) << std::endl
626 <<
"dhF_dV1 = " <<
dhF_dV1 << std::endl
627 <<
"dhF_dV2 = " <<
dhF_dV2 << std::endl
628 <<
"dhF_dh = " <<
dhF_dh << std::endl
630 <<
"dhQ_dh = " <<
dhQ_dh << std::endl
646 bool bsuccess =
true;
669 bool bsuccess =
true;
692 bool bsuccess =
true;
746 bool bsuccess =
true;
781 bool bsuccess =
true;
822 bool bsuccess =
true;
866 std::vector<Instance*>::iterator iter;
870 for (iter=first; iter!=last; ++iter)
872 (*iter)->processParams();
890 :
DeviceModel(MB, configuration.getModelParameters(), factory_block)
921 std::vector<Instance*>::iterator iter;
925 for (iter=first; iter!=last; ++iter)
943 std::vector<Instance*>::const_iterator iter;
951 os <<
"Number of Neuron instances: " << isize << std::endl;
952 os <<
" name=\t\tmodelName\tParameters" << std::endl;
953 for (i=0, iter=first; iter!=last; ++iter, ++i)
955 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
980 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
998 (*it)->updatePrimaryState();
1013 .registerDevice(
"neuron", 1)
1014 .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)