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");
607 " TITLE = \"Data for reaction model: %s.\",\n",
name.c_str());
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,
766 for (
int i=0;i<rSize;++i)
769 tmpstr =
name+
"_Conc_"+speciesName;
786 (
const std::vector<int> & staLIDVec,
int & i)
788 if (baseReactionIndex != -1)
790 int rSize = theReactions.getNumSpecies();
791 li_state_Concentrations.resize(rSize);
792 for (
int j=0;j<rSize;++j)
794 li_state_Concentrations[j]=staLIDVec[i++];
808 (
const std::vector< std::vector<int> > & jacLIDVec,
809 const std::vector<int> &map,
810 const std::vector< std::vector<int> > &map2
813 if ( !(regData.doNothing) )
815 if (baseReactionIndex != -1)
817 int rSize = theReactions.getNumSpecies();
818 AConcentrationEquConcentrationNodeOffsets.clear();
819 AConcentrationEquAuxNodeOffsets.clear();
821 AConcentrationEquConcentrationNodeOffsets.resize(rSize);
822 AConcentrationEquAuxNodeOffsets.resize(rSize);
824 for (
int i=0;i<rSize;++i)
826 AConcentrationEquConcentrationNodeOffsets[i].resize(rSize);
827 for (
int j=0;j<rSize;++j)
829 AConcentrationEquConcentrationNodeOffsets[i][j]=
830 jacLIDVec[map[baseReactionIndex+i]][map2[baseReactionIndex+i][j]];
834 int bRI = baseReactionIndex;
835 AConcentrationEquAuxNodeOffsets[i].resize(2);
836 for (
int j=0; j<2; ++j)
838 AConcentrationEquAuxNodeOffsets[i][j]=
839 jacLIDVec[map[bRI+i]][map2[bRI+i][rSize+j]];
876 for (
int i=0;i<rSize;++i)
881 for (
int j=0;j<rSize; ++j)
886 double * dfdxPtr = dfdx.returnRawEntryPointer (lidRow, lidCol);
889 double * dqdxPtr = dqdx.returnRawEntryPointer (lidRow, lidCol);
896 for (
int j=0;j<2; ++j)
950 (
double * solVector,
double * oldSolVector,
double time)
952 if (baseReactionIndex != -1)
954 int rSize = theReactions.getNumSpecies();
955 if (tempConcentrations.size() != rSize)
957 tempConcentrations.clear();
958 tempConcentrations.resize(rSize,0.0);
961 for (
int i=0;i<rSize;++i)
963 tempConcentrations[i] = solVector[li_Concentrations[i]];
967 double scalar= ((variablesScaledFlag)?(t0/C0):(1.0));
968 theReactions.setSimTime(time);
969 theReactions.setSourceScaleFac(scalar);
972 if (ddt.size() != rSize)
975 ddt.resize(rSize,0.0);
979 for (
int i=0;i<rSize;++i)
984 theReactions.getDdt( tempConcentrations, theConstantConcentrations, ddt);
987 if (tempJac.size() != rSize)
990 tempJac.resize(rSize);
991 for (
int i=0; i<rSize; ++i)
993 tempJac[i].resize(rSize,0.0);
998 for (
int i=0;i<rSize;++i)
1000 for (
int j=0;j<rSize;++j)
1007 theReactions.getJac( tempConcentrations, theConstantConcentrations, tempJac);
1042 for (
int i=0;i<rSize;++i)
1075 for (
int i=0;i<rSize;++i)
1083 for (
int i=0;i<rSize;++i)
1123 for (
int i=0;i<rSize; ++i)
1149 for (
int i=0; i<rSize; ++i)
1156 for (
int i=0;i<rSize; ++i)
1158 for (
int j=0;j<rSize; ++j)
1160 double val = (-
tempJac[i][j]);
1190 for (
int i=0;i<rSize;++i)
1251 int numSpeciesVars=0;
1258 return (numSpeciesVars+hInt);