Skip to content

Commit a145293

Browse files
1041176461jiyuangQianruipkuESROAMERmaki49
authored
Refactor: the ccp parameters to support additional Coulomb matrix construction methods. (#6307)
* Use template to reconstruct parse_expression * Feature: output R matrix at each MD step * Modify'matrix_HS' to 'matrix' for R matrix output * Merge branches 'develop' and 'develop' of https://github.com/1041176461/abacus-develop into develop * Fix: modify index in parse_expression * Fix: add regfree for parse_expression * Doc: update phonopy doc * Doc: update phonopy doc * fix tdos plot for nspin=2 * optimize dosplot for nspin=2 * fix legend for dosplot * Add files via upload * Update cal_edm_tddft.cpp * Refactor: modify exx loop for relax/md * Update result.ref * Fix wrong parameters in integrate test * Update result.ref * Update result.ref * Update result.ref * Update result.ref * Update result.ref * Update result.ref * Update result.ref * Update result.ref * add exx when istep>0 * Update dos.py * Update esolver_sdft_pw.cpp * Update lcao_before_scf.cpp * Update Exx_LRI_interface.h * Update Exx_LRI_interface.hpp * Fix: compile error * Fix: compile error * Fix: change HSE relax/md result.ref for new framework * Fix: compile error * compatible with exx_iter_finish * Add files via upload * Update esolver_ks_lcao_tddft.h * Update esolver_ks_lcao_tddft.cpp * Fix: support negative value in parse_expression * [pre-commit.ci lite] apply automatic fixes * Fix: parse_expression for scientific notation * Update input_conv.h * add complex erf function * modify ccp framework * fix add error --------- Co-authored-by: jiyuang <[email protected]> Co-authored-by: Qianrui <[email protected]> Co-authored-by: HTZhao <[email protected]> Co-authored-by: maki49 <[email protected]> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
1 parent fe44679 commit a145293

File tree

11 files changed

+776
-378
lines changed

11 files changed

+776
-378
lines changed

source/module_hamilt_general/module_xc/exx_info.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ struct Exx_Info
1515
{
1616
bool cal_exx = false;
1717

18-
std::unordered_map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>> coulomb_param;
18+
std::unordered_map<Conv_Coulomb_Pot_K::Coulomb_Method,
19+
std::pair<bool,
20+
std::unordered_map<Conv_Coulomb_Pot_K::Coulomb_Type,
21+
std::vector<std::map<std::string,std::string>>>>> coulomb_settings;
1922
// Fock:
2023
// "alpha": "0"
2124
// "Rcut_type": "limits" / "spencer"
@@ -52,7 +55,10 @@ struct Exx_Info
5255

5356
struct Exx_Info_RI
5457
{
55-
const std::unordered_map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>> &coulomb_param;
58+
const std::unordered_map<Conv_Coulomb_Pot_K::Coulomb_Method,
59+
std::pair<bool,
60+
std::unordered_map<Conv_Coulomb_Pot_K::Coulomb_Type,
61+
std::vector<std::map<std::string,std::string>>>>> &coulomb_settings;
5662

5763
bool real_number = false;
5864

@@ -74,7 +80,7 @@ struct Exx_Info
7480
int abfs_Lmax = 0; // tmp
7581

7682
Exx_Info_RI(const Exx_Info::Exx_Info_Global& info_global)
77-
: coulomb_param(info_global.coulomb_param)
83+
: coulomb_settings(info_global.coulomb_settings)
7884
{
7985
}
8086
};

source/module_io/input_conv.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -328,35 +328,41 @@ void Input_Conv::Convert()
328328
{
329329
GlobalC::exx_info.info_global.cal_exx = true;
330330
GlobalC::exx_info.info_global.ccp_type = Conv_Coulomb_Pot_K::Ccp_Type::Hf;
331-
GlobalC::exx_info.info_global.coulomb_param[Conv_Coulomb_Pot_K::Coulomb_Type::Fock] = {{
331+
std::unordered_map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>> coulomb_param;
332+
coulomb_param[Conv_Coulomb_Pot_K::Coulomb_Type::Fock] = {{
332333
{"alpha", "1"},
333334
{"Rcut_type", "spencer"},
334335
{"lambda", std::to_string(PARAM.inp.exx_lambda)} }};
336+
GlobalC::exx_info.info_global.coulomb_settings[Conv_Coulomb_Pot_K::Coulomb_Method::Center2] = std::make_pair(true, coulomb_param);
335337
}
336338
// use the error function erf(w|r-r'|), exx just has the short-range part
337339
else if (dft_functional_lower == "hse"
338340
|| dft_functional_lower == "cwp22")
339341
{
340342
GlobalC::exx_info.info_global.cal_exx = true;
341343
GlobalC::exx_info.info_global.ccp_type = Conv_Coulomb_Pot_K::Ccp_Type::Erfc;
342-
GlobalC::exx_info.info_global.coulomb_param[Conv_Coulomb_Pot_K::Coulomb_Type::Erfc] = {{
344+
std::unordered_map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>> coulomb_param;
345+
coulomb_param[Conv_Coulomb_Pot_K::Coulomb_Type::Erfc] = {{
343346
{"alpha", "1"},
344347
{"omega", std::to_string(PARAM.inp.exx_hse_omega)},
345348
{"Rcut_type", "limits"} }};
349+
GlobalC::exx_info.info_global.coulomb_settings[Conv_Coulomb_Pot_K::Coulomb_Method::Center2] = std::make_pair(true, coulomb_param);
346350
}
347351
// use the error function erf(w|r-r'|), exx just has the long-range part
348352
else if ( dft_functional_lower == "wp22" )
349353
{
350354
GlobalC::exx_info.info_global.cal_exx = true;
351355
GlobalC::exx_info.info_global.ccp_type = Conv_Coulomb_Pot_K::Ccp_Type::Erf;
352-
GlobalC::exx_info.info_global.coulomb_param[Conv_Coulomb_Pot_K::Coulomb_Type::Fock] = {{
356+
std::unordered_map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>> coulomb_param;
357+
coulomb_param[Conv_Coulomb_Pot_K::Coulomb_Type::Fock] = {{
353358
{"alpha", "1"},
354359
{"Rcut_type", "spencer"},
355360
{"lambda", std::to_string(PARAM.inp.exx_lambda)} }};
356-
GlobalC::exx_info.info_global.coulomb_param[Conv_Coulomb_Pot_K::Coulomb_Type::Erfc] = {{
361+
coulomb_param[Conv_Coulomb_Pot_K::Coulomb_Type::Erfc] = {{
357362
{"alpha", "-1"},
358363
{"omega", std::to_string(PARAM.inp.exx_hse_omega)},
359364
{"Rcut_type", "limits"} }};
365+
GlobalC::exx_info.info_global.coulomb_settings[Conv_Coulomb_Pot_K::Coulomb_Method::Center2] = std::make_pair(true, coulomb_param);
360366
}
361367
#ifdef __EXX
362368
else if (dft_functional_lower == "opt_orb")

source/module_ri/Exx_LRI.h

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <vector>
1616
#include <array>
1717
#include <map>
18+
#include <unordered_map>
1819
#include <deque>
1920
#include <mpi.h>
2021

@@ -37,6 +38,15 @@
3738
class OperatorLREXX;
3839
}
3940

41+
template<typename Tdata>
42+
class Exx_Obj
43+
{
44+
// match with Conv_Coulomb_Pot_K::Coulomb_Method
45+
public:
46+
LRI_CV<Tdata> cv;
47+
std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>> abfs_ccp;
48+
};
49+
4050
template<typename Tdata>
4151
class Exx_LRI
4252
{
@@ -85,9 +95,9 @@ class Exx_LRI
8595

8696
std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>> lcaos;
8797
std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>> abfs;
88-
std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>> abfs_ccp;
89-
90-
LRI_CV<Tdata> cv;
98+
//std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>> abfs_ccp;
99+
std::unordered_map<Conv_Coulomb_Pot_K::Coulomb_Method, Exx_Obj<Tdata>> exx_objs;
100+
//LRI_CV<Tdata> cv;
91101
RI::Exx<TA,Tcell,Ndim,Tdata> exx_lri;
92102

93103
void post_process_Hexx( std::map<TA, std::map<TAC, RI::Tensor<Tdata>>> &Hexxs_io ) const;

source/module_ri/Exx_LRI.hpp

Lines changed: 65 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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

source/module_ri/LRI_CV.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,14 @@ class LRI_CV
4747
const std::vector<TA> &list_A0,
4848
const std::vector<TAC> &list_A1,
4949
const std::map<std::string,bool> &flags); // "writable_Vws"
50-
inline std::array<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>,3>
50+
inline std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, 3>>>
5151
cal_dVs(
5252
const UnitCell &ucell,
5353
const std::vector<TA> &list_A0,
5454
const std::vector<TAC> &list_A1,
5555
const std::map<std::string,bool> &flags); // "writable_dVws"
56-
std::pair<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>,
57-
std::array<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>,3>>
56+
std::pair<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>,
57+
std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, 3>>>>
5858
cal_Cs_dCs(
5959
const UnitCell &ucell,
6060
const std::vector<TA> &list_A0,

source/module_ri/LRI_CV.hpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -146,15 +146,14 @@ auto LRI_CV<Tdata>::cal_dVs(
146146
const std::vector<TA> &list_A0,
147147
const std::vector<TAC> &list_A1,
148148
const std::map<std::string,bool> &flags) // + "writable_dVws"
149-
-> std::array<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>,3>
149+
-> std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, 3>>>
150150
{
151151
ModuleBase::TITLE("LRI_CV","cal_dVs");
152152
const T_func_DPcal_data<std::array<RI::Tensor<Tdata>,3>>
153153
func_DPcal_dV = std::bind(
154154
&LRI_CV<Tdata>::DPcal_dV, this,
155155
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4);
156-
return LRI_CV_Tools::change_order(
157-
this->cal_datas(ucell,list_A0, list_A1, flags, this->ccp_rmesh_times, func_DPcal_dV));
156+
return this->cal_datas(ucell,list_A0, list_A1, flags, this->ccp_rmesh_times, func_DPcal_dV);
158157
}
159158

160159
template<typename Tdata>
@@ -163,7 +162,9 @@ auto LRI_CV<Tdata>::cal_Cs_dCs(
163162
const std::vector<TA> &list_A0,
164163
const std::vector<TAC> &list_A1,
165164
const std::map<std::string,bool> &flags) // "cal_dC" + "writable_Cws", "writable_dCws", "writable_Vws", "writable_dVws"
166-
-> std::pair<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>, std::array<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>,3>>
165+
-> std::pair<
166+
std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>,
167+
std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, 3>>>>
167168
{
168169
ModuleBase::TITLE("LRI_CV","cal_Cs_dCs");
169170
const T_func_DPcal_data<std::pair<RI::Tensor<Tdata>, std::array<RI::Tensor<Tdata>,3>>>
@@ -173,16 +174,16 @@ auto LRI_CV<Tdata>::cal_Cs_dCs(
173174
std::map<TA,std::map<TAC, std::pair<RI::Tensor<Tdata>, std::array<RI::Tensor<Tdata>,3>>>>
174175
Cs_dCs_tmp = this->cal_datas(ucell,list_A0, list_A1, flags, std::min(1.0,this->ccp_rmesh_times), func_DPcal_C_dC);
175176

176-
std::map<TA,std::map<TAC,RI::Tensor<Tdata>>> Cs;
177-
std::array<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>,3> dCs;
178-
for(auto &Cs_dCs_A : Cs_dCs_tmp)
179-
for(auto &Cs_dCs_B : Cs_dCs_A.second)
180-
{
181-
Cs[Cs_dCs_A.first][Cs_dCs_B.first] = std::move(std::get<0>(Cs_dCs_B.second));
182-
if(flags.at("cal_dC"))
183-
for(int ix=0; ix<3; ++ix)
184-
dCs[ix][Cs_dCs_A.first][Cs_dCs_B.first] = std::move(std::get<1>(Cs_dCs_B.second)[ix]);
185-
}
177+
std::map<TA, std::map<TAC, RI::Tensor<Tdata>>> Cs;
178+
std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, 3>>> dCs;
179+
for (auto& Cs_dCs_A: Cs_dCs_tmp)
180+
for (auto& Cs_dCs_B: Cs_dCs_A.second) {
181+
Cs[Cs_dCs_A.first][Cs_dCs_B.first]
182+
= std::move(std::get<0>(Cs_dCs_B.second));
183+
if (flags.at("cal_dC"))
184+
dCs[Cs_dCs_A.first][Cs_dCs_B.first]
185+
= std::move(std::get<1>(Cs_dCs_B.second));
186+
}
186187
return std::make_pair(Cs, dCs);
187188
}
188189

0 commit comments

Comments
 (0)