46 #include <Xyce_config.h>
55 #include <N_LAS_Vector.h>
56 #include <N_LAS_Matrix.h>
71 MembraneModel(ss1), gMem_(gMem), cMem_(cMem), vRest_(vRest), eK_(eK), gK_(gK), eNa_(eNa), gNa_(gNa)
90 void MembraneHH::setJacStamp(
int numExtVars,
int segmentNumber,
int vOffset, std::vector< std::vector< int > > & segmentJacStamp )
98 int jacobianRowSize = segmentJacStamp[offset].size();
111 segmentJacStamp[offset][vOffset ] = offset;
112 segmentJacStamp[offset][vOffset + 1] = offset+1;
113 segmentJacStamp[offset][vOffset + 2] = offset+2;
114 segmentJacStamp[offset][vOffset + 3] = offset+3;
117 segmentJacStamp[offset+1].resize(2);
118 segmentJacStamp[offset+1][0] = offset;
119 segmentJacStamp[offset+1][1] = offset+1;
122 segmentJacStamp[offset+2].resize(2);
123 segmentJacStamp[offset+2][0] = offset;
124 segmentJacStamp[offset+2][1] = offset+2;
127 segmentJacStamp[offset+3].resize(2);
128 segmentJacStamp[offset+3][0] = offset;
129 segmentJacStamp[offset+3][1] = offset+3;
141 void MembraneHH::loadDAEQVector(
int segmentNumber, std::vector< int > & lidIndexVector, Linear::Vector * solnVecPtr, Linear::Vector * daeQVecPtr,
double segArea)
146 (*daeQVecPtr)[lidIndexVector[index]] +=
cMem_ * segArea * (*solnVecPtr)[lidIndexVector[index]];
148 (*daeQVecPtr)[lidIndexVector[index + 1]] += (*solnVecPtr)[lidIndexVector[index + 1]];
150 (*daeQVecPtr)[lidIndexVector[index + 2]] += (*solnVecPtr)[lidIndexVector[index + 2]];
152 (*daeQVecPtr)[lidIndexVector[index + 3]] += (*solnVecPtr)[lidIndexVector[index + 3]];
163 void MembraneHH::loadDAEFVector(
int segmentNumber, std::vector< int > & lidIndexVector, Linear::Vector * solnVecPtr, Linear::Vector * daeFVecPtr,
double segArea)
169 double vSeg = (*solnVecPtr)[lidIndexVector[index]];
170 double n = (*solnVecPtr)[lidIndexVector[index + 1]];
171 double m = (*solnVecPtr)[lidIndexVector[index + 2]];
172 double h = (*solnVecPtr)[lidIndexVector[index + 3]];
175 (*daeFVecPtr)[lidIndexVector[index]] += Neuron::HH_Vseg_F<double>(
181 (*daeFVecPtr)[lidIndexVector[index + 1]] += Neuron::nEquF<double>( vSeg-
vRest_, n );
184 (*daeFVecPtr)[lidIndexVector[index + 2]] += Neuron::mEquF<double>( vSeg-
vRest_, m );
187 (*daeFVecPtr)[lidIndexVector[index + 3]] += Neuron::hEquF<double>( vSeg-
vRest_, h );
200 std::vector< std::vector< int > > & jacobianOffsets,
201 Linear::Vector * solnVecPtr,
202 Linear::Matrix * dQdxMatPtr,
217 (*dQdxMatPtr)[lidIndexVector[index]][jacobianOffsets[row][vOffset]] +=
cMem_ * segArea;
222 (*dQdxMatPtr)[lidIndexVector[index + 1]][jacobianOffsets[row + 1][1]] += 1;
225 (*dQdxMatPtr)[lidIndexVector[index + 2]][jacobianOffsets[row + 2][1]] += 1;
228 (*dQdxMatPtr)[lidIndexVector[index + 3]][jacobianOffsets[row + 3][1]] += 1;
240 std::vector< std::vector< int > > & jacobianOffsets,
241 Linear::Vector * solnVecPtr,
242 Linear::Matrix * dFdxMatPtr,
256 double vSeg = (*solnVecPtr)[lidIndexVector[index]];
257 double n = (*solnVecPtr)[lidIndexVector[index + 1]];
258 double m = (*solnVecPtr)[lidIndexVector[index + 2]];
259 double h = (*solnVecPtr)[lidIndexVector[index + 3]];
266 Sacado::Fad::SFad<double,4> vVar( 4, 0, vSeg );
267 Sacado::Fad::SFad<double,4> nVar( 4, 1, n );
268 Sacado::Fad::SFad<double,4> mVar( 4, 2, m );
269 Sacado::Fad::SFad<double,4> hVar( 4, 3, h );
271 Sacado::Fad::SFad<double,4> gMemVar(
gMem_ * segArea );
272 Sacado::Fad::SFad<double,4> vRestVar(
vRest_ );
273 Sacado::Fad::SFad<double,4> gKVar(
gK_ * segArea );
274 Sacado::Fad::SFad<double,4> eKVar(
eK_ );
275 Sacado::Fad::SFad<double,4> gNaVar(
gNa_ * segArea );
276 Sacado::Fad::SFad<double,4> eNaVar(
eNa_ );
278 Sacado::Fad::SFad<double,4> resultFad;
279 resultFad =
Neuron::HH_Vseg_F( vVar, nVar, mVar, hVar, gMemVar, vRestVar, gKVar, eKVar, gNaVar, eNaVar );
281 (*dFdxMatPtr)[lidIndexVector[index]][jacobianOffsets[row][vOffset]] += resultFad.dx(0);
282 (*dFdxMatPtr)[lidIndexVector[index]][jacobianOffsets[row][vOffset+1]] += resultFad.dx(1);
283 (*dFdxMatPtr)[lidIndexVector[index]][jacobianOffsets[row][vOffset+2]] += resultFad.dx(2);
284 (*dFdxMatPtr)[lidIndexVector[index]][jacobianOffsets[row][vOffset+3]] += resultFad.dx(3);
290 Sacado::Fad::SFad<double,2> vVar( 2, 0, vSeg-
vRest_ );
291 Sacado::Fad::SFad<double,2> nVar( 2, 1, n );
292 Sacado::Fad::SFad<double,2> nEquResultFad =
Neuron::nEquF( vVar, nVar );
294 (*dFdxMatPtr)[lidIndexVector[index + 1]][jacobianOffsets[row + 1][0]] += nEquResultFad.dx(0);
295 (*dFdxMatPtr)[lidIndexVector[index + 1]][jacobianOffsets[row + 1][1]] += nEquResultFad.dx(1);
300 Sacado::Fad::SFad<double,2> vVar( 2, 0, vSeg-
vRest_ );
301 Sacado::Fad::SFad<double,2> mVar( 2, 1, m );
302 Sacado::Fad::SFad<double,2> mEquResultFad =
Neuron::mEquF( vVar, mVar );
304 (*dFdxMatPtr)[lidIndexVector[index + 2]][jacobianOffsets[row + 2][0]] += mEquResultFad.dx(0);
305 (*dFdxMatPtr)[lidIndexVector[index + 2]][jacobianOffsets[row + 2][1]] += mEquResultFad.dx(1);
310 Sacado::Fad::SFad<double,2> vVar( 2, 0, vSeg-
vRest_ );
311 Sacado::Fad::SFad<double,2> hVar( 2, 1, h );
312 Sacado::Fad::SFad<double,2> hEquResultFad =
Neuron::hEquF( vVar, hVar );
314 (*dFdxMatPtr)[lidIndexVector[index + 3]][jacobianOffsets[row + 3][0]] += hEquResultFad.dx(0);
315 (*dFdxMatPtr)[lidIndexVector[index + 3]][jacobianOffsets[row + 3][1]] += hEquResultFad.dx(1);
static ScalarT hEquF(const ScalarT &Vn, const ScalarT &h)
void loadDAEQVector(int segmentNumber, std::vector< int > &lidIndexVector, Linear::Vector *solnVecPtr, Linear::Vector *daeQVecPtr, double segArea)
static ScalarT HH_Vseg_F(const ScalarT &Vseg, const ScalarT &n, const ScalarT &m, const ScalarT &h, const ScalarT &memG, const ScalarT &restV, const ScalarT &Kg, const ScalarT &Ke, const ScalarT &NaG, const ScalarT &NaE)
Pure virtual class to augment a linear system.
void loadDAEdFdx(int segmentNumber, int vOffset, std::vector< int > &lidIndexVector, std::vector< std::vector< int > > &jacobianOffsets, Linear::Vector *solnVecPtr, Linear::Matrix *dFdxMatPtr, double segArea)
void setJacStamp(int numExtVars, int segmentNumber, int vOffset, std::vector< std::vector< int > > &segmentJacStamp)
const int numExternalVars_
void loadDAEdQdx(int segmentNumber, int vOffset, std::vector< int > &lidIndexVector, std::vector< std::vector< int > > &jacobianOffsets, Linear::Vector *solnVecPtr, Linear::Matrix *dQdxMatPtr, double segArea)
MembraneHH(const SolverState &ss1, double cMem, double gMem, double vRest, double eK, double gK, double eNa, double gNa)
static ScalarT nEquF(const ScalarT &Vn, const ScalarT &n)
static ScalarT mEquF(const ScalarT &Vn, const ScalarT &m)
void loadDAEFVector(int segmentNumber, std::vector< int > &lidIndexVector, Linear::Vector *solnVecPtr, Linear::Vector *daeFVecPtr, double segArea)