ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
efield.h
Go to the documentation of this file.
1#ifndef EFIELD_H
2#define EFIELD_H
3
8
9namespace elecstate
10{
11class Efield
12{
13 public:
14 Efield();
15 ~Efield();
16
17 static ModuleBase::matrix add_efield(const UnitCell& cell,
18 const ModulePW::PW_Basis* rho_basis,
19 const int& nspin,
20 const double* const* const rho,
21 const surchem& solvent);
22
23 static double cal_elec_dipole(const UnitCell& cell,
24 const ModulePW::PW_Basis* rho_basis,
25 const int& nspin,
26 const double* const* const rho,
27 const double& bmod);
28
29 static double cal_ion_dipole(const UnitCell& cell, const double& bmod);
30
31 static double cal_induced_dipole(const UnitCell& cell,
32 const ModulePW::PW_Basis* rho_basis,
33 const surchem& solvent,
34 const double& bmod);
35
36 static double saw_function(const double &a, const double &b, const double &x);
37
38 static void compute_force(const UnitCell &cell, ModuleBase::matrix &fdip);
39
40 static void prepare(const UnitCell &cell, double &latvec, double &area);
41
42 static void autoset(std::vector<double>& pos);
43
44 static double etotefield; // dipole energy
45 static double tot_dipole; // total dipole
46 static int efield_dir; // 0, 1, 2 denotes x, y, z direction for dipole correction
47 static double efield_pos_max; // the maximum position of the saw function
48 static double efield_pos_dec; // the decrease region length of the saw function
49 static double efield_amp; // field amplitude (in a.u.) (1 a.u. = 51.44 10^10 V/m)
50 static double bvec[3];
51 static double bmod;
52};
53
54} // namespace elecstate
55
56#include "pot_base.h"
57namespace elecstate
58{
59// new interface for elecstate::Potential
60class PotEfield : public PotBase
61{
62 public:
63 PotEfield(const ModulePW::PW_Basis* rho_basis_in, const UnitCell* ucell_in, const surchem* solvent_in, bool dipole)
64 : ucell_(ucell_in), solvent_(solvent_in)
65 {
66 this->rho_basis_ = rho_basis_in;
67 if (!dipole)
68 {
69 this->fixed_mode = true;
70 this->dynamic_mode = false;
71 }
72 else
73 {
74 this->fixed_mode = false;
75 this->dynamic_mode = true;
76 }
77 };
78
79 void cal_fixed_v(double *vl_pseudo) override
80 {
82 v_efield = Efield::add_efield(*ucell_,
83 const_cast<const ModulePW::PW_Basis*>(rho_basis_),
85 nullptr,
86 *solvent_);
87 for (int ir = 0; ir < rho_basis_->nrxx; ++ir)
88 {
89 vl_pseudo[ir] += v_efield(0, ir);
90 }
91 }
92
93 void cal_v_eff(const Charge *chg, const UnitCell *ucell, ModuleBase::matrix &v_eff) override
94 {
95 v_eff += Efield::add_efield(*ucell,
96 const_cast<const ModulePW::PW_Basis*>(rho_basis_),
97 v_eff.nr,
98 chg->rho,
99 *solvent_);
100 }
101
102 private:
103 const UnitCell* ucell_ = nullptr;
104 const surchem* solvent_ = nullptr;
105};
106
107} // namespace elecstate
108
109#endif
Definition charge.h:20
double ** rho
Definition charge.h:38
Definition matrix.h:19
int nr
Definition matrix.h:23
A class which can convert a function of "r" to the corresponding linear superposition of plane waves ...
Definition pw_basis.h:56
int nrxx
Definition pw_basis.h:120
const Input_para & inp
Definition parameter.h:26
Definition unitcell.h:16
Definition efield.h:12
static double cal_induced_dipole(const UnitCell &cell, const ModulePW::PW_Basis *rho_basis, const surchem &solvent, const double &bmod)
Definition efield.cpp:203
static void autoset(std::vector< double > &pos)
Definition efield.cpp:323
Efield()
Definition efield.cpp:22
static ModuleBase::matrix add_efield(const UnitCell &cell, const ModulePW::PW_Basis *rho_basis, const int &nspin, const double *const *const rho, const surchem &solvent)
Definition efield.cpp:33
static double bmod
Definition efield.h:51
static double efield_pos_max
Definition efield.h:47
static void compute_force(const UnitCell &cell, ModuleBase::matrix &fdip)
Definition efield.cpp:255
static double efield_pos_dec
Definition efield.h:48
static void prepare(const UnitCell &cell, double &latvec, double &area)
Definition efield.cpp:290
~Efield()
Definition efield.cpp:26
static double etotefield
Definition efield.h:44
static double cal_elec_dipole(const UnitCell &cell, const ModulePW::PW_Basis *rho_basis, const int &nspin, const double *const *const rho, const double &bmod)
Definition efield.cpp:170
static double cal_ion_dipole(const UnitCell &cell, const double &bmod)
Definition efield.cpp:142
static double bvec[3]
Definition efield.h:50
static double tot_dipole
Definition efield.h:45
static double efield_amp
Definition efield.h:49
static double saw_function(const double &a, const double &b, const double &x)
Definition efield.cpp:234
static int efield_dir
Definition efield.h:46
Definition pot_base.h:22
const ModulePW::PW_Basis * rho_basis_
Definition pot_base.h:35
bool dynamic_mode
Definition pot_base.h:32
bool fixed_mode
Definition pot_base.h:31
Definition efield.h:61
const UnitCell * ucell_
Definition efield.h:103
const surchem * solvent_
Definition efield.h:104
PotEfield(const ModulePW::PW_Basis *rho_basis_in, const UnitCell *ucell_in, const surchem *solvent_in, bool dipole)
Definition efield.h:63
void cal_fixed_v(double *vl_pseudo) override
Definition efield.h:79
void cal_v_eff(const Charge *chg, const UnitCell *ucell, ModuleBase::matrix &v_eff) override
Definition efield.h:93
Definition surchem.h:15
Definition cal_dm.h:10
Parameter PARAM
Definition parameter.cpp:3
int nspin
LDA ; LSDA ; non-linear spin.
Definition input_parameter.h:84