@@ -48,19 +48,18 @@ void Exx_LRI<Tdata>::init(const MPI_Comm &mpi_comm_in,
4848 { this ->abfs = Exx_Abfs::IO::construct_abfs ( abfs_same_atom, orb, this ->info .files_abfs , this ->info .kmesh_times ); }
4949 Exx_Abfs::Construct_Orbs::print_orbs_size (ucell, this ->abfs , GlobalV::ofs_running);
5050
51- const std::unordered_map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>>
52- coulomb_param_updated = RI_Util::update_coulomb_param (this ->info .coulomb_param , ucell.omega , this ->p_kv ->get_nkstot_full ());
53- this ->abfs_ccp = Conv_Coulomb_Pot_K::cal_orbs_ccp (this ->abfs , coulomb_param_updated, this ->info .ccp_rmesh_times );
54-
5551 for ( size_t T=0 ; T!=this ->abfs .size (); ++T )
5652 { GlobalC::exx_info.info_ri .abfs_Lmax = std::max ( GlobalC::exx_info.info_ri .abfs_Lmax , static_cast <int >(this ->abfs [T].size ())-1 ); }
5753
58- this ->cv .set_orbitals (
59- ucell,
60- orb,
61- this ->lcaos , this ->abfs , this ->abfs_ccp ,
62- this ->info .kmesh_times , this ->info .ccp_rmesh_times );
63-
54+ for (const auto &settings_list : this ->info .coulomb_settings )
55+ {
56+ const std::unordered_map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>>
57+ coulomb_param_updated = RI_Util::update_coulomb_param (settings_list.second .second , ucell.omega , this ->p_kv ->get_nkstot_full ());
58+ this ->exx_objs [settings_list.first ].abfs_ccp = Conv_Coulomb_Pot_K::cal_orbs_ccp (this ->abfs , coulomb_param_updated, this ->info .ccp_rmesh_times );
59+ this ->exx_objs [settings_list.first ].cv .set_orbitals (ucell, orb,
60+ this ->lcaos , this ->abfs , this ->exx_objs [settings_list.first ].abfs_ccp ,
61+ this ->info .kmesh_times , this ->info .ccp_rmesh_times );
62+ }
6463 ModuleBase::timer::tick (" Exx_LRI" , " init" );
6564}
6665
@@ -95,26 +94,40 @@ void Exx_LRI<Tdata>::cal_exx_ions(const UnitCell& ucell,
9594 const std::pair<std::vector<TA>, std::vector<std::vector<std::pair<TA,std::array<Tcell,Ndim>>>>>
9695 list_As_Vs = RI::Distribute_Equally::distribute_atoms_periods (this ->mpi_comm , atoms, period_Vs, 2 , false );
9796
98- std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>
99- Vs = this ->cv .cal_Vs (ucell,
100- list_As_Vs.first , list_As_Vs.second [0 ],
101- {{" writable_Vws" ,true }});
102- this ->cv .Vws = LRI_CV_Tools::get_CVws (ucell,Vs);
97+ std::map<TA,std::map<TAC,RI::Tensor<Tdata>>> Vs;
98+ std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>> dVs;
99+ for (const auto &settings_list : this ->info .coulomb_settings )
100+ {
101+ std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>
102+ Vs_temp = this ->exx_objs [settings_list.first ].cv .cal_Vs (ucell,
103+ list_As_Vs.first , list_As_Vs.second [0 ],
104+ {{" writable_Vws" ,true }});
105+ this ->exx_objs [settings_list.first ].cv .Vws = LRI_CV_Tools::get_CVws (ucell,Vs_temp);
106+ Vs = Vs.empty () ? Vs_temp : LRI_CV_Tools::add (Vs, Vs_temp);
107+
108+ if (PARAM.inp .cal_force || PARAM.inp .cal_stress )
109+ {
110+ std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>>
111+ dVs_temp = this ->exx_objs [settings_list.first ].cv .cal_dVs (ucell,
112+ list_As_Vs.first , list_As_Vs.second [0 ],
113+ {{" writable_dVws" ,true }});
114+ this ->exx_objs [settings_list.first ].cv .dVws = LRI_CV_Tools::get_dCVws (ucell,dVs_temp);
115+ dVs = dVs.empty () ? dVs_temp : LRI_CV_Tools::add (dVs, dVs_temp);
116+ }
117+
118+ }
103119 if (write_cv && GlobalV::MY_RANK == 0 )
104120 { LRI_CV_Tools::write_Vs_abf (Vs, PARAM.globalv .global_out_dir + " Vs" ); }
105121 this ->exx_lri .set_Vs (std::move (Vs), this ->info .V_threshold );
106122
107123 if (PARAM.inp .cal_force || PARAM.inp .cal_stress )
108124 {
109- std::array<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>,3 >
110- dVs = this ->cv .cal_dVs (ucell,
111- list_As_Vs.first , list_As_Vs.second [0 ],
112- {{" writable_dVws" ,true }});
113- this ->cv .dVws = LRI_CV_Tools::get_dCVws (ucell,dVs);
114- this ->exx_lri .set_dVs (std::move (dVs), this ->info .V_grad_threshold );
125+ std::array<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>, Ndim>
126+ dVs_order = LRI_CV_Tools::change_order (std::move (dVs));
127+ this ->exx_lri .set_dVs (std::move (dVs_order), this ->info .V_grad_threshold );
115128 if (PARAM.inp .cal_stress )
116129 {
117- std::array<std::array<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>,3 >,3 > dVRs = LRI_CV_Tools::cal_dMRs (ucell,dVs );
130+ std::array<std::array<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>,3 >,3 > dVRs = LRI_CV_Tools::cal_dMRs (ucell,dVs_order );
118131 this ->exx_lri .set_dVRs (std::move (dVRs), this ->info .V_grad_R_threshold );
119132 }
120133 }
@@ -123,29 +136,47 @@ void Exx_LRI<Tdata>::cal_exx_ions(const UnitCell& ucell,
123136 const std::pair<std::vector<TA>, std::vector<std::vector<std::pair<TA,std::array<Tcell,Ndim>>>>>
124137 list_As_Cs = RI::Distribute_Equally::distribute_atoms_periods (this ->mpi_comm , atoms, period_Cs, 2 , false );
125138
126- std::pair<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>, std::array<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>,3 >>
127- Cs_dCs = this ->cv .cal_Cs_dCs (
128- ucell,
129- list_As_Cs.first , list_As_Cs.second [0 ],
130- {{" cal_dC" ,PARAM.inp .cal_force ||PARAM.inp .cal_stress },
131- {" writable_Cws" ,true }, {" writable_dCws" ,true }, {" writable_Vws" ,false }, {" writable_dVws" ,false }});
132- std::map<TA,std::map<TAC,RI::Tensor<Tdata>>> &Cs = std::get<0 >(Cs_dCs);
133- this ->cv .Cws = LRI_CV_Tools::get_CVws (ucell,Cs);
139+ std::map<TA,std::map<TAC,RI::Tensor<Tdata>>> Cs;
140+ std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, 3 >>> dCs;
141+ for (const auto &settings_list : this ->info .coulomb_settings )
142+ {
143+ if (settings_list.second .first )
144+ {
145+ std::pair<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>,
146+ std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, 3 >>>>
147+ Cs_dCs = this ->exx_objs [settings_list.first ].cv .cal_Cs_dCs (
148+ ucell,
149+ list_As_Cs.first , list_As_Cs.second [0 ],
150+ {{" cal_dC" ,PARAM.inp .cal_force ||PARAM.inp .cal_stress },
151+ {" writable_Cws" ,true }, {" writable_dCws" ,true }, {" writable_Vws" ,false }, {" writable_dVws" ,false }});
152+ std::map<TA,std::map<TAC,RI::Tensor<Tdata>>> &Cs_temp = std::get<0 >(Cs_dCs);
153+ this ->exx_objs [settings_list.first ].cv .Cws = LRI_CV_Tools::get_CVws (ucell,Cs_temp);
154+ Cs = Cs.empty () ? Cs_temp : LRI_CV_Tools::add (Cs, Cs_temp);
155+
156+ if (PARAM.inp .cal_force || PARAM.inp .cal_stress )
157+ {
158+ std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, 3 >>> &dCs_temp = std::get<1 >(Cs_dCs);
159+ this ->exx_objs [settings_list.first ].cv .dCws = LRI_CV_Tools::get_dCVws (ucell,dCs_temp);
160+ dCs = dCs.empty () ? dCs_temp : LRI_CV_Tools::add (dCs, dCs_temp);
161+ }
162+ }
163+ }
134164 if (write_cv && GlobalV::MY_RANK == 0 )
135165 { LRI_CV_Tools::write_Cs_ao (Cs, PARAM.globalv .global_out_dir + " Cs" ); }
136166 this ->exx_lri .set_Cs (std::move (Cs), this ->info .C_threshold );
137167
138168 if (PARAM.inp .cal_force || PARAM.inp .cal_stress )
139169 {
140- std::array<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>,3 > &dCs = std::get< 1 >(Cs_dCs);
141- this -> cv . dCws = LRI_CV_Tools::get_dCVws (ucell, dCs);
142- this ->exx_lri .set_dCs (std::move (dCs ), this ->info .C_grad_threshold );
170+ std::array<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>, Ndim>
171+ dCs_order = LRI_CV_Tools::change_order ( std::move ( dCs) );
172+ this ->exx_lri .set_dCs (std::move (dCs_order ), this ->info .C_grad_threshold );
143173 if (PARAM.inp .cal_stress )
144174 {
145- std::array<std::array<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>,3 >,3 > dCRs = LRI_CV_Tools::cal_dMRs (ucell,dCs );
175+ std::array<std::array<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>,3 >,3 > dCRs = LRI_CV_Tools::cal_dMRs (ucell,dCs_order );
146176 this ->exx_lri .set_dCRs (std::move (dCRs), this ->info .C_grad_R_threshold );
147177 }
148178 }
179+
149180 ModuleBase::timer::tick (" Exx_LRI" , " cal_exx_ions" );
150181}
151182
0 commit comments