@@ -158,20 +158,23 @@ std::vector<ModuleBase::matrix> LR::ESolver_LR<T, TR>::cal_force(const int ispin
158158 // LR_Util::print_DMR(dm_trans, "dm_trans of istate " + std::to_string(istate));
159159 // difference density matrix
160160 std::vector<ct::Tensor> dm_diff_k = cal_dm_diff_pblas (this ->X [ispin].template data <T>() + offset, this ->paraX_ [ispin], c, this ->paraC_ , this ->nbasis , this ->nocc [ispin], this ->nvirt [ispin], this ->paraMat_ );
161- // std::cout << "dm_diff_k T(k) before symmetrization, istate " + std::to_string(istate) << std::endl;
162- // LR_Util::print_value(dm_diff_k[0].data<T>(), this->paraMat_.get_col_size(), this->paraMat_.get_row_size());
163- for (auto & d : dm_diff_k) { LR_Util::matsym (d.data <T>(), this ->nbasis , this ->paraMat_ ); } // symmetrize
161+ std::cout << " dm_diff_k T(k) before symmetrization, istate " + std::to_string (istate) << std::endl;
162+ LR_Util::print_value (dm_diff_k[0 ].data <T>(), this ->paraMat_ .get_col_size (), this ->paraMat_ .get_row_size ());
163+ // for (auto& d : dm_diff_k) { LR_Util::matsym(d.data<T>(), this->nbasis, this->paraMat_); } // symmetrize
164164 // std::cout << "dm_diff_k T(k) after symmetrization, istate " + std::to_string(istate) << std::endl;
165165 // LR_Util::print_value(dm_diff_k[0].data<T>(), this->paraMat_.get_col_size(), this->paraMat_.get_row_size());
166166
167167 const std::vector<ct::Tensor>& dm_relaxed_k = cal_dm_trans_pblas (Z.template data <T>() + offset, this ->paraX_ [ispin], c, this ->paraC_ , this ->nbasis , this ->nocc [ispin], this ->nvirt [ispin], this ->paraMat_ );
168- // std::cout << "dm_relaxed_k Z(k) before symmetrization, istate " + std::to_string(istate) << std::endl;
169- // LR_Util::print_value(dm_relaxed_k[0].data<T>(), this->paraMat_.get_col_size(), this->paraMat_.get_row_size());
168+ std::cout << " dm_relaxed_k Z(k) before symmetrization, istate " + std::to_string (istate) << std::endl;
169+ LR_Util::print_value (dm_relaxed_k[0 ].data <T>(), this ->paraMat_ .get_col_size (), this ->paraMat_ .get_row_size ());
170170 for (auto & d : dm_relaxed_k) { LR_Util::matsym (d.data <T>(), this ->nbasis , this ->paraMat_ ); } // symmetrize
171- // std::cout << "dm_relaxed_k Z(k) after symmetrization, istate " + std::to_string(istate) << std::endl;
172- // LR_Util::print_value(dm_relaxed_k[0].data<T>(), this->paraMat_.get_col_size(), this->paraMat_.get_row_size());
171+ std::cout << " dm_relaxed_k Z(k) after symmetrization, istate " + std::to_string (istate) << std::endl;
172+ LR_Util::print_value (dm_relaxed_k[0 ].data <T>(), this ->paraMat_ .get_col_size (), this ->paraMat_ .get_row_size ());
173173 // relaxed difference density matrix
174174 const std::vector<ct::Tensor>& relaxed_diff_dm_k = dm_diff_k + dm_relaxed_k;
175+ const elecstate::DensityMatrix<T, T>& diff_dm =
176+ LR_Util::build_dm_from_dmk<T, T>(dm_diff_k,
177+ this ->paraMat_ , this ->nk , this ->kv .kvec_d , this ->ucell , this ->gd , this ->orb_cutoff_ );
175178 const elecstate::DensityMatrix<T, T>& relaxed_diff_dm =
176179 LR_Util::build_dm_from_dmk<T, T>(relaxed_diff_dm_k,
177180 this ->paraMat_ , this ->nk , this ->kv .kvec_d , this ->ucell , this ->gd , this ->orb_cutoff_ );
@@ -241,6 +244,20 @@ std::vector<ModuleBase::matrix> LR::ESolver_LR<T, TR>::cal_force(const int ispin
241244 if (PARAM .inp .test_force )
242245 ModuleIO::print_force (GlobalV::ofs_running, this ->ucell , " OVERLAP-EDM FORCE (eV/Angstrom)" , force_overlap_edm, false );
243246
247+ if (PARAM .inp .test_force )
248+ {
249+ // test H[T] force (Z=0), non-EXX part
250+ elecstate::DensityMatrix<T, double > diff_dm_real (&this ->paraMat_ , 1 , this ->kv .kvec_d , this ->nk );
251+ LR_Util::initialize_DMR (diff_dm_real, this ->paraMat_ , this ->ucell , this ->gd , this ->orb_cutoff_ );
252+ LR_Util::get_DMR_real_imag_part (diff_dm, diff_dm_real, ' R' );
253+
254+ GlobalV::ofs_running << " ========== [TEST H_GS-(T) force (Z=0), non-EXX part] ===========" << std::endl;
255+ ModuleBase::matrix force_hamiltgs_diff = lr_force.cal_force_hamilt_gs_dm_relaxed_diff (diff_dm_real, dm_gs, /* with_ewald=*/ false );
256+ ModuleIO::print_force (GlobalV::ofs_running, this ->ucell , " H_GS-T FORCE (without EXX) (eV/Angstrom)" , force_hamiltgs_diff, false );
257+ GlobalV::ofs_running << " ========== [\\ TEST H_GS-(T) force (Z=0), non-EXX part] ===========" << std::endl;
258+ }
259+
260+
244261#ifdef __EXX
245262 const double & alpha = this ->exx_info .info_global .hybrid_alpha ;
246263
@@ -253,15 +270,26 @@ std::vector<ModuleBase::matrix> LR::ESolver_LR<T, TR>::cal_force(const int ispin
253270 force_hxc_dmtrans += force_exx_dmtrans;
254271
255272 }
273+
256274 if (LR::exx_kernel_list ().count (PARAM .inp .dft_functional ))
257275 {
258276 const auto & Ds_gs = LR_Util::get_exx_Ds_spin1 (dm_gs, this ->ucell , this ->kv , this ->paraMat_ ); // returns 0.5*D[0]
259277 const auto & Ds_relaxed_diff = LR_Util::get_exx_Ds_spin1 (relaxed_diff_dm, this ->ucell , this ->kv , this ->paraMat_ ); // returns 0.5*D[0]
260278 // LR_Util::print_CV(Ds_relaxed_diff, "Ds_relaxed_diff for EXX force");
261- ModuleBase::matrix force_exx_gs_diff = lr_force.cal_force_exx_gs_dm_relaxed_diff (Ds_gs, Ds_relaxed_diff, alpha * 4.0 ); // cancel the two 0.5s in Ds
279+ ModuleBase::matrix force_exx_gs_relaxed_diff = lr_force.cal_force_exx_gs_dm_relaxed_diff (Ds_gs, Ds_relaxed_diff, alpha * 4.0 ); // cancel the two 0.5s in Ds
280+ if (PARAM .inp .test_force )
281+ ModuleIO::print_force (GlobalV::ofs_running, this ->ucell , " EXX GS-(T+Z) FORCE (eV/Angstrom)" , force_exx_gs_relaxed_diff, false );
282+ force_hamiltgs_relaxed_diff += force_exx_gs_relaxed_diff;
283+
262284 if (PARAM .inp .test_force )
263- ModuleIO::print_force (GlobalV::ofs_running, this ->ucell , " EXX GS-(T+Z) FORCE (eV/Angstrom)" , force_exx_gs_diff, false );
264- force_hamiltgs_relaxed_diff += force_exx_gs_diff;
285+ {
286+ // test H[T] force (Z=0), EXX part
287+ const auto & Ds_diff = LR_Util::get_exx_Ds_spin1 (diff_dm, this ->ucell , this ->kv , this ->paraMat_ ); // returns 0.5*D[0]
288+ GlobalV::ofs_running << " ========== [TEST H_GS-(T) force (Z=0), EXX part] ===========" << std::endl;
289+ ModuleBase::matrix force_exx_gs_diff = lr_force.cal_force_exx_gs_dm_relaxed_diff (Ds_gs, Ds_diff, alpha * 4.0 ); // cancel the two 0.5s in Ds
290+ ModuleIO::print_force (GlobalV::ofs_running, this ->ucell , " H_GS-T EXX FORCE (Z=0) (eV/Angstrom)" , force_exx_gs_diff, false );
291+ GlobalV::ofs_running << " ========== [\\ TEST H_GS-(T) force (Z=0), EXX part] ===========" << std::endl;
292+ }
265293 }
266294#endif
267295 forces[istate] = force_hxc_dmtrans + force_hamiltgs_relaxed_diff + force_overlap_edm;
@@ -319,7 +347,7 @@ void LR::ESolver_LR<T, TR>::test_force()
319347 if (this ->nbasis == 2 && ucell.nat == 2 )
320348 {
321349 // lr_force.cal_H2_sz_center2_deriv(orb_cutoff_, kv); // for gradient
322- // lr_force.cal_H2_sz_center4(orb_cutoff_, kv, /*is_grad=*/false); // for Coulomb energy
350+ // lr_force.cal_H2_sz_center4(orb_cutoff_, kv, /*is_grad=*/false); // for 4-center integrals
323351 // lr_force.cal_H2_sz_center4(orb_cutoff_, kv, /*is_grad=*/true); // for gradient
324352 // exit(0);
325353 }
0 commit comments