1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
|
#ifndef EXTRINSIC_MODEL_DRIFT_DIFFUSION
#define EXTRINSIC_MODEL_DRIFT_DIFFUSION
#include <set>
#include <string>
#include <vector>
#include "ExtrinsicModelTwoTemperature.h"
#include "SchrodingerSolver.h"
namespace ATC {
class ATC_Coupling;
class PrescribedDataManager;
class ExtrinsicModel;
class PhysicsModel;
class PoissonSolver;
class LinearSolver;
class SchrodingerSolver;
class SchrodingerPoissonSolver;
/**
* @class ExtrinsicModelDriftDiffusion
* @brief add electron temperature physics to phonon physics
* owned fields ELECTRON_DENSITY
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModelDriftDiffusion
//--------------------------------------------------------
//--------------------------------------------------------
class ExtrinsicModelDriftDiffusion : public ExtrinsicModelTwoTemperature {
public:
// constructor
ExtrinsicModelDriftDiffusion(ExtrinsicModelManager * modelManager,
ExtrinsicModelType modelType,
std::string matFileName);
// destructor
virtual ~ExtrinsicModelDriftDiffusion();
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** pre time integration */
virtual void initialize();
/** Predictor phase, executed before Verlet */
virtual void pre_init_integrate();
/** Set sources to AtC equation */
virtual void set_sources(FIELDS & fields, FIELDS & sources);
/** Add model-specific output data */
virtual void output(OUTPUT_LIST & outputData);
/** set up LAMMPS display variables */
virtual int size_vector(int externalSize);
/** get LAMMPS display variables */
virtual bool compute_vector(int n, double & value);
protected:
/** Poisson solve */
void poisson_solve();
/** Schrodinger-Poisson solve */
void schrodinger_poisson_solve(void); // wrapper
void schrodinger_poisson_solve(int iterations);
void slice_schrodinger_poisson_solve(int consistencyIter, int constraintIter);
double update_fermi_energy(double target,bool first = false);
/** time integrator for the continuity eqn */
FieldEulerIntegrator * continuityIntegrator_;
/** poisson solver type */
SolverType poissonSolverType_;
/** poisson solver */
PoissonSolver * poissonSolver_;
/** offset/size for LAMMPS display output */
int baseSize_;
/** ways to determine the electron density */
int electronDensityEqn_;
enum electronDensityEqnType { ELECTRON_CONTINUITY,
ELECTRON_EQUILIBRIUM,
ELECTRON_SCHRODINGER};
/** frequency for updating the electron state */
int fluxUpdateFreq_;
/** Schrodinger solver type */
SolverType schrodingerSolverType_;
/** poisson solver */
SchrodingerSolver * schrodingerSolver_;
/** schrodinger-poisson solver */
SchrodingerPoissonManager schrodingerPoissonMgr_;
SchrodingerPoissonSolver * schrodingerPoissonSolver_;
/** schrodinger-poisson data */
int maxConsistencyIter_, maxConstraintIter_;
double safe_dEf_, Ef_shift_;
DENS_MAT phiTotal_;
double Tmax_;
Array2D<double> EfHistory_;
/** one dimensional restriction */
bool oneD_;
int oneDcoor_;
int oneDstride_;
std::string oneDnodesetName_;
std::set<int> oneDnodeset_;
Array< std::set<int> > oneDslices_;
Array< double > oneDdxs_;
int oneDconserve_;
DENS_MAT JE_;
};
/**
* @class ExtrinsicModelDriftDiffusionConvection
* @brief add electron temperature physics to phonon physics, including convective transport
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModelDriftDiffusionConvection
//--------------------------------------------------------
//--------------------------------------------------------
class ExtrinsicModelDriftDiffusionConvection : public ExtrinsicModelDriftDiffusion {
public:
// constructor
ExtrinsicModelDriftDiffusionConvection(ExtrinsicModelManager * modelManager,
ExtrinsicModelType modelType,
std::string matFileName);
// destructor
virtual ~ExtrinsicModelDriftDiffusionConvection();
/** pre time integration */
virtual void initialize();
/** Predictor phase, executed before Verlet */
virtual void pre_init_integrate();
/** Set sources to AtC equation */
//virtual void set_sources(FIELDS & fields, FIELDS & sources);
/** Add model-specific output data */
virtual void output(OUTPUT_LIST & outputData);
/** set up LAMMPS display variables */
virtual int size_vector(int externalSize);
/** get LAMMPS display variables */
virtual bool compute_vector(int n, double & value);
protected:
/** compute the total kinetic energy of the electrons */
void compute_nodal_kinetic_energy(DENS_MAT & kineticEnergy);
/** Linear solver for velocity */
std::vector<LinearSolver * > velocitySolvers_;
/** Linear solver for solving the poisson equations */
LinearSolver * cddmPoissonSolver_;
/** offset/size for LAMMPS display output */
int baseSize_;
double timerStart_, timerCurrent_;
};
};
#endif
|