46 #include <Xyce_config.h>
51 #include <N_UTL_Misc.h>
53 #ifdef Xyce_DEBUG_DEVICE
60 #include <N_ERH_ErrorMgr.h>
61 #include <N_UTL_Xyce.h>
62 #include <N_UTL_fwd.h>
63 #include <N_UTL_Expression.h>
66 #ifdef Xyce_REACTION_PARSER
74 #include "N_DEV_ReactionParser.hxx"
81 int N_DEV_ReactionLexer::getToken(Xyce::Device::N_DEV_ReactionParser::semantic_value *lvalp, \
82 Xyce::Device::location *llocp, \
83 map<std::string,int> &theSpeciesIDs)
92 #include <FlexLexer.h>
96 #define yylex N_DEV_lex
132 : speciesMap(right.speciesMap),
133 species(right.species),
134 constantsMap(right.constantsMap),
135 constants(right.constants),
136 initialConditions(right.initialConditions),
137 theReactions(right.theReactions),
138 reactionNamesMap(right.reactionNamesMap),
139 reactionNames(right.reactionNames),
140 myName(right.myName),
141 electronCaptureReactions(right.electronCaptureReactions),
142 holeCaptureReactions(right.holeCaptureReactions),
143 electronEmissionReactions(right.electronEmissionReactions),
144 holeEmissionReactions(right.holeEmissionReactions),
145 sourceScaleFac(right.sourceScaleFac),
149 applySources(right.applySources)
157 for (i=0;i<sourceSize;++i)
159 Util::Expression *newSource;
161 newSource =
new Util::Expression(*((right.
theSourceTerms[i]).second));
191 std::pair<int,Util::Expression *> tempPair =
theSourceTerms.back();
193 delete tempPair.second;
211 #ifdef Xyce_REACTION_PARSER
216 std::ifstream reactionFile;
217 std::map<std::string,int> theSpeciesIDs;
220 reactionFile.open(fileName.c_str(),std::ios::in);
221 if (reactionFile.is_open())
227 std::string msg=
"ReactionNetwork::setReactionNetworkFromFile: Cannot open reaction specification file: "+fileName;
228 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, msg);
231 XyceDevice::ReactionParser theParser(theLexer, theSpeciesIDs, *
this);
234 if (theParser.parse())
236 #ifdef Xyce_DEBUG_DEVICE
237 Xyce::dout() << *
this << std::endl;
239 std::string msg=
"ReactionNetwork::setReactionNetworkFromFile: Parsing reaction spec failed.";
240 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, msg);
266 int nspec=theSpeciesVect.size();
271 for (i=0;i<nspec;++i)
298 int nspec=theConstantsVect.size();
303 for (i=0;i<nspec;++i)
374 std::ostringstream ost;
375 ost <<
" Attempt to add reaction duplicate name " << name << std::endl;
376 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str());
393 if (name.find(
"_ELECTRON_CAPTURE",0) != std::string::npos)
397 else if (name.find(
"_HOLE_CAPTURE",0) != std::string::npos)
401 else if (name.find(
"_ELECTRON_EMISSION",0) != std::string::npos)
405 else if (name.find(
"_HOLE_EMISSION",0) != std::string::npos)
426 std::map<std::string,int>::iterator n_i;
430 if (reactionNum == -1)
432 std::ostringstream ost;
433 ost <<
" Attempt to add reactant " << reactant
434 <<
" to non-existant reaction " << name << std::endl;
435 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str());
449 std::ostringstream ost;
450 ost <<
"attempt to add unknown reactant " << reactant
451 <<
" to reaction number " << reactionNum
452 <<
"("<<name<<
")"<<std::endl;
453 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str());
457 speciesNum = -(n_i->second+1);
462 speciesNum = n_i->second;
485 std::map<std::string,int>::iterator n_i;
491 if (reactionNum == -1)
493 std::ostringstream ost;
494 ost <<
" Attempt to add product " << product
495 <<
" to non-existant reaction " << name << std::endl;
496 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str());
510 std::ostringstream ost;
511 ost <<
"attempt to add unknown product " << product
512 <<
" to reaction number " << reactionNum
513 <<
"("<<name<<
")"<<std::endl;
514 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str());
518 std::ostringstream ost;
520 #ifdef Xyce_RXN_WARNINGS
521 Report::UserWarning() <<
" Specified constant species " << product
522 <<
" as product of reaction number " << reactionNum
523 <<
"(" << name <<
")"<<std::endl
524 <<
" IGNORING that product";
530 speciesNum = n_i->second;
552 if (reactionNum == -1)
554 std::ostringstream ost;
555 ost <<
" Attempt to set rate constant of non-existant reaction "
556 << name << std::endl;
557 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str());
579 if (reactionNum == -1)
581 std::ostringstream ost;
582 ost <<
" Attempt to scale rate constant of non-existant reaction "
583 << name << std::endl;
584 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str());
607 if (reactionNum == -1)
609 std::ostringstream ost;
610 ost <<
" Attempt to scale rate constant of non-existant reaction "
611 << name << std::endl;
612 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str());
635 if (reactionNum == -1)
637 std::ostringstream ost;
638 ost <<
" Attempt to scale rate constant of non-existant reaction "
639 << name << std::endl;
640 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str());
663 if (reactionNum == -1)
665 std::ostringstream ost;
666 ost <<
" Attempt to scale rate constant of non-existant reaction "
667 << name << std::endl;
668 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, ost.str());
689 for (i=0; i<numReacts; ++i)
708 for (i=0; i<numReacts; ++i)
727 for (i=0; i<numReacts; ++i)
750 std::vector<N_DEV_Reaction>::iterator reactionIter=
theReactions.begin();
751 std::vector<N_DEV_Reaction>::iterator reactionIterEnd=
theReactions.end();
756 for (; reactionIter != reactionIterEnd; ++reactionIter)
758 reactionIter->setScaleFactors(
C0,
t0,
x0);
777 Util::Expression *foo=
new Util::Expression(expressionStr);
778 theSourceTerms.push_back( std::pair<int,Util::Expression *>(speciesNum, foo));
795 Util::Expression * ExpressionCopy=
new Util::Expression(*expression);
800 std::pair<int,Util::Expression *>(speciesNum,ExpressionCopy));
833 std::vector< std::pair<int,Util::Expression *> >::iterator iterSource=
835 std::vector< std::pair<int,Util::Expression *> >::iterator source_end=
838 for (;iterSource != source_end; ++iterSource)
840 (iterSource->second)->set_sim_time(time);
855 double breaktime=0, btime;
856 std::vector< std::pair<int,Util::Expression *> >::iterator iterSource=
858 std::vector< std::pair<int,Util::Expression *> >::iterator source_end=
861 for (;iterSource != source_end; ++iterSource)
863 btime=(iterSource->second)->get_break_time();
890 std::vector<double> &ddt)
894 for (i=0;i<rSize;++i)
900 std::vector< std::pair<int,Util::Expression *> >::iterator iterSource=
902 std::vector< std::pair<int,Util::Expression *> >::iterator source_end=
905 for (;iterSource != source_end; ++iterSource)
908 (iterSource->second)->evaluateFunction(return_val);
916 for (; iterMasterSource!= masterSource_end; ++iterMasterSource)
934 std::vector<std::vector<double> >&jac)
938 for (i=0;i<rSize;++i)
954 std::vector<double> &concs,
955 std::vector<double> &constant_vec,
956 std::vector<double> &dFdConst)
959 int cSize=concs.size();
963 dFdConst.resize(cSize);
964 for (i=0;i<cSize;++i)
967 for (i=0;i<rSize;++i)
969 theReactions[i].getDFdConst(constNum,concs,constant_vec,dFdConst);
994 std::vector<double> &constant_vec,
995 std::vector<int> &captureVect,
996 std::vector<int> &emissionVect)
1001 for (i=0;i<captureVect.size();++i)
1003 rate -=
theReactions[captureVect[i]].getRate(concs, constant_vec);
1006 for (i=0;i<emissionVect.size();++i)
1008 rate +=
theReactions[emissionVect[i]].getRate(concs,constant_vec);
1028 std::vector<double> &constant_vec,
1029 std::vector<int> &captureVect,
1030 double & concentration)
1035 for (i=0;i<captureVect.size();++i)
1037 rate +=
theReactions[captureVect[i]].getRate(concs, constant_vec);
1042 return concentration/rate;
1064 std::vector<double> &constant_vec,
1065 std::vector<int> &captureVect,
1066 double & concentration,
1067 std::vector<double> &lifetimes)
1070 lifetimes.resize(captureVect.size());
1072 for (i=0;i<captureVect.size();++i)
1074 lifetimes[i] =
theReactions[captureVect[i]].getRate(concs, constant_vec);
1076 if (lifetimes[i] > 0)
1077 lifetimes[i] = concentration/lifetimes[i];
1107 std::vector<double> &constant_vec,
1108 std::vector<int> &captureVect,
1109 std::vector<int> &emissionVect,
1110 std::vector<double> &dRatedC)
1113 int cSize=dRatedC.size();
1114 std::vector<double> tempdRdC(cSize);
1116 for (i=0;i<cSize;++i)
1121 for (i=0;i<captureVect.size();++i)
1123 tempdRdC.assign(cSize,0.0);
1124 theReactions[captureVect[i]].getDRateDC(concs, constant_vec, tempdRdC);
1126 for (j=0;j<cSize;++j)
1128 dRatedC[j] -= tempdRdC[j];
1129 #ifdef Xyce_DEBUG_DEVICE
1135 for (i=0;i<emissionVect.size();++i)
1137 tempdRdC.assign(cSize,0.0);
1138 theReactions[emissionVect[i]].getDRateDC(concs, constant_vec, tempdRdC);
1140 for (j=0;j<cSize;++j)
1142 dRatedC[j] += tempdRdC[j];
1143 #ifdef Xyce_DEBUG_DEVICE
1174 std::vector<double> &constant_vec,
1175 std::vector<int> &captureVect,
1176 std::vector<int> &emissionVect,
1177 std::vector<double> &dRatedConst)
1180 int cSize=dRatedConst.size();
1181 std::vector<double> tempdRdConst(cSize);
1183 for (i=0;i<cSize;++i)
1188 for (i=0;i<captureVect.size();++i)
1190 tempdRdConst.assign(cSize,0.0);
1192 for (j=0;j<cSize;++j)
1194 theReactions[captureVect[i]].getDRateDConst(j, concs, constant_vec, tempdRdConst[j]);
1195 dRatedConst[j] -= tempdRdConst[j];
1196 #ifdef Xyce_DEBUG_DEVICE
1201 #ifdef Xyce_DEBUG_DEVICE
1209 for (i=0;i<emissionVect.size();++i)
1211 tempdRdConst.assign(cSize,0.0);
1213 for (j=0;j<cSize;++j)
1215 theReactions[emissionVect[i]].getDRateDConst(j, concs, constant_vec, tempdRdConst[j]);
1216 dRatedConst[j] += tempdRdConst[j];
1217 #ifdef Xyce_DEBUG_DEVICE
1222 #ifdef Xyce_DEBUG_DEVICE