File: Material.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 (248 lines) | stat: -rw-r--r-- 9,435 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
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
#ifndef MATERIAL_H
#define MATERIAL_H

#include <map>
#include <set>
#include <string>
#include "MatrixLibrary.h"
#include "ATC_TypeDefs.h"
#include "ATC_Error.h"
#include "LammpsInterface.h"

namespace ATC
{
  class BodyForce;
  class Stress;
  class ViscousStress;
  class ElectronChargeDensity;
  class ElectronHeatCapacity;
  class ElectronHeatFlux;
  class ElectronFlux;
  class ElectronPhononExchange;
  class ElectronDragPower;

/**
 *  @class Material
 *  @brief Base class for computing and storing properties and fields for a material
 */

  class Material
  {
  public:
    Material();
    virtual ~Material();
    /** this constructor parses material file */
    Material(std::string & tag, std::fstream & fileId);

    /** initialize */
    virtual void initialize();

    /** return label */
    std::string label(void) const {return tag_;}

    /** check material has required interfaces */
    bool check_registry(const std::set<std::string> functionList) const
    {
      std::set<std::string>::const_iterator itr;
      for (itr=functionList.begin(); itr!=functionList.end(); itr++) {
        if (registry_.find(*itr) == registry_.end()) {
          std::stringstream ss;
          ss << "WARNING: material: [" << tag_ << "] cannot find " << *itr ;
          ATC::LammpsInterface::instance()->print_msg_once(ss.str());
        }
        if (registry_.find(*itr) == registry_.end()) return false;
      }
      return true;
    }

    /** access to material parameters */
    bool parameter(const std::string name, double & value) const
    {
      std::map<std::string,double>::const_iterator iter = parameters_.find(name);
      if ( iter == parameters_.end()) {
        value = 0.0;
        return false;
      }
      value = iter->second;
      return true;
    }
    /** true if rhs flux is linear (per field) */
    bool linear_flux(FieldName name) const {
     return linearFlux_(name);
    };

    /** true if rhs source is linear (per field) */
    bool linear_source(FieldName name) const {
     return linearSource_(name);
    };

    /** true if lhs density is constant (per field) */
    bool constant_density(FieldName name) const {
      return constantDensity_(name);
    };

    /** each of these is a field function computed at a set of points */
    /** if there is only one function it is in the base class
     ** otherwise, a subsidiary class is setup */
    /* -----------------------------------------------------------------*/
    /** densities */
    /* -----------------------------------------------------------------*/
    /** thermal energy */
    void thermal_energy(const FIELD_MATS & fields,
                        DENS_MAT & energy) const;
    /** heat capacity */
    void heat_capacity(const FIELD_MATS & fields,
                       DENS_MAT & capacity) const;
    /** thermal energy */
    void electron_thermal_energy(const FIELD_MATS & fields,
                                 DENS_MAT & energy) const;
    /** electron capacities */
    void electron_mass_density(const FIELD_MATS &fields,
                               DENS_MAT &density) const;
    void electron_heat_capacity(const FIELD_MATS &fields,
                                DENS_MAT &capacity) const;
    /** derivative of electron heat capacity */
    void D_electron_heat_capacity(const FIELD_MATS &fields,
                                  const GRAD_FIELD_MATS &gradFields,
                                  DENS_MAT_VEC &Dcapacity) const;
    /** kinetic energy */
    void kinetic_energy(const FIELD_MATS & fields,
                        DENS_MAT & energy) const;
    /** mass density */
    void mass_density(const FIELD_MATS &fields,
                      DENS_MAT &density) const;
    /** elastic energy */
    void elastic_energy(const FIELD_MATS & fields,
                        const GRAD_FIELD_MATS & gradFields,
                        DENS_MAT & energy) const;
    /** permitivity */
    void permittivity(const FIELD_MATS & fields,
                      DENS_MAT & energy) const;
    /** inverse effective mass */
    void inv_effective_mass(const FIELD_MATS & fields,
                            DENS_MAT & energy) const;
    /** band-edge potential */
    void band_edge_potential(const FIELD_MATS & fields,
                             DENS_MAT & energy) const;
    /** viscosity */
    void viscosity(const FIELD_MATS & fields,
                   DENS_MAT & energy) const;
    /* -----------------------------------------------------------------*/
    /** fluxes */
    /* -----------------------------------------------------------------*/
    /** heat_flux */
    void heat_flux(const FIELD_MATS & fields,
                   const GRAD_FIELD_MATS & gradFields,
                   DENS_MAT_VEC  & heatFlux) const;
    /** electron conduction flux */
    void electron_heat_flux(const FIELD_MATS &fields,
                            const GRAD_FIELD_MATS &gradFields,
                            DENS_MAT_VEC &flux) const;
    /** electron heat convection */
    void electron_heat_convection(const FIELD_MATS &fields,
                                  DENS_MAT_VEC &flux) const;
    /** electron momentum convection */
    void electron_momentum_convection(const FIELD_MATS &fields,
                                      DENS_MAT_VEC &flux) const;
    /** stress */
    void stress(const FIELD_MATS &fields,
                const GRAD_FIELD_MATS &gradFields,
                DENS_MAT_VEC &stress) const;

    /** viscous stress */
    void viscous_stress(const FIELD_MATS &fields,
                        const GRAD_FIELD_MATS &gradFields,
                        DENS_MAT_VEC &viscousStress) const;

    /** computes electron flux */
    void electron_flux(const FIELD_MATS &fields,
                       const GRAD_FIELD_MATS &gradFields,
                       DENS_MAT_VEC &flux) const;
    void electron_thermal_stress(const FIELD_MATS &fields,
                                 const GRAD_FIELD_MATS &gradFields,
                                 DENS_MAT_VEC &stress) const;
    /** computes electric displacement */
    void electric_displacement(const FIELD_MATS &fields,
                               const GRAD_FIELD_MATS &gradFields,
                               DENS_MAT_VEC &flux) const;
    /** computes electric field */
    void electric_field(const FIELD_MATS &fields,
                        const GRAD_FIELD_MATS &gradFields,
                        DENS_MAT_VEC &flux) const;
    /* -----------------------------------------------------------------*/
    /** sources */
    /* -----------------------------------------------------------------*/
    /** electron-phonon exchange flux */
    bool electron_phonon_exchange(const FIELD_MATS &fields,
                                  DENS_MAT &flux) const;
    bool electron_drag_power(const FIELD_MATS &fields,
                             const GRAD_FIELD_MATS &gradFields,
                             DENS_MAT &power) const;
    void electron_drag_velocity_coefficient(const FIELD_MATS &fields,
                                            DENS_MAT &dragCoef) const;
    /** computes net generation */
    virtual bool electron_recombination(const FIELD_MATS &fields,
                                        const GRAD_FIELD_MATS &gradFields,
                                        DENS_MAT &recombination) const;
    /** computes drift diffusion charge density */
    virtual bool electron_charge_density(const FIELD_MATS &fields,
                                         DENS_MAT &density) const;
    virtual void D_electron_charge_density(const FieldName fieldName,
                                           const FIELD_MATS &fields,
                                           DENS_MAT &D_density) const;
    /** computes momentum source */
    virtual bool body_force(const FIELD_MATS &fields,
                                  DENS_MAT &density) const;


  protected:
    /** material's label  */
    std::string tag_;
    /** dictionary of material parameters */
    std::map<std::string,double> parameters_;
    /** dictionary of instantiated functions */
    std::set<std::string> registry_;
    /** per eqn flag of constant density */
    Array<bool> constantDensity_;
    /** per eqn flag of linearity/nonlinearity */
    Array<bool> linearFlux_, linearSource_;
    /** default heat capacity */
    double rhoCp_;
    /** heat capacity */
    double heatCapacity_;
    /** electron heat capacity */
    ElectronHeatCapacity * electronHeatCapacity_;
    /** mass density */
    double massDensity_;
    /** thermal conductivity */
    double heatConductivity_;
    /** electron heat flux */
    ElectronHeatFlux * electronHeatFlux_;
    /** stress */
    Stress * stress_;
    /** viscous stress */
    ViscousStress * viscousStress_;
    /** body force */
    BodyForce * bodyForce_;
    /** electron-phonon exchange */
    ElectronPhononExchange * electronPhononExchange_;
    /** electron drag power */
    ElectronDragPower * electronDragPower_;
    /** electron flux */
    ElectronFlux * electronFlux_;
    /** electric permittivity */
    double permittivity_;
    /** inverse effective mass */
    double invEffectiveMass_;
    /** equilibrium carrier density */
    double electronEquilibriumDensity_;
    /** relaxation time */
    double electronRecombinationInvTau_;
    /** electron charge density model */
    ElectronChargeDensity * electronChargeDensity_;
  };

}
#endif // Material.h