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" );
277 bool bsuccess =
true;
294 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
311 rIntPreviousGiven(false),
312 radiusPreviousGiven(false),
313 lengthPreviousGiven(false),
314 rIntNextGiven(false),
315 radiusNextGiven(false),
316 lengthNextGiven(false),
325 APosEquPosNodeOffset(0),
326 APosEquNextNodeOffset(0),
327 ANegEquNegNodeOffset(0),
328 ANegEquLastNodeOffset(0)
439 for(
int i=2; i<numVars; i+=4)
506 gForward[0] = radius * (radius *
radius) / (rLong * segLength * ( segLength * radius * radius + segLength * radius * radius ));
507 gBackward[
nSeg-1] = radius * (radius *
radius) / (rLong * segLength * ( segLength * radius * radius + segLength * radius * radius ));
509 for(
int i=1; i<(
nSeg-1); i++)
511 gBackward[i] = radius * (radius *
radius) / (rLong * segLength * ( segLength * radius * radius + segLength * radius * radius ));
512 gForward[i] = gBackward[i];
587 const std::vector<int> & extLIDVecRef)
592 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
594 Xyce::dout() << std::endl << section_divider << std::endl;
595 Xyce::dout() <<
" Instance::registerLIDs" << std::endl;
596 Xyce::dout() <<
" name = " <<
getName() << std::endl;
605 for(
int i=0, j=0; i<
nSeg; i++, j+=4)
613 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) )
615 Xyce::dout() <<
" li_Pos = " <<
li_Pos << std::endl
616 <<
" li_Neg = " <<
li_Neg << std::endl;
617 for(
int i=0; i<
nSeg; i++ )
619 Xyce::dout() <<
" li_Vol[ " << i <<
" ] = " <<
li_Vol[i] << std::endl
620 <<
" li_nPro[ " << i <<
" ] = " <<
li_nPro[i] << std::endl
621 <<
" li_mPro[ " << i <<
" ] = " <<
li_mPro[i] << std::endl
622 <<
" li_hPro[ " << i <<
" ] = " <<
li_hPro[i] << std::endl;
626 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) )
628 Xyce::dout() << section_divider << std::endl;
642 for (
int i = 0; i <
nSeg; i++)
644 std::ostringstream segNumber;
668 for(
int i=0, j=0; i<
nSeg; i++, j+=2)
726 for(
int i=0, j=2; i<
nSeg; i++, j+=4 )
771 bool bsuccess =
true;
778 double vIn = (*solVectorPtr)[
li_Pos];
779 double vOut = (*solVectorPtr)[
li_Neg];
791 for(
int i=0; i<
nSeg; i++ )
794 double vSeg = (*solVectorPtr)[
li_Vol[i]];
802 vNext = (*solVectorPtr)[li_Vol[i+1]];
811 vPrev = (*solVectorPtr)[li_Vol[i-1]];
813 double nVarSeg = (*solVectorPtr)[
li_nPro[i]];
814 double mVarSeg = (*solVectorPtr)[
li_mPro[i]];
815 double hVarSeg = (*solVectorPtr)[
li_hPro[i]];
822 const int numDeriv = 6;
823 Sacado::Fad::SFad<double,6> vVar( numDeriv, 0, vSeg );
824 Sacado::Fad::SFad<double,6> vVpr( numDeriv, 1, vPrev );
825 Sacado::Fad::SFad<double,6> vVne( numDeriv, 2, vNext );
826 Sacado::Fad::SFad<double,6> nVar( numDeriv, 3, nVarSeg );
827 Sacado::Fad::SFad<double,6> mVar( numDeriv, 4, mVarSeg );
828 Sacado::Fad::SFad<double,6> hVar( numDeriv, 5, hVarSeg );
830 Sacado::Fad::SFad<double,6> gPrev(
gBackward[i] );
831 Sacado::Fad::SFad<double,6> gNext(
gForward[i] );
833 Sacado::Fad::SFad<double,6> vRestVar(
model_.
vRest );
835 Sacado::Fad::SFad<double,6> eKVar(
model_.
eK );
837 Sacado::Fad::SFad<double,6> eNaVar(
model_.
eNa );
840 Sacado::Fad::SFad<double,6> resultFad;
841 resultFad =
kcl1EquF( vVar, vVpr, vVne, nVar, mVar, hVar, gPrev, gNext, gMemVar, vRestVar, gKVar, eKVar, gNaVar, eNaVar );
852 const int numDeriv = 2;
853 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
858 Sacado::Fad::SFad<double,2> resultFad;
859 resultFad =
kcl1EquQ( vVar, cMemVar );
867 const int numDeriv = 2;
868 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
869 Sacado::Fad::SFad<double,2> nVar( numDeriv, 1, nVarSeg );
871 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
873 Sacado::Fad::SFad<double,2> resultFad =
nEquF( vVar, nVar, vRestVar);
875 dnF_dV[i] = resultFad.dx(0);
876 dnF_dn[i] = resultFad.dx(1);
879 const int numDeriv = 1;
880 Sacado::Fad::SFad<double,1> nVar( numDeriv, 0, nVarSeg );
882 Sacado::Fad::SFad<double,1> resultFad =
nEquQ( nVar );
884 dnQ_dn[i] = resultFad.dx(0);
889 const int numDeriv = 2;
890 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
891 Sacado::Fad::SFad<double,2> mVar( numDeriv, 1, mVarSeg );
893 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
895 Sacado::Fad::SFad<double,2> resultFad =
mEquF( vVar, mVar, vRestVar );
897 dmF_dV[i] = resultFad.dx(0);
898 dmF_dm[i] = resultFad.dx(1);
901 const int numDeriv = 1;
902 Sacado::Fad::SFad<double,1> mVar( numDeriv, 0, mVarSeg );
904 Sacado::Fad::SFad<double,1> resultFad =
mEquQ( mVar );
906 dmQ_dm[i] = resultFad.dx(0);
911 const int numDeriv = 2;
912 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
913 Sacado::Fad::SFad<double,2> hVar( numDeriv, 1, hVarSeg );
915 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
917 Sacado::Fad::SFad<double,2> resultFad =
hEquF( vVar, hVar, vRestVar );
919 dhF_dV[i] = resultFad.dx(0);
920 dhF_dh[i] = resultFad.dx(1);
923 const int numDeriv = 1;
924 Sacado::Fad::SFad<double,1> hVar( numDeriv, 0, hVarSeg );
926 Sacado::Fad::SFad<double,1> resultFad =
hEquQ( hVar );
928 dhQ_dh[i] = resultFad.dx(0);
939 Xyce::dout() <<
"Segment " << i << std::endl
940 <<
"vPrev = " << vPrev << std::endl
941 <<
"vSeg = " << vSeg << std::endl
942 <<
"vNext = " << vNext << std::endl
943 <<
"n, m, h = " << nVarSeg <<
", " << mVarSeg <<
", " << hVarSeg << std::endl
944 <<
"segFvalue = " <<
segFvalue[i] << std::endl
945 <<
"segQvalue = " <<
segQvalue[i] << std::endl
973 bool bsuccess =
true;
980 for(
int i=0; i<
nSeg; i++)
999 bool bsuccess =
true;
1021 bool bsuccess =
true;
1025 for(
int i=0; i<
nSeg ; i++)
1059 for(
int i=0; i<
nSeg ; i++)
1081 bool bsuccess =
true;
1085 for(
int i=0; i<
nSeg ; i++)
1110 bool bsuccess =
true;
1120 for(
int i=0; i<
nSeg ; i++)
1150 bool bsuccess =
true;
1193 std::vector<Instance*>::iterator iter;
1197 for (iter=first; iter!=last; ++iter)
1199 (*iter)->processParams();
1217 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
1254 std::vector<Instance*>::iterator iter;
1258 for (iter=first; iter!=last; ++iter)
1277 std::vector<Instance*>::const_iterator iter;
1285 os <<
"Number of Neuron instances: " << isize << std::endl;
1286 os <<
" name=\t\tmodelName\tParameters" << std::endl;
1287 for (i=0, iter=first; iter!=last; ++iter, ++i)
1289 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
1314 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1328 .registerDevice(
"neuron", 3)
1329 .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