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
|