8 template <
typename TK,
typename TR,
typename Tfunc>
21 const double& factor_force,
22 const double& factor_stress,
33 int num_threads = omp_get_num_threads();
35 int local_total_irr = 0;
38 int& local_total_irr = total_irr;
42#pragma omp for schedule(dynamic)
44 for (
int iat = 0; iat < ucell.
nat; iat++)
46 const int T1 = ucell.
iat2it[iat];
48 const int I1 = ucell.
iat2ia[iat];
52 if (isforce) { f_iat = &f(iat, 0); }
55 double f_tmp[3] = { 0.0, 0.0, 0.0 };
56 if (num_threads > 1) { f_iat = f_tmp; }
59 const int start1 = ucell.
itiaiw2iwt(T1, I1, 0);
60 for (
int cb = 0; cb < ra->
na_each[iat]; ++cb)
62 const int T2 = ra->
info[iat][cb][3];
63 const int I2 = ra->
info[iat][cb][4];
64 const int start2 = ucell.
itiaiw2iwt(T2, I2, 0);
68 double Rx = ra->
info[iat][cb][0];
69 double Ry = ra->
info[iat][cb][1];
70 double Rz = ra->
info[iat][cb][2];
73 std::vector<hamilt::BaseMatrix<double>*> tmp_matrix;
74 for (
int is = 0; is < nspin_DMR; ++is)
84 for (
int is = 0; is < nspin_DMR; ++is) { dm2d1 += tmp_matrix[is]->get_value(mu, nu); }
85 double dm2d2 = 2.0 * dm2d1;
88 const double dm2d2_f = dm2d2 * factor_force;
89 for (
int i = 0; i < 3; ++i) { f_iat[i] += dm2d2_f * dHSx[i][irr]; }
93 const double dm2d1_s = dm2d1 * factor_stress;
94 stress_func(local_s, dm2d1_s, dHSx, dHSxy, dtau, irr);
102 if (isforce && num_threads > 1) {
for (
int i = 0; i < 3; ++i) { f(iat, i) += f_iat[i]; } }
106#pragma omp critical(cal_foverlap_k_reduce)
108 total_irr += local_total_irr;
111 for (
int i = 0; i < 3; ++i) {
for (
int j = i; j < 3; ++j) { s(i, j) += local_s(i, j); } }
117 if (total_irr != pv.
nnr)
static void tick(const std::string &class_name_in, const std::string &name_in)
Use twice at a time: the first time, set start_flag to false; the second time, calculate the time dur...
Definition timer.cpp:57
Definition parallel_orbitals.h:9
int get_col_size() const
dimension getters for 2D-block-cyclic division of Hamiltonian matrix get_col_size() : total number of...
Definition parallel_orbitals.h:76
int get_row_size() const
Definition parallel_orbitals.h:77
int * nlocstart
Definition parallel_orbitals.h:34
int nnr
Definition parallel_orbitals.h:32
const Input_para & inp
Definition parameter.h:26
Definition record_adj.h:11
int *** info
Definition record_adj.h:61
int * na_each
Definition record_adj.h:41
int *& iat2it
Definition unitcell.h:47
Tiait itiaiw2iwt(const Tiait &it, const Tiait &ia, const Tiait &iw) const
Definition unitcell.h:68
Atom * atoms
Definition unitcell.h:18
double & lat0
Definition unitcell.h:28
ModuleBase::IntArray & itia2iat
Definition unitcell.h:51
int & nat
Definition unitcell.h:46
double & omega
Definition unitcell.h:32
int *& iat2ia
Definition unitcell.h:48
Definition density_matrix.h:36
hamilt::HContainer< TR > * get_DMR_pointer(const int ispin) const
get pointer of DMR
Definition density_matrix_io.cpp:186
BaseMatrix< T > * find_matrix(int i, int j, int rx, int ry, int rz)
find BaseMatrix with atom index atom_i and atom_j and R index (rx, ry, rz) This interface can be used...
Definition hcontainer.cpp:261
std::ofstream ofs_running
Definition global_variable.cpp:38
void OUT(std::ofstream &ofs, const std::string &name)
Definition global_function.cpp:51
void WARNING_QUIT(const std::string &, const std::string &)
Combine the functions of WARNING and QUIT.
Definition test_delley.cpp:14
void TITLE(const std::string &class_name, const std::string &function_name, const bool disable)
Definition tool_title.cpp:18
Definition pulay_force_stress.h:22
void cal_pulay_fs(ModuleBase::matrix &f, ModuleBase::matrix &s, const elecstate::DensityMatrix< TK, TR > &dm, const UnitCell &ucell, const Parallel_Orbitals &pv, const double *(&dHSx)[3], const double *(&dHSxy)[6], const bool &isforce, const bool &isstress, Record_adj *ra=nullptr, const double &factor_force=1.0, const double &factor_stress=1.0)
for 2-center-integration terms, provided force and stress derivatives
Parameter PARAM
Definition parameter.cpp:3