Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Speed-up hot path of GFN2 geometry optimization #1178

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 11 additions & 7 deletions src/coulomb/klopmanohno.f90
Original file line number Diff line number Diff line change
Expand Up @@ -498,20 +498,24 @@ subroutine getCoulombDerivsCluster(mol, itbl, gamAverage, gExp, hardness, &
!> Derivative of Coulomb matrix w.r.t. strain deformations
real(wp), intent(out) :: djdL(:, :, :)

integer :: iat, jat, ish, jsh, ii, jj, iid, jid
integer :: iat, jat, nat, ish, jsh, ii, jj, iid, jid
real(wp) :: r1, g1, gij, vec(3), dG(3), dS(3, 3)

djdr(:, :, :) = 0.0_wp
djdtr(:, :) = 0.0_wp
djdL(:, :, :) = 0.0_wp

nat = len(mol) ! workaround for legacy Intel Fortran compilers

!$omp parallel do default(none) reduction(+:djdr, djdtr, djdL) &
!$omp shared(mol, itbl, qvec, gExp, hardness) &
!$omp private(iat, jat, ish, jsh, ii, jj, iid, jid, r1, g1, gij, vec, dG, dS)
do iat = 1, len(mol)
ii = itbl(1, iat)
iid = mol%id(iat)
do jat = 1, iat-1
!$omp shared(mol, itbl, qvec, gExp, hardness, nat) &
!$omp private(iat, jat, ish, jsh, ii, jj, iid, jid, r1, g1, gij, vec, dG, dS) &
!$omp collapse(2) schedule(dynamic,32)
do iat = 1, nat
do jat = 1, nat
if (jat >= iat) cycle
ii = itbl(1, iat)
iid = mol%id(iat)
jj = itbl(1, jat)
jid = mol%id(jat)
vec(:) = mol%xyz(:, jat) - mol%xyz(:, iat)
Expand Down
15 changes: 9 additions & 6 deletions src/disp/dftd4.F90
Original file line number Diff line number Diff line change
Expand Up @@ -2032,22 +2032,25 @@ subroutine atm_gradient_latp &
real(wp), intent(inout) :: sigma(:, :)
real(wp), intent(inout) :: dEdcn(:)

integer :: iat, jat, kat, ati, atj, atk, jtr, ktr
integer :: iat, jat, kat, nat, ati, atj, atk, jtr, ktr
real(wp) :: cutoff2
real(wp) :: rij(3), rjk(3), rik(3), r2ij, r2jk, r2ik
real(wp) :: c6ij, c6jk, c6ik, cij, cjk, cik, scale
real(wp) :: dE, dG(3, 3), dS(3, 3), dCN(3)
real(wp), parameter :: sr = 4.0_wp/3.0_wp

cutoff2 = cutoff**2
nat = len(mol) ! workaround for legacy Intel Fortran compilers

!$omp parallel do default(none) reduction(+:energies, gradient, sigma, dEdcn) &
!$omp shared(mol, r4r2, par, trans, cutoff2, c6, dc6dcn) &
!$omp shared(mol, r4r2, par, trans, cutoff2, c6, dc6dcn, nat) &
!$omp private(iat, ati, jat, atj, kat, atk, c6ij, cij, c6ik, c6jk, cik, cjk, &
!$omp& rij, r2ij, ktr, rik, r2ik, rjk, r2jk, scale, dE, dG, dS, dCN)
do iat = 1, len(mol)
ati = mol%at(iat)
do jat = 1, iat
!$omp& rij, r2ij, ktr, rik, r2ik, rjk, r2jk, scale, dE, dG, dS, dCN) &
!$omp collapse(2) schedule(dynamic,32)
do iat = 1, nat
do jat = 1, nat
if (jat > iat) cycle
ati = mol%at(iat)
atj = mol%at(jat)

c6ij = c6(jat,iat)
Expand Down
38 changes: 21 additions & 17 deletions src/xtb/hamiltonian.f90
Original file line number Diff line number Diff line change
Expand Up @@ -205,19 +205,21 @@ subroutine build_SDQH0(nShell, hData, nat, at, nbf, nao, xyz, trans, selfEnergy,
! --- Aufpunkt for moment operator
point = 0.0_wp

!$omp parallel do default(none) schedule(dynamic) &
!$omp parallel do default(none) &
!$omp shared(nat, xyz, at, nShell, hData, selfEnergy, caoshell, saoshell, &
!$omp& nprim, primcount, alp, cont, intcut, trans, point) &
!$omp private (iat,jat,izp,ci,ra,rb,saw, &
!$omp& rab2,jzp,ish,ishtyp,icao,naoi,iptyp, &
!$omp& jsh,jshmax,jshtyp,jcao,naoj,jptyp,ss,dd,qq,shpoly, &
!$omp& est,alpi,alpj,ab,iprim,jprim,ip,jp,il,jl,hii,hjj,km,zi,zj,zetaij,hav, &
!$omp& mli,mlj,tmp,tmp1,tmp2,iao,jao,ii,jj,k,ij,itr) &
!$omp shared(sint,dpint,qpint,H0)
!$omp shared(sint,dpint,qpint,H0) &
!$omp collapse(2) schedule(dynamic,32)
do iat = 1, nat
ra(1:3) = xyz(1:3,iat)
izp = at(iat)
do jat = 1, iat-1
do jat = 1, nat
if (jat >= iat) cycle
ra(1:3) = xyz(1:3,iat)
izp = at(iat)
jzp = at(jat)
do ish = 1, nShell(izp)
ishtyp = hData%angShell(ish,izp)
Expand Down Expand Up @@ -426,21 +428,22 @@ subroutine build_dSDQH0(nShell, hData, selfEnergy, dSEdcn, intcut, nat, nao, nbf
thr2 = intcut
point = 0.0_wp
! call timing(t1,t3)
!$omp parallel do default(none) schedule(dynamic) &
!$omp parallel do default(none) &
!$omp shared(nat, at, xyz, trans, nShell, hData, selfEnergy, dSEdcn, P, Pew, &
!$omp& ves, vs, vd, vq, intcut, nprim, primcount, caoshell, saoshell, alp, cont) &
!$omp private(iat,jat,ixyz,izp,ci,rij2,jzp,ish,ishtyp, &
!$omp& icao,naoi,iptyp,jsh,jshmax,jshtyp,jcao,naoj,jptyp, &
!$omp& sdq,sdqg,est,alpi,alpj,ab,iprim,jprim,ip,jp,ri,rj,rij,km,shpoly,dshpoly, &
!$omp& mli,mlj,dum,dumdum,tmp,stmp,dtmp,qtmp,il,jl,zi,zj,zetaij,hii,hjj,hav, &
!$omp& iao,jao,ii,jj,k,pij,hij,hpij,g_xyz,itr) &
!$omp reduction(+:g,sigma,dhdcn)
!$omp reduction(+:g,sigma,dhdcn) &
!$omp collapse(2) schedule(dynamic,32)
do iat = 1,nat
ri = xyz(:,iat)
izp = at(iat)
do jat = 1,iat-1
! if (jat.eq.iat) cycle
do jat = 1,nat
if (jat >= iat) cycle
ri = xyz(:,iat)
jzp = at(jat)
izp = at(iat)

do ish = 1,nShell(izp)
ishtyp = hData%angShell(ish,izp)
Expand Down Expand Up @@ -626,7 +629,7 @@ subroutine build_dSDQH0_noreset(nShell, hData, selfEnergy, dSEdcn, intcut, &
thr2 = intcut
point = 0.0_wp
! call timing(t1,t3)
!$omp parallel do default(none) schedule(dynamic) &
!$omp parallel do default(none) &
!$omp shared(nat, at, xyz, nShell, hData, selfEnergy, dSEdcn, P, Pew, &
!$omp& H0, S, ves, vs, vd, vq, intcut, nprim, primcount, caoshell, saoshell, &
!$omp& alp, cont) &
Expand All @@ -635,14 +638,15 @@ subroutine build_dSDQH0_noreset(nShell, hData, selfEnergy, dSEdcn, intcut, &
!$omp& sdq,sdqg,est,alpi,alpj,ab,iprim,jprim,ip,jp,ri,rj,rij,km,shpoly,dshpoly, &
!$omp& mli,mlj,dum,dumdum,tmp,dtmp,qtmp,il,jl,zi,zj,zetaij,hii,hjj,hav, &
!$omp& iao,jao,ii,jj,k,pij,hij,hpij,g_xyz,itr) &
!$omp reduction(+:g,sigma,dhdcn)
!$omp reduction(+:g,sigma,dhdcn) &
!$omp collapse(2) schedule(dynamic,32)
do iat = 1,nat
ri = xyz(:,iat)
izp = at(iat)
do jat = 1,iat-1
! if (jat.eq.iat) cycle
do jat = 1,nat
if (jat >= iat) cycle
izp = at(iat)
jzp = at(jat)

ri = xyz(:,iat)
rj = xyz(:,jat)
rij = ri - rj
rij2 = sum( rij**2 )
Expand Down