From c67bcb5e52f0b7e4ed131d0bc587bef89d87f447 Mon Sep 17 00:00:00 2001 From: Ivan Carnimeo Date: Mon, 28 Jun 2021 09:14:42 +0200 Subject: [PATCH] DFT-D3: clock print --- PW/src/print_clock_pw.f90 | 5 +++++ dft-d3/api.f90 | 28 ++++++++++++++++------------ dft-d3/core.f90 | 24 ++++++++++++++++++++---- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/PW/src/print_clock_pw.f90 b/PW/src/print_clock_pw.f90 index 71e38267c..ef9eba813 100644 --- a/PW/src/print_clock_pw.f90 +++ b/PW/src/print_clock_pw.f90 @@ -72,6 +72,11 @@ SUBROUTINE print_clock_pw() CALL print_clock( 'vdW_ffts' ) CALL print_clock( 'vdW_v' ) CALL print_clock( 'vdW_kernel' ) + CALL print_clock( 'dftd3' ) + CALL print_clock( 'dftd3:edisp' ) + CALL print_clock( 'dftd3:three' ) + CALL print_clock( 'dftd3:ncoor' ) + CALL print_clock( 'dftd3:gdisp' ) IF (lxdm) THEN CALL print_clock('energy_xdm') diff --git a/dft-d3/api.f90 b/dft-d3/api.f90 index 850a855f2..53277991b 100644 --- a/dft-d3/api.f90 +++ b/dft-d3/api.f90 @@ -242,6 +242,8 @@ contains real(wp) :: rtmp3(3) integer :: rep_cn(3), rep_vdw(3) + Call start_clock('dftd3') + if (present(grads) .neqv. present(stress)) then write(*,*) "!!! Error in dftd3_pbc_dispersion" write(*,*) "Either both grads and stress must be present or none of them" @@ -268,20 +270,22 @@ contains & this%rthr, rep_vdw, this%cn_thr, rep_cn) disp = -e6 * this%s6 - e8 * this%s18 - e6abc - if (.not. present(grads)) then - return - end if + if (present(grads)) then - grads(:,:) = 0.0_wp - call pbcgdisp(max_elem, maxc, natom, coords, izp, this%c6ab, this%mxc, & - & r2r4, this%r0ab, rcov, s6, s18, rs6, rs8, rs10, alp6, alp8, alp10, & - & this%noabc, this%numgrad, this%version, grads, disp2, gnorm, & - & stress, latvecs, rep_vdw, rep_cn, this%rthr, .false., this%cn_thr) - ! Note, the stress variable in pbcgdisp contains the *lattice derivatives* - ! on return, so it needs to be converted to obtain the stress tensor. - stress(:,:) = -matmul(stress, transpose(latvecs))& - & / abs(determinant(latvecs)) + grads(:,:) = 0.0_wp + call pbcgdisp(max_elem, maxc, natom, coords, izp, this%c6ab, this%mxc, & + & r2r4, this%r0ab, rcov, s6, s18, rs6, rs8, rs10, alp6, alp8, alp10, & + & this%noabc, this%numgrad, this%version, grads, disp2, gnorm, & + & stress, latvecs, rep_vdw, rep_cn, this%rthr, .false., this%cn_thr) + ! Note, the stress variable in pbcgdisp contains the *lattice derivatives* + ! on return, so it needs to be converted to obtain the stress tensor. + stress(:,:) = -matmul(stress, transpose(latvecs))& + & / abs(determinant(latvecs)) + end if + + Call stop_clock('dftd3') + end subroutine dftd3_pbc_dispersion diff --git a/dft-d3/core.f90 b/dft-d3/core.f90 index f2a3a0d69..f84eb41bb 100644 --- a/dft-d3/core.f90 +++ b/dft-d3/core.f90 @@ -2455,6 +2455,8 @@ contains real(wp) dx,dy,dz,r,damp,xn,rr,rco,tau(3) real(wp), INTENT(IN) :: crit_cn + call start_clock('dftd3:ncoor') + do i=1,natoms xn=0.0d0 do iat=1,natoms @@ -2485,6 +2487,8 @@ contains cn(i)=xn end do + call stop_clock('dftd3:ncoor') + end subroutine pbcncoord @@ -2520,6 +2524,7 @@ contains real(wp) bj_dmp6,bj_dmp8 real(wp) tmp1,tmp2 + call start_clock('dftd3:edisp') e6 =0 e8 =0 @@ -2806,12 +2811,15 @@ contains end if + if (.not.noabc) then - if (noabc)return + ! compute non-additive third-order energy using averaged C6 + call pbcthreebody(max_elem,xyz,lat,n,iz,rep_cn,crit_cn,& + & cc6ab,r0ab,e63) - ! compute non-additive third-order energy using averaged C6 - call pbcthreebody(max_elem,xyz,lat,n,iz,rep_cn,crit_cn,& - & cc6ab,r0ab,e63) + end if + + call stop_clock('dftd3:edisp') end subroutine pbcedisp @@ -2841,6 +2849,8 @@ contains INTEGER, DIMENSION(3) :: repmin,repmax ! REAL(WP) :: time1,time2 + call start_clock('dftd3:three') + counter=0 eabc=0.0d0 abcthr=cnthr @@ -3141,6 +3151,8 @@ contains end do + call stop_clock('dftd3:three') + end subroutine pbcthreebody @@ -3211,6 +3223,8 @@ contains real(wp) abcthr,time1,time2,geomean2,r0av,dc9,dfdmp,dang,ang integer,dimension(3) ::repv,repmin,repmax,repmin2,repmax2 + call start_clock('dftd3:gdisp') + ! R^2 cut-off rthr=crit_vdw abcthr=crit_cn @@ -4665,6 +4679,8 @@ contains write(*,*)'|G(stress)|=',gnorm end if + call stop_clock('dftd3:gdisp') + end subroutine pbcgdisp