46 #include <Xyce_config.h>
60 #include <N_ERH_ErrorMgr.h>
64 #include <N_LAS_Vector.h>
65 #include <N_LAS_Matrix.h>
66 #include <N_UTL_FeatureTest.h>
67 #include <N_UTL_Math.h>
82 .setDescription(
"Intracellular resistivity");
88 .setDescription(
"Segment radius");
94 .setDescription(
"Cable length");
100 .setDescription(
"Previous segment,intracellular resistivity");
106 .setDescription(
"Previous segment,segment radius");
112 .setDescription(
"Previous segment length");
118 .setDescription(
"Next segment,intracellular resistivity");
124 .setDescription(
"Next segment,segment radius");
130 .setDescription(
"Next segment length");
136 .setDescription(
"Number of segments");
145 .setDescription(
"Membrane capacitance");
151 .setDescription(
"Membrane conductance");
157 .setDescription(
"Resting potential");
163 .setDescription(
"Potassium resting potential");
169 .setDescription(
"Potassium base conductance");
175 .setDescription(
"Sodium resting potential");
181 .setDescription(
"Sodium base conductance");
187 .setDescription(
"a-current rest potential");
193 .setDescription(
"a-current base conductance");
199 .setDescription(
"Calcium rest potential");
205 .setDescription(
"Calcium base conductance");
211 .setDescription(
"Potassium-calcium rest potential");
217 .setDescription(
"Potassium-calcium base conductance");
223 .setDescription(
"initial intra-cellular calcium concentration");
229 .setDescription(
"calcium current to concentration multiplier");
235 .setDescription(
"calcium removal time constant");
241 .setDescription(
"Intracellular resistivity");
247 .setDescription(
"Segment radius");
253 .setDescription(
"Cable length");
259 .setDescription(
"Previous segment,intracellular resistivity");
265 .setDescription(
"Previous segment,segment radius");
271 .setDescription(
"Previous segment length");
277 .setDescription(
"Next segment,intracellular resistivity");
283 .setDescription(
"Next segment,segment radius");
289 .setDescription(
"Next segment length");
295 .setDescription(
"Number of segments");
329 bool bsuccess =
true;
346 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
363 rIntPreviousGiven(false),
364 radiusPreviousGiven(false),
365 lengthPreviousGiven(false),
366 rIntNextGiven(false),
367 radiusNextGiven(false),
368 lengthNextGiven(false),
377 APosEquPosNodeOffset(0),
378 APosEquNextNodeOffset(0),
379 ANegEquNegNodeOffset(0),
380 ANegEquLastNodeOffset(0)
487 for(
int i=2; i<numVars; i+=10)
507 if( i==(numVars-10) )
581 gForward[0] = radius * (radius *
radius) / (rLong * segLength * ( segLength * radius * radius + segLength * radius * radius ));
582 gBackward[
nSeg-1] = radius * (radius *
radius) / (rLong * segLength * ( segLength * radius * radius + segLength * radius * radius ));
584 for(
int i=1; i<(
nSeg-1); i++)
586 gBackward[i] = radius * (radius *
radius) / (rLong * segLength * ( segLength * radius * radius + segLength * radius * radius ));
587 gForward[i] = gBackward[i];
708 const std::vector<int> & extLIDVecRef)
713 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
715 Xyce::dout() << std::endl << section_divider << std::endl;
716 Xyce::dout() <<
" Instance::registerLIDs" << std::endl;
717 Xyce::dout() <<
" name = " <<
getName() << std::endl;
726 for(
int i=0, j=0; i<
nSeg; i++, j+=10)
740 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) )
742 Xyce::dout() <<
" li_Pos = " <<
li_Pos << std::endl
743 <<
" li_Neg = " <<
li_Neg << std::endl;
744 for(
int i=0; i<
nSeg; i++ )
746 Xyce::dout() <<
" li_Vol[ " << i <<
" ] = " <<
li_Vol[i] << std::endl
747 <<
" li_nPro[ " << i <<
" ] = " <<
li_nPro[i] << std::endl
748 <<
" li_mPro[ " << i <<
" ] = " <<
li_mPro[i] << std::endl
749 <<
" li_hPro[ " << i <<
" ] = " <<
li_hPro[i] << std::endl
750 <<
" li_aPro[ " << i <<
" ] = " <<
li_aPro[i] << std::endl
751 <<
" li_bPro[ " << i <<
" ] = " <<
li_bPro[i] << std::endl
752 <<
" li_MPro[ " << i <<
" ] = " <<
li_MPro[i] << std::endl
753 <<
" li_HPro[ " << i <<
" ] = " <<
li_HPro[i] << std::endl
754 <<
" li_cPro[ " << i <<
" ] = " <<
li_cPro[i] << std::endl
755 <<
" li_CaPro[ " << i <<
" ] = " <<
li_CaPro[i] << std::endl;
759 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) )
761 Xyce::dout() << section_divider << std::endl;
776 for (
int i = 0; i <
nSeg; i++)
778 std::ostringstream segNumber;
808 for(
int i=0, j=0; i<
nSeg; i++, j+=2)
882 for(
int i=0, j=2; i<
nSeg; i++, j+=10 )
941 bool bsuccess =
true;
948 double vIn = (*solVectorPtr)[
li_Pos];
949 double vOut = (*solVectorPtr)[
li_Neg];
960 for(
int i=0; i<
nSeg; i++ )
963 double vSeg = (*solVectorPtr)[
li_Vol[i]];
971 vNext = (*solVectorPtr)[li_Vol[i+1]];
980 vPrev = (*solVectorPtr)[li_Vol[i-1]];
982 double nVarSeg = (*solVectorPtr)[
li_nPro[i]];
983 double mVarSeg = (*solVectorPtr)[
li_mPro[i]];
984 double hVarSeg = (*solVectorPtr)[
li_hPro[i]];
985 double aVarSeg = (*solVectorPtr)[
li_aPro[i]];
986 double bVarSeg = (*solVectorPtr)[
li_bPro[i]];
987 double M_VarSeg = (*solVectorPtr)[
li_MPro[i]];
988 double H_VarSeg = (*solVectorPtr)[
li_HPro[i]];
989 double cVarSeg = (*solVectorPtr)[
li_cPro[i]];
990 double CaVarSeg = (*solVectorPtr)[
li_CaPro[i]];
997 const int numDeriv = 11;
998 Sacado::Fad::SFad<double,11> vVar ( numDeriv, 0, vSeg );
999 Sacado::Fad::SFad<double,11> vVpr ( numDeriv, 1, vPrev );
1000 Sacado::Fad::SFad<double,11> vVne ( numDeriv, 2, vNext );
1001 Sacado::Fad::SFad<double,11> nVar ( numDeriv, 3, nVarSeg );
1002 Sacado::Fad::SFad<double,11> mVar ( numDeriv, 4, mVarSeg );
1003 Sacado::Fad::SFad<double,11> hVar ( numDeriv, 5, hVarSeg );
1004 Sacado::Fad::SFad<double,11> aVar ( numDeriv, 6, aVarSeg );
1005 Sacado::Fad::SFad<double,11> bVar ( numDeriv, 7, bVarSeg );
1006 Sacado::Fad::SFad<double,11> M_Var( numDeriv, 8, M_VarSeg );
1007 Sacado::Fad::SFad<double,11> H_Var( numDeriv, 9, H_VarSeg );
1008 Sacado::Fad::SFad<double,11> cVar ( numDeriv, 10, cVarSeg );
1011 Sacado::Fad::SFad<double,11> gPrev(
gBackward[i] );
1012 Sacado::Fad::SFad<double,11> gNext(
gForward[i] );
1014 Sacado::Fad::SFad<double,11> vRestVar(
model_.
vRest );
1016 Sacado::Fad::SFad<double,11> eKVar(
model_.
eK );
1018 Sacado::Fad::SFad<double,11> eNaVar(
model_.
eNa );
1020 Sacado::Fad::SFad<double,11> eAVar(
model_.
eA );
1022 Sacado::Fad::SFad<double,11> eCaVar(
model_.
eCa );
1024 Sacado::Fad::SFad<double,11> CaInitVar(
model_.
CaInit );
1026 Sacado::Fad::SFad<double,11> CaTauVar(
model_.
CaTau );
1029 Sacado::Fad::SFad<double,11> resultFad;
1030 resultFad =
kcl1EquF( vVar, vVpr, vVne, nVar, mVar, hVar, aVar, bVar, M_Var, H_Var, cVar, gPrev, gNext, gMemVar, vRestVar, gKVar, eKVar, gNaVar, eNaVar, gAVar, eAVar, gCaVar, eCaVar, gKCaVar);
1043 segF_dc[i] = resultFad.dx(10);
1047 const int numDeriv = 1;
1048 Sacado::Fad::SFad<double,1> vVar( numDeriv, 0, vSeg );
1053 Sacado::Fad::SFad<double,1> resultFad;
1054 resultFad =
kcl1EquQ( vVar, cMemVar );
1062 const int numDeriv = 2;
1063 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
1064 Sacado::Fad::SFad<double,2> nVar( numDeriv, 1, nVarSeg );
1066 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
1068 Sacado::Fad::SFad<double,2> resultFad =
nEquF( vVar, nVar, vRestVar);
1070 dnF_dV[i] = resultFad.dx(0);
1071 dnF_dn[i] = resultFad.dx(1);
1074 const int numDeriv = 1;
1075 Sacado::Fad::SFad<double,1> nVar( numDeriv, 0, nVarSeg );
1077 Sacado::Fad::SFad<double,1> resultFad =
nEquQ( nVar );
1079 dnQ_dn[i] = resultFad.dx(0);
1084 const int numDeriv = 2;
1085 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
1086 Sacado::Fad::SFad<double,2> mVar( numDeriv, 1, mVarSeg );
1088 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
1090 Sacado::Fad::SFad<double,2> resultFad =
mEquF( vVar, mVar, vRestVar );
1092 dmF_dV[i] = resultFad.dx(0);
1093 dmF_dm[i] = resultFad.dx(1);
1096 const int numDeriv = 1;
1097 Sacado::Fad::SFad<double,1> mVar( numDeriv, 0, mVarSeg );
1099 Sacado::Fad::SFad<double,1> resultFad =
mEquQ( mVar );
1101 dmQ_dm[i] = resultFad.dx(0);
1106 const int numDeriv = 2;
1107 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
1108 Sacado::Fad::SFad<double,2> hVar( numDeriv, 1, hVarSeg );
1110 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
1112 Sacado::Fad::SFad<double,2> resultFad =
hEquF( vVar, hVar, vRestVar );
1114 dhF_dV[i] = resultFad.dx(0);
1115 dhF_dh[i] = resultFad.dx(1);
1118 const int numDeriv = 1;
1119 Sacado::Fad::SFad<double,1> hVar( numDeriv, 0, hVarSeg );
1121 Sacado::Fad::SFad<double,1> resultFad =
hEquQ( hVar );
1123 dhQ_dh[i] = resultFad.dx(0);
1128 const int numDeriv = 2;
1129 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
1130 Sacado::Fad::SFad<double,2> aVar( numDeriv, 1, aVarSeg );
1132 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
1134 Sacado::Fad::SFad<double,2> resultFad =
aEquF( vVar, aVar, vRestVar );
1136 daF_dV[i] = resultFad.dx(0);
1137 daF_da[i] = resultFad.dx(1);
1140 const int numDeriv = 1;
1141 Sacado::Fad::SFad<double,1> aVar( numDeriv, 0, aVarSeg );
1143 Sacado::Fad::SFad<double,1> resultFad =
aEquQ( aVar );
1145 daQ_da[i] = resultFad.dx(0);
1150 const int numDeriv = 2;
1151 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
1152 Sacado::Fad::SFad<double,2> bVar( numDeriv, 1, bVarSeg );
1154 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
1156 Sacado::Fad::SFad<double,2> resultFad =
bEquF( vVar, bVar, vRestVar );
1158 dbF_dV[i] = resultFad.dx(0);
1159 dbF_db[i] = resultFad.dx(1);
1162 const int numDeriv = 1;
1163 Sacado::Fad::SFad<double,1> bVar( numDeriv, 0, bVarSeg );
1165 Sacado::Fad::SFad<double,1> resultFad =
bEquQ( bVar );
1167 dbQ_db[i] = resultFad.dx(0);
1172 const int numDeriv = 2;
1173 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
1174 Sacado::Fad::SFad<double,2> M_Var( numDeriv, 1, M_VarSeg );
1176 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
1178 Sacado::Fad::SFad<double,2> resultFad =
M_EquF( vVar, M_Var, vRestVar );
1180 dMF_dV[i] = resultFad.dx(0);
1181 dMF_dM[i] = resultFad.dx(1);
1184 const int numDeriv = 1;
1185 Sacado::Fad::SFad<double,1> M_Var( numDeriv, 0, M_VarSeg );
1187 Sacado::Fad::SFad<double,1> resultFad =
M_EquQ( M_Var );
1189 dMQ_dM[i] = resultFad.dx(0);
1194 const int numDeriv = 2;
1195 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
1196 Sacado::Fad::SFad<double,2> H_Var( numDeriv, 1, H_VarSeg );
1198 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
1200 Sacado::Fad::SFad<double,2> resultFad =
H_EquF( vVar, H_Var, vRestVar );
1202 dHF_dV[i] = resultFad.dx(0);
1203 dHF_dH[i] = resultFad.dx(1);
1206 const int numDeriv = 1;
1207 Sacado::Fad::SFad<double,1> H_Var( numDeriv, 0, H_VarSeg );
1209 Sacado::Fad::SFad<double,1> resultFad =
H_EquQ( H_Var );
1211 dHQ_dH[i] = resultFad.dx(0);
1216 const int numDeriv = 3;
1217 Sacado::Fad::SFad<double,3> vVar( numDeriv, 0, vSeg );
1218 Sacado::Fad::SFad<double,3> cVar( numDeriv, 1, cVarSeg );
1219 Sacado::Fad::SFad<double,3> CaVar( numDeriv, 2, CaVarSeg );
1221 Sacado::Fad::SFad<double,3> vRestVar(
model_.
vRest );
1223 Sacado::Fad::SFad<double,3> resultFad =
C_EquF( vVar, cVar, CaVar, vRestVar );
1225 dcF_dV[i] = resultFad.dx(0);
1226 dcF_dc[i] = resultFad.dx(1);
1230 const int numDeriv = 1;
1231 Sacado::Fad::SFad<double,1> cVar( numDeriv, 0, cVarSeg );
1233 Sacado::Fad::SFad<double,1> resultFad =
C_EquQ( cVar );
1235 dcQ_dc[i] = resultFad.dx(0);
1240 const int numDeriv = 4;
1241 Sacado::Fad::SFad<double,4> vVar( numDeriv, 0, vSeg );
1242 Sacado::Fad::SFad<double,4> M_Var( numDeriv, 1, M_VarSeg );
1243 Sacado::Fad::SFad<double,4> H_Var( numDeriv, 2, H_VarSeg );
1244 Sacado::Fad::SFad<double,4> CaVar( numDeriv, 3, CaVarSeg );
1246 Sacado::Fad::SFad<double,4> gCaVar(
model_.
gCa );
1247 Sacado::Fad::SFad<double,4> eCaVar(
model_.
gCa );
1249 Sacado::Fad::SFad<double,4> CaTauVar(
model_.
CaTau );
1251 Sacado::Fad::SFad<double,4> resultFad =
Ca_EquF( vVar, M_Var, H_Var, CaVar, gCaVar, eCaVar, CaGammaVar, CaTauVar );
1259 const int numDeriv = 1;
1260 Sacado::Fad::SFad<double,1> CaVar( numDeriv, 0, CaVarSeg );
1262 Sacado::Fad::SFad<double,1> resultFad =
Ca_EquQ( CaVar );
1273 bool bsuccess =
true;
1282 double v1Now = (*solVectorPtr)[
li_Pos];
1283 double v2Now = (*solVectorPtr)[
li_Neg];
1284 double nNow = (*solVectorPtr)[
li_nPro];
1285 double mNow = (*solVectorPtr)[
li_mPro];
1286 double hNow = (*solVectorPtr)[
li_hPro];
1287 double aNow = (*solVectorPtr)[
li_aPro];
1288 double bNow = (*solVectorPtr)[
li_bPro];
1289 double M_Now = (*solVectorPtr)[li_M_Pro];
1290 double H_Now = (*solVectorPtr)[li_H_Pro];
1291 double cNow = (*solVectorPtr)[
li_cPro];
1292 double CaNow = (*solVectorPtr)[
li_CaPro];
1298 Sacado::Fad::SFad<double,10> v1Var( 10, 0, v1Now );
1299 Sacado::Fad::SFad<double,10> v2Var( 10, 1, v2Now );
1300 Sacado::Fad::SFad<double,10> nVar( 10, 2, nNow );
1301 Sacado::Fad::SFad<double,10> mVar( 10, 3, mNow );
1302 Sacado::Fad::SFad<double,10> hVar( 10, 4, hNow );
1303 Sacado::Fad::SFad<double,10> aVar( 10, 5, aNow );
1304 Sacado::Fad::SFad<double,10> bVar( 10, 6, bNow );
1305 Sacado::Fad::SFad<double,10> M_Var( 10, 7, M_Now );
1306 Sacado::Fad::SFad<double,10> H_Var( 10, 8, H_Now );
1307 Sacado::Fad::SFad<double,10> cVar( 10, 9, cNow );
1310 Sacado::Fad::SFad<double,10> gMemVar(
model_.
gMem );
1311 Sacado::Fad::SFad<double,10> vRestVar(
model_.
vRest );
1312 Sacado::Fad::SFad<double,10> gKVar(
model_.
gK );
1313 Sacado::Fad::SFad<double,10> eKVar(
model_.
eK );
1314 Sacado::Fad::SFad<double,10> gNaVar(
model_.
gNa );
1315 Sacado::Fad::SFad<double,10> eNaVar(
model_.
eNa );
1316 Sacado::Fad::SFad<double,10> gAVar(
model_.
gA );
1317 Sacado::Fad::SFad<double,10> eAVar(
model_.
eA );
1318 Sacado::Fad::SFad<double,10> gCaVar(
model_.
gCa );
1319 Sacado::Fad::SFad<double,10> eCaVar(
model_.
gCa );
1320 Sacado::Fad::SFad<double,10> gKCaVar(
model_.
gKCa );
1321 Sacado::Fad::SFad<double,10> CaInitVar(
model_.
CaInit );
1323 Sacado::Fad::SFad<double,10> CaTauVar(
model_.
CaTau );
1326 Sacado::Fad::SFad<double,10> resultFad;
1327 resultFad =
kcl1EquF( v1Var, v2Var, nVar, mVar, hVar, aVar, bVar, M_Var, H_Var, cVar, gMemVar, vRestVar, gKVar, eKVar, gNaVar, eNaVar, gAVar, eAVar, gCaVar, eCaVar, gKCaVar);
1329 dkcl1F_dV1 = resultFad.dx(0);
1330 dkcl1F_dV2 = resultFad.dx(1);
1331 dkcl1F_dn = resultFad.dx(2);
1332 dkcl1F_dm = resultFad.dx(3);
1333 dkcl1F_dh = resultFad.dx(4);
1334 dkcl1F_da = resultFad.dx(5);
1335 dkcl1F_db = resultFad.dx(6);
1336 dkcl1F_dM = resultFad.dx(7);
1337 dkcl1F_dH = resultFad.dx(8);
1338 dkcl1F_dc = resultFad.dx(9);
1341 resultFad =
kcl2EquF( v1Var, v2Var, nVar, mVar, hVar, aVar, bVar, M_Var, H_Var, cVar, gMemVar, vRestVar, gKVar, eKVar, gNaVar, eNaVar, gAVar, eAVar, gCaVar, eCaVar, gKCaVar);
1343 dkcl2F_dV1 = resultFad.dx(0);
1344 dkcl2F_dV2 = resultFad.dx(1);
1345 dkcl2F_dn = resultFad.dx(2);
1346 dkcl2F_dm = resultFad.dx(3);
1347 dkcl2F_dh = resultFad.dx(4);
1348 dkcl2F_da = resultFad.dx(5);
1349 dkcl2F_db = resultFad.dx(6);
1350 dkcl2F_dM = resultFad.dx(7);
1351 dkcl2F_dH = resultFad.dx(8);
1352 dkcl2F_dc = resultFad.dx(9);
1356 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
1357 Sacado::Fad::SFad<double,2> v2Var( 2, 1, v2Now );
1360 Sacado::Fad::SFad<double,2> cMemVar(
model_.
cMem );
1362 Sacado::Fad::SFad<double,2> resultFad;
1363 resultFad =
kcl1EquQ( v1Var, v2Var, cMemVar );
1364 kcl1Qvalue = resultFad.val();
1365 dkcl1Q_dV1 = resultFad.dx(0);
1366 dkcl1Q_dV2 = resultFad.dx(1);
1368 resultFad =
kcl2EquQ( v1Var, v2Var, cMemVar );
1369 kcl2Qvalue = resultFad.val();
1370 dkcl2Q_dV1 = resultFad.dx(0);
1371 dkcl2Q_dV2 = resultFad.dx(1);
1376 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
1377 Sacado::Fad::SFad<double,2> nVar( 2, 1, nNow );
1379 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
1381 Sacado::Fad::SFad<double,2> resultFad =
nEquF( v1Var, nVar, vRestVar);
1382 nEquFvalue = resultFad.val();
1383 dnF_dV1 = resultFad.dx(0);
1384 dnF_dn = resultFad.dx(1);
1388 Sacado::Fad::SFad<double,1> nVar( 1, 0, nNow );
1390 Sacado::Fad::SFad<double,1> resultFad =
nEquQ( nVar );
1391 nEquQvalue = resultFad.val();
1392 dnQ_dn = resultFad.dx(0);
1397 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
1398 Sacado::Fad::SFad<double,2> mVar( 2, 1, mNow );
1400 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
1402 Sacado::Fad::SFad<double,2> resultFad =
mEquF( v1Var, mVar, vRestVar );
1403 mEquFvalue = resultFad.val();
1404 dmF_dV1 = resultFad.dx(0);
1405 dmF_dm = resultFad.dx(1);
1408 Sacado::Fad::SFad<double,1> mVar( 1, 0, mNow );
1410 Sacado::Fad::SFad<double,1> resultFad =
mEquQ( mVar );
1411 mEquQvalue = resultFad.val();
1412 dmQ_dm = resultFad.dx(0);
1417 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
1418 Sacado::Fad::SFad<double,2> hVar( 2, 1, hNow );
1420 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
1422 Sacado::Fad::SFad<double,2> resultFad =
hEquF( v1Var, hVar, vRestVar );
1423 hEquFvalue = resultFad.val();
1424 dhF_dV1 = resultFad.dx(0);
1425 dhF_dh = resultFad.dx(1);
1428 Sacado::Fad::SFad<double,1> hVar( 1, 0, hNow );
1430 Sacado::Fad::SFad<double,1> resultFad =
hEquQ( hVar );
1431 hEquQvalue = resultFad.val();
1432 dhQ_dh = resultFad.dx(0);
1437 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
1438 Sacado::Fad::SFad<double,2> aVar( 2, 1, aNow );
1440 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
1442 Sacado::Fad::SFad<double,2> resultFad =
aEquF( v1Var, aVar, vRestVar );
1443 aEquFvalue = resultFad.val();
1444 daF_dV1 = resultFad.dx(0);
1445 daF_da = resultFad.dx(1);
1448 Sacado::Fad::SFad<double,1> aVar( 1, 0, aNow );
1450 Sacado::Fad::SFad<double,1> resultFad =
aEquQ( aVar );
1451 aEquQvalue = resultFad.val();
1452 daQ_da = resultFad.dx(0);
1457 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
1458 Sacado::Fad::SFad<double,2> bVar( 2, 1, bNow );
1460 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
1462 Sacado::Fad::SFad<double,2> resultFad =
bEquF( v1Var, bVar, vRestVar );
1463 bEquFvalue = resultFad.val();
1464 dbF_dV1 = resultFad.dx(0);
1465 dbF_db = resultFad.dx(1);
1468 Sacado::Fad::SFad<double,1> bVar( 1, 0, bNow );
1470 Sacado::Fad::SFad<double,1> resultFad =
aEquQ( bVar );
1471 bEquQvalue = resultFad.val();
1472 dbQ_db = resultFad.dx(0);
1477 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
1478 Sacado::Fad::SFad<double,2> M_Var( 2, 1, M_Now );
1480 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
1482 Sacado::Fad::SFad<double,2> resultFad =
M_EquF( v1Var, M_Var, vRestVar );
1483 M_EquFvalue = resultFad.val();
1484 dMF_dV1 = resultFad.dx(0);
1485 dMF_dM = resultFad.dx(1);
1488 Sacado::Fad::SFad<double,1> M_Var( 1, 0, M_Now );
1490 Sacado::Fad::SFad<double,1> resultFad =
aEquQ( M_Var );
1491 M_EquQvalue = resultFad.val();
1492 dMQ_dM = resultFad.dx(0);
1497 Sacado::Fad::SFad<double,2> v1Var( 2, 0, v1Now );
1498 Sacado::Fad::SFad<double,2> H_Var( 2, 1, H_Now );
1500 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
1502 Sacado::Fad::SFad<double,2> resultFad =
H_EquF( v1Var, H_Var, vRestVar );
1503 H_EquFvalue = resultFad.val();
1504 dHF_dV1 = resultFad.dx(0);
1505 dHF_dH = resultFad.dx(1);
1508 Sacado::Fad::SFad<double,1> H_Var( 1, 0, H_Now );
1510 Sacado::Fad::SFad<double,1> resultFad =
H_EquQ( H_Var );
1511 H_EquQvalue = resultFad.val();
1512 dHQ_dH = resultFad.dx(0);
1517 Sacado::Fad::SFad<double,3> v1Var( 3, 0, v1Now );
1518 Sacado::Fad::SFad<double,3> cVar( 3, 1, cNow );
1519 Sacado::Fad::SFad<double,3> CaVar( 3, 2, CaNow );
1521 Sacado::Fad::SFad<double,3> vRestVar(
model_.
vRest );
1523 Sacado::Fad::SFad<double,3> resultFad =
C_EquF( v1Var, cVar, CaVar, vRestVar );
1524 cEquFvalue = resultFad.val();
1525 dcF_dV1 = resultFad.dx(0);
1526 dcF_dc = resultFad.dx(1);
1530 Sacado::Fad::SFad<double,1> cVar( 1, 0, cNow );
1532 Sacado::Fad::SFad<double,1> resultFad =
C_EquQ( cVar );
1533 cEquQvalue = resultFad.val();
1534 dcQ_dc = resultFad.dx(0);
1539 Sacado::Fad::SFad<double,5> v1Var( 5, 0, v1Now );
1540 Sacado::Fad::SFad<double,5> v2Var( 5, 1, v2Now );
1541 Sacado::Fad::SFad<double,5> M_Var( 5, 2, M_Now );
1542 Sacado::Fad::SFad<double,5> H_Var( 5, 3, H_Now );
1543 Sacado::Fad::SFad<double,5> CaVar( 5, 4, CaNow );
1546 Sacado::Fad::SFad<double,5> gCaVar(
model_.
gCa );
1547 Sacado::Fad::SFad<double,5> eCaVar(
model_.
gCa );
1549 Sacado::Fad::SFad<double,5> CaTauVar(
model_.
CaTau );
1551 Sacado::Fad::SFad<double,5> resultFad =
Ca_EquF( v1Var, v2Var, M_Var, H_Var, CaVar, gCaVar, eCaVar, CaGammaVar, CaTauVar );
1552 CaEquFvalue = resultFad.val();
1553 dCaF_dV1 = resultFad.dx(0);
1554 dCaF_dV2 = resultFad.dx(1);
1560 Sacado::Fad::SFad<double,1> CaVar( 1, 0, CaNow );
1562 Sacado::Fad::SFad<double,1> resultFad =
Ca_EquQ( CaVar );
1563 CaEquQvalue = resultFad.val();
1575 Xyce::dout() <<
"Instance::updateIntermediateVars()" << std::endl
1576 <<
"v1 = " << v1Now << std::endl
1577 <<
"v2 = " << v2Now << std::endl
1578 <<
"nNow = " << nNow << std::endl
1579 <<
"mNow = " << mNow << std::endl
1580 <<
"hNow = " << hNow << std::endl
1581 <<
"aNow = " << aNow << std::endl
1582 <<
"bNow = " << bNow << std::endl
1583 <<
"M_Now = " << M_Now << std::endl
1584 <<
"H_Now = " << H_Now << std::endl
1585 <<
"cNow = " << cNow << std::endl
1586 <<
"CaNow = " << CaNow << std::endl
1587 <<
"kcl1Fvalue = " <<
kcl1Fvalue << std::endl
1588 <<
"dkcl1F_dV1 = " << dkcl1F_dV1 << std::endl
1589 <<
"dkcl1F_dV2 = " << dkcl1F_dV2 << std::endl
1590 <<
"dkcl1F_dn = " << dkcl1F_dn << std::endl
1591 <<
"dkcl1F_dm = " << dkcl1F_dm << std::endl
1592 <<
"dkcl1F_dh = " << dkcl1F_dh << std::endl
1593 <<
"kcl2Fvalue = " <<
kcl2Fvalue << std::endl
1594 <<
"dkcl2F_dV1 = " << dkcl2F_dV1 << std::endl
1595 <<
"dkcl2F_dV2 = " << dkcl2F_dV2 << std::endl
1596 <<
"dkcl2F_dn = " << dkcl2F_dn << std::endl
1597 <<
"dkcl2F_dm = " << dkcl2F_dm << std::endl
1598 <<
"dkcl2F_dh = " << dkcl2F_dh << std::endl
1599 <<
"alphaN = " << alphaN<double>( v1Now ) << std::endl
1600 <<
"betaN = " << betaN<double>( v1Now ) << std::endl
1601 <<
"nEquFvalue = " << nEquFvalue << std::endl
1602 <<
"dnF_dV1 = " << dnF_dV1 << std::endl
1603 <<
"dnF_dn = " <<
dnF_dn << std::endl
1604 <<
"nEquQvalue = " << nEquQvalue << std::endl
1605 <<
"dnQ_dn = " <<
dnQ_dn << std::endl
1606 <<
"alphaM = " << alphaM<double>( v1Now ) << std::endl
1607 <<
"betaM = " << betaM<double>( v1Now ) << std::endl
1608 <<
"mEquFvalue = " << mEquFvalue << std::endl
1609 <<
"dmF_dV1 = " << dmF_dV1 << std::endl
1610 <<
"dmF_dm = " <<
dmF_dm << std::endl
1611 <<
"mEquQvalue = " << mEquQvalue << std::endl
1612 <<
"dmQ_dm = " <<
dmQ_dm << std::endl
1613 <<
"alphaH = " << alphaH<double>( v1Now ) << std::endl
1614 <<
"betaH = " << betaH<double>( v1Now ) << std::endl
1615 <<
"hEquFvalue = " << hEquFvalue << std::endl
1616 <<
"dhF_dV1 = " << dhF_dV1 << std::endl
1617 <<
"dhF_dh = " <<
dhF_dh << std::endl
1618 <<
"hEquQvalue = " << hEquQvalue << std::endl
1619 <<
"dhQ_dh = " <<
dhQ_dh << std::endl
1621 <<
"aInf = " << aInf<double>( v1Now ) << std::endl
1622 <<
"aTau = " << aTau<double>( v1Now ) << std::endl
1623 <<
"aEquFvalue = " << aEquFvalue << std::endl
1624 <<
"daF_dV1 = " << daF_dV1 << std::endl
1625 <<
"daF_da = " <<
daF_da << std::endl
1626 <<
"aEquQvalue = " << aEquQvalue << std::endl
1627 <<
"daQ_da = " <<
daQ_da << std::endl
1629 <<
"bInf = " << bInf<double>( v1Now ) << std::endl
1630 <<
"bTau = " << bTau<double>( v1Now ) << std::endl
1631 <<
"bEquFvalue = " << bEquFvalue << std::endl
1632 <<
"dbF_dV1 = " << dbF_dV1 << std::endl
1633 <<
"dbF_db = " <<
dbF_db << std::endl
1634 <<
"bEquQvalue = " << bEquQvalue << std::endl
1635 <<
"dbQ_db = " <<
dbQ_db << std::endl
1637 <<
"M_Inf = " << M_Inf<double>( v1Now ) << std::endl
1638 <<
"M_Tau = " << M_Tau<double>( v1Now ) << std::endl
1639 <<
"M_EquFvalue = " << M_EquFvalue << std::endl
1640 <<
"dMF_dV1 = " << dMF_dV1 << std::endl
1641 <<
"dMF_dM = " <<
dMF_dM << std::endl
1642 <<
"M_EquQvalue = " << M_EquQvalue << std::endl
1643 <<
"dMQ_dM = " <<
dMQ_dM << std::endl
1645 <<
"H_Inf = " << H_Inf<double>( v1Now ) << std::endl
1646 <<
"H_Tau = " << H_Tau<double>( v1Now ) << std::endl
1647 <<
"H_EquFvalue = " << H_EquFvalue << std::endl
1648 <<
"dHF_dV1 = " << dHF_dV1 << std::endl
1649 <<
"dHF_dH = " <<
dHF_dH << std::endl
1650 <<
"H_EquQvalue = " << H_EquQvalue << std::endl
1651 <<
"dHQ_dH = " <<
dHQ_dH << std::endl
1653 <<
"cEquFvalue = " << cEquFvalue << std::endl
1654 <<
"dcF_dV1 = " << dcF_dV1 << std::endl
1655 <<
"dcF_dc = " <<
dcF_dc << std::endl
1656 <<
"cEquQvalue = " << cEquQvalue << std::endl
1657 <<
"dcQ_dc = " <<
dcQ_dc << std::endl
1659 <<
"CaEquFvalue = " << CaEquFvalue << std::endl
1660 <<
"dCaF_dV1 = " << dCaF_dV1 << std::endl
1661 <<
"dCaF_dV2 = " << dCaF_dV2 << std::endl
1662 <<
"dCaF_dM = " <<
dCaF_dM << std::endl
1663 <<
"dCaF_dH = " <<
dCaF_dH << std::endl
1664 <<
"dCaF_dCa = " <<
dCaF_dCa << std::endl
1665 <<
"CaEquQvalue = " << CaEquQvalue << std::endl
1666 <<
"dCaQ_dCa = " <<
dCaQ_dCa << std::endl
1684 bool bsuccess =
true;
1691 for(
int i=0; i<
nSeg; i++)
1710 bool bsuccess =
true;
1732 bool bsuccess =
true;
1736 for(
int i=0; i<
nSeg ; i++)
1776 for(
int i=0; i<
nSeg ; i++)
1804 bool bsuccess =
true;
1808 for(
int i=0; i<
nSeg ; i++)
1841 bool bsuccess =
true;
1851 for(
int i=0; i<
nSeg ; i++)
1903 bool bsuccess =
true;
1947 std::vector<Instance*>::iterator iter;
1951 for (iter=first; iter!=last; ++iter)
1953 (*iter)->processParams();
1971 :
DeviceModel(MB, configuration.getModelParameters(), factory_block)
2001 std::vector<Instance*>::iterator iter;
2005 for (iter=first; iter!=last; ++iter)
2024 std::vector<Instance*>::const_iterator iter;
2032 os <<
"Number of Neuron instances: " << isize << std::endl;
2033 os <<
" name=\t\tmodelName\tParameters" << std::endl;
2034 for (i=0, iter=first; iter!=last; ++iter, ++i)
2036 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
2061 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
2075 .registerDevice(
"neuron", 4)
2076 .registerModelType(
"neuron", 4);
const InstanceName & getName() const
static ScalarT bEquQ(const ScalarT &b)
std::vector< double > segHEquFvalue
bool updateTemperature(const double &temp_tmp)
std::vector< double > dmF_dV
std::vector< double > segBEquFvalue
std::vector< int > SegVEqnVsegOffset
bool updateDependentParameters()
std::vector< int > li_NaCurrentState
std::vector< double > dCaQ_dCa
const SolverState & solverState_
std::vector< double > dCaF_dM
bool processInstanceParams()
processInstanceParams
Descriptor & addPar(const char *parName, T default_value, T U::*varPtr)
Adds the parameter description to the parameter map.
std::vector< double > dMF_dM
std::vector< double > segAEquFvalue
std::vector< double > dnF_dn
std::vector< double > dcF_dV
Linear::Vector * nextSolVectorPtr
Linear::Vector * daeQVectorPtr
std::vector< double > dnQ_dn
Pure virtual class to augment a linear system.
std::vector< int > li_aPro
void addInternalNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
std::vector< int > li_KCurrentState
std::vector< int > MEquVNodeOffset
std::vector< double > dcF_dc
std::vector< double > segF_dM
std::vector< int > li_hPro
std::vector< Instance * > instanceContainer
std::vector< double > segFvalue
std::vector< double > segH_EquFvalue
std::vector< double > gForward
static ScalarT M_EquQ(const ScalarT &M)
void registerStateLIDs(const std::vector< int > &staLIDVecRef)
static ScalarT nEquQ(const ScalarT &n)
std::vector< double > segF_dn
std::vector< int > CEquCNodeOffset
std::vector< double > dhF_dV
virtual void registerJacLIDs(const JacobianStamp &jacLIDVec)
virtual std::ostream & printOutInstances(std::ostream &os) const
std::vector< int > HEquHNodeOffset
std::vector< int > CaEquVNodeOffset
std::vector< double > dbQ_db
std::vector< int > BEquBNodeOffset
std::vector< double > dcF_dCa
std::vector< double > segM_EquQvalue
std::vector< double > segQ_dV
std::vector< int > CaEquCaNodeOffset
Instance(const Configuration &configuration, const InstanceBlock &IB, Model &Miter, const FactoryBlock &factory_block)
std::vector< int > CaEquM_NodeOffset
std::vector< double > dmQ_dm
std::vector< int > M_EquM_NodeOffset
std::vector< int > li_bPro
std::vector< Param > params
Parameters from the line.
std::vector< double > dHF_dV
bool updateIntermediateVars()
int APosEquNextNodeOffset
virtual void forEachInstance(DeviceInstanceOp &op) const
Apply a device instance "op" to all instances associated with this model.
std::vector< int > li_Vol
std::vector< int > MEquMNodeOffset
std::vector< double > dmF_dm
std::vector< double > dCaF_dCa
void setParams(const std::vector< Param > ¶ms)
std::vector< int > NEquVNodeOffset
std::vector< int > li_nPro
const std::string & getName() const
const std::vector< std::vector< int > > & jacobianStamp() const
std::vector< double > segF_dc
static ScalarT mEquQ(const ScalarT &m)
static ScalarT C_EquQ(const ScalarT &C)
std::vector< double > segNEquQvalue
The FactoryBlock contains parameters needed by the device, instance and model creation functions...
std::vector< double > potassiumCurrent
std::vector< double > segMEquFvalue
static ScalarT hEquQ(const ScalarT &h)
std::vector< double > gBackward
static ScalarT aEquF(const ScalarT &Vn1, const ScalarT &a, const ScalarT &Vrest)
std::vector< double > segF_dh
std::vector< double > segF_db
void varTypes(std::vector< char > &varTypeVec)
const DeviceOptions & deviceOptions_
static ScalarT bEquF(const ScalarT &Vn1, const ScalarT &b, const ScalarT &Vrest)
std::vector< double > segMEquQvalue
std::vector< double > dMF_dV
std::vector< double > segF_dVn
Linear::Vector * nextStaVectorPtr
static Config< T > & addConfiguration()
Adds the device to the Xyce device configuration.
std::vector< double > dCaF_dH
std::vector< double > dbF_dV
std::vector< double > segF_dH
Linear::Matrix * dFdxMatrixPtr
std::vector< int > li_HPro
std::vector< double > daF_dV
static ScalarT H_EquQ(const ScalarT &H)
std::vector< double > segF_dVp
static ScalarT aEquQ(const ScalarT &a)
The Device class is an interface for device implementations.
static ScalarT kcl1EquQ(const ScalarT &VSeg, const ScalarT &memC)
std::vector< double > segF_dV
std::vector< int > M_EquVNodeOffset
void loadNodeSymbols(Util::SymbolTable &symbol_table) const
Populates and returns the store name map.
std::vector< double > dMQ_dM
std::vector< double > dnF_dV
std::vector< double > segF_dm
std::vector< int > li_cPro
Class Configuration contains device configuration data.
int ANegEquLastNodeOffset
static ScalarT mEquF(const ScalarT &Vn1, const ScalarT &m, const ScalarT &Vrest)
std::vector< double > segBEquQvalue
std::vector< int > CEquVNodeOffset
std::vector< double > segH_EquQvalue
std::vector< double > daQ_da
std::vector< int > H_EquVNodeOffset
std::vector< int > AEquANodeOffset
std::vector< int > SegVEqnVnexOffset
std::vector< double > dhQ_dh
static ScalarT kcl2EquQ(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &memC)
std::vector< double > segCaEquQvalue
static void loadInstanceParameters(ParametricData< Instance > &instance_parameters)
const SolverState & getSolverState() const
std::vector< double > segNEquFvalue
bool updateSecondaryState()
std::vector< double > dHF_dH
static ScalarT C_EquF(const ScalarT &Vn1, const ScalarT &C, const ScalarT &CaConc, const ScalarT &Vrest)
void registerJacLIDs(const std::vector< std::vector< int > > &jacLIDVec)
static ScalarT nEquF(const ScalarT &Vn1, const ScalarT &n, const ScalarT &Vrest)
std::vector< double > daF_da
Linear::Vector * daeFVectorPtr
std::vector< double > segCEquQvalue
std::vector< int > li_CaPro
static ScalarT Ca_EquF(const ScalarT &Vn1, const ScalarT &MC, const ScalarT &HC, const ScalarT &Ca, const ScalarT &CaTg, const ScalarT &CaE, const ScalarT &CaGamma, const ScalarT &CaTau)
static Device * factory(const Configuration &configuration, const FactoryBlock &factory_block)
bool updatePrimaryState()
std::vector< double > segAEquQvalue
std::vector< double > sodiumCurrent
std::vector< int > SegVEqnMOffset
std::vector< int > SegVEqnVpreOffset
std::vector< int > CEquCaNodeOffset
std::vector< double > dhF_dh
std::vector< int > AEquVNodeOffset
static ScalarT kcl1EquF(const ScalarT &VSeg, const ScalarT &VSegP, const ScalarT &VSegN, const ScalarT &n, const ScalarT &m, const ScalarT &h, const ScalarT &a, const ScalarT &b, const ScalarT &MC, const ScalarT &HC, const ScalarT &CC, const ScalarT &gPrev, const ScalarT &gNext, const ScalarT &memG, const ScalarT &restV, const ScalarT &Kg, const ScalarT &Ke, const ScalarT &NaG, const ScalarT &NaE, const ScalarT &Ag, const ScalarT &Ae, const ScalarT &CaTg, const ScalarT &CaE, const ScalarT &KCaG)
std::vector< int > li_mPro
std::vector< int > SegVEqnHOffset
const ExternData & extData
static ScalarT kcl2EquF(const ScalarT &Vn1, const ScalarT &Vn2, const ScalarT &n, const ScalarT &m, const ScalarT &h, const ScalarT &a, const ScalarT &b, const ScalarT &MC, const ScalarT &HC, const ScalarT &CC, const ScalarT &memG, const ScalarT &restV, const ScalarT &Kg, const ScalarT &Ke, const ScalarT &NaG, const ScalarT &NaE, const ScalarT &Ag, const ScalarT &Ae, const ScalarT &CaTg, const ScalarT &CaE, const ScalarT &KCaG)
std::vector< double > dHQ_dH
std::vector< double > segM_EquFvalue
ModelBlock represents a .MODEL line from the netlist.
std::vector< int > li_MPro
std::vector< std::vector< int > > jacStamp
Manages parameter binding for class C.
std::vector< int > HEquVNodeOffset
InstanceBlock represent a device instance line from the netlist.
static ScalarT M_EquF(const ScalarT &Vn1, const ScalarT &M, const ScalarT &Vrest)
std::vector< Param > params
Linear::Matrix * dQdxMatrixPtr
std::vector< double > dCaF_dV
static ScalarT H_EquF(const ScalarT &Vn1, const ScalarT &H, const ScalarT &Vrest)
static ScalarT Ca_EquQ(const ScalarT &Ca)
std::vector< double > segQvalue
std::vector< double > segCaEquFvalue
std::vector< int > H_EquH_NodeOffset
std::vector< double > segHEquQvalue
static void loadModelParameters(ParametricData< Model > &model_parameters)
std::vector< double > segCEquFvalue
std::vector< int > BEquVNodeOffset
static ScalarT hEquF(const ScalarT &Vn1, const ScalarT &h, const ScalarT &Vrest)
std::vector< int > CaEquH_NodeOffset
std::vector< int > SegVEqnNOffset
bool processParams()
processParams
void registerLIDs(const std::vector< int > &intLIDVecRef, const std::vector< int > &extLIDVecRef)
std::vector< double > segF_da
std::vector< double > dbF_db
void setModParams(const std::vector< Param > ¶ms)
std::vector< int > NEquNNodeOffset
std::vector< double > dcQ_dc