@@ -12,6 +12,18 @@ int H_Ewald_pw::mxr = 200;
1212H_Ewald_pw::H_Ewald_pw (){};
1313H_Ewald_pw::~H_Ewald_pw (){};
1414
15+ int H_Ewald_pw::estimate_mxr (const double &rmax, const ModuleBase::Matrix3 &bg)
16+ {
17+ double bg1[3 ];
18+ bg1[0 ] = bg.e11 ; bg1[1 ] = bg.e12 ; bg1[2 ] = bg.e13 ;
19+ const int nm1 = (int )(dnrm2 (3 , bg1, 1 ) * rmax + 2 );
20+ bg1[0 ] = bg.e21 ; bg1[1 ] = bg.e22 ; bg1[2 ] = bg.e23 ;
21+ const int nm2 = (int )(dnrm2 (3 , bg1, 1 ) * rmax + 2 );
22+ bg1[0 ] = bg.e31 ; bg1[1 ] = bg.e32 ; bg1[2 ] = bg.e33 ;
23+ const int nm3 = (int )(dnrm2 (3 , bg1, 1 ) * rmax + 2 );
24+ return (2 * nm1 + 1 ) * (2 * nm2 + 1 ) * (2 * nm3 + 1 );
25+ }
26+
1527double H_Ewald_pw::compute_ewald (const UnitCell& cell,
1628 const ModulePW::PW_Basis* rho_basis,
1729 const ModuleBase::ComplexMatrix& strucFac)
@@ -150,16 +162,7 @@ double H_Ewald_pw::compute_ewald(const UnitCell& cell,
150162 // Compute rmax and dynamically determine mxr (maximum number of r-vectors)
151163 // to avoid buffer overflow for very small unit cells or high cutoff energies.
152164 rmax = 4.0 / sqrt (alpha) / cell.lat0 ;
153- {
154- double bg1[3 ];
155- bg1[0 ] = cell.G .e11 ; bg1[1 ] = cell.G .e12 ; bg1[2 ] = cell.G .e13 ;
156- int nm1 = (int )(dnrm2 (3 , bg1, 1 ) * rmax + 2 );
157- bg1[0 ] = cell.G .e21 ; bg1[1 ] = cell.G .e22 ; bg1[2 ] = cell.G .e23 ;
158- int nm2 = (int )(dnrm2 (3 , bg1, 1 ) * rmax + 2 );
159- bg1[0 ] = cell.G .e31 ; bg1[1 ] = cell.G .e32 ; bg1[2 ] = cell.G .e33 ;
160- int nm3 = (int )(dnrm2 (3 , bg1, 1 ) * rmax + 2 );
161- mxr = (2 * nm1 + 1 ) * (2 * nm2 + 1 ) * (2 * nm3 + 1 );
162- }
165+ mxr = H_Ewald_pw::estimate_mxr (rmax, cell.G );
163166
164167 if (PARAM .inp .test_energy )
165168 {
@@ -205,7 +208,7 @@ double H_Ewald_pw::compute_ewald(const UnitCell& cell,
205208 // calculate tau[na1]-tau[na2]
206209 dtau = cell.atoms [it1].tau [ia1] - cell.atoms [it2].tau [ia2];
207210 // generates nearest-neighbors shells
208- H_Ewald_pw::rgen (dtau, rmax, irr, cell.latvec , cell.G , r, r2, nrm);
211+ H_Ewald_pw::rgen (dtau, rmax, irr, cell.latvec , cell.G , r, r2, mxr, nrm);
209212 // at-->cell.latvec, bg-->G
210213 // and sum to the real space part
211214
@@ -249,7 +252,7 @@ double H_Ewald_pw::compute_ewald(const UnitCell& cell,
249252 // calculate tau[na]-tau[nb]
250253 dtau = cell.atoms [nt1].tau [na] - cell.atoms [nt2].tau [nb];
251254 // generates nearest-neighbors shells
252- H_Ewald_pw::rgen (dtau, rmax, irr, cell.latvec , cell.G , r, r2, nrm);
255+ H_Ewald_pw::rgen (dtau, rmax, irr, cell.latvec , cell.G , r, r2, mxr, nrm);
253256 // at-->cell.latvec, bg-->G
254257 // and sum to the real space part
255258
@@ -301,6 +304,7 @@ void H_Ewald_pw::rgen(
301304 const ModuleBase::Matrix3 &G,
302305 ModuleBase::Vector3<double > *r,
303306 double *r2,
307+ const int mxr,
304308 int &nrm)
305309{
306310 // -------------------------------------------------------------------
0 commit comments