46 #include <Xyce_config.h>
50 #include <N_UTL_Math.h>
62 #include <N_LAS_Matrix.h>
63 #include <N_LAS_MultiVector.h>
64 #include <N_LAS_Vector.h>
69 #include <N_UTL_Expression.h>
70 #include <N_UTL_FeatureTest.h>
84 const NetlistLocation & netlist_location,
90 outputName(rd.outName),
94 useScaledVariablesFlag(false),
95 variablesScaledFlag(false),
96 rateConstantsScaledFlag(false),
98 baseReactionIndex(-1),
110 outputBefore1(false),
134 outputName(rd.outName),
138 useScaledVariablesFlag(false),
139 variablesScaledFlag(false),
140 rateConstantsScaledFlag(false),
142 baseReactionIndex(-1),
154 outputBefore1(false),
155 outputBefore2(false),
156 theReactions(reactionNet)
158 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
192 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
242 for (i=0; i<icSize; ++i)
315 if (isActive(Diag::DEVICE_PARAMETERS))
333 if (isActive(Diag::DEVICE_PARAMETERS))
335 Xyce::dout() <<
"Scaled Reactions: " << std::endl;
372 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
374 Xyce::dout() <<
"Device::Region::setupScalingVars:" << std::endl;
375 Xyce::dout().width(20);
376 Xyce::dout().precision(12);
377 Xyce::dout() <<
" " << std::endl;
378 Xyce::dout() <<
"t0 = " << t0 << std::endl;
379 Xyce::dout() <<
"x0 = " <<
x0 << std::endl;
380 Xyce::dout() <<
"a0 = " <<
a0 << std::endl;
381 Xyce::dout() <<
"C0 = " <<
C0 << std::endl;
382 Xyce::dout() <<
"D0 = " <<
D0 << std::endl;
383 Xyce::dout() <<
"R0 = " <<
R0 << std::endl;
384 Xyce::dout() <<
"k0 = " <<
k0 << std::endl;
385 Xyce::dout() <<
"rk0 = " <<
rk0 << std::endl;
543 bool bsuccess =
true;
546 char filename[32];
for(i=0;i<32;++i) filename[i] = static_cast<char>(0);
548 sprintf(filename,
"%s.dat",
outputName.c_str());
555 Xyce::dout() << std::endl;
556 Xyce::dout() << section_divider << std::endl;
557 Xyce::dout() <<
"In Device::DiodePDEInstance::outputTecplot. filename = ";
558 Xyce::dout() << std::string(filename);
559 Xyce::dout() <<
" time = " << time;
560 Xyce::dout() <<
" step = " << step;
561 Xyce::dout() << std::endl;
568 fp1 = fopen(filename,
"w");
572 fp1 = fopen(filename,
"a");
582 fprintf(fp1,
"%s",
"\tVARIABLES = \"TIME \",\n");
584 for (i=0;i<cSize;++i)
589 for (i=0;i<rSize;++i)
593 fprintf(fp1,
"%s",
"\tZONE F=POINT\n");
600 for (i=0;i<cSize;++i)
604 fprintf(fp1,
" %20.12e", printVal);
607 for (i=0;i<rSize;++i)
611 fprintf(fp1,
" %20.12e", printVal);
614 fprintf(fp1,
"%s",
"\n");
634 std::vector<int> &colDep,
642 if (colDep.size() != 2)
644 Report::DevelFatal0().in(
"Region::setupJacStamp") <<
"colDep != 2";
647 int stampSize=jacStamp.size();
649 jacStamp.resize(stampSize+concentrationSize);
655 for (
int i=0; i<concentrationSize; ++i)
662 for (
int j=0;j<concentrationSize; ++j)
676 lastIndex = jacStamp.size()-1;
688 const std::vector<int> & extLIDVec,
699 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
701 Xyce::dout() <<
" li_Concentrations: " << std::endl;
703 for (
int i=0;i<rSize;++i)
707 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
709 Xyce::dout() <<
" li_Concentrations["<< i <<
"] = " <<
li_Concentrations[i] << std::endl;
727 Util::SymbolTable & symbol_table,
735 for (
int i = 0; i < rSize; ++i)
753 std::map<int,std::string> & intNameMap,
761 for (
int i=0;i<rSize;++i)
779 (
const std::vector<int> & staLIDVec,
int & i)
781 if (baseReactionIndex != -1)
783 int rSize = theReactions.getNumSpecies();
784 li_state_Concentrations.resize(rSize);
785 for (
int j=0;j<rSize;++j)
787 li_state_Concentrations[j]=staLIDVec[i++];
801 (
const std::vector< std::vector<int> > & jacLIDVec,
802 const std::vector<int> &map,
803 const std::vector< std::vector<int> > &map2
806 if ( !(regData.doNothing) )
808 if (baseReactionIndex != -1)
810 int rSize = theReactions.getNumSpecies();
811 AConcentrationEquConcentrationNodeOffsets.clear();
812 AConcentrationEquAuxNodeOffsets.clear();
814 AConcentrationEquConcentrationNodeOffsets.resize(rSize);
815 AConcentrationEquAuxNodeOffsets.resize(rSize);
817 for (
int i=0;i<rSize;++i)
819 AConcentrationEquConcentrationNodeOffsets[i].resize(rSize);
820 for (
int j=0;j<rSize;++j)
822 AConcentrationEquConcentrationNodeOffsets[i][j]=
823 jacLIDVec[map[baseReactionIndex+i]][map2[baseReactionIndex+i][j]];
827 int bRI = baseReactionIndex;
828 AConcentrationEquAuxNodeOffsets[i].resize(2);
829 for (
int j=0; j<2; ++j)
831 AConcentrationEquAuxNodeOffsets[i][j]=
832 jacLIDVec[map[bRI+i]][map2[bRI+i][rSize+j]];
869 for (
int i=0;i<rSize;++i)
874 for (
int j=0;j<rSize; ++j)
879 double * dfdxPtr = dfdx.returnRawEntryPointer (lidRow, lidCol);
882 double * dqdxPtr = dqdx.returnRawEntryPointer (lidRow, lidCol);
889 for (
int j=0;j<2; ++j)
943 (
double * solVector,
double * oldSolVector,
double time)
945 if (baseReactionIndex != -1)
947 int rSize = theReactions.getNumSpecies();
948 if (tempConcentrations.size() != rSize)
950 tempConcentrations.clear();
951 tempConcentrations.resize(rSize,0.0);
954 for (
int i=0;i<rSize;++i)
956 tempConcentrations[i] = solVector[li_Concentrations[i]];
960 double scalar= ((variablesScaledFlag)?(t0/C0):(1.0));
961 theReactions.setSimTime(time);
962 theReactions.setSourceScaleFac(scalar);
965 if (ddt.size() != rSize)
968 ddt.resize(rSize,0.0);
972 for (
int i=0;i<rSize;++i)
977 theReactions.getDdt( tempConcentrations, theConstantConcentrations, ddt);
980 if (tempJac.size() != rSize)
983 tempJac.resize(rSize);
984 for (
int i=0; i<rSize; ++i)
986 tempJac[i].resize(rSize,0.0);
991 for (
int i=0;i<rSize;++i)
993 for (
int j=0;j<rSize;++j)
1000 std::vector<double> tempVec;
1001 theReactions.getJacobianVC( tempConcentrations, theConstantConcentrations, tempJac,tempVec);
1036 for (
int i=0;i<rSize;++i)
1069 for (
int i=0;i<rSize;++i)
1077 for (
int i=0;i<rSize;++i)
1117 for (
int i=0;i<rSize; ++i)
1143 for (
int i=0; i<rSize; ++i)
1150 for (
int i=0;i<rSize; ++i)
1152 for (
int j=0;j<rSize; ++j)
1154 double val = (-
tempJac[i][j]);
1184 for (
int i=0;i<rSize;++i)
1245 int numSpeciesVars=0;
1252 return (numSpeciesVars+hInt);
std::vector< std::vector< double * > > dqdxConcEquAuxVarPtrs
void updateIntermediateVars(double *solVector, double *oldSolVector, double time)
const InstanceName & getName()
void setupJacStamp(std::vector< std::vector< int > > &jacStamp, std::vector< int > &colDep, int &firstReactant, int &lastIndex)
double currTimeStep_
Region, BJT, Digital, ThermalResistor, ROM, Charon, Others.
void setScaleParams(double c, double t, double x)
Pure virtual class to augment a linear system.
void addInternalNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
const std::string & getEncodedName() const
Return the instance name encoded as: [s:]*xname [s:]*Ytype!name [s:]*Utype!name!count.
void addSource(std::string speciesName, Util::Expression *expr)
void scaleRateConstantsFromCalc()
void createDefaultReactionNetwork(const NetlistLocation &netlist_location, const std::string &reactionSpecFile)
void registerJacLIDs(const std::vector< std::vector< int > > &jacLIDVec, const std::vector< int > &map, const std::vector< std::vector< int > > &map2)
bool loadDAEdQdx(Linear::Matrix &dqdx)
std::vector< int > li_Concentrations
const std::string & getSpeciesName(int i)
void setupScalingVars(ScalingVars &sv)
std::vector< double > ddt
void setupPointers(Linear::Matrix &dfdx, Linear::Matrix &dqdx)
bool rateConstantsScaledFlag
const std::string & getConstantsName(int i)
void setCoefficients(double Temp)
bool loadDAEdFdx(Linear::Matrix &dfdx)
void addMasterSourceTerm(const std::string &speciesName)
void setInitialCondition(const std::string &name, const double val)
bool loadDAEQVector(double *qVec)
std::vector< double > theConstantConcentrations
void addMasterSource(std::string speciesName)
void augmentNameMap(std::map< int, std::string > &intNameMap, DeviceInstance &di)
std::vector< std::vector< int > > AConcentrationEquAuxNodeOffsets
void setRateConstantsFromCalc(double T)
bool updateSecondaryState(double *staDeriv)
const SolverState & solState
bool loadDAEdFdxdV(double *dfdxdv, double vdiff)
void loadNodeSymbols(Util::SymbolTable &symbol_table, const DeviceInstance &device_instance)
Region(const NetlistLocation &netlist_location, RegionData &rd, const DeviceOptions &devOp, const SolverState &solst, bool sourceOn=true)
std::vector< double > tempConcentrations
void setMaterial(MaterialLayer *material, double Temp)
std::vector< double > initialConcentrations
std::vector< std::vector< double * > > dqdxConcEquConcVarPtrs
void scaleRateConstants()
void setApplySources(bool flag)
std::vector< std::vector< double * > > dfdxConcEquAuxVarPtrs
std::vector< std::vector< double * > > dfdxConcEquConcVarPtrs
std::vector< std::vector< double > > tempJac
double getBreakpointTime()
bool loadDAEFVector(double *fVec)
int getNumInitialConditions()
void initializeReactionNetwork(ScalingVars &sv, MaterialLayer *material, double Temp)
std::pair< std::string, double > getInitialCondition(int i)
std::string spiceInternalName(const InstanceName &instance_name, const std::string &lead)
ReactionNetwork theReactions
void setRateConstants(double T)
void unscaleRateConstants()
double currTime_
DeviceEntity for expression time, breakpoints DeviceMgr for dependent parameters, breakpoints...
int getReactantNum(const std::string &name)
void unscaleRateConstantsFromCalc()
std::vector< int > li_state_Concentrations
void registerStateLIDs(const std::vector< int > &staLIDVecRef, int &i)
void setReactionNetworkFromFile(const NetlistLocation &netlist_location, const std::string &fileName)
std::vector< double > tempConcentrationDerivs
void addSourceTerm(const std::string &speciesName, const std::string &expressionStr)
void registerLIDs(const std::vector< int > &intLIDVec, const std::vector< int > &extLIDVec, int &intIndex)