lammps/lib/reax/reax_reac.F

313 lines
9.6 KiB
Fortran

**********************************************************************
* *
* REAXFF Reactive force field program *
* *
* Developed and written by Adri van Duin, duin@wag.caltech.edu *
* *
* Copyright (c) 2001-2010 California Institute of Technology *
* *
* This is an open-source program. Feel free to modify its *
* contents. Please keep me informed of any useful modification *
* or addition that you made. Please do not distribute this *
* program to others; if people are interested in obtaining *
* a copy of this program let them contact me first. *
* *
**********************************************************************
**********************************************************************
* *
* REAXFF Reactive force field program *
* *
* Developed and written by Adri van Duin, duin@wag.caltech.edu *
* *
* Copyright (c) 2001-2010 California Institute of Technology *
* *
* This is an open-source program. Feel free to modify its *
* contents. Please keep me informed of any useful modification *
* or addition that you made. Please do not distribute this *
* program to others; if people are interested in obtaining *
* a copy of this program let them contact me first. *
* *
**********************************************************************
**********************************************************************
subroutine encalc
**********************************************************************
#include "cbka.blk"
#include "cbkc.blk"
#include "cbkcha.blk"
#include "cbkconst.blk"
#include "cbkd.blk"
#include "cbkdcell.blk"
#include "cbkenergies.blk"
#include "cellcoord.blk"
#include "control.blk"
#include "small.blk"
**********************************************************************
* *
* Calculate energy and first derivatives *
* *
**********************************************************************
c$$$ if (ndebug.eq.1) then
c$$$C open (65,file='fort.65',status='unknown',access='append')
c$$$ write (65,*) 'In encalc'
c$$$ call timer(65)
c$$$ close (65)
c$$$ end if
estrc=0.0
do i1=1,na
do i2=1,3
d(i2,i1)=0.0
estrain(i1)=0.0
end do
end do
eb=zero
ea=zero
elp=zero
emol=zero
ev=zero
ehb=zero
ecoa=zero
epen=zero
et=zero
eco=zero
eres=zero
eradbo=zero
efi=zero
if(Lvirial.eq.1) then
do k1 = 1,6
virial(k1) = zero
end do
endif
if (Latomvirial.eq.1) then
do i1=1,na
do i2=1,6
atomvirial(i2,i1)=0.0
end do
end do
endif
call boncor
call lonpar
call covbon
call ovcor
call srtang !Determine valency angles
call srttor !Determine torsion angles
* call srtoop !Determine out of plane angles
call srthb !Determine hydrogen bonds
call calval
call valang
* call oopang
call torang
call hbond
!print *, 'called hbond'
!print *, nchaud
call nonbon
call efield
call restraint
c
c Use this to print out fort.73-style energies
c It only works correctly in serial mode
c
c write (6,'(i8,1x,14(f21.10,1x))')mdstep+nprevrun,eb,ea,elp,
c $emol,ev+epen,ecoa,ehb,et,eco,ew,ep,ech,efi
estrc=eb+ea+elp+ev+ecoa+emol+epen+et+ehb+eco+ew+ep+ncha2*ech+efi
if (estrc.gt.zero) return
if (estrc.le.zero) then
goto 10
else
write (*,*)mdstep
write (92,*)eb,ea,elp,ev,ecoa,emol,epen,eoop,et,eco,ew,
$ep,ech,eres,eradbo
stop 'Energy not a number'
end if
10 continue
return
end
**********************************************************************
**********************************************************************
subroutine reaxinit
**********************************************************************
#include "cbka.blk"
#include "cbkatomcoord.blk"
#include "cbkc.blk"
#include "cbkcha.blk"
#include "cbkconst.blk"
#include "cbkdcell.blk"
#include "cbkdistan.blk"
#include "cbkenergies.blk"
#include "cbkia.blk"
#include "cbkimove.blk"
#include "cbkinit.blk"
#include "cbktregime.blk"
#include "cellcoord.blk"
#include "control.blk"
#include "opt.blk"
#include "small.blk"
**********************************************************************
c$$$ if (ndebug.eq.1) then
c$$$C open (65,file='fort.65',status='unknown',access='append')
c$$$ write (65,*) 'In init'
c$$$ call timer(65)
c$$$ close (65)
c$$$ end if
**********************************************************************
* *
* Initialize variables *
* *
**********************************************************************
convmd=4.184*1.0d26
pi=3.14159265
avognr=6.0221367d23
rdndgr=180.0/pi
dgrrdn=1.0/rdndgr
rgasc=8.314510
caljou=4.184
xjouca=1.0/caljou
ech=zero
zero=0.0
one=1.0
two=2.0
three=3.0
half=one/two
nzero=0
none=1
ntwo=2
nthree=3
invt=0
ndata2=0
iheatf=0
nradcount=0
itemp=1
xinh=zero
ifieldx=0
ifieldy=0
ifieldz=0
mdstep=0
kx=0
ky=0
kz=0
nit=0
nbon=0
angle(1)=90.0
angle(2)=90.0
angle(3)=90.0
axiss(1)=zero
axiss(2)=zero
axiss(3)=zero
do i1=1,nat
id(i1,1)=0
id(i1,2)=0
id(i1,3)=0
end do
icgeo=0
sumhe=zero
ustime=zero
systime=zero
vpmax=zero
vpmin=zero
dseed=0
iagain=0
do i1=1,nat
do i2=1,mbond+3
ia(i1,i2)=0
iag(i1,i2)=0
end do
end do
ioldchg=0
na=0
nrestra=0
nrestrav=0
nrestrat=0
nrestram=0
tset=tsetor
tm11=axis(1)
tm21=zero
tm31=zero
tm22=axis(2)
tm32=zero
tm33=axis(3)
qruid='NORMAL RUN'
c$$$ do i1=1,nat
c$$$ imove(i1)=1
c$$$ end do
**********************************************************************
* *
* Write file headers *
* *
**********************************************************************
Cc open (71,file='fort.71',status='unknown',access='append')
c write (71,10)
c close (71)
Cc open (73,file='fort.73',status='unknown',access='append')
c write (73,20)
c close (73)
c if (ntrc.gt.0) then
Cc open (75,file='fort.75',status='unknown',access='append')
c write (75,30)
c close (75)
c end if
c if (nmethod.eq.4) then
Cc open (59,file='fort.59',status='unknown',access='append')
c write (59,40)
c close (59)
c end if
return
**********************************************************************
* *
* Format part *
* *
**********************************************************************
10 format (' Iter. Nmol Epot Ekin Etot ',
$' T(K) Eaver(block) Eaver(total) Taver Tmax ',
$' Pres(MPa) sdev(Epot) sdev(Eaver) Tset Timestep',
$' RMSG Totaltime')
20 format (' Iter. Ebond Eatom Elp Emol',
$' Eval Ecoa Ehbo Etors Econj',
$' Evdw Ecoul Echarge Efield')
30 format (' Iter. Tsys Tzone1 Tset1 Tzone2 Tset2')
40 format (' Iter. a b c px',
$'(MPa) py(MPa) pz(MPa) pset(MPa) Volume ')
end
**********************************************************************
************************************************************************
c subroutine timer(nunit)
************************************************************************
c#include "cbka.blk"
c#include "cbkinit.blk"
c real timear
c real tarray(2)
c#ifdef _IBM
c call dtime_(tarray,timear)
c#else
c call dtime(tarray,timear)
c#endif
c ustime=ustime+tarray(1)
c systime=systime+tarray(2)
c write (nunit,100)ustime,systime,ustime+systime
c return
c 100 format ('User time:',f20.4,' System time:',f20.4,
c $' Total time:',f20.4)
c end
************************************************************************
************************************************************************