1 SUBROUTINE FMAT(FMATRX, NREAL, TSCF, TDER, DELDIP, HEAT)
2 IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4 DIMENSION FMATRX(*), DELDIP(3,*)
5 ***********************************************************************
7 * VALUE CALCULATES THE SECOND-ORDER OF THE ENERGY WITH
8 * RESPECT TO THE CARTESIAN COORDINATES I AND J AND PLACES IT
11 * ON INPUT NATOMS = NUMBER OF ATOMS IN THE SYSTEM.
12 * XPARAM = INTERNAL COORDINATES OF MOLECULE STORED LINEARLY
15 * COORDL = ARRAY OF CARTESIAN COORDINATES, STORED LINEARLY.
16 * I = INDEX OF CARTESIAN COORDINATE.
17 * J = INDEX OF CARTESIAN COORDINATE.
19 * ON OUTPUT FMATRX = SECOND DERIVATIVE OF THE ENERGY WITH RESPECT TO
20 * CARTESIAN COORDINATES I AND J.
21 ***********************************************************************
22 COMMON /KEYWRD/ KEYWRD
23 COMMON /GEOKST/ NATOMS,LABELS(NUMATM),
24 1 NA(NUMATM),NB(NUMATM),NC(NUMATM)
25 COMMON /GEOVAR/ NVAR,LOC(2,MAXPAR),IDUMY, DUMY(MAXPAR)
26 COMMON /DENSTY/ P(MPACK),PDUMY(2,MPACK)
27 COMMON /TIMDMP/ TLEFT, TDUMP
28 COMMON /ATMASS/ ATMASS(NUMATM)
30 COMMON /CORE / CORE(107)
31 COMMON /MOLKST/ NUMAT,NAT(NUMATM),NFIRST(NUMATM),NMIDLE(NUMATM),
32 1 NLAST(NUMATM), NORBS, NELECS,NALPHA,NBETA,
33 2 NCLOSE,NOPEN,NDUMY,FRACT
34 COMMON /COORD / COORD(3,NUMATM)
35 COMMON /NLLCOM/ EVECS(MAXPAR*MAXPAR),BMAT(MAXPAR,MAXPAR*2)
36 DIMENSION GRAD(MAXPAR),
37 1GROLD(MAXPAR), COORDL(MAXPAR), Q(NUMATM), DEL2(3), G2OLD(MAXPAR)
38 2, EIGS(MAXPAR), G2RAD(MAXPAR),
42 LOGICAL DEBUG, RESTRT, PRNT, RESFIL, PRECIS, BIG, LOG
43 EQUIVALENCE (COORD(1,1),COORDL(1))
46 C FACT IS THE CONVERSION FACTOR FROM KCAL/MOLE TO ERGS
48 C SET UP CONSTANTS AND FLAGS
51 C SET UP THE VARIABLES IN XPARAM ANDLOC,THESE ARE IN CARTESIAN COORDINA
56 IF(LABELS(I).NE.99.AND.LABELS(I).NE.107) THEN
58 LABELS(NUMAT)=LABELS(I)
63 C THIS IS A QUICK, IF CLUMSY, WAY TO CALCULATE NUMAT, AND TO REMOVE
64 C THE DUMMY ATOMS FROM THE ARRAY LABELS.
80 PRNT =(INDEX(KEYWRD,'IRC=') .EQ. 0)
81 LOG =(INDEX(KEYWRD,'NOLOG') .EQ. 0)
82 PRECIS =(INDEX(KEYWRD,'PREC') .NE. 0)
83 RESTRT =(INDEX(KEYWRD,'RESTART') .NE. 0)
84 IF(INDEX(KEYWRD,'NLLSQ') .NE. 0) RESTRT=.FALSE.
85 DEBUG =(INDEX(KEYWRD,'FMAT') .NE. 0)
86 BIG =(INDEX(KEYWRD,'LARGE') .NE. 0 .AND. DEBUG)
87 IF(PRNT)WRITE(6,'(//4X,''FIRST DERIVATIVES WILL BE USED IN THE''
88 1,'' CALCULATION OF SECOND DERIVATIVES'')')
94 CALL FORSAV(TOTIME,DELDIP,ISTART,FMATRX, COORD, NVAR,HEAT,
95 1 EVECS,JSTART,FCONST)
96 KOUNTF=(ISTART*(ISTART+1))/2
103 IF (TSCF.GT.0.D0)TLEFT=TLEFT-TSCF-TDER
108 ESTIME=(NVAR-ISTART+1)*TOTIME/(ISTART-1.D0)
110 ESTIME=NVAR*(TSCF+TDER)*2.D0
111 IF (PRECIS) ESTIME=ESTIME*2.D0
114 1WRITE(6,'(/10X,''ESTIMATED TIME TO COMPLETE CALCULATION =''
115 2,F9.2,'' SECONDS'')')ESTIME
118 1 WRITE(6,'(/10X,''STARTING AGAIN AT LINE'',18X,I4)')ISTART
119 WRITE(6,'(/10X,''TIME USED UP TO RESTART ='',F22.2)')TOTIME
130 C DETERMINE A GOOD STEP SIZE
133 COORDL(I)=COORDL(I)+DELTA
134 CALL COMPFG(COORDL, .TRUE., ESCF, .TRUE., G2OLD, .TRUE.)
135 COORDL(I)=COORDL(I)-DELTA
136 DELTA=DELTA*10.D0/SQRT(DOT(G2OLD,G2OLD,NVAR))
138 C CONSTRAIN DELTA TO A 'REASONABLE' VALUE
140 DELTA=MIN(0.05D0,MAX(0.005D0,DELTA))
141 IF(DEBUG)WRITE(6,'(A,I3,A,F12.5)')' STEP:',I,' DELTA :',DELT
144 COORDL(I)=COORDL(I)+DELTA
145 CALL COMPFG(COORDL, .TRUE., ESCF, .TRUE., G2OLD, .TRUE.)
146 IF(DEBUG)WRITE(6,'(A,F12.5)')' GNORM +1.0*DELTA',
147 1SQRT(DOT(G2OLD,G2OLD,NVAR))
148 COORDL(I)=COORDL(I)-DELTA*2.D0
150 CALL COMPFG(COORDL, .TRUE., HEATAA, .TRUE., G2RAD, .TRUE.)
151 COORDL(I)=COORDL(I)+DELTA
152 IF(DEBUG)WRITE(6,'(A,F12.5)')' GNORM -1.0*DELTA',
153 1SQRT(DOT(G2RAD,G2RAD,NVAR))
155 IF(DEBUG)WRITE(6,'(A,I3,A,F12.5)')' STEP:',I,' DELTA :',DELT
158 COORDL(I)=COORDL(I)+0.5D0*DELTA
160 CALL COMPFG(COORDL, .TRUE., ESCF, .TRUE., GROLD, .TRUE.)
161 IF(DEBUG)WRITE(6,'(A,F12.5)')' GNORM +0.5*DELTA',
162 1SQRT(DOT(GROLD,GROLD,NVAR))
165 60 Q(II)=CORE(LABELS(II))-Q(II)
166 SUM = DIPOLE(P,Q,COORDL,DELDIP(1,I),0)
167 COORDL(I)=COORDL(I)-DELTA
169 CALL COMPFG(COORDL, .TRUE., HEATAA, .TRUE., GRAD, .TRUE.)
170 IF(DEBUG)WRITE(6,'(A,F12.5)')' GNORM -0.5*DELTA',
171 1SQRT(DOT(GRAD,GRAD,NVAR))
174 70 Q(II)=CORE(LABELS(II))-Q(II)
175 SUM = DIPOLE(P,Q,COORDL,DEL2,0)
176 COORDL(I)=COORDL(I)+DELTA*0.5D0
177 DELDIP(1,I)=(DELDIP(1,I)-DEL2(1))*0.5D0/DELTA
178 DELDIP(2,I)=(DELDIP(2,I)-DEL2(2))*0.5D0/DELTA
179 DELDIP(3,I)=(DELDIP(3,I)-DEL2(3))*0.5D0/DELTA
187 C G2OLD = X + 1.0*DELTA
188 C GROLD = X + 0.5*DELTA
189 C GRAD = X - 0.5*DELTA
190 C G2RAD = X - 1.0*DELTA
192 DUMY(L)= (8.D0*(GROLD(L)-GRAD(L))-(G2OLD(L)-G2RAD(L)))
194 EIGS(L)=(2.D0*(GROLD(L)-GRAD(L))-(G2OLD(L)-G2RAD(L)))
195 1 /DELTA**3*FACT/56.D0
197 C CORRECT FOR 4'TH ORDER CONTAMINATION
199 C# CORR=MIN(ABS(DUMY(L)),ABS(EIGS(L))*0.0001D0)
200 C# DUMY(L)=DUMY(L)-SIGN(CORR,DUMY(L))
201 FMATRX(KOUNTF)=FMATRX(KOUNTF)+DUMY(L)
207 DUMY(L)=(8.D0*(GROLD(L)-GRAD(L))-(G2OLD(L)-G2RAD(L)))
209 EIGS(L)=(2.D0*(GROLD(L)-GRAD(L))-(G2OLD(L)-G2RAD(L)))
210 1 /DELTA**3*FACT/56.D0
212 C CORRECT FOR 4'TH ORDER CONTAMINATION
214 C# CORR=MIN(ABS(DUMY(L)),ABS(EIGS(L))*0.0001D0)
215 C# DUMY(L)=DUMY(L)-SIGN(CORR,DUMY(L))
216 FMATRX(KK)=FMATRX(KK)+DUMY(L)
221 DUMY(L)=((GROLD(L)-GRAD(L)))*0.25D0/DELTA*FACT
222 FMATRX(KOUNTF)=FMATRX(KOUNTF)+DUMY(L)
228 DUMY(L)=((GROLD(L)-GRAD(L)))*0.25D0/DELTA*FACT
229 FMATRX(KK)=FMATRX(KK)+DUMY(L)
233 WRITE(6,'(A)')' CONTRIBUTIONS TO F-MATRIX'
234 WRITE(6,'(A)')' ELEMENT +1.0*DELTA +0.5*DELTA -0.5*DEL'
235 1//'TA -1.0*DELTA 2''ND ORDER 4TH ORDER'
236 WRITE(6,'(I7,6F12.6)')(L,G2OLD(L),GROLD(L),GRAD(L),G2RAD(L),
237 1DUMY(L),EIGS(L),L=1,NVAR)
241 TLEFT= MAX(0.1D0,TLEFT-TSTEP)
242 IF(TSTEP.GT.1.D6)TSTEP=TSTEP-1.D6
245 WRITE(6,'('' STEP:'',I4,'' RESTART FILE WRITTEN, INTEGRAL ='
246 1',F10.2,'' TIME LEFT:'',F10.2)')I,TOTIME,TLEFT
247 WRITE(0,'('' STEP:'',I4,'' RESTART FILE WRITTEN, INTEGRAL ='
248 1',F10.2,'' TIME LEFT:'',F10.2)')I,TOTIME,TLEFT
249 IF(LOG)WRITE(11,'('' STEP:'',I4,'' RESTART FILE WRITTEN, '',
250 +''INTEGRAL ='',F10.2,'' TIME LEFT:'',F10.2)')I,TOTIME,TLEFT
253 WRITE(6,'('' STEP:'',I4,'' TIME ='',F9.2,'' SECS, INTEGRAL =
254 1'',F10.2,'' TIME LEFT:'',F10.2)')I,TSTEP,TOTIME,TLEFT
255 WRITE(0,'('' STEP:'',I4,'' TIME ='',F9.2,'' SECS, INTEGRAL =
256 1'',F10.2,'' TIME LEFT:'',F10.2)')I,TSTEP,TOTIME,TLEFT
257 IF(LOG) WRITE(11,'('' STEP:'',I4,'' TIME ='',F9.2,'' SECS, '',
258 +''INTEGRAL ='',F10.2,'' TIME LEFT:'',F10.2)')I,TSTEP,TOTIME,TLEFT
261 IF(TLAST-TLEFT.GT.TDUMP)THEN
266 CALL FORSAV(TOTIME,DELDIP,II,FMATRX, COORD,NVAR,HEAT,
267 1 EVECS,JSTART,FCONST)
269 IF(I.NE.NVAR.AND.TLEFT-10.D0 .LT. ESTIM) THEN
270 WRITE(6,'(//10X,''- - - - - - - TIME UP - - - - - - -'',//)'
272 WRITE(6,'(/10X,'' POINT REACHED ='',I4)')I
273 WRITE(6,'(/10X,'' RESTART USING KEY-WORD "RESTART"'')')
274 WRITE(6,'(10X,''ESTIMATED TIME FOR THE NEXT STEP ='',F8.2,
275 1'' SECONDS'')')ESTIM
278 CALL FORSAV(TOTIME,DELDIP,II,FMATRX, COORD,NVAR,HEAT,
279 1 EVECS,JSTART,FCONST)
280 WRITE(6,'(//10X,''FORCE MATRIX WRITTEN TO DISK'')')
286 IF(ATMASS(I).LT.1.D-20.AND.LABELS(I).LT.99)THEN
287 CALL FORSAV(TOTIME,DELDIP,NVAR,FMATRX, COORD,NVAR,HEAT,
288 1 EVECS,ILOOP,FCONST)
289 WRITE(6,'(A)')' AT LEAST ONE ATOM HAS A ZERO MASS. A RESTART
291 WRITE(6,'(A)')' FILE HAS BEEN WRITTEN AND THE JOB STOPPED'
295 IF(ISTART.LE.NVAR .AND. INDEX(KEYWRD,'ISOT') .NE. 0)
296 1CALL FORSAV(TOTIME,DELDIP,NVAR,FMATRX, COORD,NVAR,HEAT,
297 2 EVECS,ILOOP,FCONST)