46 #include <Xyce_config.h>
58 #include <N_ERH_ErrorMgr.h>
62 #include <N_LAS_Vector.h>
63 #include <N_LAS_Matrix.h>
64 #include <N_UTL_FeatureTest.h>
65 #include <N_UTL_Math.h>
78 .setDescription(
"Intracellular resistivity");
84 .setDescription(
"Segment radius");
90 .setDescription(
"Cable length");
96 .setDescription(
"Previous segment,intracellular resistivity");
102 .setDescription(
"Previous segment,segment radius");
108 .setDescription(
"Previous segment length");
114 .setDescription(
"Next segment,intracellular resistivity");
120 .setDescription(
"Next segment,segment radius");
126 .setDescription(
"Next segment length");
132 .setDescription(
"Number of segments" );
141 .setDescription(
"Membrane capacitance");
147 .setDescription(
"Membrane conductance");
153 .setDescription(
"Resting potential");
159 .setDescription(
"Potassium resting potential");
165 .setDescription(
"Potassium base conductance");
171 .setDescription(
"Sodium resting potential");
177 .setDescription(
"Sodium base conductance");
183 .setDescription(
"Intracellular resistivity");
189 .setDescription(
"Segment radius");
195 .setDescription(
"Cable length");
201 .setDescription(
"Previous segment,intracellular resistivity");
207 .setDescription(
"Previous segment,segment radius");
213 .setDescription(
"Previous segment length");
219 .setDescription(
"Next segment,intracellular resistivity");
225 .setDescription(
"Next segment,segment radius");
231 .setDescription(
"Next segment length");
237 .setDescription(
"Number of segments" );
298 bool bsuccess =
true;
315 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
332 rIntPreviousGiven(false),
333 radiusPreviousGiven(false),
334 lengthPreviousGiven(false),
335 rIntNextGiven(false),
336 radiusNextGiven(false),
337 lengthNextGiven(false),
346 APosEquPosNodeOffset(0),
347 APosEquNextNodeOffset(0),
348 ANegEquNegNodeOffset(0),
349 ANegEquLastNodeOffset(0)
429 for(
int i=2; i<numVars; i+=4)
496 gForward[0] = radius * (radius *
radius) / (rLong * segLength * ( segLength * radius * radius + segLength * radius * radius ));
497 gBackward[
nSeg-1] = radius * (radius *
radius) / (rLong * segLength * ( segLength * radius * radius + segLength * radius * radius ));
499 for(
int i=1; i<(
nSeg-1); i++)
501 gBackward[i] = radius * (radius *
radius) / (rLong * segLength * ( segLength * radius * radius + segLength * radius * radius ));
502 gForward[i] = gBackward[i];
577 const std::vector<int> & extLIDVecRef)
582 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
584 Xyce::dout() << std::endl << section_divider << std::endl;
585 Xyce::dout() <<
" Instance::registerLIDs" << std::endl;
586 Xyce::dout() <<
" name = " <<
getName() << std::endl;
595 for(
int i=0, j=0; i<
nSeg; i++, j+=4)
603 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) )
605 Xyce::dout() <<
" li_Pos = " <<
li_Pos << std::endl
606 <<
" li_Neg = " <<
li_Neg << std::endl;
607 for(
int i=0; i<
nSeg; i++ )
609 Xyce::dout() <<
" li_Vol[ " << i <<
" ] = " <<
li_Vol[i] << std::endl
610 <<
" li_nPro[ " << i <<
" ] = " <<
li_nPro[i] << std::endl
611 <<
" li_mPro[ " << i <<
" ] = " <<
li_mPro[i] << std::endl
612 <<
" li_hPro[ " << i <<
" ] = " <<
li_hPro[i] << std::endl;
616 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) )
618 Xyce::dout() << section_divider << std::endl;
632 for (
int i = 0; i <
nSeg; i++)
634 std::ostringstream segNumber;
658 for(
int i=0, j=0; i<
nSeg; i++, j+=2)
716 for(
int i=0, j=2; i<
nSeg; i++, j+=4 )
761 bool bsuccess =
true;
768 double vIn = (*solVectorPtr)[
li_Pos];
769 double vOut = (*solVectorPtr)[
li_Neg];
781 for(
int i=0; i<
nSeg; i++ )
784 double vSeg = (*solVectorPtr)[
li_Vol[i]];
792 vNext = (*solVectorPtr)[li_Vol[i+1]];
801 vPrev = (*solVectorPtr)[li_Vol[i-1]];
803 double nVarSeg = (*solVectorPtr)[
li_nPro[i]];
804 double mVarSeg = (*solVectorPtr)[
li_mPro[i]];
805 double hVarSeg = (*solVectorPtr)[
li_hPro[i]];
812 const int numDeriv = 6;
813 Sacado::Fad::SFad<double,6> vVar( numDeriv, 0, vSeg );
814 Sacado::Fad::SFad<double,6> vVpr( numDeriv, 1, vPrev );
815 Sacado::Fad::SFad<double,6> vVne( numDeriv, 2, vNext );
816 Sacado::Fad::SFad<double,6> nVar( numDeriv, 3, nVarSeg );
817 Sacado::Fad::SFad<double,6> mVar( numDeriv, 4, mVarSeg );
818 Sacado::Fad::SFad<double,6> hVar( numDeriv, 5, hVarSeg );
820 Sacado::Fad::SFad<double,6> gPrev(
gBackward[i] );
821 Sacado::Fad::SFad<double,6> gNext(
gForward[i] );
823 Sacado::Fad::SFad<double,6> vRestVar(
model_.
vRest );
825 Sacado::Fad::SFad<double,6> eKVar(
model_.
eK );
827 Sacado::Fad::SFad<double,6> eNaVar(
model_.
eNa );
830 Sacado::Fad::SFad<double,6> resultFad;
831 resultFad =
kcl1EquF( vVar, vVpr, vVne, nVar, mVar, hVar, gPrev, gNext, gMemVar, vRestVar, gKVar, eKVar, gNaVar, eNaVar );
842 const int numDeriv = 2;
843 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
848 Sacado::Fad::SFad<double,2> resultFad;
849 resultFad =
kcl1EquQ( vVar, cMemVar );
857 const int numDeriv = 2;
858 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
859 Sacado::Fad::SFad<double,2> nVar( numDeriv, 1, nVarSeg );
861 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
863 Sacado::Fad::SFad<double,2> resultFad =
nEquF( vVar, nVar, vRestVar);
865 dnF_dV[i] = resultFad.dx(0);
866 dnF_dn[i] = resultFad.dx(1);
869 const int numDeriv = 1;
870 Sacado::Fad::SFad<double,1> nVar( numDeriv, 0, nVarSeg );
872 Sacado::Fad::SFad<double,1> resultFad =
nEquQ( nVar );
874 dnQ_dn[i] = resultFad.dx(0);
879 const int numDeriv = 2;
880 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
881 Sacado::Fad::SFad<double,2> mVar( numDeriv, 1, mVarSeg );
883 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
885 Sacado::Fad::SFad<double,2> resultFad =
mEquF( vVar, mVar, vRestVar );
887 dmF_dV[i] = resultFad.dx(0);
888 dmF_dm[i] = resultFad.dx(1);
891 const int numDeriv = 1;
892 Sacado::Fad::SFad<double,1> mVar( numDeriv, 0, mVarSeg );
894 Sacado::Fad::SFad<double,1> resultFad =
mEquQ( mVar );
896 dmQ_dm[i] = resultFad.dx(0);
901 const int numDeriv = 2;
902 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
903 Sacado::Fad::SFad<double,2> hVar( numDeriv, 1, hVarSeg );
905 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
907 Sacado::Fad::SFad<double,2> resultFad =
hEquF( vVar, hVar, vRestVar );
909 dhF_dV[i] = resultFad.dx(0);
910 dhF_dh[i] = resultFad.dx(1);
913 const int numDeriv = 1;
914 Sacado::Fad::SFad<double,1> hVar( numDeriv, 0, hVarSeg );
916 Sacado::Fad::SFad<double,1> resultFad =
hEquQ( hVar );
918 dhQ_dh[i] = resultFad.dx(0);
929 Xyce::dout() <<
"Segment " << i << std::endl
930 <<
"vPrev = " << vPrev << std::endl
931 <<
"vSeg = " << vSeg << std::endl
932 <<
"vNext = " << vNext << std::endl
933 <<
"n, m, h = " << nVarSeg <<
", " << mVarSeg <<
", " << hVarSeg << std::endl
934 <<
"segFvalue = " <<
segFvalue[i] << std::endl
935 <<
"segQvalue = " <<
segQvalue[i] << std::endl
963 bool bsuccess =
true;
970 for(
int i=0; i<
nSeg; i++)
989 bool bsuccess =
true;
1011 bool bsuccess =
true;
1015 for(
int i=0; i<
nSeg ; i++)
1049 for(
int i=0; i<
nSeg ; i++)
1071 bool bsuccess =
true;
1075 for(
int i=0; i<
nSeg ; i++)
1100 bool bsuccess =
true;
1110 for(
int i=0; i<
nSeg ; i++)
1140 bool bsuccess =
true;
1183 std::vector<Instance*>::iterator iter;
1187 for (iter=first; iter!=last; ++iter)
1189 (*iter)->processParams();
1207 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
1244 std::vector<Instance*>::iterator iter;
1248 for (iter=first; iter!=last; ++iter)
1267 std::vector<Instance*>::const_iterator iter;
1275 os <<
"Number of Neuron instances: " << isize << std::endl;
1276 os <<
" name=\t\tmodelName\tParameters" << std::endl;
1277 for (i=0, iter=first; iter!=last; ++iter, ++i)
1279 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
1304 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1318 .registerDevice(
"neuron", 3)
1319 .registerModelType(
"neuron", 3);
const InstanceName & getName() const
std::vector< int > MEquVNodeOffset
std::vector< double > segNEquFvalue
bool updateIntermediateVars()
std::vector< double > segF_dV
static ScalarT hEquF(const ScalarT &Vn1, const ScalarT &h, const ScalarT &Vrest)
std::vector< double > dhF_dh
std::vector< double > segF_dn
std::vector< int > SegVEqnVsegOffset
bool updateDependentParameters()
bool updateTemperature(const double &temp_tmp)
const SolverState & solverState_
void registerJacLIDs(const std::vector< std::vector< int > > &jacLIDVec)
Descriptor & addPar(const char *parName, T default_value, T U::*varPtr)
Adds the parameter description to the parameter map.
std::vector< int > SegVEqnNOffset
std::vector< int > NEquVNodeOffset
std::vector< int > li_mPro
Linear::Vector * nextSolVectorPtr
static ScalarT mEquF(const ScalarT &Vn1, const ScalarT &m, const ScalarT &Vrest)
std::vector< double > segQ_dV
std::vector< int > HEquHNodeOffset
Linear::Vector * daeQVectorPtr
std::vector< int > SegVEqnMOffset
Pure virtual class to augment a linear system.
std::vector< std::vector< int > > jacStamp
void addInternalNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
std::vector< double > dhF_dV
std::vector< double > dmF_dV
std::vector< double > dnF_dV
std::vector< double > gForward
void registerStateLIDs(const std::vector< int > &staLIDVecRef)
std::vector< double > dnF_dn
static ScalarT mEquQ(const ScalarT &m)
std::vector< double > segF_dVn
std::vector< double > segF_dh
std::vector< double > dmQ_dm
std::vector< int > li_Vol
virtual void registerJacLIDs(const JacobianStamp &jacLIDVec)
std::vector< Instance * > instanceContainer
std::vector< int > MEquMNodeOffset
std::vector< Param > params
Parameters from the line.
bool updatePrimaryState()
std::vector< double > segQvalue
std::vector< double > segHEquFvalue
std::vector< int > SegVEqnHOffset
void setParams(const std::vector< Param > ¶ms)
const std::string & getName() const
The FactoryBlock contains parameters needed by the device, instance and model creation functions...
std::vector< double > potassiumCurrent
std::vector< int > li_hPro
bool processParams()
processParams
bool updateSecondaryState()
static void loadInstanceParameters(ParametricData< Instance > &instance_parameters)
const DeviceOptions & deviceOptions_
static Device * factory(const Configuration &configuration, const FactoryBlock &factory_block)
std::vector< int > SegVEqnVpreOffset
Linear::Vector * nextStaVectorPtr
int ANegEquLastNodeOffset
static Config< T > & addConfiguration()
Adds the device to the Xyce device configuration.
std::vector< double > dnQ_dn
Linear::Matrix * dFdxMatrixPtr
static ScalarT kcl1EquF(const ScalarT &VSeg, const ScalarT &VSegP, const ScalarT &VSegN, const ScalarT &n, const ScalarT &m, const ScalarT &h, const ScalarT &gPrev, const ScalarT &gNext, const ScalarT &memG, const ScalarT &restV, const ScalarT &Kg, const ScalarT &Ke, const ScalarT &NaG, const ScalarT &NaE)
The Device class is an interface for device implementations.
Instance(const Configuration &configuration, const InstanceBlock &IB, Model &Miter, const FactoryBlock &factory_block)
std::vector< int > HEquVNodeOffset
std::vector< double > segFvalue
void loadNodeSymbols(Util::SymbolTable &symbol_table) const
Populates and returns the store name map.
std::vector< int > NEquNNodeOffset
std::vector< double > segHEquQvalue
const std::vector< std::vector< int > > & jacobianStamp() const
Class Configuration contains device configuration data.
std::vector< double > segNEquQvalue
virtual void forEachInstance(DeviceInstanceOp &op) const
Apply a device instance "op" to all instances associated with this model.
std::vector< double > gBackward
std::vector< int > li_KCurrentState
bool processInstanceParams()
processInstanceParams
std::vector< double > dhQ_dh
std::vector< int > SegVEqnVnexOffset
static ScalarT hEquQ(const ScalarT &h)
static ScalarT kcl1EquQ(const ScalarT &VSeg, const ScalarT &memC)
const SolverState & getSolverState() const
std::vector< double > segF_dVp
static ScalarT nEquQ(const ScalarT &n)
std::vector< int > li_NaCurrentState
Linear::Vector * daeFVectorPtr
static ScalarT nEquF(const ScalarT &Vn1, const ScalarT &n, const ScalarT &Vrest)
int APosEquNextNodeOffset
void registerLIDs(const std::vector< int > &intLIDVecRef, const std::vector< int > &extLIDVecRef)
std::vector< double > segF_dm
std::vector< double > sodiumCurrent
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.
std::vector< Param > params
Linear::Matrix * dQdxMatrixPtr
std::vector< double > dmF_dm
void varTypes(std::vector< char > &varTypeVec)
virtual std::ostream & printOutInstances(std::ostream &os) const
std::vector< double > segMEquFvalue
void setModParams(const std::vector< Param > ¶ms)
static void loadModelParameters(ParametricData< Model > &model_parameters)
std::vector< int > li_nPro
std::vector< double > segMEquQvalue