Skip to content

Commit ea63996

Browse files
committed
perf: merge 3 FFTs into 1 in laplacian_rho()
Compute |G|² = sum(gcar_i²) once and perform a single FFT instead of 3 separate FFTs (one per direction).
1 parent 813dc17 commit ea63996

1 file changed

Lines changed: 10 additions & 13 deletions

File tree

source/source_hamilt/module_xc/xc_grad.cpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -968,22 +968,19 @@ void XC_Functional::laplacian_rho(
968968
{
969969
std::vector<std::complex<double>> lapl_tmp(rho_basis->nmaxgr);
970970

971-
for(int ir=0; ir<rho_basis->nrxx; ir++)
972-
{
973-
lapl[ir] = 0.0;
974-
}
975-
976-
for(int i=0; i<3; i++)
971+
for(int ig=0; ig<rho_basis->npw; ig++)
977972
{
978-
for(int ig=0; ig<rho_basis->npw; ig++)
973+
double g2 = 0.0;
974+
for(int i=0; i<3; i++)
979975
{
980-
lapl_tmp[ig] = -rhog[ig] * rho_basis->gcar[ig][i] * rho_basis->gcar[ig][i];
981-
}
982-
rho_basis->recip2real(lapl_tmp.data(), lapl_tmp.data());
983-
for(int ir=0; ir<rho_basis->nrxx; ir++)
984-
{
985-
lapl[ir] += lapl_tmp[ir].real() * tpiba * tpiba;
976+
g2 += rho_basis->gcar[ig][i] * rho_basis->gcar[ig][i];
986977
}
978+
lapl_tmp[ig] = -rhog[ig] * g2;
979+
}
980+
rho_basis->recip2real(lapl_tmp.data(), lapl_tmp.data());
981+
for(int ir=0; ir<rho_basis->nrxx; ir++)
982+
{
983+
lapl[ir] = lapl_tmp[ir].real() * tpiba * tpiba;
987984
}
988985
}
989986

0 commit comments

Comments
 (0)