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;
652 for(
int i=0, j=0; i<
nSeg; i++, j+=2)
675 bool returnVal=
false;
737 for(
int i=0, j=2; i<
nSeg; i++, j+=4 )
782 bool bsuccess =
true;
789 double vIn = (*solVectorPtr)[
li_Pos];
790 double vOut = (*solVectorPtr)[
li_Neg];
802 for(
int i=0; i<
nSeg; i++ )
805 double vSeg = (*solVectorPtr)[
li_Vol[i]];
813 vNext = (*solVectorPtr)[li_Vol[i+1]];
822 vPrev = (*solVectorPtr)[li_Vol[i-1]];
824 double nVarSeg = (*solVectorPtr)[
li_nPro[i]];
825 double mVarSeg = (*solVectorPtr)[
li_mPro[i]];
826 double hVarSeg = (*solVectorPtr)[
li_hPro[i]];
833 const int numDeriv = 6;
834 Sacado::Fad::SFad<double,6> vVar( numDeriv, 0, vSeg );
835 Sacado::Fad::SFad<double,6> vVpr( numDeriv, 1, vPrev );
836 Sacado::Fad::SFad<double,6> vVne( numDeriv, 2, vNext );
837 Sacado::Fad::SFad<double,6> nVar( numDeriv, 3, nVarSeg );
838 Sacado::Fad::SFad<double,6> mVar( numDeriv, 4, mVarSeg );
839 Sacado::Fad::SFad<double,6> hVar( numDeriv, 5, hVarSeg );
841 Sacado::Fad::SFad<double,6> gPrev(
gBackward[i] );
842 Sacado::Fad::SFad<double,6> gNext(
gForward[i] );
844 Sacado::Fad::SFad<double,6> vRestVar(
model_.
vRest );
846 Sacado::Fad::SFad<double,6> eKVar(
model_.
eK );
848 Sacado::Fad::SFad<double,6> eNaVar(
model_.
eNa );
851 Sacado::Fad::SFad<double,6> resultFad;
852 resultFad =
kcl1EquF( vVar, vVpr, vVne, nVar, mVar, hVar, gPrev, gNext, gMemVar, vRestVar, gKVar, eKVar, gNaVar, eNaVar );
863 const int numDeriv = 2;
864 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
869 Sacado::Fad::SFad<double,2> resultFad;
870 resultFad =
kcl1EquQ( vVar, cMemVar );
878 const int numDeriv = 2;
879 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
880 Sacado::Fad::SFad<double,2> nVar( numDeriv, 1, nVarSeg );
882 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
884 Sacado::Fad::SFad<double,2> resultFad =
nEquF( vVar, nVar, vRestVar);
886 dnF_dV[i] = resultFad.dx(0);
887 dnF_dn[i] = resultFad.dx(1);
890 const int numDeriv = 1;
891 Sacado::Fad::SFad<double,1> nVar( numDeriv, 0, nVarSeg );
893 Sacado::Fad::SFad<double,1> resultFad =
nEquQ( nVar );
895 dnQ_dn[i] = resultFad.dx(0);
900 const int numDeriv = 2;
901 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
902 Sacado::Fad::SFad<double,2> mVar( numDeriv, 1, mVarSeg );
904 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
906 Sacado::Fad::SFad<double,2> resultFad =
mEquF( vVar, mVar, vRestVar );
908 dmF_dV[i] = resultFad.dx(0);
909 dmF_dm[i] = resultFad.dx(1);
912 const int numDeriv = 1;
913 Sacado::Fad::SFad<double,1> mVar( numDeriv, 0, mVarSeg );
915 Sacado::Fad::SFad<double,1> resultFad =
mEquQ( mVar );
917 dmQ_dm[i] = resultFad.dx(0);
922 const int numDeriv = 2;
923 Sacado::Fad::SFad<double,2> vVar( numDeriv, 0, vSeg );
924 Sacado::Fad::SFad<double,2> hVar( numDeriv, 1, hVarSeg );
926 Sacado::Fad::SFad<double,2> vRestVar(
model_.
vRest );
928 Sacado::Fad::SFad<double,2> resultFad =
hEquF( vVar, hVar, vRestVar );
930 dhF_dV[i] = resultFad.dx(0);
931 dhF_dh[i] = resultFad.dx(1);
934 const int numDeriv = 1;
935 Sacado::Fad::SFad<double,1> hVar( numDeriv, 0, hVarSeg );
937 Sacado::Fad::SFad<double,1> resultFad =
hEquQ( hVar );
939 dhQ_dh[i] = resultFad.dx(0);
948 #ifdef Xyce_DEBUG_DEVICE
951 Xyce::dout() <<
"Segment " << i << std::endl
952 <<
"vPrev = " << vPrev << std::endl
953 <<
"vSeg = " << vSeg << std::endl
954 <<
"vNext = " << vNext << std::endl
955 <<
"n, m, h = " << nVarSeg <<
", " << mVarSeg <<
", " << hVarSeg << std::endl
956 <<
"segFvalue = " <<
segFvalue[i] << std::endl
957 <<
"segQvalue = " <<
segQvalue[i] << std::endl
986 bool bsuccess =
true;
993 for(
int i=0; i<
nSeg; i++)
1012 bool bsuccess =
true;
1034 bool bsuccess =
true;
1038 for(
int i=0; i<
nSeg ; i++)
1072 for(
int i=0; i<
nSeg ; i++)
1094 bool bsuccess =
true;
1098 for(
int i=0; i<
nSeg ; i++)
1123 bool bsuccess =
true;
1133 for(
int i=0; i<
nSeg ; i++)
1163 bool bsuccess =
true;
1206 std::vector<Instance*>::iterator iter;
1210 for (iter=first; iter!=last; ++iter)
1212 (*iter)->processParams();
1230 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
1267 std::vector<Instance*>::iterator iter;
1271 for (iter=first; iter!=last; ++iter)
1290 std::vector<Instance*>::const_iterator iter;
1298 os <<
"Number of Neuron instances: " << isize << std::endl;
1299 os <<
" name=\t\tmodelName\tParameters" << std::endl;
1300 for (i=0, iter=first; iter!=last; ++iter, ++i)
1302 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
1327 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1341 .registerDevice(
"neuron", 3)
1342 .registerModelType(
"neuron", 3);