@@ -95,18 +95,18 @@ void Numerical_Basis::output_overlap( const ModuleBase::ComplexMatrix *psi)
9595 GlobalV::ofs_running << " --------------------------------------------------------" << std::endl;
9696
9797 // search for all k-points.
98- overlap_Q[ik] = this ->cal_overlap_Q (ik, npw, psi[ik], derivative_order);
98+ overlap_Q[ik] = this ->cal_overlap_Q (ik, npw, psi[ik], static_cast < double >( derivative_order) );
9999 ModuleBase::GlobalFunc::DONE (GlobalV::ofs_running," cal_overlap_Q" );
100100
101101 // (2) generate Sq matrix if necessary.
102102 if (winput::out_spillage == 2 )
103103 {
104- overlap_Sq[ik] = this ->cal_overlap_Sq ( ik, npw, derivative_order );
104+ overlap_Sq[ik] = this ->cal_overlap_Sq ( ik, npw, static_cast < double >( derivative_order) );
105105 ModuleBase::GlobalFunc::DONE (GlobalV::ofs_running," cal_overlap_Sq" );
106106 }
107107 }
108108
109- const ModuleBase::matrix overlap_V = this ->cal_overlap_V (psi, derivative_order); // Peize Lin add 2020.04.23
109+ const ModuleBase::matrix overlap_V = this ->cal_overlap_V (psi, static_cast < double >( derivative_order) ); // Peize Lin add 2020.04.23
110110
111111 #ifdef __MPI
112112 for (int ik=0 ; ik<GlobalC::kv.nks ; ik++)
@@ -139,7 +139,7 @@ ModuleBase::ComplexArray Numerical_Basis::cal_overlap_Q(
139139 const int &ik,
140140 const int &np,
141141 const ModuleBase::ComplexMatrix &psi,
142- const int derivative_order) const
142+ const double derivative_order) const
143143{
144144 ModuleBase::TITLE (" Numerical_Basis" ," cal_overlap_Q" );
145145 ModuleBase::timer::tick (" Numerical_Basis" ," cal_overlap_Q" );
@@ -156,6 +156,8 @@ ModuleBase::ComplexArray Numerical_Basis::cal_overlap_Q(
156156 for (int ig=0 ; ig<np; ig++)
157157 gk[ig] = GlobalC::wf.get_1qvec_cartesian (ik, ig);
158158
159+ const std::vector<double > gpow = Numerical_Basis::cal_gpow (gk, derivative_order);
160+
159161 const ModuleBase::realArray flq = this ->cal_flq (ik, gk);
160162
161163 const ModuleBase::matrix ylm = Numerical_Basis::cal_ylm (gk);
@@ -195,7 +197,7 @@ ModuleBase::ComplexArray Numerical_Basis::cal_overlap_Q(
195197 for (int ig=0 ; ig<np; ig++)
196198 {
197199// const std::complex<double> local_tmp = lphase * sk[ig] * ylm(lm, ig) * flq[ig];
198- const std::complex <double > local_tmp = lphase * sk[ig] * ylm (lm, ig) * flq (L,ie,ig) * pow (gk [ig]. norm2 (),derivative_order) ; // Peize Lin add for dpsi 2020.04.23
200+ const std::complex <double > local_tmp = lphase * sk[ig] * ylm (lm, ig) * flq (L,ie,ig) * gpow [ig]; // Peize Lin add for dpsi 2020.04.23
199201 overlap_tmp += conj ( local_tmp ) * psi (ib, ig); // psi is bloch orbitals
200202 }
201203 overlap_Q (ib, this ->mu_index [T](I, L, N, m), ie) = overlap_tmp;
@@ -214,7 +216,7 @@ ModuleBase::ComplexArray Numerical_Basis::cal_overlap_Q(
214216ModuleBase::ComplexArray Numerical_Basis::cal_overlap_Sq (
215217 const int &ik,
216218 const int &np,
217- const int derivative_order) const
219+ const double derivative_order) const
218220{
219221 ModuleBase::TITLE (" Numerical_Basis" ," cal_overlap_Sq" );
220222 ModuleBase::timer::tick (" Numerical_Basis" ," cal_overlap_Sq" );
@@ -232,6 +234,8 @@ ModuleBase::ComplexArray Numerical_Basis::cal_overlap_Sq(
232234 for (int ig=0 ; ig<np; ig++)
233235 gk[ig] = GlobalC::wf.get_1qvec_cartesian (ik, ig);
234236
237+ const std::vector<double > gpow = Numerical_Basis::cal_gpow (gk, derivative_order);
238+
235239 const ModuleBase::realArray flq = this ->cal_flq (ik, gk);
236240
237241 const ModuleBase::matrix ylm = Numerical_Basis::cal_ylm (gk);
@@ -281,7 +285,7 @@ ModuleBase::ComplexArray Numerical_Basis::cal_overlap_Sq(
281285
282286 std::vector<std::complex <double >> about_ig1 (np, std::complex <double >(0.0 ,0.0 ));
283287 for (int ig=0 ; ig<np; ig++)
284- about_ig1[ig] = conj ( lphase1 * sk1[ig] * ylm (lm1, ig) ) * pow (gk [ig]. norm2 (),derivative_order) ; // Peize Lin add for dpsi 2020.04.23
288+ about_ig1[ig] = conj ( lphase1 * sk1[ig] * ylm (lm1, ig) ) * gpow [ig]; // Peize Lin add for dpsi 2020.04.23
285289
286290 for (int m2=0 ; m2<2 *l2+1 ; m2++) // 2.6
287291 {
@@ -330,18 +334,20 @@ ModuleBase::ComplexArray Numerical_Basis::cal_overlap_Sq(
330334// Peize Lin add for dpsi 2020.04.23
331335ModuleBase::matrix Numerical_Basis::cal_overlap_V (
332336 const ModuleBase::ComplexMatrix *psi,
333- const int derivative_order)
337+ const double derivative_order)
334338{
335339 ModuleBase::matrix overlap_V (GlobalC::kv.nks , GlobalV::NBANDS);
336340 for (int ik=0 ; ik<GlobalC::kv.nks ; ++ik)
337341 {
342+ std::vector<ModuleBase::Vector3<double >> gk (GlobalC::kv.ngk [ik]);
343+ for (int ig=0 ; ig<gk.size (); ig++)
344+ gk[ig] = GlobalC::wf.get_1qvec_cartesian (ik, ig);
345+
346+ const std::vector<double > gpow = Numerical_Basis::cal_gpow (gk, derivative_order);
347+
338348 for (int ib=0 ; ib<GlobalV::NBANDS; ++ib)
339- {
340349 for (int ig=0 ; ig<GlobalC::kv.ngk [ik]; ++ig)
341- {
342- overlap_V (ik,ib)+= norm (psi[ik](ib,ig)) * pow (GlobalC::wf.get_1qvec_cartesian (ik,ig).norm2 (),derivative_order);
343- }
344- }
350+ overlap_V (ik,ib)+= norm (psi[ik](ib,ig)) * gpow[ig];
345351 }
346352 return overlap_V;
347353}
@@ -368,6 +374,25 @@ ModuleBase::matrix Numerical_Basis::cal_ylm(const std::vector<ModuleBase::Vector
368374 return ylm;
369375}
370376
377+ std::vector<double > Numerical_Basis::cal_gpow (const std::vector<ModuleBase::Vector3<double >> &gk, const double derivative_order)
378+ {
379+ constexpr double thr = 1E-12 ;
380+ std::vector<double > gpow (gk.size (), 0.0 );
381+ for (int ig=0 ; ig<gpow.size (); ++ig)
382+ {
383+ if (derivative_order>=0 )
384+ {
385+ gpow[ig] = std::pow (gk[ig].norm2 (),derivative_order);
386+ }
387+ else
388+ {
389+ if (gk[ig].norm2 () >= thr)
390+ gpow[ig] = std::pow (gk[ig].norm2 (),derivative_order);
391+ }
392+ }
393+ return gpow;
394+ }
395+
371396std::vector<ModuleBase::IntArray> Numerical_Basis::init_mu_index (void )
372397{
373398 GlobalV::ofs_running << " Initialize the mu index" << std::endl;
0 commit comments