From 512d4f4954bfff1fb31f94df7f736275fb746597 Mon Sep 17 00:00:00 2001 From: "Igor S. Gerasimov" Date: Sat, 1 Feb 2025 12:23:06 +0100 Subject: [PATCH 1/2] Avoid division by zero at first optimization step Signed-off-by: Igor S. Gerasimov --- src/optimizer.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/optimizer.f90 b/src/optimizer.f90 index d9002c392..27e09fabd 100644 --- a/src/optimizer.f90 +++ b/src/optimizer.f90 @@ -850,7 +850,7 @@ subroutine relax(env,iter,mol,anc,restart,maxcycle,maxdispl,ethr,gthr, & write(env%unit,'(5x,"change ",e18.7,1x,"Eh")') echng write(env%unit,'(3x,"gradient norm :",f14.7,1x,"Eh/α")',advance='no') gnorm write(env%unit,'(3x,"predicted",e18.7)',advance='no') depred - write(env%unit,'(1x,"("f7.2"%)")') (depred-echng)/echng*100 + write(env%unit,'(1x,"("f7.2"%)")') (depred-echng)/(echng+1e-34_wp)*100 endif ! check 0 energy case ! From dbafc6e558d7203bf343f4836e850617eb067422 Mon Sep 17 00:00:00 2001 From: "Igor S. Gerasimov" Date: Sat, 1 Feb 2025 12:27:18 +0100 Subject: [PATCH 2/2] Avoid division by zero during computing dPhi/dR for torsions Signed-off-by: Igor S. Gerasimov --- src/constr.f90 | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/src/constr.f90 b/src/constr.f90 index 74090f13b..cfb7826f7 100644 --- a/src/constr.f90 +++ b/src/constr.f90 @@ -613,7 +613,11 @@ Subroutine dphidrPBC(mode,nat,xyz,i,j,k,l,vTrR,vTrB,vTrC,phi,& dphidrj=0 dphidrk=0 dphidrl=0 - onenner=1.0d0/(nan*nbn) + if (abs(nan*nbn).gt.eps) then + onenner=1.0d0/(nan*nbn) + else + onenner=0.0d0 + endif else onenner=1.d0/nenner endif @@ -630,21 +634,27 @@ Subroutine dphidrPBC(mode,nat,xyz,i,j,k,l,vTrR,vTrB,vTrC,phi,& call crossprod(rbpc,na,rbpca) call crossprod(rbpc,nb,rbpcb) - ! ... dphidri - do ic=1,3 - dphidri(ic)=onenner*(cosphi*nbn/nan*rab(ic)-rbb(ic)) - - ! ... dphidrj - dphidrj(ic)=onenner*(cosphi*(nbn/nan*rapba(ic)& - & +nan/nbn*rbc(ic))& - & -(rac(ic)+rapbb(ic))) - ! ... dphidrk - dphidrk(ic)=onenner*(cosphi*(nbn/nan*raa(ic)& - & +nan/nbn*rbpcb(ic))& - & -(rba(ic)+rbpca(ic))) - ! ... dphidrl - dphidrl(ic)=onenner*(cosphi*nan/nbn*rbb(ic)-rab(ic)) - end do + if (abs(onenner).gt.eps) then + do ic=1,3 + ! ... dphidri + dphidri(ic)=onenner*(cosphi*nbn/nan*rab(ic)-rbb(ic)) + ! ... dphidrj + dphidrj(ic)=onenner*(cosphi*(nbn/nan*rapba(ic)& + & +nan/nbn*rbc(ic))& + & -(rac(ic)+rapbb(ic))) + ! ... dphidrk + dphidrk(ic)=onenner*(cosphi*(nbn/nan*raa(ic)& + & +nan/nbn*rbpcb(ic))& + & -(rba(ic)+rbpca(ic))) + ! ... dphidrl + dphidrl(ic)=onenner*(cosphi*nan/nbn*rbb(ic)-rab(ic)) + end do + else + dphidri=0.0d0 + dphidrj=0.0d0 + dphidrk=0.0d0 + dphidrl=0.0d0 + endif End subroutine