46 #include <Xyce_config.h>
51 #include <N_UTL_Misc.h>
52 #include <N_UTL_Xyce.h>
54 #ifdef Xyce_DEBUG_DEVICE
64 #ifdef Xyce_DEBUG_DEVICE
82 #include <N_LAS_Matrix.h>
83 #include <N_LAS_MultiVector.h>
84 #include <N_LAS_Vector.h>
89 #include <N_UTL_Expression.h>
107 outputName(rd.outName),
111 useScaledVariablesFlag(false),
112 variablesScaledFlag(false),
113 rateConstantsScaledFlag(false),
115 baseReactionIndex(-1),
127 outputBefore1(false),
151 outputName(rd.outName),
155 useScaledVariablesFlag(false),
156 variablesScaledFlag(false),
157 rateConstantsScaledFlag(false),
159 baseReactionIndex(-1),
171 outputBefore1(false),
172 outputBefore2(false),
173 theReactions(reactionNet)
175 #ifdef Xyce_DEBUG_DEVICE
211 #ifdef Xyce_DEBUG_DEVICE
264 for (i=0; i<icSize; ++i)
333 #ifdef Xyce_DEBUG_DEVICE
351 #ifdef Xyce_DEBUG_DEVICE
356 Xyce::dout() <<
"Scaled Reactions: " << std::endl;
393 #ifdef Xyce_DEBUG_DEVICE
396 Xyce::dout() <<
"N_DEV_Region::setupScalingVars:" << std::endl;
397 Xyce::dout().width(20);
398 Xyce::dout().precision(12);
399 Xyce::dout() <<
" " << std::endl;
400 Xyce::dout() <<
"t0 = " << t0 << std::endl;
401 Xyce::dout() <<
"x0 = " <<
x0 << std::endl;
402 Xyce::dout() <<
"a0 = " <<
a0 << std::endl;
403 Xyce::dout() <<
"C0 = " <<
C0 << std::endl;
404 Xyce::dout() <<
"D0 = " <<
D0 << std::endl;
405 Xyce::dout() <<
"R0 = " <<
R0 << std::endl;
406 Xyce::dout() <<
"k0 = " <<
k0 << std::endl;
407 Xyce::dout() <<
"rk0 = " <<
rk0 << std::endl;
567 bool bsuccess =
true;
570 char filename[32];
for(i=0;i<32;++i) filename[i] = static_cast<char>(0);
572 sprintf(filename,
"%s.dat",
outputName.c_str());
577 #ifdef Xyce_DEBUG_DEVICE
580 Xyce::dout() << std::endl;
581 Xyce::dout() << section_divider << std::endl;
582 Xyce::dout() <<
"In N_DEV_DiodePDEInstance::outputTecplot. filename = ";
583 Xyce::dout() << std::string(filename);
584 Xyce::dout() <<
" time = " << time;
585 Xyce::dout() <<
" step = " << step;
586 Xyce::dout() << std::endl;
594 fp1 = fopen(filename,
"w");
598 fp1 = fopen(filename,
"a");
608 fprintf(fp1,
"%s",
"\tVARIABLES = \"TIME \",\n");
610 for (i=0;i<cSize;++i)
615 for (i=0;i<rSize;++i)
619 fprintf(fp1,
"%s",
"\tZONE F=POINT\n");
626 for (i=0;i<cSize;++i)
630 fprintf(fp1,
" %20.12e", printVal);
633 for (i=0;i<rSize;++i)
637 fprintf(fp1,
" %20.12e", printVal);
640 fprintf(fp1,
"%s",
"\n");
660 std::vector<int> &colDep,
668 if (colDep.size() != 2)
670 Report::DevelFatal0() <<
"Region::setupJacStamp ERROR: colDep != 2 ";
673 int stampSize=jacStamp.size();
675 jacStamp.resize(stampSize+concentrationSize);
681 for (
int i=0; i<concentrationSize; ++i)
688 for (
int j=0;j<concentrationSize; ++j)
702 lastIndex = jacStamp.size()-1;
714 const std::vector<int> & extLIDVec,
725 #ifdef Xyce_DEBUG_DEVICE
728 Xyce::dout() <<
" li_Concentrations: " << std::endl;
731 for (
int i=0;i<rSize;++i)
735 #ifdef Xyce_DEBUG_DEVICE
738 Xyce::dout() <<
" li_Concentrations["<< i <<
"] = " <<
li_Concentrations[i] << std::endl;
755 std::map<int,std::string> & intNameMap,
763 for (
int i=0;i<rSize;++i)
781 (
const std::vector<int> & staLIDVec,
int & i)
783 if (baseReactionIndex != -1)
785 int rSize = theReactions.getNumSpecies();
786 li_state_Concentrations.resize(rSize);
787 for (
int j=0;j<rSize;++j)
789 li_state_Concentrations[j]=staLIDVec[i++];
803 (
const std::vector< std::vector<int> > & jacLIDVec,
804 const std::vector<int> &map,
805 const std::vector< std::vector<int> > &map2
808 if ( !(regData.doNothing) )
810 if (baseReactionIndex != -1)
812 int rSize = theReactions.getNumSpecies();
813 AConcentrationEquConcentrationNodeOffsets.clear();
814 AConcentrationEquAuxNodeOffsets.clear();
816 AConcentrationEquConcentrationNodeOffsets.resize(rSize);
817 AConcentrationEquAuxNodeOffsets.resize(rSize);
819 for (
int i=0;i<rSize;++i)
821 AConcentrationEquConcentrationNodeOffsets[i].resize(rSize);
822 for (
int j=0;j<rSize;++j)
824 AConcentrationEquConcentrationNodeOffsets[i][j]=
825 jacLIDVec[map[baseReactionIndex+i]][map2[baseReactionIndex+i][j]];
829 int bRI = baseReactionIndex;
830 AConcentrationEquAuxNodeOffsets[i].resize(2);
831 for (
int j=0; j<2; ++j)
833 AConcentrationEquAuxNodeOffsets[i][j]=
834 jacLIDVec[map[bRI+i]][map2[bRI+i][rSize+j]];
871 for (
int i=0;i<rSize;++i)
876 for (
int j=0;j<rSize; ++j)
881 double * dfdxPtr = dfdx.returnRawEntryPointer (lidRow, lidCol);
884 double * dqdxPtr = dqdx.returnRawEntryPointer (lidRow, lidCol);
891 for (
int j=0;j<2; ++j)
945 (
double * solVector,
double * oldSolVector,
double time)
947 if (baseReactionIndex != -1)
949 int rSize = theReactions.getNumSpecies();
950 if (tempConcentrations.size() != rSize)
952 tempConcentrations.clear();
953 tempConcentrations.resize(rSize,0.0);
956 for (
int i=0;i<rSize;++i)
958 tempConcentrations[i] = solVector[li_Concentrations[i]];
962 double scalar= ((variablesScaledFlag)?(t0/C0):(1.0));
963 theReactions.setSimTime(time);
964 theReactions.setSourceScaleFac(scalar);
967 if (ddt.size() != rSize)
970 ddt.resize(rSize,0.0);
974 for (
int i=0;i<rSize;++i)
979 theReactions.getDdt( tempConcentrations, theConstantConcentrations, ddt);
982 if (tempJac.size() != rSize)
985 tempJac.resize(rSize);
986 for (
int i=0; i<rSize; ++i)
988 tempJac[i].resize(rSize,0.0);
993 for (
int i=0;i<rSize;++i)
995 for (
int j=0;j<rSize;++j)
1002 theReactions.getJac( tempConcentrations, theConstantConcentrations, tempJac);
1037 for (
int i=0;i<rSize;++i)
1070 for (
int i=0;i<rSize;++i)
1078 for (
int i=0;i<rSize;++i)
1118 for (
int i=0;i<rSize; ++i)
1144 for (
int i=0; i<rSize; ++i)
1151 for (
int i=0;i<rSize; ++i)
1153 for (
int j=0;j<rSize; ++j)
1155 double val = (-
tempJac[i][j]);
1185 for (
int i=0;i<rSize;++i)
1246 int numSpeciesVars=0;
1253 return (numSpeciesVars+hInt);