52 #include <Xyce_config.h>
56 #include <N_UTL_Math.h>
60 #include <N_UTL_fwd.h>
61 #include <N_UTL_FeatureTest.h>
63 #include <N_ERH_ErrorMgr.h>
84 carrierEmissionIndex(-1),
86 FADVectorsAllocated(false),
105 std::vector< std::pair<int,double> > & products,
108 theReactants(reactants),
109 theProducts(products),
110 theRateConstant(rateConstant),
114 carrierEmissionIndex(-1),
118 FADVectorsAllocated(false),
119 myReactionName(
"UNDEFINED"),
122 peq(
charge/(13.1*8.854214871e-14)),
123 unshieldedLength(0.0),
124 latticeConstant(0.0),
148 :theReactants(right.theReactants),
149 theProducts(right.theProducts),
150 concDependency(right.concDependency),
151 constDependency(right.constDependency),
152 theRateConstant(right.theRateConstant),
153 numconcs(right.numconcs),
154 numconsts(right.numconsts),
155 carrierEmissionIndex(right.carrierEmissionIndex),
157 energy(right.energy),
158 material(right.material),
159 FADVectorsAllocated(false),
160 myReactionName(right.myReactionName),
161 tolerance(right.tolerance),
164 unshieldedLength(right.unshieldedLength),
165 latticeConstant(right.latticeConstant),
166 constCoeff(right.constCoeff),
167 Specie1(right.Specie1),
168 Specie2(right.Specie2),
169 chargeProduct(right.chargeProduct),
170 carrierCharge(right.carrierCharge),
171 carrierBCIndex(right.carrierBCIndex)
199 if (
this == &right)
return *
this;
203 Xyce::dout() <<
"We're doing an assignment of reaction! " << std::endl;
272 std::vector<std::pair<int,double> >::iterator iter;
273 std::vector<std::pair<int,double> >::iterator iter_end=
theReactants.end();
274 bool foundSpecies=
false;
279 for (iter=
theReactants.begin(); iter != iter_end; iter++)
281 if (iter->first == species)
283 iter->second += stoich;
291 theReactants.push_back(std::pair<int,double>(species,stoich));
305 std::vector<std::pair<int,double> >::iterator iter;
306 std::vector<std::pair<int,double> >::iterator iter_end=
theProducts.end();
307 bool foundSpecies=
false;
312 for (iter=
theProducts.begin(); iter != iter_end; iter++)
314 if (iter->first == species)
316 iter->second += stoich;
324 theProducts.push_back(std::pair<int,double>(species,stoich));
359 std::vector<double> &constants)
376 reactionRate=
getRateVC(concentrations,constants);
390 for (i=0;i<rSize;++i)
397 c=concentrations[species];
401 c=constants[-(species+1)];
406 reactionRate *= pow(c,stoich);
428 std::vector<double> &constants,
429 std::vector<double> &dratedc)
431 int cSize=concentrations.size();
448 for (i=0;i<cSize;++i)
459 for (i=0;i<rSize;++i)
465 c=concentrations[species];
469 c=constants[-(species+1)];
477 for (j=0;j<cSize;++j)
483 dratedc[j] *= stoich*pow(c,stoich-1.0);
487 dratedc[j] *= pow(c,stoich);
494 for (j=0;j<cSize;++j)
524 std::vector<double> &concentrations,
525 std::vector<double> &constants,
528 int cSize=constants.size();
550 for (i=0;i<rSize;++i)
556 c=concentrations[species];
560 c=constants[-(species+1)];
568 if (species < 0 && constNum ==-(species+1))
571 dratedc *= stoich*pow(c,stoich-1.0);
575 dratedc *= pow(c,stoich);
581 if (constNum !=-(species+1))
605 std::vector<double> &constants,
606 std::vector<double> &ddt)
619 reactionRate=
getRateVC(concentrations,constants);
628 for (i=0;i<rSize;++i)
634 ddt[species] -= stoich*reactionRate;
638 for (i=0;i<pSize;++i)
644 ddt[species] += stoich*reactionRate;
675 std::vector<double> &constants,
676 std::vector<std::vector<double> > &jac)
678 int cSize=concentrations.size();
679 int constSize=constants.size();
684 std::vector<double> dratedc(cSize,0.0);
686 int FADSize=cSize+constSize;
707 for( i=0 ; i<2 ; ++i)
712 for( i=0 ; i<cSize ; ++i)
714 defects[i] = concentrations[i];
719 for(
int j=0 ; j<cSize ; ++j)
721 dratedc[j] = tempdRdCFD.dx(j+2);
732 for( i=0 ; i<2 ; ++i)
737 for( i=0 ; i<cSize ; ++i)
739 defects[i] = concentrations[i];
744 for(
int j=0 ; j<cSize ; ++j)
746 dratedc[j] = tempdRdCFD.dx(j+2);
789 for (i=0;i<rSize;++i)
795 for (j=0;j<cSize;++j)
799 jac[species][j] -= stoich*dratedc[j];
805 for (i=0;i<pSize;++i)
811 for (j=0;j<cSize;++j)
815 jac[species][j] += stoich*dratedc[j];
834 std::vector<double> &constants,
835 std::vector<std::vector<double> > &jac,
836 std::vector<double> &constVec)
838 int constSize=constants.size();
839 int cSize=concentrations.size();
844 std::vector<double> dratedc(cSize,0.0);
846 std::vector<double> dratedConst(constSize,0.0);
847 int FADSize=cSize+constSize;
874 for( i=0 ; i<constSize ; ++i)
879 for( i=0 ; i<cSize ; ++i)
881 defects[i] = concentrations[i];
882 defects[i].diff(i+constSize,FADSize);
886 for(
int j=0 ; j<cSize ; ++j)
888 dratedc[j] = tempdRdCFD.dx(j+constSize);
890 for(
int j=0 ; j<constSize ; ++j)
891 dratedConst[j] = tempdRdCFD.dx(j);
902 for( i=0 ; i<constSize ; ++i)
907 for( i=0 ; i<cSize ; ++i)
909 defects[i] = concentrations[i];
910 defects[i].diff(i+constSize,FADSize);
914 for(
int j=0 ; j<cSize ; ++j)
916 dratedc[j] = tempdRdCFD.dx(j+constSize);
918 for(
int j=0 ; j<constSize ; ++j)
919 dratedConst[j] = tempdRdCFD.dx(j);
928 for (i=0;i<rSize;++i)
934 for (j=0;j<cSize;++j)
936 jac[species][j] -= stoich*dratedc[j];
941 for (i=0;i<pSize;++i)
947 for (j=0;j<cSize;++j)
949 jac[species][j] += stoich*dratedc[j];
957 for(
int constIdx=0 ; constIdx<constSize ; ++constIdx)
959 int offset = constIdx*cSize;
961 for (i=0;i<rSize;++i)
966 constVec[species+offset] -= stoich*dratedConst[constIdx];
969 for (i=0;i<pSize;++i)
974 constVec[species+offset] += stoich*dratedConst[constIdx];
1010 std::vector<double> &concentrations,
1011 std::vector<double> &constants,
1012 std::vector<double> &dFdConst)
1014 int constSize=constants.size();
1015 int cSize=concentrations.size();
1022 int FADSize=cSize+constSize;
1041 int cSize = concentrations.size();
1048 for( i=0 ; i<2 ; ++i)
1053 for( i=0 ; i<concentrations.size() ; ++i)
1055 defects[i] = concentrations[i];
1060 dratedc = tempdRdCFD.dx(constantNumber);
1065 int cSize = concentrations.size();
1072 for( i=0 ; i<2 ; ++i)
1077 for( i=0 ; i<cSize ; ++i)
1079 defects[i] = concentrations[i];
1083 dratedc = tempdRdCFD.dx(constantNumber);
1127 for (i=0;i<rSize;++i)
1133 dFdConst[species] -= stoich*dratedc;
1137 for (i=0;i<pSize;++i)
1143 dFdConst[species] += stoich*dratedc;
1182 double C0,
double t0,
double x0)
1200 Report::UserError() <<
"Illegal carrier charge";
1217 double N,
double Energy,
1218 double C0,
double t0,
double x0)
1236 Report::UserError() <<
"Illegal carrier charge";
1255 double v,
double C0i,
double t0,
double x0)
1271 Report::UserError() <<
"Illegal carrier charge";
1295 std::vector<Specie> &C,
1296 double C0,
double t0,
double x0)
1347 std::vector<Specie> &C,
1348 double C0,
double t0,
double x0,
1397 std::vector<Specie> &C,
1398 double bindingEnergy,
1399 double gammaAB,
double gammaA,
1400 double gammaB,
double concSi,
1401 double C0,
double t0,
double x0)
1413 bindingEnergy, gammaAB,gammaA,
1453 std::vector<Specie> &C,
double sigma,
1454 double C0,
double t0,
double x0)
1484 Report::UserError() <<
"The bulk material " <<
material->
material <<
" is unknown";
1506 std::vector<double> &concs,
1507 std::vector<double> &constant_vec)
1513 Report::UserError() <<
"The bulk material " <<
material->
material <<
" is unknown";
1576 for (i=0;i<rSize;++i)
1604 for (i=0;i<rSize;++i)
1622 (
const std::vector<Specie> & species, std::ostream & os )
const
1625 int isize = theReactants.size();
1627 bool firstPrintDone=
false;
1628 for (i=0;i<isize;++i)
1630 int speciesIndex = theReactants[i].first;
1631 if (speciesIndex >= 0)
1633 if (firstPrintDone) os <<
" + ";
1634 double tmp = theReactants[i].second;
1636 os <<
" "<<tmp<<
" * ";
1637 os.setf(std::ios::right); os.width(3);
1638 os << species[speciesIndex].getName();
1640 firstPrintDone =
true;
1645 isize = theProducts.size();
1646 firstPrintDone=
false;
1647 for (i=0;i<isize;++i)
1649 int speciesIndex = theProducts[i].first;
1650 if (speciesIndex >= 0)
1652 if (firstPrintDone) os <<
" + ";
1653 double tmp = theProducts[i].second;
1655 os <<
" " << tmp <<
" * ";
1656 os.setf(std::ios::right); os.width(3);
1658 os << species[speciesIndex].getName();
1659 firstPrintDone =
true;
1663 os <<
" Rate Constant: ";
1664 os.precision(8); os.setf(std::ios::scientific);
1665 os << theRateConstant;
1668 os <<
"\n Dependencies:\n";
1669 for (
int j=0;j<concDependency.size();++j)
1671 os <<
" " << species[j].getName() <<
" = " << concDependency[j] << std::endl;
1816 Report::UserError() <<
"Unrecognized reaction name in setting rate coefficient creation " <<
myReactionName;
Rate constant calculator for Electron or Hole emission reaction.
void setSimpleRateCalculator(double k, double C0, double t0, double x0)
ScalarT getDiffusionCoefficient(ScalarT Temperature)
void setComplexMultiplierRateCalculator(std::vector< Specie > &VariableSpecies, std::vector< Specie > &ConstantSpecies, double C0, double t0, double x0, double multiplier)
std::string myReactionName
Sacado::ELRFad::DFad< double > FDFadType
Pure virtual class to augment a linear system.
Rate constant calculator for Electron or Hole emission reaction.
void unscaleRateConstantFromCalculator()
virtual double rateConstantScaleFactor()=0
return current scale factor for rate constant
double getRate(std::vector< double > &concentrations, std::vector< double > &constants)
std::vector< int > concDependency
std::vector< FDFadType > carriers
void setMaterial(MaterialLayer *material, double Temp)
RetScalarT charge(RetScalarT U, Arg2ScalarT C0, Arg3ScalarT Ud, Arg4ScalarT m, Arg5ScalarT Area)
void getDdt(std::vector< double > &concentrations, std::vector< double > &constants, std::vector< double > &ddt)
void setEmissionRateCalculator(double sigma, double v, double N, double Energy, double C0, double t0, double x0)
virtual double computeRateConstant(double T)=0
return rate constant at given temperature
void getDRateDConst(int constNum, std::vector< double > &concentrations, std::vector< double > &constants, double &dratedc)
void addReactant(int species, double stoich)
void output(const std::vector< Specie > &species, std::ostream &os) const
ScalarT getFDEmissionRate(std::vector< ScalarT > &concentrations, std::vector< ScalarT > &constants)
std::vector< int > constDependency
std::vector< FDFadType > defects
void addProduct(int species, double stoich)
void setRateConstantFromCalculator(double T)
Rate constant calculator for a irreversible two-species complexing reaction.
double diffusionCoefficient1
RateCalculator * myRateCalc
void getJac(std::vector< double > &concentrations, std::vector< double > &constants, std::vector< std::vector< double > > &jac)
void setDecomplexRateCalculator(std::vector< Specie > &VariableSpecies, std::vector< Specie > &ConstantSpecies, double bindingEnergy, double gammaAB, double gammaA, double gammaB, double concSi, double C0, double t0, double x0)
Reaction & operator=(const Reaction &right)
virtual bool isBulkMaterialSet()=0
void setCoefficient(double Temp)
bool getEnhancedDiffusion()
void getDRateDC(std::vector< double > &concentrations, std::vector< double > &constants, std::vector< double > &dratedc)
std::vector< std::pair< int, double > > theReactants
std::vector< std::pair< int, double > > theProducts
void scaleRateConstantFromCalculator()
void setCaptureRateCalculator(double sigma, double v, double C0, double t0, double x0)
virtual RateCalculator * Clone()=0
create a copy of this calculator
double diffusionCoefficient2
void setRateConstant(double)
void setConstDependency(int cSize)
void setDependency(int cSize)
ScalarT getRateVC(std::vector< ScalarT > &concentrations, std::vector< ScalarT > &constants)
Class for trivial, constant rate constant (independent of temperature)
virtual void setBulkMaterial(std::string material)=0
Abstract interface class for "rate calculator" strategy pattern.
void setFDEmissionRateCalculator(int carrierIndex, double sigma, double Energy, double v, double C0, double t0, double x0)
void setReactants(std::vector< std::pair< int, double > > &products)
void setBourgoinCorbettHoleRateCalculator(std::vector< Specie > &VariableSpecies, std::vector< Specie > &ConstantSpecies, double sigma, double C0, double t0, double x0)
void setProducts(std::vector< std::pair< int, double > > &products)
double defectReactionRadius
void getDFdConst(int constantNumber, std::vector< double > &concentrations, std::vector< double > &constants, std::vector< double > &dFdConst)
Rate constant calculator for Electron or Hole capture reaction.
void getJacobianVC(std::vector< double > &concentrations, std::vector< double > &constants, std::vector< std::vector< double > > &jac, std::vector< double > &constVec)
materialEnum_t materialEnum
void setComplexRateCalculator(std::vector< Specie > &VariableSpecies, std::vector< Specie > &ConstantSpecies, double C0, double t0, double x0)