46 #include <Xyce_config.h>
51 #include <N_UTL_Misc.h>
56 #include <N_LAS_Vector.h>
57 #include <N_LAS_Matrix.h>
72 MembraneModel(ss1), gMem_(gMem), cMem_(cMem), vRest_(vRest), eK_(eK), gK_(gK), eNa_(eNa), gNa_(gNa)
91 void MembraneHH::setJacStamp(
int numExtVars,
int segmentNumber,
int vOffset, std::vector< std::vector< int > > & segmentJacStamp )
99 int jacobianRowSize = segmentJacStamp[offset].size();
112 segmentJacStamp[offset][vOffset ] = offset;
113 segmentJacStamp[offset][vOffset + 1] = offset+1;
114 segmentJacStamp[offset][vOffset + 2] = offset+2;
115 segmentJacStamp[offset][vOffset + 3] = offset+3;
118 segmentJacStamp[offset+1].resize(2);
119 segmentJacStamp[offset+1][0] = offset;
120 segmentJacStamp[offset+1][1] = offset+1;
123 segmentJacStamp[offset+2].resize(2);
124 segmentJacStamp[offset+2][0] = offset;
125 segmentJacStamp[offset+2][1] = offset+2;
128 segmentJacStamp[offset+3].resize(2);
129 segmentJacStamp[offset+3][0] = offset;
130 segmentJacStamp[offset+3][1] = offset+3;
142 void MembraneHH::loadDAEQVector(
int segmentNumber, std::vector< int > & lidIndexVector, N_LAS_Vector * solnVecPtr, N_LAS_Vector * daeQVecPtr,
double segArea)
147 (*daeQVecPtr)[lidIndexVector[index]] +=
cMem_ * segArea * (*solnVecPtr)[lidIndexVector[index]];
149 (*daeQVecPtr)[lidIndexVector[index + 1]] += (*solnVecPtr)[lidIndexVector[index + 1]];
151 (*daeQVecPtr)[lidIndexVector[index + 2]] += (*solnVecPtr)[lidIndexVector[index + 2]];
153 (*daeQVecPtr)[lidIndexVector[index + 3]] += (*solnVecPtr)[lidIndexVector[index + 3]];
164 void MembraneHH::loadDAEFVector(
int segmentNumber, std::vector< int > & lidIndexVector, N_LAS_Vector * solnVecPtr, N_LAS_Vector * daeFVecPtr,
double segArea)
170 double vSeg = (*solnVecPtr)[lidIndexVector[index]];
171 double n = (*solnVecPtr)[lidIndexVector[index + 1]];
172 double m = (*solnVecPtr)[lidIndexVector[index + 2]];
173 double h = (*solnVecPtr)[lidIndexVector[index + 3]];
176 (*daeFVecPtr)[lidIndexVector[index]] += Neuron::HH_Vseg_F<double>(
182 (*daeFVecPtr)[lidIndexVector[index + 1]] += Neuron::nEquF<double>( vSeg-
vRest_, n );
185 (*daeFVecPtr)[lidIndexVector[index + 2]] += Neuron::mEquF<double>( vSeg-
vRest_, m );
188 (*daeFVecPtr)[lidIndexVector[index + 3]] += Neuron::hEquF<double>( vSeg-
vRest_, h );
201 std::vector< std::vector< int > > & jacobianOffsets,
202 N_LAS_Vector * solnVecPtr,
203 N_LAS_Matrix * dQdxMatPtr,
218 (*dQdxMatPtr)[lidIndexVector[index]][jacobianOffsets[row][vOffset]] +=
cMem_ * segArea;
223 (*dQdxMatPtr)[lidIndexVector[index + 1]][jacobianOffsets[row + 1][1]] += 1;
226 (*dQdxMatPtr)[lidIndexVector[index + 2]][jacobianOffsets[row + 2][1]] += 1;
229 (*dQdxMatPtr)[lidIndexVector[index + 3]][jacobianOffsets[row + 3][1]] += 1;
241 std::vector< std::vector< int > > & jacobianOffsets,
242 N_LAS_Vector * solnVecPtr,
243 N_LAS_Matrix * dFdxMatPtr,
257 double vSeg = (*solnVecPtr)[lidIndexVector[index]];
258 double n = (*solnVecPtr)[lidIndexVector[index + 1]];
259 double m = (*solnVecPtr)[lidIndexVector[index + 2]];
260 double h = (*solnVecPtr)[lidIndexVector[index + 3]];
267 Sacado::Fad::SFad<double,4> vVar( 4, 0, vSeg );
268 Sacado::Fad::SFad<double,4> nVar( 4, 1, n );
269 Sacado::Fad::SFad<double,4> mVar( 4, 2, m );
270 Sacado::Fad::SFad<double,4> hVar( 4, 3, h );
272 Sacado::Fad::SFad<double,4> gMemVar(
gMem_ * segArea );
273 Sacado::Fad::SFad<double,4> vRestVar(
vRest_ );
274 Sacado::Fad::SFad<double,4> gKVar(
gK_ * segArea );
275 Sacado::Fad::SFad<double,4> eKVar(
eK_ );
276 Sacado::Fad::SFad<double,4> gNaVar(
gNa_ * segArea );
277 Sacado::Fad::SFad<double,4> eNaVar(
eNa_ );
279 Sacado::Fad::SFad<double,4> resultFad;
280 resultFad =
Neuron::HH_Vseg_F( vVar, nVar, mVar, hVar, gMemVar, vRestVar, gKVar, eKVar, gNaVar, eNaVar );
282 (*dFdxMatPtr)[lidIndexVector[index]][jacobianOffsets[row][vOffset]] += resultFad.dx(0);
283 (*dFdxMatPtr)[lidIndexVector[index]][jacobianOffsets[row][vOffset+1]] += resultFad.dx(1);
284 (*dFdxMatPtr)[lidIndexVector[index]][jacobianOffsets[row][vOffset+2]] += resultFad.dx(2);
285 (*dFdxMatPtr)[lidIndexVector[index]][jacobianOffsets[row][vOffset+3]] += resultFad.dx(3);
291 Sacado::Fad::SFad<double,2> vVar( 2, 0, vSeg-
vRest_ );
292 Sacado::Fad::SFad<double,2> nVar( 2, 1, n );
293 Sacado::Fad::SFad<double,2> nEquResultFad =
Neuron::nEquF( vVar, nVar );
295 (*dFdxMatPtr)[lidIndexVector[index + 1]][jacobianOffsets[row + 1][0]] += nEquResultFad.dx(0);
296 (*dFdxMatPtr)[lidIndexVector[index + 1]][jacobianOffsets[row + 1][1]] += nEquResultFad.dx(1);
301 Sacado::Fad::SFad<double,2> vVar( 2, 0, vSeg-
vRest_ );
302 Sacado::Fad::SFad<double,2> mVar( 2, 1, m );
303 Sacado::Fad::SFad<double,2> mEquResultFad =
Neuron::mEquF( vVar, mVar );
305 (*dFdxMatPtr)[lidIndexVector[index + 2]][jacobianOffsets[row + 2][0]] += mEquResultFad.dx(0);
306 (*dFdxMatPtr)[lidIndexVector[index + 2]][jacobianOffsets[row + 2][1]] += mEquResultFad.dx(1);
311 Sacado::Fad::SFad<double,2> vVar( 2, 0, vSeg-
vRest_ );
312 Sacado::Fad::SFad<double,2> hVar( 2, 1, h );
313 Sacado::Fad::SFad<double,2> hEquResultFad =
Neuron::hEquF( vVar, hVar );
315 (*dFdxMatPtr)[lidIndexVector[index + 3]][jacobianOffsets[row + 3][0]] += hEquResultFad.dx(0);
316 (*dFdxMatPtr)[lidIndexVector[index + 3]][jacobianOffsets[row + 3][1]] += hEquResultFad.dx(1);