File: ExtrinsicModelDriftDiffusion.h

package info (click to toggle)
lammps 20220106.git7586adbb6a%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 348,064 kB
  • sloc: cpp: 831,421; python: 24,896; xml: 14,949; f90: 10,845; ansic: 7,967; sh: 4,226; perl: 4,064; fortran: 2,424; makefile: 1,501; objc: 238; lisp: 163; csh: 16; awk: 14; tcl: 6
file content (191 lines) | stat: -rw-r--r-- 5,420 bytes parent folder | download | duplicates (2)
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