From a664ca6e245f3dfaa644d43b3d81b12a6efeeb29 Mon Sep 17 00:00:00 2001 From: Susi Lehtola Date: Tue, 18 Apr 2023 13:41:07 +0300 Subject: [PATCH 1/5] Ensure that metadynamics bias reference geometry differs by at least 1e-6 from the initial geometry Signed-off-by: Susi Lehtola --- src/dynamic.f90 | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/dynamic.f90 b/src/dynamic.f90 index ae617b260..aedcac353 100644 --- a/src/dynamic.f90 +++ b/src/dynamic.f90 @@ -174,10 +174,11 @@ subroutine md(env,mol,chk,calc, & real(wp) :: step,eel1,tstep,taut,xlam2,accu,driftthr real(wp) :: Ekin,tmass,f,mintime - real(wp) :: Tinit,Tav,T,epav,ekav,dav,cma(3),bave,bavt,dum2 + real(wp) :: Tinit,Tav,T,epav,ekav,dav,cma(3),bave,bavt real(wp) :: dum,edum,eerror,xx(10),molmass,slope,maxtime real(wp) :: tstep0,tmax,nfreedom,t0,w0,t1,w1,ep_prec,rege(4) real(wp) :: tors(mol%n),be(3),b0(3),tor,dip(3) + real(wp) :: rcoord(3), rnorm logical :: ex,thermostat,restart,confdump,equi,gmd,ldum integer :: i,j,k,ic,jc,ia,ja,ii,jj,ndum,cdump,nmax,ibin @@ -200,13 +201,14 @@ subroutine md(env,mol,chk,calc, & integer :: ich,trj,pdb,imdl logical :: exist + ! Displace reference geometry by 1e-6 + real(wp), parameter :: atom_displacement = 1.0e-6_wp + type(metadyn_setvar) :: metasetlocal real(wp) :: emtd real(wp) :: metatime metatime = 0.0_wp - - call delete_file('xtbmdok') if(icall.eq.0)then @@ -342,10 +344,23 @@ subroutine md(env,mol,chk,calc, & endif if (metasetlocal%nstruc.eq.0) then do i = 1, mol%n - do j = 1, 3 - call random_number(dum2) - metasetlocal%xyz(j,i,1) = mol%xyz(j,i) + 1.0e-6_wp*dum2 + ! Generate randomly displaced geometry + do while(.true.) + rnorm = 0.0_wp + do j = 1, 3 + call random_number(rcoord(j)) + rnorm = rnorm + rcoord(j)**2 + enddo + ! Ensure that displacement is large enough so that it + ! can be normalized to the unit sphere + if(rnorm .ge. 1e-8) then + exit + endif enddo + ! Normalize displacement to the unit sphere + rcoord = rcoord/sqrt(rnorm) + ! Assign displaced geometry + metasetlocal%xyz(j,i,1) = mol%xyz(j,i) + atom_displacement*rcoord(j) enddo metasetlocal%nstruc = 1 else From 5aaa2ea81916e817e23ea59c2a9071b89afebc67 Mon Sep 17 00:00:00 2001 From: Susi Lehtola Date: Sat, 22 Apr 2023 13:47:38 +0300 Subject: [PATCH 2/5] Update src/dynamic.f90 Co-authored-by: Sebastian Ehlert <28669218+awvwgk@users.noreply.github.com> Signed-off-by: Susi Lehtola --- src/dynamic.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dynamic.f90 b/src/dynamic.f90 index aedcac353..c0638f517 100644 --- a/src/dynamic.f90 +++ b/src/dynamic.f90 @@ -345,7 +345,7 @@ subroutine md(env,mol,chk,calc, & if (metasetlocal%nstruc.eq.0) then do i = 1, mol%n ! Generate randomly displaced geometry - do while(.true.) + do rnorm = 0.0_wp do j = 1, 3 call random_number(rcoord(j)) From 8377793eeb9a4972a4de60a1137f9d455df39e9c Mon Sep 17 00:00:00 2001 From: Susi Lehtola Date: Sat, 22 Apr 2023 13:47:49 +0300 Subject: [PATCH 3/5] Update src/dynamic.f90 Co-authored-by: Sebastian Ehlert <28669218+awvwgk@users.noreply.github.com> Signed-off-by: Susi Lehtola --- src/dynamic.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dynamic.f90 b/src/dynamic.f90 index c0638f517..7f3f01704 100644 --- a/src/dynamic.f90 +++ b/src/dynamic.f90 @@ -353,7 +353,7 @@ subroutine md(env,mol,chk,calc, & enddo ! Ensure that displacement is large enough so that it ! can be normalized to the unit sphere - if(rnorm .ge. 1e-8) then + if(rnorm >= 1e-8) then exit endif enddo From 8d7e0ef42c09d33429471bf89c5c756b16c0bbd3 Mon Sep 17 00:00:00 2001 From: Susi Lehtola Date: Sat, 22 Apr 2023 13:52:40 +0300 Subject: [PATCH 4/5] Replace loops with intrinsic functions Signed-off-by: Susi Lehtola --- src/dynamic.f90 | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/dynamic.f90 b/src/dynamic.f90 index 7f3f01704..589ba02fa 100644 --- a/src/dynamic.f90 +++ b/src/dynamic.f90 @@ -178,7 +178,7 @@ subroutine md(env,mol,chk,calc, & real(wp) :: dum,edum,eerror,xx(10),molmass,slope,maxtime real(wp) :: tstep0,tmax,nfreedom,t0,w0,t1,w1,ep_prec,rege(4) real(wp) :: tors(mol%n),be(3),b0(3),tor,dip(3) - real(wp) :: rcoord(3), rnorm + real(wp) :: rcoord(3) logical :: ex,thermostat,restart,confdump,equi,gmd,ldum integer :: i,j,k,ic,jc,ia,ja,ii,jj,ndum,cdump,nmax,ibin @@ -346,19 +346,18 @@ subroutine md(env,mol,chk,calc, & do i = 1, mol%n ! Generate randomly displaced geometry do - rnorm = 0.0_wp - do j = 1, 3 - call random_number(rcoord(j)) - rnorm = rnorm + rcoord(j)**2 - enddo + ! Generate numbers in [0,1] + call random_number(rcoord) + ! Convert numbers to [-1, 1] + rcoord = 2.0_wp*rcoord-1.0_wp ! Ensure that displacement is large enough so that it ! can be normalized to the unit sphere - if(rnorm >= 1e-8) then + if(norm2(rcoord) >= 1e-8) then exit endif enddo ! Normalize displacement to the unit sphere - rcoord = rcoord/sqrt(rnorm) + rcoord = rcoord/norm2(rcoord) ! Assign displaced geometry metasetlocal%xyz(j,i,1) = mol%xyz(j,i) + atom_displacement*rcoord(j) enddo From 1fc10d246adb5ba5b13dc7bb38fadeb8b22b78d9 Mon Sep 17 00:00:00 2001 From: Sebastian Ehlert <28669218+awvwgk@users.noreply.github.com> Date: Tue, 25 Apr 2023 18:35:36 +0200 Subject: [PATCH 5/5] Minor fix --- src/dynamic.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dynamic.f90 b/src/dynamic.f90 index 589ba02fa..98bfb4338 100644 --- a/src/dynamic.f90 +++ b/src/dynamic.f90 @@ -359,7 +359,7 @@ subroutine md(env,mol,chk,calc, & ! Normalize displacement to the unit sphere rcoord = rcoord/norm2(rcoord) ! Assign displaced geometry - metasetlocal%xyz(j,i,1) = mol%xyz(j,i) + atom_displacement*rcoord(j) + metasetlocal%xyz(:,i,1) = mol%xyz(:,i) + atom_displacement*rcoord enddo metasetlocal%nstruc = 1 else