diff --git a/source/Makefile.Objects b/source/Makefile.Objects index 243b1ee57f..3580cf19f6 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 a561e61e7d..f43a0755b9 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 149717b05d..40d3a3a9b9 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 @@ -52,220 +51,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 +202,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 0000000000..6d323b9f8c --- /dev/null +++ b/source/source_pw/module_dfpt/dfpt_pw_data_resp.cpp @@ -0,0 +1,415 @@ +// ============================================================ +// 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" +// 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 + +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 diff --git a/source/source_pw/module_dfpt/test/CMakeLists.txt b/source/source_pw/module_dfpt/test/CMakeLists.txt index 80db18c630..714989a4a8 100644 --- a/source/source_pw/module_dfpt/test/CMakeLists.txt +++ b/source/source_pw/module_dfpt/test/CMakeLists.txt @@ -8,6 +8,7 @@ addtest( LIBS parameter base device symmetry 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 @@ -36,6 +37,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 6557511e30..7d38b33296 100644 --- a/source/source_pw/module_dfpt/test_serial/CMakeLists.txt +++ b/source/source_pw/module_dfpt/test_serial/CMakeLists.txt @@ -34,6 +34,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 @@ -50,6 +51,7 @@ addtest( SOURCES 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 @@ -72,6 +74,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 @@ -92,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 @@ -111,6 +115,7 @@ addtest( SOURCES 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 @@ -130,6 +135,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