File: ExtrinsicModelElectrostatic.h

package info (click to toggle)
lammps 0~20181211.gitad1b1897d%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 318,860 kB
  • sloc: cpp: 729,569; python: 40,508; xml: 14,919; fortran: 12,142; ansic: 7,454; sh: 5,565; perl: 4,105; f90: 2,700; makefile: 2,117; objc: 238; lisp: 163; tcl: 61; csh: 16; awk: 14
file content (187 lines) | stat: -rw-r--r-- 5,419 bytes parent folder | download | duplicates (4)
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
#ifndef EXTRINSIC_MODEL_ELECTROSTATIC
#define EXTRINSIC_MODEL_ELECTROSTATIC

// WIP_REJ
#define CHARGED_SURFACE

#include "ExtrinsicModel.h"
#include <utility>
#include <string>
#include <vector>
#include <map>

namespace ATC {

  // forward declarations
  class ATC_Coupling;
  class PrescribedDataManager;
  class ExtrinsicModel;
  class PhysicsModel;
  class PoissonSolver;
  class FundamentalAtomQuantity;
  class AtfShapeFunctionRestriction;
  class ChargeRegulator;

  /**
   *  @class  ExtrinsicModelElectrostatic
   *  @brief  add self-consistent electrostatic forces
   *          owned field: ELECTRIC_POTENTIAL 
   */

  //--------------------------------------------------------
  //--------------------------------------------------------
  //  Class ExtrinsicModelElectrostatic
  //--------------------------------------------------------
  //--------------------------------------------------------

  class ExtrinsicModelElectrostatic : public ExtrinsicModel {
  
  public:

    // constructor
    ExtrinsicModelElectrostatic(ExtrinsicModelManager * modelManager,
                   ExtrinsicModelType modelType,
                   std::string matFileName);

    // destructor
    virtual ~ExtrinsicModelElectrostatic();

    /** parser/modifier */
    virtual bool modify(int narg, char **arg);

    /** construct transfers needed for model */
    virtual void construct_transfers();

    /** pre time integration */
    virtual void initialize();

    /** Predictor phase, executed before Verlet */
    virtual void post_init_integrate();

    /** changes lammps forces to include long-range electrostatic interactions */
    virtual void post_force();

    /** 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 double compute_scalar(void);
    virtual bool compute_vector(int n, double & value);

    PoissonSolver * poisson_solver(void) const { return poissonSolver_;} 

 
  protected:
    /** poisson solver type */
    SolverType poissonSolverType_;
    double poissonSolverTol_;
    int poissonSolverMaxIter_;

    /** poisson solver */
    PoissonSolver * poissonSolver_;

    /** max solves per minimize */
    int maxSolves_;

    /** offset/size for LAMMPS display output */
    int baseSize_;

    /** rhs mask for Poisson solver */
    Array2D<bool> rhsMask_;
  
    /** estimate instrinsic charge density */
    void add_electrostatic_forces(MATRIX & nodalPotential);

    /** correct short range FE electric field */
    void correct_electrostatic_forces();

#ifdef CHARGED_SURFACE
    /** account for charged surfaces on charged atoms */
    void apply_charged_surfaces(MATRIX & nodalPotential);

    /** set charged surface data */
    void add_charged_surface(const std::string & facesetName,
                             const double chargeDensity);
#endif
    /** charge regulator */
    ChargeRegulator * chargeRegulator_; 

    /** local electric potential Green's function for each node */
    std::vector<SparseVector<double> > greensFunctions_;

#ifdef CHARGED_SURFACE
    /** stores surface charge data at fixed charge surfaces */
    std::map<std::string,double> surfaceCharges_;

    /** data structure to store information for applying charged surfaces */
    std::map<std::string,std::map<int,std::pair<DENS_VEC,double> > > chargedSurfaces_;
#endif

    /** data structure storing potential induced only by charges under the nodal shape function support */
    std::map<std::string,std::map<int,double> > nodalChargePotential_;

    
    /** allows electric force only applied only in z direction to complement LAMMPS slab command */
    bool useSlab_;

    
    /** enables method when short range interactions are off */
    bool includeShortRange_;

    /** atomic forces */
    FundamentalAtomQuantity * atomForces_;

    /** coarse-grained charges from internal atoms */
    DENS_MAN * nodalAtomicCharge_;

    /** coarse-grained charges from ghost atoms */
    DENS_MAN * nodalAtomicGhostCharge_;

    /** workspace */
    DENS_MAT _atomElectricalForce_;
    double  totalElectricalForce_[3];
  };


  /**
   *  @class  ExtrinsicModelElectrostaticMomentum
   *  @brief  add self-consistent electrostatic forces with elastic coupling
   */

  //--------------------------------------------------------
  //--------------------------------------------------------
  //  Class ExtrinsicModelElectrostaticMomentum
  //--------------------------------------------------------
  //--------------------------------------------------------

  class ExtrinsicModelElectrostaticMomentum : public ExtrinsicModelElectrostatic {
  
  public:

    // constructor
    ExtrinsicModelElectrostaticMomentum(ExtrinsicModelManager * modelManager,
                                       ExtrinsicModelType modelType,
                                       std::string matFileName);

    // destructor
    virtual ~ExtrinsicModelElectrostaticMomentum();

    /** parser/modifier */
    virtual bool modify(int narg, char **arg);

    /** pre time integration */
    virtual void initialize();

    /** Set sources to AtC equation */
    virtual void set_sources(FIELDS & fields, FIELDS & sources);

    /** Add model-specific output data */
    virtual void output(OUTPUT_LIST & outputData);
 
  };

};
#endif