Skip to content

Commit 87db32b

Browse files
committed
test: separate T and DZ
1 parent 95d79bc commit 87db32b

File tree

3 files changed

+47
-23
lines changed

3 files changed

+47
-23
lines changed

source/module_lr/Grad/esolver_lr_grad.cpp

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -193,14 +193,35 @@ std::vector<ModuleBase::matrix> LR::ESolver_LR<T, TR>::cal_force(const int ispin
193193
this->paraMat_, this->nk, this->kv.kvec_d, this->ucell, this->gd, this->orb_cutoff_);
194194
LR_Util::print_DMR(dm_trans, this->ucell.nat, "dm_trans of istate " + std::to_string(istate));
195195

196-
elecstate::DensityMatrix<T, T> relaxed_diff_dm = // T+D(Z), (R) can be complex
197-
LR_Util::build_dm_from_dmk<T, T>(
198-
// LR_Util::operator+(
199-
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_)
200-
+ 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_)
201-
,// ),
202-
this->paraMat_, this->nk, this->kv.kvec_d, this->ucell, this->gd, this->orb_cutoff_);
203-
LR_Util::print_DMR(relaxed_diff_dm, this->ucell.nat, "relaxed_diff_dm of istate " + std::to_string(istate));
196+
// difference density matrix
197+
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_);
198+
// std::cout << "dm_diff_k T(k) before symmetrization, istate " + std::to_string(istate) << std::endl;
199+
// LR_Util::print_value(dm_diff_k[0].data<T>(), this->paraMat_.get_col_size(), this->paraMat_.get_row_size());
200+
for (auto& d : dm_diff_k) { LR_Util::matsym(d.data<T>(), this->nbasis, this->paraMat_); } // symmetrize
201+
// std::cout << "dm_diff_k T(k) after symmetrization, istate " + std::to_string(istate) << std::endl;
202+
// LR_Util::print_value(dm_diff_k[0].data<T>(), this->paraMat_.get_col_size(), this->paraMat_.get_row_size());
203+
204+
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_);
205+
// std::cout << "dm_relaxed_k Z(k) before symmetrization, istate " + std::to_string(istate) << std::endl;
206+
// LR_Util::print_value(dm_relaxed_k[0].data<T>(), this->paraMat_.get_col_size(), this->paraMat_.get_row_size());
207+
for (auto& d : dm_relaxed_k) { LR_Util::matsym(d.data<T>(), this->nbasis, this->paraMat_); } // symmetrize
208+
// std::cout << "dm_relaxed_k Z(k) after symmetrization, istate " + std::to_string(istate) << std::endl;
209+
// LR_Util::print_value(dm_relaxed_k[0].data<T>(), this->paraMat_.get_col_size(), this->paraMat_.get_row_size());
210+
// relaxed difference density matrix
211+
std::vector<ct::Tensor> relaxed_diff_dm_k = dm_diff_k + dm_relaxed_k;
212+
elecstate::DensityMatrix<T, T> relaxed_diff_dm =
213+
LR_Util::build_dm_from_dmk<T, T>(relaxed_diff_dm_k,
214+
this->paraMat_, this->nk, this->kv.kvec_d, this->ucell, this->gd, this->orb_cutoff_, /*symmetrize=*/false);
215+
// LR_Util::print_DMR(relaxed_diff_dm, this->ucell.nat, "relaxed_diff_dm T+Z (Z symmetrized) of istate " + std::to_string(istate));
216+
217+
// elecstate::DensityMatrix<T, T> relaxed_diff_dm = // T+D(Z), (R) can be complex
218+
// LR_Util::build_dm_from_dmk<T, T>(
219+
// // LR_Util::operator+(
220+
// cal_dm_diff_pb las(this->X[ispin].template data<T>() + offset, this->paraX_[ispin], c, this->paraC_, this->nbasis, this->nocc[ispin], this->nvirt[ispin], this->paraMat_)
221+
// + 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_)
222+
// ,// ),
223+
// this->paraMat_, this->nk, this->kv.kvec_d, this->ucell, this->gd, this->orb_cutoff_);
224+
// LR_Util::print_DMR(relaxed_diff_dm, this->ucell.nat, "relaxed_diff_dm of istate " + std::to_string(istate));
204225
elecstate::DensityMatrix<T, double> relaxed_diff_dm_real(&this->paraMat_, 1, this->kv.kvec_d, this->nk);
205226
LR_Util::initialize_DMR(relaxed_diff_dm_real, this->paraMat_, this->ucell, this->gd, this->orb_cutoff_);
206227
LR_Util::get_DMR_real_imag_part(relaxed_diff_dm, relaxed_diff_dm_real, this->ucell.nat, 'R');
@@ -325,11 +346,11 @@ void LR::ESolver_LR<T, TR>::test_force()
325346
ModuleIO::print_force(GlobalV::ofs_running, this->ucell, "2* GS Hxc force calculated by 'LR_Force' from kernel (eV/Angstrom)", f_hxc_potlr * 2, false);
326347
// 2 for spin in f->v. Spin in v->f is already multiplied in the singlet Hartree factor 2.
327348
/// ======================================= END test 2 =========================================
328-
if (this->nbasis == 2 && ucell.nat == 2)
329-
{
330-
///========================== test 3: H2 SZ 4-center gradients =========================
331-
lr_force.cal_H2_sz_center4_grad_hxc(orb_cutoff_);
332-
}
349+
///========================== test 3: H2 SZ 4-center gradients =========================
350+
// if (this->nbasis == 2 && ucell.nat == 2)
351+
// {
352+
// lr_force.cal_H2_sz_center4_grad_hxc(orb_cutoff_);
353+
// }
333354
// exit(0);
334355
}
335356

source/module_lr/Grad/multipliers/cal_multiplier_w_from_z.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,20 +114,20 @@ namespace LR
114114
DM_trans, gint, pot_grad, ucell, orb_cutoff, gd, kv, p_occ_occ, pc, pmat,
115115
{ 0 }, T(-2.0), ATYPE::CC_oo);
116116

117+
std::vector<ct::Tensor> dm_trans_2d, dm_diff_2d;
117118
auto cal_dm_trans = [&](const int is, const T* const x_ptr)->void //DX
118119
{
119120
const auto psi_ks_is = LR_Util::get_psi_spin(psi_ks, is, nk);
120121
#ifdef __MPI
121-
std::vector<ct::Tensor> dm_trans_2d = cal_dm_trans_pblas(x_ptr, px[is], psi_ks_is, pc, naos, nocc[is], nvirt[is], pmat);
122+
dm_trans_2d = cal_dm_trans_pblas(x_ptr, px[is], psi_ks_is, pc, naos, nocc[is], nvirt[is], pmat);
122123
for (auto& t : dm_trans_2d) LR_Util::matsym(t.data<T>(), naos, pmat);
123124
#else
124-
std::vector<ct::Tensor> dm_trans_2d = cal_dm_trans_blas(x_ptr, psi_ks_is, nocc[is], nvirt[is]);
125+
dm_trans_2d = cal_dm_trans_blas(x_ptr, psi_ks_is, nocc[is], nvirt[is]);
125126
for (auto& t : dm_trans_2d) LR_Util::matsym(t.data<T>(), naos);
126127
#endif
127128
for (int ik = 0;ik < nk;++ik) { DM_trans.set_DMK_pointer(ik, dm_trans_2d[ik].data<T>()); }
128129
};
129-
130-
auto cal_dm_diff_relaxed = [&](const int& is, const T* const x_ptr, const T* const z_ptr)->void // T+DZ
130+
auto cal_dm_diff_relaxed = [&](const int& is, const T* const x_ptr, const T* const z_ptr)->void // T+DZ // 段错误可能在这
131131
{
132132
const auto psi_ks_is = LR_Util::get_psi_spin(psi_ks, is, nk);
133133
#ifdef __MPI
@@ -139,9 +139,9 @@ namespace LR
139139
#endif
140140

141141
#ifdef __MPI
142-
std::vector<ct::Tensor> dm_diff_2d = cal_dm_diff_pblas(x_ptr, px[is], psi_ks_is, pc, naos, nocc[is], nvirt[is], pmat);
142+
dm_diff_2d = cal_dm_diff_pblas(x_ptr, px[is], psi_ks_is, pc, naos, nocc[is], nvirt[is], pmat);
143143
#else
144-
std::vector<ct::Tensor> dm_diff_2d = cal_dm_diff_blas(x_ptr, psi_ks_is, naos, nocc[is], nvirt[is]);
144+
dm_diff_2d = cal_dm_diff_blas(x_ptr, psi_ks_is, naos, nocc[is], nvirt[is]);
145145
#endif
146146
for (int ik = 0;ik < nk;++ik)
147147
{

source/module_lr/utils/lr_util_hcontainer.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,16 +181,19 @@ namespace LR_Util
181181
const UnitCell& ucell,
182182
const Grid_Driver& gd,
183183
const std::vector<double>& orb_cutoff,
184+
const bool symmetrize = true,
184185
const bool cal_dmr = true)
185186
{
186187
elecstate::DensityMatrix<TK, TR> dm(&pmat, 1, kvec_d, nk);
187188
initialize_DMR(dm, pmat, ucell, gd, orb_cutoff);
189+
190+
if (symmetrize)
191+
for (int ik = 0; ik < nk; ++ik)
192+
LR_Util::matsym(dmk[ik].data<TK>(), pmat.get_global_row_size(), pmat);
193+
188194
for (int ik = 0; ik < nk; ++ik)
189-
{
190-
// symmetrize
191-
LR_Util::matsym(dmk[ik].data<TK>(), pmat.get_global_row_size(), pmat);
192195
dm.set_DMK_pointer(ik, dmk[ik].data<TK>());
193-
}
196+
194197
if (cal_dmr) { dm.cal_DMR(); }
195198
return dm;
196199
}

0 commit comments

Comments
 (0)