@@ -90,6 +90,8 @@ void XC_Functional::gradcorr(
9090 double * neg = nullptr ;
9191 double ** vsave = nullptr ;
9292 double ** vgg = nullptr ;
93+ double * lapl1 = nullptr ;
94+ double * lapl2 = nullptr ;
9395
9496 // for spin unpolarized case,
9597 // calculate the gradient of (rho_core+rho) in reciprocal space.
@@ -118,6 +120,12 @@ void XC_Functional::gradcorr(
118120
119121 XC_Functional::grad_rho ( rhogsum1 , gdr1, rhopw, ucell->tpiba );
120122
123+ if (func_type == 3 || func_type == 5 )
124+ {
125+ lapl1 = new double [rhopw->nrxx ];
126+ XC_Functional::laplacian_rho (rhogsum1, lapl1, rhopw, ucell->tpiba );
127+ }
128+
121129 // for spin polarized case;
122130 // calculate the gradient of (rho_core+rho) in reciprocal space.
123131 if (PARAM .inp .nspin ==2 )
@@ -146,6 +154,12 @@ void XC_Functional::gradcorr(
146154 }
147155
148156 XC_Functional::grad_rho ( rhogsum2 , gdr2, rhopw, ucell->tpiba );
157+
158+ if (func_type == 3 || func_type == 5 )
159+ {
160+ lapl2 = new double [rhopw->nrxx ];
161+ XC_Functional::laplacian_rho (rhogsum2, lapl2, rhopw, ucell->tpiba );
162+ }
149163 }
150164
151165 if (PARAM .inp .nspin == 4 &&(PARAM .globalv .domag ||PARAM .globalv .domag_z ))
@@ -222,6 +236,20 @@ void XC_Functional::gradcorr(
222236
223237 XC_Functional::grad_rho ( rhogsum1 , gdr1, rhopw, ucell->tpiba );
224238 XC_Functional::grad_rho ( rhogsum2 , gdr2, rhopw, ucell->tpiba );
239+
240+ if (func_type == 3 || func_type == 5 )
241+ {
242+ if (lapl1 == nullptr )
243+ {
244+ lapl1 = new double [rhopw->nrxx ];
245+ }
246+ XC_Functional::laplacian_rho (rhogsum1, lapl1, rhopw, ucell->tpiba );
247+ if (lapl2 == nullptr )
248+ {
249+ lapl2 = new double [rhopw->nrxx ];
250+ }
251+ XC_Functional::laplacian_rho (rhogsum2, lapl2, rhopw, ucell->tpiba );
252+ }
225253 }
226254
227255 const double epsr = 1.0e-6 ;
@@ -297,7 +325,8 @@ void XC_Functional::gradcorr(
297325#ifdef __EXX
298326 hybrid_alpha = GlobalC::exx_info.info_global .hybrid_alpha ;
299327#endif
300- XC_Functional_Libxc::tau_xc ( func_id, arho, grho2a, atau, sxc, v1xc, v2xc, v3xc, hybrid_alpha);
328+ double lapl_val = (lapl1 != nullptr ) ? lapl1[ir] : 0.0 ;
329+ XC_Functional_Libxc::tau_xc ( func_id, arho, grho2a, lapl_val, atau, sxc, v1xc, v2xc, v3xc, hybrid_alpha);
301330 }
302331 else
303332 {
@@ -366,10 +395,12 @@ void XC_Functional::gradcorr(
366395#ifdef __EXX
367396 hybrid_alpha = GlobalC::exx_info.info_global .hybrid_alpha ;
368397#endif
398+ double laplup_val = (lapl1 != nullptr ) ? lapl1[ir] : 0.0 ;
399+ double lapldw_val = (lapl2 != nullptr ) ? lapl2[ir] : 0.0 ;
369400 XC_Functional_Libxc::tau_xc_spin (
370401 func_id,
371402 rhotmp1[ir], rhotmp2[ir], gdr1[ir], gdr2[ir],
372- atau1, atau2, sxc, v1xcup, v1xcdw, v2xcup, v2xcdw, v2xcud, v3xcup, v3xcdw, hybrid_alpha);
403+ laplup_val, lapldw_val, atau1, atau2, sxc, v1xcup, v1xcdw, v2xcup, v2xcdw, v2xcud, v3xcup, v3xcdw, hybrid_alpha);
373404 }
374405 else
375406 {
@@ -653,14 +684,18 @@ void XC_Functional::gradcorr(
653684 delete[] rhotmp2;
654685 delete[] rhogsum2;
655686 delete[] gdr2;
687+ delete[] lapl2;
656688 if (!is_stress)
657689 {
658690 delete[] h2;
659691 }
692+ delete[] lapl1;
660693 }
661- if (PARAM .inp .nspin == 4 && (PARAM .globalv .domag ||PARAM .globalv .domag_z ))
694+ else if (PARAM .inp .nspin == 4 && (PARAM .globalv .domag ||PARAM .globalv .domag_z ))
662695 {
663696 delete[] neg;
697+ delete[] lapl1;
698+ delete[] lapl2;
664699 if (!is_stress)
665700 {
666701 for (int i=0 ; i<nspin0; i++)
@@ -679,6 +714,10 @@ void XC_Functional::gradcorr(
679714 delete[] rhogsum2;
680715 delete[] gdr2;
681716 }
717+ else
718+ {
719+ delete[] lapl1;
720+ }
682721
683722 return ;
684723}
@@ -816,11 +855,42 @@ void XC_Functional::grad_dot(
816855 dh[ir] = aux[ir].real () * tpiba;
817856 }
818857
819- delete[] aux;
858+ delete[] aux;
820859 delete[] gaux;
821860 return ;
822861}
823862
863+
864+ void XC_Functional::laplacian_rho (
865+ const std::complex <double >* rhog,
866+ double * lapl,
867+ const ModulePW::PW_Basis* rho_basis,
868+ const double tpiba)
869+ {
870+ std::complex <double >* lapl_tmp = new std::complex <double >[rho_basis->nmaxgr ];
871+
872+ for (int ir=0 ; ir<rho_basis->nrxx ; ir++)
873+ {
874+ lapl[ir] = 0.0 ;
875+ }
876+
877+ for (int i=0 ; i<3 ; i++)
878+ {
879+ for (int ig=0 ; ig<rho_basis->npw ; ig++)
880+ {
881+ lapl_tmp[ig] = -rhog[ig] * rho_basis->gcar [ig][i] * rho_basis->gcar [ig][i];
882+ }
883+ rho_basis->recip2real (lapl_tmp, lapl_tmp);
884+ for (int ir=0 ; ir<rho_basis->nrxx ; ir++)
885+ {
886+ lapl[ir] += lapl_tmp[ir].real () * tpiba * tpiba;
887+ }
888+ }
889+
890+ delete[] lapl_tmp;
891+ }
892+
893+
824894void XC_Functional::noncolin_rho (
825895 double *rhoout1,
826896 double *rhoout2,
0 commit comments