46 #include <Xyce_config.h>
56 #include <N_UTL_Misc.h>
66 #include <N_ERH_ErrorMgr.h>
70 #include <N_LAS_Vector.h>
71 #include <N_LAS_Matrix.h>
249 bool bsuccess =
true;
266 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
283 rIntPreviousGiven(false),
284 radiusPreviousGiven(false),
285 lengthPreviousGiven(false),
286 rIntNextGiven(false),
287 radiusNextGiven(false),
288 lengthNextGiven(false),
297 APosEquPosNodeOffset(0),
298 APosEquNextNodeOffset(0),
299 ANegEquNegNodeOffset(0),
300 ANegEquLastNodeOffset(0)
411 for(
int i=2; i<numVars; i+=4)
478 gForward[0] = radius * (radius *
radius) / (rLong * segLength * ( segLength * radius * radius + segLength * radius * radius ));
479 gBackward[
nSeg-1] = radius * (radius *
radius) / (rLong * segLength * ( segLength * radius * radius + segLength * radius * radius ));
481 for(
int i=1; i<(
nSeg-1); i++)
483 gBackward[i] = radius * (radius *
radius) / (rLong * segLength * ( segLength * radius * radius + segLength * radius * radius ));
484 gForward[i] = gBackward[i];
559 const std::vector<int> & extLIDVecRef)
564 #ifdef Xyce_DEBUG_DEVICE
567 Xyce::dout() << std::endl << section_divider << std::endl;
568 Xyce::dout() <<
" Instance::registerLIDs" << std::endl;
569 Xyce::dout() <<
" name = " <<
getName() << std::endl;
579 for(
int i=0, j=0; i<
nSeg; i++, j+=4)
587 #ifdef Xyce_DEBUG_DEVICE
590 Xyce::dout() <<
" li_Pos = " <<
li_Pos << std::endl
591 <<
" li_Neg = " <<
li_Neg << std::endl;
592 for(
int i=0; i<
nSeg; i++ )
594 Xyce::dout() <<
" li_Vol[ " << i <<
" ] = " <<
li_Vol[i] << std::endl
595 <<
" li_nPro[ " << i <<
" ] = " <<
li_nPro[i] << std::endl
596 <<
" li_mPro[ " << i <<
" ] = " <<
li_mPro[i] << std::endl
597 <<
" li_hPro[ " << i <<
" ] = " <<
li_hPro[i] << std::endl;
602 #ifdef Xyce_DEBUG_DEVICE
605 Xyce::dout() << section_divider << std::endl;
624 for(
int i=0; i<
nSeg; i++)
626 std::ostringstream segNumber;
629 tmpstr =
getName() +
"_" +
"V" + segNumber.str();
633 tmpstr =
getName() +
"_" +
"N" + segNumber.str();
637 tmpstr =
getName() +
"_" +
"M" + segNumber.str();
641 tmpstr =
getName() +
"_" +
"H" + segNumber.str();
664 for(
int i=0, j=0; i<
nSeg; i++, j+=2)
687 bool returnVal=
false;
749 for(
int i=0, j=2; i<
nSeg; i++, j+=4 )
794 bool bsuccess =
true;
801 double vIn = (*solVectorPtr)[
li_Pos];
802 double vOut = (*solVectorPtr)[
li_Neg];
814 for(
int i=0; i<
nSeg; i++ )
817 double vSeg = (*solVectorPtr)[
li_Vol[i]];
825 vNext = (*solVectorPtr)[li_Vol[i+1]];
834 vPrev = (*solVectorPtr)[li_Vol[i-1]];
836 double nVarSeg = (*solVectorPtr)[
li_nPro[i]];
837 double mVarSeg = (*solVectorPtr)[
li_mPro[i]];
838 double hVarSeg = (*solVectorPtr)[
li_hPro[i]];
845 const int numDeriv = 6;
846 Sacado::Fad::SFad<double,6> vVar( numDeriv, 0, vSeg );
847 Sacado::Fad::SFad<double,6> vVpr( numDeriv, 1, vPrev );
848 Sacado::Fad::SFad<double,6> vVne( numDeriv, 2, vNext );
849 Sacado::Fad::SFad<double,6> nVar( numDeriv, 3, nVarSeg );
850 Sacado::Fad::SFad<double,6> mVar( numDeriv, 4, mVarSeg );
851 Sacado::Fad::SFad<double,6> hVar( numDeriv, 5, hVarSeg );
853 Sacado::Fad::SFad<double,6> gPrev(
gBackward[i] );
854 Sacado::Fad::SFad<double,6> gNext(
gForward[i] );
856 Sacado::Fad::SFad<double,6> vRestVar(
model_.
vRest );
858 Sacado::Fad::SFad<double,6> eKVar(
model_.
eK );
860 Sacado::Fad::SFad<double,6> eNaVar(
model_.
eNa );
863 Sacado::Fad::SFad<double,6> resultFad;
864 resultFad =
kcl1EquF( vVar, vVpr, vVne, nVar, mVar, hVar, gPrev, gNext, gMemVar, vRestVar, gKVar, eKVar, gNaVar, eNaVar );
875 const int numDeriv = 2;
876 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
881 Sacado::Fad::SFad<double,2> resultFad;
882 resultFad =
kcl1EquQ( vVar, cMemVar );
890 const int numDeriv = 2;
891 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
892 Sacado::Fad::SFad<double,2> nVar( numDeriv, 1, nVarSeg );
894 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
896 Sacado::Fad::SFad<double,2> resultFad =
nEquF( vVar, nVar, vRestVar);
898 dnF_dV[i] = resultFad.dx(0);
899 dnF_dn[i] = resultFad.dx(1);
902 const int numDeriv = 1;
903 Sacado::Fad::SFad<double,1> nVar( numDeriv, 0, nVarSeg );
905 Sacado::Fad::SFad<double,1> resultFad =
nEquQ( nVar );
907 dnQ_dn[i] = resultFad.dx(0);
912 const int numDeriv = 2;
913 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
914 Sacado::Fad::SFad<double,2> mVar( numDeriv, 1, mVarSeg );
916 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
918 Sacado::Fad::SFad<double,2> resultFad =
mEquF( vVar, mVar, vRestVar );
920 dmF_dV[i] = resultFad.dx(0);
921 dmF_dm[i] = resultFad.dx(1);
924 const int numDeriv = 1;
925 Sacado::Fad::SFad<double,1> mVar( numDeriv, 0, mVarSeg );
927 Sacado::Fad::SFad<double,1> resultFad =
mEquQ( mVar );
929 dmQ_dm[i] = resultFad.dx(0);
934 const int numDeriv = 2;
935 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
936 Sacado::Fad::SFad<double,2> hVar( numDeriv, 1, hVarSeg );
938 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
940 Sacado::Fad::SFad<double,2> resultFad =
hEquF( vVar, hVar, vRestVar );
942 dhF_dV[i] = resultFad.dx(0);
943 dhF_dh[i] = resultFad.dx(1);
946 const int numDeriv = 1;
947 Sacado::Fad::SFad<double,1> hVar( numDeriv, 0, hVarSeg );
949 Sacado::Fad::SFad<double,1> resultFad =
hEquQ( hVar );
951 dhQ_dh[i] = resultFad.dx(0);
960 #ifdef Xyce_DEBUG_DEVICE
963 Xyce::dout() <<
"Segment " << i << std::endl
964 <<
"vPrev = " << vPrev << std::endl
965 <<
"vSeg = " << vSeg << std::endl
966 <<
"vNext = " << vNext << std::endl
967 <<
"n, m, h = " << nVarSeg <<
", " << mVarSeg <<
", " << hVarSeg << std::endl
968 <<
"segFvalue = " <<
segFvalue[i] << std::endl
969 <<
"segQvalue = " <<
segQvalue[i] << std::endl
998 bool bsuccess =
true;
1005 for(
int i=0; i<
nSeg; i++)
1024 bool bsuccess =
true;
1046 bool bsuccess =
true;
1050 for(
int i=0; i<
nSeg ; i++)
1084 for(
int i=0; i<
nSeg ; i++)
1106 bool bsuccess =
true;
1110 for(
int i=0; i<
nSeg ; i++)
1135 bool bsuccess =
true;
1145 for(
int i=0; i<
nSeg ; i++)
1175 bool bsuccess =
true;
1218 std::vector<Instance*>::iterator iter;
1222 for (iter=first; iter!=last; ++iter)
1224 (*iter)->processParams();
1242 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
1279 std::vector<Instance*>::iterator iter;
1283 for (iter=first; iter!=last; ++iter)
1302 std::vector<Instance*>::const_iterator iter;
1310 os <<
"Number of Neuron instances: " << isize << std::endl;
1311 os <<
" name=\t\tmodelName\tParameters" << std::endl;
1312 for (i=0, iter=first; iter!=last; ++iter, ++i)
1314 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
1339 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1353 .registerDevice(
"neuron", 3)
1354 .registerModelType(
"neuron", 3);