From 6c89dd67d052156c27a03f1f95b994b23e71b6cf Mon Sep 17 00:00:00 2001 From: Zanthoxylum <105619360+Zanthoxylum@users.noreply.github.com> Date: Mon, 2 Nov 2026 00:02:40 +0800 Subject: [PATCH 1/3] refactor(dfpt): split the DFPT_PW_Data response-field slots to dfpt_pw_data_resp.cpp The bound-safe getters/setters of the per-direction / per-q response fields (u_active, docc, v_sc, the displacement / E-field response stashes and the drho / dv slot family) move verbatim from dfpt_pw_data.cpp (791 -> 402 lines) to the new dfpt_pw_data_resp.cpp (413 lines); the driver state (lifecycle, q delegation, validate_q_ ordering, the dpsi / convergence ledger, dynmat / phonon tensors, drhoc) stays behind. Class declaration and call sites unchanged; build surfaces updated (Makefile.Objects, module_dfpt CMakeLists). MODULE_DFPT 10/10; si_G anchor rerun verified bit-identical frequencies and dyn file against the E5 baseline. --- source/Makefile.Objects | 1 + source/source_pw/module_dfpt/CMakeLists.txt | 1 + source/source_pw/module_dfpt/dfpt_pw_data.cpp | 389 ----------------- .../module_dfpt/dfpt_pw_data_resp.cpp | 412 ++++++++++++++++++ 4 files changed, 414 insertions(+), 389 deletions(-) create mode 100644 source/source_pw/module_dfpt/dfpt_pw_data_resp.cpp diff --git a/source/Makefile.Objects b/source/Makefile.Objects index 243b1ee57f4..3580cf19f6d 100644 --- a/source/Makefile.Objects +++ b/source/Makefile.Objects @@ -451,6 +451,7 @@ OBJS_DFPT=dfpt_hamilt_shift.o\ dfpt_phon_ewald.o\ dfpt_pw.o\ dfpt_pw_data.o\ + dfpt_pw_data_resp.o\ dfpt_pw_init.o\ dfpt_pw_q0.o\ dfpt_pw_run.o\ diff --git a/source/source_pw/module_dfpt/CMakeLists.txt b/source/source_pw/module_dfpt/CMakeLists.txt index a561e61e7d1..f43a0755b99 100644 --- a/source/source_pw/module_dfpt/CMakeLists.txt +++ b/source/source_pw/module_dfpt/CMakeLists.txt @@ -7,6 +7,7 @@ set(SOURCES dfpt_pw_solve.cpp dfpt_pw_q0.cpp dfpt_pw_data.cpp + dfpt_pw_data_resp.cpp dfpt_kq_basis.cpp dfpt_pert.cpp dfpt_pert_vkb.cpp diff --git a/source/source_pw/module_dfpt/dfpt_pw_data.cpp b/source/source_pw/module_dfpt/dfpt_pw_data.cpp index 149717b05d3..eb6f93a2ae8 100644 --- a/source/source_pw/module_dfpt/dfpt_pw_data.cpp +++ b/source/source_pw/module_dfpt/dfpt_pw_data.cpp @@ -52,220 +52,6 @@ void DFPT_PW_Data::clean() ModuleBase::timer::end("DFPT_PW_Data", "clean"); } -bool DFPT_PW_Data::u_active() const -{ - ModuleBase::TITLE("DFPT_PW_Data", "u_active"); - ModuleBase::timer::start("DFPT_PW_Data", "u_active"); - // a usable provider has its occupation matrices initialized (the ground - // state does this when DFT+U actually runs); a wired provider without - // them (e.g. a default-constructed reservation) stays inactive. - ModuleBase::timer::end("DFPT_PW_Data", "u_active"); - return with_u() && dftu_->is_occmat_ready(); -} - -void DFPT_PW_Data::set_docc(int q_idx, const std::vector>& occ) -{ - ModuleBase::TITLE("DFPT_PW_Data", "set_docc"); - ModuleBase::timer::start("DFPT_PW_Data", "set_docc"); - if (q_idx < 0) - { - ModuleBase::timer::end("DFPT_PW_Data", "set_docc"); - return; - } - if (q_idx >= static_cast(docc_.size())) - { - docc_.resize(q_idx + 1); - } - docc_[q_idx] = occ; - ModuleBase::timer::end("DFPT_PW_Data", "set_docc"); -} - -void DFPT_PW_Data::set_vsc_r(int atom_idx, int dir, const std::vector>& v) -{ - ModuleBase::TITLE("DFPT_PW_Data", "set_vsc_r"); - ModuleBase::timer::start("DFPT_PW_Data", "set_vsc_r"); - if (atom_idx < 0 || dir < 0 || dir >= 3) - { - ModuleBase::timer::end("DFPT_PW_Data", "set_vsc_r"); - return; - } - const size_t slot = static_cast(3 * atom_idx + dir); - if (slot >= vsc_r_.size()) - { - vsc_r_.resize(slot + 1); - } - vsc_r_[slot] = v; - ModuleBase::timer::end("DFPT_PW_Data", "set_vsc_r"); -} - -std::vector> DFPT_PW_Data::get_vsc_r(int atom_idx, int dir) const -{ - ModuleBase::TITLE("DFPT_PW_Data", "get_vsc_r"); - ModuleBase::timer::start("DFPT_PW_Data", "get_vsc_r"); - if (atom_idx < 0 || dir < 0 || dir >= 3) - { - ModuleBase::timer::end("DFPT_PW_Data", "get_vsc_r"); - return std::vector>(); - } - const size_t slot = static_cast(3 * atom_idx + dir); - if (slot < vsc_r_.size()) - { - ModuleBase::timer::end("DFPT_PW_Data", "get_vsc_r"); - return vsc_r_[slot]; - } - ModuleBase::timer::end("DFPT_PW_Data", "get_vsc_r"); - return std::vector>(); -} - -void DFPT_PW_Data::set_drho_disp(int atom_idx, int dir, const std::vector>& rho) -{ - ModuleBase::TITLE("DFPT_PW_Data", "set_drho_disp"); - ModuleBase::timer::start("DFPT_PW_Data", "set_drho_disp"); - if (atom_idx < 0 || dir < 0 || dir >= 3) - { - ModuleBase::timer::end("DFPT_PW_Data", "set_drho_disp"); - return; - } - const size_t slot = static_cast(3 * atom_idx + dir); - if (slot >= drho_disp_.size()) - { - drho_disp_.resize(slot + 1); - } - drho_disp_[slot] = rho; - ModuleBase::timer::end("DFPT_PW_Data", "set_drho_disp"); -} - -std::vector> DFPT_PW_Data::get_drho_disp(int atom_idx, int dir) const -{ - ModuleBase::TITLE("DFPT_PW_Data", "get_drho_disp"); - ModuleBase::timer::start("DFPT_PW_Data", "get_drho_disp"); - if (atom_idx < 0 || dir < 0 || dir >= 3) - { - ModuleBase::timer::end("DFPT_PW_Data", "get_drho_disp"); - return std::vector>(); - } - const size_t slot = static_cast(3 * atom_idx + dir); - if (slot < drho_disp_.size()) - { - ModuleBase::timer::end("DFPT_PW_Data", "get_drho_disp"); - return drho_disp_[slot]; - } - ModuleBase::timer::end("DFPT_PW_Data", "get_drho_disp"); - return std::vector>(); -} - -void DFPT_PW_Data::set_dpsi_disp(int atom_idx, - int dir, - const std::vector>>>& d) -{ - ModuleBase::TITLE("DFPT_PW_Data", "set_dpsi_disp"); - ModuleBase::timer::start("DFPT_PW_Data", "set_dpsi_disp"); - if (atom_idx < 0 || dir < 0 || dir >= 3) - { - ModuleBase::timer::end("DFPT_PW_Data", "set_dpsi_disp"); - return; - } - const size_t slot = static_cast(3 * atom_idx + dir); - if (slot >= dpsi_disp_.size()) - { - dpsi_disp_.resize(slot + 1); - } - dpsi_disp_[slot] = d; - ModuleBase::timer::end("DFPT_PW_Data", "set_dpsi_disp"); -} - -std::vector>>> DFPT_PW_Data::get_dpsi_disp(int atom_idx, int dir) const -{ - ModuleBase::TITLE("DFPT_PW_Data", "get_dpsi_disp"); - ModuleBase::timer::start("DFPT_PW_Data", "get_dpsi_disp"); - if (atom_idx < 0 || dir < 0 || dir >= 3) - { - ModuleBase::timer::end("DFPT_PW_Data", "get_dpsi_disp"); - return std::vector>>>(); - } - const size_t slot = static_cast(3 * atom_idx + dir); - if (slot < dpsi_disp_.size()) - { - ModuleBase::timer::end("DFPT_PW_Data", "get_dpsi_disp"); - return dpsi_disp_[slot]; - } - ModuleBase::timer::end("DFPT_PW_Data", "get_dpsi_disp"); - return std::vector>>>(); -} - -void DFPT_PW_Data::set_pos_resp(int dir, const std::vector>>>& y) -{ - ModuleBase::TITLE("DFPT_PW_Data", "set_pos_resp"); - ModuleBase::timer::start("DFPT_PW_Data", "set_pos_resp"); - if (dir < 0 || dir >= 3) - { - ModuleBase::timer::end("DFPT_PW_Data", "set_pos_resp"); - return; - } - if (pos_resp_.size() < 3) - { - pos_resp_.resize(3); - } - pos_resp_[dir] = y; - ModuleBase::timer::end("DFPT_PW_Data", "set_pos_resp"); -} - -std::vector>>> DFPT_PW_Data::get_pos_resp(int dir) const -{ - ModuleBase::TITLE("DFPT_PW_Data", "get_pos_resp"); - ModuleBase::timer::start("DFPT_PW_Data", "get_pos_resp"); - if (dir < 0 || dir >= 3 || dir >= static_cast(pos_resp_.size())) - { - ModuleBase::timer::end("DFPT_PW_Data", "get_pos_resp"); - return std::vector>>>(); - } - ModuleBase::timer::end("DFPT_PW_Data", "get_pos_resp"); - return pos_resp_[dir]; -} - -void DFPT_PW_Data::set_dpsi_efield(int dir, const std::vector>>>& d) -{ - ModuleBase::TITLE("DFPT_PW_Data", "set_dpsi_efield"); - ModuleBase::timer::start("DFPT_PW_Data", "set_dpsi_efield"); - if (dir < 0 || dir >= 3) - { - ModuleBase::timer::end("DFPT_PW_Data", "set_dpsi_efield"); - return; - } - if (dpsi_efield_.size() < 3) - { - dpsi_efield_.resize(3); - } - dpsi_efield_[dir] = d; - ModuleBase::timer::end("DFPT_PW_Data", "set_dpsi_efield"); -} - -std::vector>>> DFPT_PW_Data::get_dpsi_efield(int dir) const -{ - ModuleBase::TITLE("DFPT_PW_Data", "get_dpsi_efield"); - ModuleBase::timer::start("DFPT_PW_Data", "get_dpsi_efield"); - if (dir < 0 || dir >= 3 || dir >= static_cast(dpsi_efield_.size())) - { - ModuleBase::timer::end("DFPT_PW_Data", "get_dpsi_efield"); - return std::vector>>>(); - } - ModuleBase::timer::end("DFPT_PW_Data", "get_dpsi_efield"); - return dpsi_efield_[dir]; -} - -std::vector> DFPT_PW_Data::get_docc(int q_idx) const -{ - ModuleBase::TITLE("DFPT_PW_Data", "get_docc"); - ModuleBase::timer::start("DFPT_PW_Data", "get_docc"); - if (q_idx >= 0 && q_idx < static_cast(docc_.size())) - { - ModuleBase::timer::end("DFPT_PW_Data", "get_docc"); - return docc_[q_idx]; - } - ModuleBase::timer::end("DFPT_PW_Data", "get_docc"); - return std::vector>(); -} - int DFPT_PW_Data::get_nq() const { return qlist_->get_nq(); @@ -417,181 +203,6 @@ int DFPT_PW_Data::get_current_iter(int q_idx, int irrep) const return it != current_iter_.end() ? it->second : 0; } -void DFPT_PW_Data::set_drho_r(int q_idx, int spin, const std::vector& rho) -{ - ModuleBase::TITLE("DFPT_PW_Data", "set_drho_r"); - ModuleBase::timer::start("DFPT_PW_Data", "set_drho_r"); - if (q_idx < 0 || spin < 0) - { - ModuleBase::timer::end("DFPT_PW_Data", "set_drho_r"); - return; - } - if (q_idx >= static_cast(drho_r_.size())) - { - drho_r_.resize(q_idx + 1); - } - if (spin >= static_cast(drho_r_[q_idx].size())) - { - drho_r_[q_idx].resize(spin + 1); - } - drho_r_[q_idx][spin] = rho; - ModuleBase::timer::end("DFPT_PW_Data", "set_drho_r"); -} - -std::vector DFPT_PW_Data::get_drho_r(int q_idx, int spin) const -{ - ModuleBase::TITLE("DFPT_PW_Data", "get_drho_r"); - ModuleBase::timer::start("DFPT_PW_Data", "get_drho_r"); - if (q_idx >= 0 && spin >= 0 && q_idx < static_cast(drho_r_.size()) - && spin < static_cast(drho_r_[q_idx].size())) - { - ModuleBase::timer::end("DFPT_PW_Data", "get_drho_r"); - return drho_r_[q_idx][spin]; - } - ModuleBase::timer::end("DFPT_PW_Data", "get_drho_r"); - return std::vector(); -} - -void DFPT_PW_Data::set_drho_g(int q_idx, int spin, const std::vector>& rho) -{ - ModuleBase::TITLE("DFPT_PW_Data", "set_drho_g"); - ModuleBase::timer::start("DFPT_PW_Data", "set_drho_g"); - if (q_idx < 0 || spin < 0) - { - ModuleBase::timer::end("DFPT_PW_Data", "set_drho_g"); - return; - } - if (q_idx >= static_cast(drho_g_.size())) - { - drho_g_.resize(q_idx + 1); - } - if (spin >= static_cast(drho_g_[q_idx].size())) - { - drho_g_[q_idx].resize(spin + 1); - } - drho_g_[q_idx][spin] = rho; - ModuleBase::timer::end("DFPT_PW_Data", "set_drho_g"); -} - -std::vector> DFPT_PW_Data::get_drho_g(int q_idx, int spin) const -{ - ModuleBase::TITLE("DFPT_PW_Data", "get_drho_g"); - ModuleBase::timer::start("DFPT_PW_Data", "get_drho_g"); - if (q_idx >= 0 && spin >= 0 && q_idx < static_cast(drho_g_.size()) - && spin < static_cast(drho_g_[q_idx].size())) - { - ModuleBase::timer::end("DFPT_PW_Data", "get_drho_g"); - return drho_g_[q_idx][spin]; - } - ModuleBase::timer::end("DFPT_PW_Data", "get_drho_g"); - return std::vector>(); -} - -void DFPT_PW_Data::set_dv_r(int q_idx, int spin, const std::vector& v) -{ - ModuleBase::TITLE("DFPT_PW_Data", "set_dv_r"); - ModuleBase::timer::start("DFPT_PW_Data", "set_dv_r"); - if (q_idx < 0 || spin < 0) - { - ModuleBase::timer::end("DFPT_PW_Data", "set_dv_r"); - return; - } - if (q_idx >= static_cast(dv_r_.size())) - { - dv_r_.resize(q_idx + 1); - } - if (spin >= static_cast(dv_r_[q_idx].size())) - { - dv_r_[q_idx].resize(spin + 1); - } - dv_r_[q_idx][spin] = v; - ModuleBase::timer::end("DFPT_PW_Data", "set_dv_r"); -} - -std::vector DFPT_PW_Data::get_dv_r(int q_idx, int spin) const -{ - ModuleBase::TITLE("DFPT_PW_Data", "get_dv_r"); - ModuleBase::timer::start("DFPT_PW_Data", "get_dv_r"); - if (q_idx >= 0 && spin >= 0 && q_idx < static_cast(dv_r_.size()) - && spin < static_cast(dv_r_[q_idx].size())) - { - ModuleBase::timer::end("DFPT_PW_Data", "get_dv_r"); - return dv_r_[q_idx][spin]; - } - ModuleBase::timer::end("DFPT_PW_Data", "get_dv_r"); - return std::vector(); -} - -void DFPT_PW_Data::set_dv_recip_c(int q_idx, int spin, const std::vector>& v) -{ - ModuleBase::TITLE("DFPT_PW_Data", "set_dv_recip_c"); - ModuleBase::timer::start("DFPT_PW_Data", "set_dv_recip_c"); - if (q_idx < 0 || spin < 0) - { - ModuleBase::timer::end("DFPT_PW_Data", "set_dv_recip_c"); - return; - } - if (q_idx >= static_cast(dv_recip_c_.size())) - { - dv_recip_c_.resize(q_idx + 1); - } - if (spin >= static_cast(dv_recip_c_[q_idx].size())) - { - dv_recip_c_[q_idx].resize(spin + 1); - } - dv_recip_c_[q_idx][spin] = v; - ModuleBase::timer::end("DFPT_PW_Data", "set_dv_recip_c"); -} - -std::vector> DFPT_PW_Data::get_dv_recip_c(int q_idx, int spin) const -{ - ModuleBase::TITLE("DFPT_PW_Data", "get_dv_recip_c"); - ModuleBase::timer::start("DFPT_PW_Data", "get_dv_recip_c"); - if (q_idx >= 0 && spin >= 0 && q_idx < static_cast(dv_recip_c_.size()) - && spin < static_cast(dv_recip_c_[q_idx].size())) - { - ModuleBase::timer::end("DFPT_PW_Data", "get_dv_recip_c"); - return dv_recip_c_[q_idx][spin]; - } - ModuleBase::timer::end("DFPT_PW_Data", "get_dv_recip_c"); - return std::vector>(); -} - -void DFPT_PW_Data::set_dv_rc(int q_idx, int spin, const std::vector>& v) -{ - ModuleBase::TITLE("DFPT_PW_Data", "set_dv_rc"); - ModuleBase::timer::start("DFPT_PW_Data", "set_dv_rc"); - if (q_idx < 0 || spin < 0) - { - ModuleBase::timer::end("DFPT_PW_Data", "set_dv_rc"); - return; - } - if (q_idx >= static_cast(dv_rc_.size())) - { - dv_rc_.resize(q_idx + 1); - } - if (spin >= static_cast(dv_rc_[q_idx].size())) - { - dv_rc_[q_idx].resize(spin + 1); - } - dv_rc_[q_idx][spin] = v; - ModuleBase::timer::end("DFPT_PW_Data", "set_dv_rc"); -} - -std::vector> DFPT_PW_Data::get_dv_rc(int q_idx, int spin) const -{ - ModuleBase::TITLE("DFPT_PW_Data", "get_dv_rc"); - ModuleBase::timer::start("DFPT_PW_Data", "get_dv_rc"); - if (q_idx >= 0 && spin >= 0 && q_idx < static_cast(dv_rc_.size()) - && spin < static_cast(dv_rc_[q_idx].size())) - { - ModuleBase::timer::end("DFPT_PW_Data", "get_dv_rc"); - return dv_rc_[q_idx][spin]; - } - ModuleBase::timer::end("DFPT_PW_Data", "get_dv_rc"); - return std::vector>(); -} - void DFPT_PW_Data::set_dynmat(int q_idx, const ModuleBase::ComplexMatrix& dm) { ModuleBase::TITLE("DFPT_PW_Data", "set_dynmat"); diff --git a/source/source_pw/module_dfpt/dfpt_pw_data_resp.cpp b/source/source_pw/module_dfpt/dfpt_pw_data_resp.cpp new file mode 100644 index 00000000000..c9486db96f5 --- /dev/null +++ b/source/source_pw/module_dfpt/dfpt_pw_data_resp.cpp @@ -0,0 +1,412 @@ +// ============================================================ +// Response-field slots of DFPT_PW_Data: the bound-safe getters/setters +// of the per-direction / per-q response fields -- u_active, docc, +// v_sc, the displacement / E-field response stashes (drho_disp, +// dpsi_disp, pos_resp, dpsi_efield) and the drho / dv slot family. +// The driver state (lifecycle, q delegation, dpsi ledger, dynmat / +// phonon tensors) stays in dfpt_pw_data.cpp. +// ============================================================ + +#include "dfpt_pw_data.h" + +#include "source_base/timer.h" +#include "source_base/tool_title.h" + +#include +#include + +namespace ModuleDFPT +{ + + +bool DFPT_PW_Data::u_active() const +{ + ModuleBase::TITLE("DFPT_PW_Data", "u_active"); + ModuleBase::timer::start("DFPT_PW_Data", "u_active"); + // a usable provider has its occupation matrices initialized (the ground + // state does this when DFT+U actually runs); a wired provider without + // them (e.g. a default-constructed reservation) stays inactive. + ModuleBase::timer::end("DFPT_PW_Data", "u_active"); + return with_u() && dftu_->is_occmat_ready(); +} + +void DFPT_PW_Data::set_docc(int q_idx, const std::vector>& occ) +{ + ModuleBase::TITLE("DFPT_PW_Data", "set_docc"); + ModuleBase::timer::start("DFPT_PW_Data", "set_docc"); + if (q_idx < 0) + { + ModuleBase::timer::end("DFPT_PW_Data", "set_docc"); + return; + } + if (q_idx >= static_cast(docc_.size())) + { + docc_.resize(q_idx + 1); + } + docc_[q_idx] = occ; + ModuleBase::timer::end("DFPT_PW_Data", "set_docc"); +} + +void DFPT_PW_Data::set_vsc_r(int atom_idx, int dir, const std::vector>& v) +{ + ModuleBase::TITLE("DFPT_PW_Data", "set_vsc_r"); + ModuleBase::timer::start("DFPT_PW_Data", "set_vsc_r"); + if (atom_idx < 0 || dir < 0 || dir >= 3) + { + ModuleBase::timer::end("DFPT_PW_Data", "set_vsc_r"); + return; + } + const size_t slot = static_cast(3 * atom_idx + dir); + if (slot >= vsc_r_.size()) + { + vsc_r_.resize(slot + 1); + } + vsc_r_[slot] = v; + ModuleBase::timer::end("DFPT_PW_Data", "set_vsc_r"); +} + +std::vector> DFPT_PW_Data::get_vsc_r(int atom_idx, int dir) const +{ + ModuleBase::TITLE("DFPT_PW_Data", "get_vsc_r"); + ModuleBase::timer::start("DFPT_PW_Data", "get_vsc_r"); + if (atom_idx < 0 || dir < 0 || dir >= 3) + { + ModuleBase::timer::end("DFPT_PW_Data", "get_vsc_r"); + return std::vector>(); + } + const size_t slot = static_cast(3 * atom_idx + dir); + if (slot < vsc_r_.size()) + { + ModuleBase::timer::end("DFPT_PW_Data", "get_vsc_r"); + return vsc_r_[slot]; + } + ModuleBase::timer::end("DFPT_PW_Data", "get_vsc_r"); + return std::vector>(); +} + +void DFPT_PW_Data::set_drho_disp(int atom_idx, int dir, const std::vector>& rho) +{ + ModuleBase::TITLE("DFPT_PW_Data", "set_drho_disp"); + ModuleBase::timer::start("DFPT_PW_Data", "set_drho_disp"); + if (atom_idx < 0 || dir < 0 || dir >= 3) + { + ModuleBase::timer::end("DFPT_PW_Data", "set_drho_disp"); + return; + } + const size_t slot = static_cast(3 * atom_idx + dir); + if (slot >= drho_disp_.size()) + { + drho_disp_.resize(slot + 1); + } + drho_disp_[slot] = rho; + ModuleBase::timer::end("DFPT_PW_Data", "set_drho_disp"); +} + +std::vector> DFPT_PW_Data::get_drho_disp(int atom_idx, int dir) const +{ + ModuleBase::TITLE("DFPT_PW_Data", "get_drho_disp"); + ModuleBase::timer::start("DFPT_PW_Data", "get_drho_disp"); + if (atom_idx < 0 || dir < 0 || dir >= 3) + { + ModuleBase::timer::end("DFPT_PW_Data", "get_drho_disp"); + return std::vector>(); + } + const size_t slot = static_cast(3 * atom_idx + dir); + if (slot < drho_disp_.size()) + { + ModuleBase::timer::end("DFPT_PW_Data", "get_drho_disp"); + return drho_disp_[slot]; + } + ModuleBase::timer::end("DFPT_PW_Data", "get_drho_disp"); + return std::vector>(); +} + +void DFPT_PW_Data::set_dpsi_disp(int atom_idx, + int dir, + const std::vector>>>& d) +{ + ModuleBase::TITLE("DFPT_PW_Data", "set_dpsi_disp"); + ModuleBase::timer::start("DFPT_PW_Data", "set_dpsi_disp"); + if (atom_idx < 0 || dir < 0 || dir >= 3) + { + ModuleBase::timer::end("DFPT_PW_Data", "set_dpsi_disp"); + return; + } + const size_t slot = static_cast(3 * atom_idx + dir); + if (slot >= dpsi_disp_.size()) + { + dpsi_disp_.resize(slot + 1); + } + dpsi_disp_[slot] = d; + ModuleBase::timer::end("DFPT_PW_Data", "set_dpsi_disp"); +} + +std::vector>>> DFPT_PW_Data::get_dpsi_disp(int atom_idx, int dir) const +{ + ModuleBase::TITLE("DFPT_PW_Data", "get_dpsi_disp"); + ModuleBase::timer::start("DFPT_PW_Data", "get_dpsi_disp"); + if (atom_idx < 0 || dir < 0 || dir >= 3) + { + ModuleBase::timer::end("DFPT_PW_Data", "get_dpsi_disp"); + return std::vector>>>(); + } + const size_t slot = static_cast(3 * atom_idx + dir); + if (slot < dpsi_disp_.size()) + { + ModuleBase::timer::end("DFPT_PW_Data", "get_dpsi_disp"); + return dpsi_disp_[slot]; + } + ModuleBase::timer::end("DFPT_PW_Data", "get_dpsi_disp"); + return std::vector>>>(); +} + +void DFPT_PW_Data::set_pos_resp(int dir, const std::vector>>>& y) +{ + ModuleBase::TITLE("DFPT_PW_Data", "set_pos_resp"); + ModuleBase::timer::start("DFPT_PW_Data", "set_pos_resp"); + if (dir < 0 || dir >= 3) + { + ModuleBase::timer::end("DFPT_PW_Data", "set_pos_resp"); + return; + } + if (pos_resp_.size() < 3) + { + pos_resp_.resize(3); + } + pos_resp_[dir] = y; + ModuleBase::timer::end("DFPT_PW_Data", "set_pos_resp"); +} + +std::vector>>> DFPT_PW_Data::get_pos_resp(int dir) const +{ + ModuleBase::TITLE("DFPT_PW_Data", "get_pos_resp"); + ModuleBase::timer::start("DFPT_PW_Data", "get_pos_resp"); + if (dir < 0 || dir >= 3 || dir >= static_cast(pos_resp_.size())) + { + ModuleBase::timer::end("DFPT_PW_Data", "get_pos_resp"); + return std::vector>>>(); + } + ModuleBase::timer::end("DFPT_PW_Data", "get_pos_resp"); + return pos_resp_[dir]; +} + +void DFPT_PW_Data::set_dpsi_efield(int dir, const std::vector>>>& d) +{ + ModuleBase::TITLE("DFPT_PW_Data", "set_dpsi_efield"); + ModuleBase::timer::start("DFPT_PW_Data", "set_dpsi_efield"); + if (dir < 0 || dir >= 3) + { + ModuleBase::timer::end("DFPT_PW_Data", "set_dpsi_efield"); + return; + } + if (dpsi_efield_.size() < 3) + { + dpsi_efield_.resize(3); + } + dpsi_efield_[dir] = d; + ModuleBase::timer::end("DFPT_PW_Data", "set_dpsi_efield"); +} + +std::vector>>> DFPT_PW_Data::get_dpsi_efield(int dir) const +{ + ModuleBase::TITLE("DFPT_PW_Data", "get_dpsi_efield"); + ModuleBase::timer::start("DFPT_PW_Data", "get_dpsi_efield"); + if (dir < 0 || dir >= 3 || dir >= static_cast(dpsi_efield_.size())) + { + ModuleBase::timer::end("DFPT_PW_Data", "get_dpsi_efield"); + return std::vector>>>(); + } + ModuleBase::timer::end("DFPT_PW_Data", "get_dpsi_efield"); + return dpsi_efield_[dir]; +} + +std::vector> DFPT_PW_Data::get_docc(int q_idx) const +{ + ModuleBase::TITLE("DFPT_PW_Data", "get_docc"); + ModuleBase::timer::start("DFPT_PW_Data", "get_docc"); + if (q_idx >= 0 && q_idx < static_cast(docc_.size())) + { + ModuleBase::timer::end("DFPT_PW_Data", "get_docc"); + return docc_[q_idx]; + } + ModuleBase::timer::end("DFPT_PW_Data", "get_docc"); + return std::vector>(); +} + +void DFPT_PW_Data::set_drho_r(int q_idx, int spin, const std::vector& rho) +{ + ModuleBase::TITLE("DFPT_PW_Data", "set_drho_r"); + ModuleBase::timer::start("DFPT_PW_Data", "set_drho_r"); + if (q_idx < 0 || spin < 0) + { + ModuleBase::timer::end("DFPT_PW_Data", "set_drho_r"); + return; + } + if (q_idx >= static_cast(drho_r_.size())) + { + drho_r_.resize(q_idx + 1); + } + if (spin >= static_cast(drho_r_[q_idx].size())) + { + drho_r_[q_idx].resize(spin + 1); + } + drho_r_[q_idx][spin] = rho; + ModuleBase::timer::end("DFPT_PW_Data", "set_drho_r"); +} + +std::vector DFPT_PW_Data::get_drho_r(int q_idx, int spin) const +{ + ModuleBase::TITLE("DFPT_PW_Data", "get_drho_r"); + ModuleBase::timer::start("DFPT_PW_Data", "get_drho_r"); + if (q_idx >= 0 && spin >= 0 && q_idx < static_cast(drho_r_.size()) + && spin < static_cast(drho_r_[q_idx].size())) + { + ModuleBase::timer::end("DFPT_PW_Data", "get_drho_r"); + return drho_r_[q_idx][spin]; + } + ModuleBase::timer::end("DFPT_PW_Data", "get_drho_r"); + return std::vector(); +} + +void DFPT_PW_Data::set_drho_g(int q_idx, int spin, const std::vector>& rho) +{ + ModuleBase::TITLE("DFPT_PW_Data", "set_drho_g"); + ModuleBase::timer::start("DFPT_PW_Data", "set_drho_g"); + if (q_idx < 0 || spin < 0) + { + ModuleBase::timer::end("DFPT_PW_Data", "set_drho_g"); + return; + } + if (q_idx >= static_cast(drho_g_.size())) + { + drho_g_.resize(q_idx + 1); + } + if (spin >= static_cast(drho_g_[q_idx].size())) + { + drho_g_[q_idx].resize(spin + 1); + } + drho_g_[q_idx][spin] = rho; + ModuleBase::timer::end("DFPT_PW_Data", "set_drho_g"); +} + +std::vector> DFPT_PW_Data::get_drho_g(int q_idx, int spin) const +{ + ModuleBase::TITLE("DFPT_PW_Data", "get_drho_g"); + ModuleBase::timer::start("DFPT_PW_Data", "get_drho_g"); + if (q_idx >= 0 && spin >= 0 && q_idx < static_cast(drho_g_.size()) + && spin < static_cast(drho_g_[q_idx].size())) + { + ModuleBase::timer::end("DFPT_PW_Data", "get_drho_g"); + return drho_g_[q_idx][spin]; + } + ModuleBase::timer::end("DFPT_PW_Data", "get_drho_g"); + return std::vector>(); +} + +void DFPT_PW_Data::set_dv_r(int q_idx, int spin, const std::vector& v) +{ + ModuleBase::TITLE("DFPT_PW_Data", "set_dv_r"); + ModuleBase::timer::start("DFPT_PW_Data", "set_dv_r"); + if (q_idx < 0 || spin < 0) + { + ModuleBase::timer::end("DFPT_PW_Data", "set_dv_r"); + return; + } + if (q_idx >= static_cast(dv_r_.size())) + { + dv_r_.resize(q_idx + 1); + } + if (spin >= static_cast(dv_r_[q_idx].size())) + { + dv_r_[q_idx].resize(spin + 1); + } + dv_r_[q_idx][spin] = v; + ModuleBase::timer::end("DFPT_PW_Data", "set_dv_r"); +} + +std::vector DFPT_PW_Data::get_dv_r(int q_idx, int spin) const +{ + ModuleBase::TITLE("DFPT_PW_Data", "get_dv_r"); + ModuleBase::timer::start("DFPT_PW_Data", "get_dv_r"); + if (q_idx >= 0 && spin >= 0 && q_idx < static_cast(dv_r_.size()) + && spin < static_cast(dv_r_[q_idx].size())) + { + ModuleBase::timer::end("DFPT_PW_Data", "get_dv_r"); + return dv_r_[q_idx][spin]; + } + ModuleBase::timer::end("DFPT_PW_Data", "get_dv_r"); + return std::vector(); +} + +void DFPT_PW_Data::set_dv_recip_c(int q_idx, int spin, const std::vector>& v) +{ + ModuleBase::TITLE("DFPT_PW_Data", "set_dv_recip_c"); + ModuleBase::timer::start("DFPT_PW_Data", "set_dv_recip_c"); + if (q_idx < 0 || spin < 0) + { + ModuleBase::timer::end("DFPT_PW_Data", "set_dv_recip_c"); + return; + } + if (q_idx >= static_cast(dv_recip_c_.size())) + { + dv_recip_c_.resize(q_idx + 1); + } + if (spin >= static_cast(dv_recip_c_[q_idx].size())) + { + dv_recip_c_[q_idx].resize(spin + 1); + } + dv_recip_c_[q_idx][spin] = v; + ModuleBase::timer::end("DFPT_PW_Data", "set_dv_recip_c"); +} + +std::vector> DFPT_PW_Data::get_dv_recip_c(int q_idx, int spin) const +{ + ModuleBase::TITLE("DFPT_PW_Data", "get_dv_recip_c"); + ModuleBase::timer::start("DFPT_PW_Data", "get_dv_recip_c"); + if (q_idx >= 0 && spin >= 0 && q_idx < static_cast(dv_recip_c_.size()) + && spin < static_cast(dv_recip_c_[q_idx].size())) + { + ModuleBase::timer::end("DFPT_PW_Data", "get_dv_recip_c"); + return dv_recip_c_[q_idx][spin]; + } + ModuleBase::timer::end("DFPT_PW_Data", "get_dv_recip_c"); + return std::vector>(); +} + +void DFPT_PW_Data::set_dv_rc(int q_idx, int spin, const std::vector>& v) +{ + ModuleBase::TITLE("DFPT_PW_Data", "set_dv_rc"); + ModuleBase::timer::start("DFPT_PW_Data", "set_dv_rc"); + if (q_idx < 0 || spin < 0) + { + ModuleBase::timer::end("DFPT_PW_Data", "set_dv_rc"); + return; + } + if (q_idx >= static_cast(dv_rc_.size())) + { + dv_rc_.resize(q_idx + 1); + } + if (spin >= static_cast(dv_rc_[q_idx].size())) + { + dv_rc_[q_idx].resize(spin + 1); + } + dv_rc_[q_idx][spin] = v; + ModuleBase::timer::end("DFPT_PW_Data", "set_dv_rc"); +} + +std::vector> DFPT_PW_Data::get_dv_rc(int q_idx, int spin) const +{ + ModuleBase::TITLE("DFPT_PW_Data", "get_dv_rc"); + ModuleBase::timer::start("DFPT_PW_Data", "get_dv_rc"); + if (q_idx >= 0 && spin >= 0 && q_idx < static_cast(dv_rc_.size()) + && spin < static_cast(dv_rc_[q_idx].size())) + { + ModuleBase::timer::end("DFPT_PW_Data", "get_dv_rc"); + return dv_rc_[q_idx][spin]; + } + ModuleBase::timer::end("DFPT_PW_Data", "get_dv_rc"); + return std::vector>(); +} + + +} // namespace ModuleDFPT From 114bbcec64ae92cdc44a138985d08bd17a1d3a85 Mon Sep 17 00:00:00 2001 From: Zanthoxylum <105619360+Zanthoxylum@users.noreply.github.com> Date: Mon, 2 Nov 2026 15:33:03 +0800 Subject: [PATCH 2/3] fix(dfpt): include dftu_base.h and wire dfpt_pw_data_resp.cpp into the test targets dfpt_pw_data_resp.cpp dereferences the Plus_U_Base reservation in u_active, which is only forward-declared in dfpt_pw_data.h -- include dftu_base.h for the complete type (the main build surfaces list only made the link error invisible in the test targets). The test targets that compile dfpt_pw_data.cpp directly also need the new dfpt_pw_data_resp.cpp in their SOURCES. Rebuild from deleted binaries + full MODULE_DFPT ctest: 10/10. --- source/source_pw/module_dfpt/dfpt_pw_data_resp.cpp | 3 +++ source/source_pw/module_dfpt/test/CMakeLists.txt | 2 ++ source/source_pw/module_dfpt/test_serial/CMakeLists.txt | 6 ++++++ 3 files changed, 11 insertions(+) diff --git a/source/source_pw/module_dfpt/dfpt_pw_data_resp.cpp b/source/source_pw/module_dfpt/dfpt_pw_data_resp.cpp index c9486db96f5..6d323b9f8c0 100644 --- a/source/source_pw/module_dfpt/dfpt_pw_data_resp.cpp +++ b/source/source_pw/module_dfpt/dfpt_pw_data_resp.cpp @@ -11,6 +11,9 @@ #include "source_base/timer.h" #include "source_base/tool_title.h" +// u_active dereferences the Plus_U_Base reservation (only forward-declared +// in dfpt_pw_data.h) +#include "source_pw/module_pwdft/dftu_base.h" #include #include diff --git a/source/source_pw/module_dfpt/test/CMakeLists.txt b/source/source_pw/module_dfpt/test/CMakeLists.txt index 50b13aa6c5d..4b0977937a1 100644 --- a/source/source_pw/module_dfpt/test/CMakeLists.txt +++ b/source/source_pw/module_dfpt/test/CMakeLists.txt @@ -14,6 +14,7 @@ addtest( SOURCES dfpt_pw_data_test.cpp ../dfpt_pw_data.cpp + ../dfpt_pw_data_resp.cpp ../../../source_cell/qlist.cpp ../../../source_cell/reciprocal_grid.cpp ../../../source_psi/psi.cpp @@ -66,6 +67,7 @@ addtest( ../dfpt_pw_solve.cpp ../dfpt_pw_q0.cpp ../dfpt_pw_data.cpp + ../dfpt_pw_data_resp.cpp ../dfpt_pert.cpp ../dfpt_pert_vkb.cpp ../dfpt_pert_nl.cpp diff --git a/source/source_pw/module_dfpt/test_serial/CMakeLists.txt b/source/source_pw/module_dfpt/test_serial/CMakeLists.txt index 2f08a0acdd2..ba2b1508825 100644 --- a/source/source_pw/module_dfpt/test_serial/CMakeLists.txt +++ b/source/source_pw/module_dfpt/test_serial/CMakeLists.txt @@ -41,6 +41,7 @@ addtest( ../dfpt_pert_vkb.cpp ../dfpt_pert_nl.cpp ../dfpt_pw_data.cpp + ../dfpt_pw_data_resp.cpp ../dfpt_kq_basis.cpp ../../../source_cell/qlist.cpp ../../../source_cell/reciprocal_grid.cpp @@ -64,6 +65,7 @@ addtest( dfpt_rho_serial_test.cpp ../dfpt_rho.cpp ../dfpt_pw_data.cpp + ../dfpt_pw_data_resp.cpp ../dfpt_kq_basis.cpp ../../../source_cell/qlist.cpp ../../../source_cell/reciprocal_grid.cpp @@ -93,6 +95,7 @@ addtest( ../dfpt_pert_vkb.cpp ../dfpt_pert_nl.cpp ../dfpt_pw_data.cpp + ../dfpt_pw_data_resp.cpp ../dfpt_kq_basis.cpp ../../../source_cell/qlist.cpp ../../../source_cell/reciprocal_grid.cpp @@ -120,6 +123,7 @@ addtest( ../dfpt_pert_vkb.cpp ../dfpt_pert_nl.cpp ../dfpt_pw_data.cpp + ../dfpt_pw_data_resp.cpp ../dfpt_kq_basis.cpp ../../../source_cell/qlist.cpp ../../../source_cell/reciprocal_grid.cpp @@ -146,6 +150,7 @@ addtest( test_dfpt_write_dyn.cpp ../dfpt_write_dyn.cpp ../dfpt_pw_data.cpp + ../dfpt_pw_data_resp.cpp ../../../source_cell/qlist.cpp ../../../source_cell/reciprocal_grid.cpp ../../../source_psi/psi.cpp @@ -173,6 +178,7 @@ if(ENABLE_LIBXC) ../dfpt_xc_analytic.cpp ../dfpt_rho.cpp ../dfpt_pw_data.cpp + ../dfpt_pw_data_resp.cpp ../dfpt_kq_basis.cpp ../../../source_cell/qlist.cpp ../../../source_cell/reciprocal_grid.cpp From 293d7a9fae8586f218cab554c3a5ee92295e33cb Mon Sep 17 00:00:00 2001 From: Zanthoxylum <105619360+Zanthoxylum@users.noreply.github.com> Date: Mon, 2 Nov 2026 18:52:05 +0800 Subject: [PATCH 3/3] refactor(dfpt): drop the dftu_base.h include from dfpt_pw_data.cpp After the response-field split, dfpt_pw_data.cpp only passes and stores a Plus_U_Base pointer; the forward declaration in dfpt_pw_data.h is sufficient and the complete type is needed only by u_active() in dfpt_pw_data_resp.cpp. All DFPT test binaries rebuilt from deleted binaries (make rc=0); full MODULE_DFPT ctest: 10/10. --- source/source_pw/module_dfpt/dfpt_pw_data.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/source/source_pw/module_dfpt/dfpt_pw_data.cpp b/source/source_pw/module_dfpt/dfpt_pw_data.cpp index eb6f93a2ae8..40d3a3a9b9d 100644 --- a/source/source_pw/module_dfpt/dfpt_pw_data.cpp +++ b/source/source_pw/module_dfpt/dfpt_pw_data.cpp @@ -2,7 +2,6 @@ #include "source_base/timer.h" #include "source_base/tool_quit.h" #include "source_base/tool_title.h" -#include "source_pw/module_pwdft/dftu_base.h" #include #include