@@ -48,18 +48,19 @@ 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+
5155 for ( size_t T=0 ; T!=this ->abfs .size (); ++T )
5256 { GlobalC::exx_info.info_ri .abfs_Lmax = std::max ( GlobalC::exx_info.info_ri .abfs_Lmax , static_cast <int >(this ->abfs [T].size ())-1 ); }
5357
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- }
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+
6364 ModuleBase::timer::tick (" Exx_LRI" , " init" );
6465}
6566
@@ -94,40 +95,26 @@ void Exx_LRI<Tdata>::cal_exx_ions(const UnitCell& ucell,
9495 const std::pair<std::vector<TA>, std::vector<std::vector<std::pair<TA,std::array<Tcell,Ndim>>>>>
9596 list_As_Vs = RI::Distribute_Equally::distribute_atoms_periods (this ->mpi_comm , atoms, period_Vs, 2 , false );
9697
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- }
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);
119103 if (write_cv && GlobalV::MY_RANK == 0 )
120104 { LRI_CV_Tools::write_Vs_abf (Vs, PARAM.globalv .global_out_dir + " Vs" ); }
121105 this ->exx_lri .set_Vs (std::move (Vs), this ->info .V_threshold );
122106
123107 if (PARAM.inp .cal_force || PARAM.inp .cal_stress )
124108 {
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 );
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 );
128115 if (PARAM.inp .cal_stress )
129116 {
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 );
117+ std::array<std::array<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>,3 >,3 > dVRs = LRI_CV_Tools::cal_dMRs (ucell,dVs );
131118 this ->exx_lri .set_dVRs (std::move (dVRs), this ->info .V_grad_R_threshold );
132119 }
133120 }
@@ -136,47 +123,29 @@ void Exx_LRI<Tdata>::cal_exx_ions(const UnitCell& ucell,
136123 const std::pair<std::vector<TA>, std::vector<std::vector<std::pair<TA,std::array<Tcell,Ndim>>>>>
137124 list_As_Cs = RI::Distribute_Equally::distribute_atoms_periods (this ->mpi_comm , atoms, period_Cs, 2 , false );
138125
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- }
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);
164134 if (write_cv && GlobalV::MY_RANK == 0 )
165135 { LRI_CV_Tools::write_Cs_ao (Cs, PARAM.globalv .global_out_dir + " Cs" ); }
166136 this ->exx_lri .set_Cs (std::move (Cs), this ->info .C_threshold );
167137
168138 if (PARAM.inp .cal_force || PARAM.inp .cal_stress )
169139 {
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 );
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 );
173143 if (PARAM.inp .cal_stress )
174144 {
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 );
145+ std::array<std::array<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>,3 >,3 > dCRs = LRI_CV_Tools::cal_dMRs (ucell,dCs );
176146 this ->exx_lri .set_dCRs (std::move (dCRs), this ->info .C_grad_R_threshold );
177147 }
178148 }
179-
180149 ModuleBase::timer::tick (" Exx_LRI" , " cal_exx_ions" );
181150}
182151
0 commit comments