1 SUBROUTINE LINMIN(XPARAM,ALPHA,PVECT,NVAR,FUNCT,OKF,IC, DOTT)
2 IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4 DIMENSION XPARAM(NVAR),PVECT(NVAR)
7 C*********************************************************************
9 C LINMIN DOES A LINE MINIMISATION.
11 C ON INPUT: XPARAM = STARTING COORDINATE OF SEARCH.
12 C ALPHA = STEP SIZE FOR INITIATING SEARCH.
13 C PVECT = DIRECTION OF SEARCH.
14 C NVAR = NUMBER OF VARIABLES IN XPARAM.
15 C FUNCT = INITIAL VALUE OF THE FUNCTION TO BE MINIMIZED.
16 C ISOK = NOT IMPORTANT.
17 C COSINE = COSINE OF ANGLE OF CURRENT AND PREVIOUS GRADIENT.
19 C ON OUTPUT: XPARAM = COORDINATE OF MINIMUM OF FUNCTI0N.
20 C ALPHA = NEW STEP SIZE, USED IN NEXT CALL OF LINMIN.
21 C FUNCT = FINAL, MINIMUM VALUE OF THE FUNCTION.
22 C OKF = TRUE IF LINMIN IMPROVED FUNCT, FALSE OTHERWISE.
24 C**********************************************************************
25 COMMON /KEYWRD/ KEYWRD
27 C THE FOLLOWING COMMON IS USED TO FIND OUT IF A NON-VARIATIONALLY
28 C OPTIMIZED WAVE-FUNCTION IS BEING USED.
30 COMMON /MOLKST/ NUMAT,NAT(NUMATM),NFIRST(NUMATM),NMIDLE(NUMATM),
31 1 NLAST(NUMATM), NORBS, NELECS,NALPHA,NBETA,
32 2 NCLOSE,NOPEN,NDUMY,FRACT
34 DIMENSION PHI(3), VT(4)
35 DIMENSION XSTOR(MAXPAR), XPAREF(MAXPAR)
36 INTEGER LEFT,RIGHT,CENTER
37 LOGICAL PRINT,OKF, HALFE, DIIS
38 SAVE ICALCN, PRINT, HALFE, XMAXM, I
41 IF (ICALCN.NE.NUMCAL) THEN
42 HALFE =(INDEX(KEYWRD,'C.I.') .NE. 0 .OR. NCLOSE.NE.NOPEN)
43 IF(INDEX(KEYWRD,'GNORM') .NE. 0)
44 1DROP=DROP*MIN(READA(KEYWRD,INDEX(KEYWRD,'GNORM')),1.D0)
47 IF(INDEX(KEYWRD,'NOTH') .EQ. 0) THEN
60 IF(INDEX(KEYWRD,'PREC') .NE. 0) DELTA1=0.0000005
66 PRINT=(INDEX(KEYWRD,'LINMIN') .NE. 0)
75 20 XMAXM=MAX(XMAXM,PABS)
78 1CALL COMPFG(XPARAM, .TRUE., FUNCT,.TRUE.,GRAD,.FALSE.)
81 DIIS=IC.EQ.1.AND.NVAR.GT.1
86 IF (VT(2).GT.XMAXM) VT(2)=XMAXM
91 30 XPARAM(I)=XPAREF(I)+ALPHA*PVECT(I)
92 CALL COMPFG(XPARAM, .TRUE., PHI(2),.TRUE.,GRAD,.FALSE.)
93 IF(PHI(2).GT.FMAX) FMAX=PHI(2)
94 IF(PHI(2).LT.FMIN) FMIN=PHI(2)
95 CALL EXCHNG (PHI(2),SQSTOR,ENERGY,ESTOR,XPARAM,XSTOR,
100 C CALCULATE A NEW ALPHA BASED ON THIEL'S FORMULA
102 ALPHA=-ALPHA**2*DOTT/(2.D0*(PHI(2)-SSQLST-ALPHA*DOTT))
103 IF(ALPHA.GT.2.D0)ALPHA=2.D0
105 IF(PHI(2).LT.PHI(1))THEN
111 C# IF(PRINT)WRITE(6,'(3(A,F12.6))')' ESTIMATED DROP:',DOTT*0.5D0,
112 C# 1' ACTUAL: ',PHI(2)-SSQLST, ' PREDICTED ALPHA',ALPHA
113 OKF=OKF.OR.PHI(2).LT.SSQLST
114 IF(DELTA1.GT.0.3D0)THEN
116 C THIEL'S TESTS # 18 AND 19
118 IF(OKF.AND.ALPHA.LT.2.D0)GOTO 190
121 IF (VT(3).LE.1.D0) THEN
131 40 XPARAM(I)=XPAREF(I)+ALPHA*PVECT(I)
132 CALL COMPFG (XPARAM, .TRUE., FUNCT,.TRUE.,GRAD,.FALSE.)
133 IF(FUNCT.GT.FMAX) FMAX=FUNCT
134 IF(FUNCT.LT.FMIN) FMIN=FUNCT
135 IF (FUNCT.LT.SQSTOR) CALL EXCHNG (FUNCT,SQSTOR,ENERGY,
136 1ESTOR,XPARAM,XSTOR,ALPHA,ALFS,NVAR)
137 OKF=(OKF.OR.FUNCT.LT.FIN)
139 IF (PRINT)WRITE (6,50) VT(1),PHI(1),PHI(1)-FIN,
140 1 VT(2),PHI(2),PHI(2)-FIN,
141 2 VT(3),PHI(3),PHI(3)-FIN
142 50 FORMAT ( ' ---QLINMN ',/5X, 'LEFT ...',F17.8,2F17.11/5X,
143 1 'CENTER ...',F17.8,2F17.11,/5X, 'RIGHT ...',F17.8,2F17.11,/)
148 IF(ABS(ALPHA*BETA*GAMMA) .GT. 1.D-4)THEN
149 ALPHA=-(PHI(1)*ALPHA+PHI(2)*BETA+PHI(3)*GAMMA)/(ALPHA*BETA*G
153 C FINISH BECAUSE TWO POINTS CALCULATED ARE VERY CLOSE TOGETHER
157 BETA=((PHI(1)-PHI(2))/GAMMA)-ALPHA*(VT(1)+VT(2))
159 60 IF (PHI(RIGHT).GT.PHI(LEFT)) GO TO 70
160 ALPHA=3.0D00*VT(RIGHT)-2.0D00*VT(CENTER)
162 70 ALPHA=3.0D00*VT(LEFT)-2.0D00*VT(CENTER)
164 IF (ABS(S).GT.XMAXM) S=SIGN(XMAXM,S)*(1+0.01*(XMAXM/S))
167 90 ALPHA=-BETA/(2.0D00*ALPHA)
170 IF (ABS(S).GT.XXM) S=SIGN(XXM,S)*(1+0.01*(XXM/S))
174 C FINISH IF CALCULATED POINT IS NEAR TO POINT ALREADY CALCULATED
177 110 IF (ABS(ALPHA-VT(I)).LT.DELTA1*(1.D0+VT(I)).AND.OKF) GOTO 190
179 120 XPARAM(I)=XPAREF(I)+ALPHA*PVECT(I)
181 CALL COMPFG (XPARAM, .TRUE., FUNCT,.TRUE.,GRAD,.FALSE.)
182 IF(FUNCT.GT.FMAX) FMAX=FUNCT
183 IF(FUNCT.LT.FMIN) FMIN=FUNCT
184 IF (FUNCT.LT.SQSTOR) CALL EXCHNG (FUNCT,SQSTOR,ENERGY,ESTOR,
185 1 XPARAM,XSTOR,ALPHA,ALFS,NVAR)
186 OKF=OKF .OR. (FUNCT.LT.FIN)
187 IF (PRINT) WRITE(6,130) VT(LEFT),PHI(LEFT), PHI(LEFT)-FIN,
188 1 VT(CENTER),PHI(CENTER),PHI(CENTER)-FIN,
189 2 VT(RIGHT),PHI(RIGHT),PHI(RIGHT)-FIN,
190 3 ALPHA,FUNCT,FUNCT-FIN
191 130 FORMAT (5X,'LEFT ...',F17.8,2F17.11,/5X,'CENTER ...',
192 1F17.8,2F17.11,/5X,'RIGHT ...',F17.8,2F17.11,/5X,
193 2 'NEW ...',F17.8,2F17.11,/)
195 C TEST TO EXIT FROM LINMIN IF NOT DROPPING IN VALUE OF FUNCTION FAST.
197 IF(ABS(FUNOLD-FUNCT) .LT. DELTA2 .AND. OKF) GOTO 190
199 IF ((ALPHA.GT.VT(RIGHT)).OR.(ALPHA.GT.VT(CENTER)
200 1 .AND.FUNCT.LT.PHI(CENTER)).OR.(ALPHA.GT.VT(LEFT)
201 2 .AND.ALPHA.LT.VT(CENTER).AND.FUNCT.GT.PHI(CENTER)))
208 150 IF (VT(CENTER).LT.VT(RIGHT)) GO TO 160
212 160 IF (VT(LEFT).LT.VT(CENTER)) GO TO 170
216 170 IF (VT(CENTER).LT.VT(RIGHT)) GO TO 180
223 C IC=1 IF THE LAST POINT CALCULATED WAS THE BEST POINT, IC=2 OTHERWISE
226 IF(ABS(ESTOR-ENERGY).LT.1.D-12)IC=1
227 CALL EXCHNG (SQSTOR,FUNCT,ESTOR,ENERGY,XSTOR,XPARAM,
229 OKF = (FUNCT.LT.SSQLST.OR.DIIS)
230 IF (FUNCT.GE.SSQLST) RETURN
231 IF (ALPHA) 200,220,220
234 210 PVECT(I)=-PVECT(I)