99#include " ../ri/Cell_Nearest.h"
1010#include " ../ri/Label.h"
1111#include " ../global/Map_Operator.h"
12+ #include " ./symmetry/Filter_Atom_Symmetry.h"
1213
1314#include < cassert>
1415
@@ -35,6 +36,18 @@ void Exx<TA,Tcell,Ndim,Tdata>::set_parallel(
3536 this ->post_2D .set_parallel (this ->mpi_comm , this ->atoms_pos , this ->period );
3637}
3738
39+ template <typename TA, typename Tcell, std::size_t Ndim, typename Tdata>
40+ void Exx<TA,Tcell,Ndim,Tdata>::set_symmetry(
41+ const bool flag_symmetry,
42+ const std::map<std::pair<TA,TA>, std::set<TC>> &irreducible_sector)
43+ {
44+ if (flag_symmetry)
45+ this ->lri .filter_atom = std::make_shared<Filter_Atom_Symmetry<TA,TC,Tdata>>(
46+ this ->period , irreducible_sector);
47+ else
48+ this ->lri .filter_atom = std::make_shared<Filter_Atom<TA,TAC>>();
49+ }
50+
3851template <typename TA, typename Tcell, std::size_t Ndim, typename Tdata>
3952void Exx<TA,Tcell,Ndim,Tdata>::set_Cs(
4053 const std::map<TA, std::map<TAC, Tensor<Tdata>>> &Cs,
@@ -214,6 +227,9 @@ void Exx<TA,Tcell,Ndim,Tdata>::cal_Hs(
214227 this ->energy = this ->post_2D .cal_energy (
215228 this ->post_2D .saves [" Ds_" +save_names_suffix[2 ]],
216229 this ->post_2D .set_tensors_map2 (this ->Hs ) );
230+
231+ if (!this ->flag_save_result .Hs )
232+ this ->Hs .clear ();
217233}
218234
219235template <typename TA, typename Tcell, std::size_t Ndim, typename Tdata>
@@ -234,7 +250,7 @@ void Exx<TA,Tcell,Ndim,Tdata>::cal_force(
234250 std::map<TA,Tdata> force_ipos;
235251
236252 {
237- std::map<TA,std::map<TAC,Tensor<Tdata>>> dHs;
253+ this -> dHs [ipos][ 0 ]. clear () ;
238254
239255 this ->lri .data_ab_name [Label::ab::a ] = " dCs_" +std::to_string (ipos)+" _" +save_names_suffix[3 ];
240256 this ->lri .data_ab_name [Label::ab::a0b0] = " Vs_" +save_names_suffix[1 ];
@@ -243,13 +259,13 @@ void Exx<TA,Tcell,Ndim,Tdata>::cal_force(
243259 this ->lri .cal_loop3 (
244260 {Label::ab_ab::a0b0_a1b1,
245261 Label::ab_ab::a0b0_a1b2,},
246- dHs,
262+ this -> dHs [ipos][ 0 ] ,
247263 -1.0 );
248264
249265 this ->lri .cal_loop3 (
250266 {Label::ab_ab::a0b0_a2b1,
251267 Label::ab_ab::a0b0_a2b2},
252- dHs,
268+ this -> dHs [ipos][ 0 ] ,
253269 1.0 );
254270
255271 this ->lri .data_ab_name [Label::ab::a ] = " Cs_" +save_names_suffix[0 ];
@@ -258,55 +274,61 @@ void Exx<TA,Tcell,Ndim,Tdata>::cal_force(
258274 this ->lri .cal_loop3 (
259275 {Label::ab_ab::a0b0_a2b2,
260276 Label::ab_ab::a0b0_a2b1},
261- dHs,
277+ this -> dHs [ipos][ 0 ] ,
262278 1.0 );
263279
264280 this ->post_2D .cal_force (
265281 this ->post_2D .saves [" Ds_" +save_names_suffix[2 ]],
266- this ->post_2D .set_tensors_map2 (std::move ( dHs) ),
282+ this ->post_2D .set_tensors_map2 (this -> dHs [ipos][ 0 ] ),
267283 true ,
268284 force_ipos );
269285
270- // mul(D)
271- // this->Fs[ipos] = this->post_2D.cal_F(dHs);
272- // this->stress[ipos] = this->post_2D.cal_sttress(dHs);
273- // this->Fs[ipos][I] = \sum_J \sum_{i,j} dHs(i,j) * D(i,j)
286+ // mul(D)
287+ // this->Fs[ipos] = this->post_2D.cal_F(dHs);
288+ // this->stress[ipos] = this->post_2D.cal_sttress(dHs);
289+ // this->Fs[ipos][I] = \sum_J \sum_{i,j} dHs(i,j) * D(i,j)
290+
291+ if (!this ->flag_save_result .dHs )
292+ this ->dHs [ipos][0 ].clear ();
274293 }
275294
276295 {
277- std::map<TA,std::map<TAC,Tensor<Tdata>>> dHs;
296+ this -> dHs [ipos][ 1 ]. clear () ;
278297
279298 this ->lri .cal_loop3 (
280299 {Label::ab_ab::a0b0_a2b2,
281300 Label::ab_ab::a0b0_a1b2},
282- dHs,
283- 1.0 );
301+ this -> dHs [ipos][ 1 ] ,
302+ - 1.0 );
284303
285304 this ->lri .data_ab_name [Label::ab::a0b0] = " Vs_" +save_names_suffix[1 ];
286305 this ->lri .data_ab_name [Label::ab::b ] = " dCs_" +std::to_string (ipos)+" _" +save_names_suffix[3 ];
287306
288307 this ->lri .cal_loop3 (
289308 {Label::ab_ab::a0b0_a1b1,
290309 Label::ab_ab::a0b0_a2b1},
291- dHs,
292- 1.0 );
310+ this -> dHs [ipos][ 1 ] ,
311+ - 1.0 );
293312
294313 this ->lri .cal_loop3 (
295314 {Label::ab_ab::a0b0_a1b2,
296315 Label::ab_ab::a0b0_a2b2},
297- dHs,
298- - 1.0 );
316+ this -> dHs [ipos][ 1 ] ,
317+ 1.0 );
299318
300319 this ->post_2D .cal_force (
301320 this ->post_2D .saves [" Ds_" +save_names_suffix[2 ]],
302- this ->post_2D .set_tensors_map2 (std::move ( dHs) ),
321+ this ->post_2D .set_tensors_map2 (this -> dHs [ipos][ 1 ] ),
303322 false ,
304323 force_ipos );
305324
306- // mul(D)
307- // this->Fs[ipos] -= this->post_2D.cal_F(dHs);
308- // this->stress[ipos] -= this->post_2D.cal_sttress(dHs);
309- // this->Fs[ipos][J] = \sum_I \sum_{i,j} dHs(i,j) * D(i,j)
325+ // mul(D)
326+ // this->Fs[ipos] -= this->post_2D.cal_F(dHs);
327+ // this->stress[ipos] -= this->post_2D.cal_sttress(dHs);
328+ // this->Fs[ipos][J] = \sum_I \sum_{i,j} dHs(i,j) * D(i,j)
329+
330+ if (!this ->flag_save_result .dHs )
331+ this ->dHs [ipos][1 ].clear ();
310332 }
311333 this ->force [ipos] = this ->post_2D .reduce_force (force_ipos);
312334 } // end for(ipos)
@@ -331,7 +353,7 @@ void Exx<TA,Tcell,Ndim,Tdata>::cal_stress(
331353 for (std::size_t ipos0=0 ; ipos0<Npos; ++ipos0)
332354 for (std::size_t ipos1=0 ; ipos1<Npos; ++ipos1)
333355 {
334- std::map<TA,std::map<TAC,Tensor<Tdata>>> dHs ;
356+ this -> dHRs [ipos0][ipos1]. clear () ;
335357
336358 this ->lri .data_ab_name [Label::ab::a ] = " dCRs_" +std::to_string (ipos0)+" _" +std::to_string (ipos1)+" _" +save_names_suffix[3 ];
337359 this ->lri .data_ab_name [Label::ab::a0b0] = " Vs_" +save_names_suffix[1 ];
@@ -340,7 +362,7 @@ void Exx<TA,Tcell,Ndim,Tdata>::cal_stress(
340362 this ->lri .cal_loop3 (
341363 {Label::ab_ab::a0b0_a1b1,
342364 Label::ab_ab::a0b0_a2b1},
343- dHs ,
365+ this -> dHRs [ipos0][ipos1] ,
344366 1.0 );
345367
346368 this ->lri .data_ab_name [Label::ab::a ] = " Cs_" +save_names_suffix[0 ];
@@ -349,7 +371,7 @@ void Exx<TA,Tcell,Ndim,Tdata>::cal_stress(
349371 this ->lri .cal_loop3 (
350372 {Label::ab_ab::a0b0_a1b1,
351373 Label::ab_ab::a0b0_a2b1},
352- dHs ,
374+ this -> dHRs [ipos0][ipos1] ,
353375 1.0 );
354376
355377 this ->lri .data_ab_name [Label::ab::a0b0] = " Vs_" +save_names_suffix[1 ];
@@ -358,12 +380,15 @@ void Exx<TA,Tcell,Ndim,Tdata>::cal_stress(
358380 this ->lri .cal_loop3 (
359381 {Label::ab_ab::a0b0_a1b1,
360382 Label::ab_ab::a0b0_a2b1},
361- dHs ,
383+ this -> dHRs [ipos0][ipos1] ,
362384 1.0 );
363385
364- this ->stress (ipos0,ipos1) = post_2D.cal_energy (
365- this ->post_2D .saves [" Ds_" +save_names_suffix[2 ]],
366- this ->post_2D .set_tensors_map2 (dHs));
386+ this ->stress (ipos0,ipos1) = post_2D.cal_energy (
387+ this ->post_2D .saves [" Ds_" +save_names_suffix[2 ]],
388+ this ->post_2D .set_tensors_map2 (this ->dHRs [ipos0][ipos1]));
389+
390+ if (!this ->flag_save_result .dHRs )
391+ this ->dHRs [ipos0][ipos1].clear ();
367392 }
368393}
369394
0 commit comments