52 #ifndef N_DEV_REACTION_H
53 #define N_DEV_REACTION_H
73 Reaction(std::vector< std::pair<int,double> > & ,
74 std::vector< std::pair<int,double> > &,
81 std::vector<double> &concs,
82 std::vector<double> &constant_vec);
86 void setReactants(std::vector< std::pair<int,double> > &products );
88 void setProducts(std::vector< std::pair<int,double> > &products );
90 double getRate(std::vector<double> &concentrations,
91 std::vector<double> &constants);
92 void getDdt(std::vector<double> &concentrations,
93 std::vector<double> &constants,
94 std::vector<double> &ddt);
95 void getDRateDC(std::vector<double> &concentrations,
96 std::vector<double> &constants,
97 std::vector<double> &dratedc);
99 std::vector<double> &concentrations,
100 std::vector<double> &constants,
102 void getJac(std::vector<double> &concentrations,
103 std::vector<double> &constants,
104 std::vector<std::vector<double> > &jac);
106 std::vector<double> &concentrations,
107 std::vector<double> &constants,
108 std::vector<double> &dFdConst);
111 std::vector<double> &constants,
112 std::vector<std::vector<double> > &jac,
113 std::vector<double> &constVec);
115 void output (
const std::vector<Specie> & species,
116 std::ostream & os )
const;
122 double Energy,
double C0,
double t0,
125 double v,
double C0,
double t0,
double x0);
127 std::vector<Specie> &ConstantSpecies,
128 double C0,
double t0,
double x0);
130 std::vector<Specie> &ConstantSpecies,
131 double C0,
double t0,
double x0,
134 std::vector<Specie> &ConstantSpecies,
135 double bindingEnergy,
136 double gammaAB,
double gammaA,
double gammaB,
138 double C0,
double t0,
double x0);
141 std::vector<Specie> &ConstantSpecies,
142 double sigma,
double C0,
double t0,
double x0);
152 template <
class ScalarT>
154 std::vector<ScalarT> &constants);
156 template <
class ScalarT>
157 ScalarT
getRateVC(std::vector<ScalarT> &concentrations,
158 std::vector<ScalarT> &constants);
200 template <
class ScalarT>
202 std::vector<ScalarT> &constants);
204 template <
class ScalarT>
206 std::vector<ScalarT> &constants);
284 template <
class ScalarT>
286 std::vector<ScalarT> &constants)
307 for (i=0;i<rSize;++i)
314 c=concentrations[species];
318 c=constants[-(species+1)];
323 rRate *= pow(c,stoich);
342 ScalarT exponential = exp(-
energy/KbT);
343 rRate *= DOS*exponential;
353 ScalarT exponential = exp(-(iFI +
energy)/KbT);
383 template <
class ScalarT>
385 std::vector<ScalarT> &constants)
389 ScalarT reactionRate;
404 for (i=0;i<rSize;++i)
411 c=concentrations[species];
415 c=constants[-(species+1)];
420 reactionRate *= pow(c,stoich);
440 template <
class ScalarT>
442 std::vector<ScalarT> &constants)
460 Report::UserError() <<
"Unrecognized reaction coefficient type in rection coefficient evaluator";
466 template <
class ScalarT>
468 std::vector<ScalarT> &constants)
482 ScalarT concsDensity=0.0;
483 for(
int i=0 ; i<concentrations.size() ; ++i)
484 concsDensity += concentrations[i];
486 ScalarT rdefTilde = pow(
tolerance+
C0*concsDensity,1.0/3.0);
488 ScalarT rdef = 0.5/rdefTilde;
495 Report::UserError() <<
"Unrecognized material in complex reaction coefficient evaluator";
507 ScalarT concsDensity=0.0;
513 for(
int i=0 ; i<concentrations.size() ; ++i)
514 concsDensity += concentrations[i];
516 ScalarT rdefTilde = pow(
tolerance+
C0*concsDensity,1.0/3.0);
518 ScalarT rdef = 0.5/rdefTilde;
522 ScalarT TeV = ADTEMP/11604.0;
524 ScalarT deby0 = sqrt(TeV/
peq);
526 ScalarT carrierConcentration =
tolerance +
C0*constants[0];
528 if(
tolerance +
C0*constants[0] < 0.0) carrierConcentration = 1.e-16;
530 ScalarT carrier1Debye=deby0/sqrt(carrierConcentration);
532 carrierConcentration =
tolerance +
C0*constants[1];
534 if(carrierConcentration < 0.0)carrierConcentration = 1.0;
536 ScalarT carrier2Debye=deby0/sqrt(carrierConcentration);
538 ScalarT debye= 1.0/(1.0/carrier1Debye+1.0/carrier2Debye);
544 ScalarT reactionRadiusTilde = 0.65*log(1.0 + arg/0.65)*debye;
548 if(constants[0] < 0.0 || constants[1] < 0)
549 reactionRadiusTilde = 1.0e12;
551 localCoeff = 1.0/(1.0/rdef + 1.0/reactionRadiusTilde);
556 Report::UserError() <<
"Unrecognized material in complex reaction coefficient evaluator";
566 return localCoeff*diffusion;
void setSimpleRateCalculator(double k, double C0, double t0, double x0)
void setComplexMultiplierRateCalculator(std::vector< Specie > &VariableSpecies, std::vector< Specie > &ConstantSpecies, double C0, double t0, double x0, double multiplier)
virtual void setScaleFactors(double C0, double t0, double x0)=0
set concentration, time, and space scale factors (space scale factor is currently unused by any calcu...
std::string myReactionName
Sacado::ELRFad::DFad< double > FDFadType
Pure virtual class to augment a linear system.
void unscaleRateConstantFromCalculator()
double getRate(std::vector< double > &concentrations, std::vector< double > &constants)
std::vector< int > concDependency
std::vector< FDFadType > carriers
inverse_fermi_one_half_N fdinvObj
void setMaterial(MaterialLayer *material, double Temp)
void scaleRateConstant(double)
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)
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)
void setScaleFactors(double C0i, double t0, double x0)
double diffusionCoefficient1
ScalarT complexCoefficient(std::vector< ScalarT > &concentrations, std::vector< ScalarT > &constants)
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)
void setRxnVariableCoeffs(bool variableCoeff)
void setCoefficient(double Temp)
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)
bool variableRateCoefficient
double diffusionCoefficient2
void setRateConstant(double)
void setConstDependency(int cSize)
void setDependency(int cSize)
ScalarT getRateVC(std::vector< ScalarT > &concentrations, std::vector< ScalarT > &constants)
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)
int getCarrierEmissionIndex()
void setTemperature(double T)
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)
ScalarT rxnCoefficient(std::vector< ScalarT > &concentrations, std::vector< ScalarT > &constants)
void getDFdConst(int constantNumber, std::vector< double > &concentrations, std::vector< double > &constants, std::vector< double > &dFdConst)
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)