1 SUBROUTINE SEARCH(XPARAM,ALPHA,SIG,NVAR,GMIN,OKF, FUNCT)
2 IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4 DIMENSION XPARAM(*), SIG(*)
5 ************************************************************************
7 * SEARCH PERFORMS A LINE SEARCH FOR POWSQ. IT MINIMIZES THE NORM OF
8 * THE GRADIENT VECTOR IN THE DIRECTION SIG.
10 * ON INPUT XPARAM = CURRENT POINT IN NVAR DIMENSIONAL SPACE.
11 * ALPHA = STEP SIZE (IN FACT ALPHA IS CALCULATED IN SEARCH).
12 * SIG = SEARCH DIRECTION VECTOR.
13 * NVAR = NUMBER OF PARAMETERS IN SIG (& XPARAM)
15 * ON OUTPUT XPARAM = PARAMETERS OF MINIMUM.
16 * ALPHA = DISTANCE TO MINIMUM.
17 * GMIN = GRADIENT NORM AT MINIMUM.
18 * OKF = FUNCTION WAS IMPROVED.
19 ************************************************************************
20 COMMON /SIGMA1/ GNEXT, AMIN, ANEXT
21 COMMON /SIGMA2/ GNEXT1(MAXPAR), GMIN1(MAXPAR)
23 COMMON /NUMCAL/ NUMCAL
24 DIMENSION GRAD(MAXPAR),XREF(MAXPAR), GREF(MAXPAR), XMIN1(MAXPAR)
25 SAVE DEBUG, G, TINY, LOOKS, TOLERG
27 LOGICAL DEBUG, OKF, NOPR
29 IF (ICALCN.NE.NUMCAL) THEN
32 C TOLG = CRITERION FOR EXIT BY RELATIVE CHANGE IN GRADIENT.
34 DEBUG=(INDEX(KEYWRD,'LINMIN') .NE. 0)
48 IF(ABS(ALPHA) .GT. 0.2)ALPHA=SIGN(0.2D0,ALPHA)
50 WRITE(6,'('' SEARCH DIRECTION VECTOR'')')
51 WRITE(6,'(6F12.6)')(SIG(I),I=1,NVAR)
52 WRITE(6,'('' INITIAL GRADIENT VECTOR'')')
53 WRITE(6,'(6F12.6)')(GMIN1(I),I=1,NVAR)
55 GB=DOT(GMIN1,GREF,NVAR)
56 IF(DEBUG) WRITE(6,'('' GRADIENT AT START OF SEARCH:'',F16.6)')
70 IF(ABS(SUM) .GT. 3.D0) SUM=SIGN(3.D0,SUM)
73 C XPARAM IS THE GEOMETRY OF THE PREDICTED MINIMUM ALONG THE LINE
77 40 XPARAM(I)=XREF(I)+ALPHA*SIG(I)
79 C CALCULATE GRADIENT NORM AND GRADIENTS AT THE PREDICTED MINIMUM
85 CALL COMPFG (XPARAM, .TRUE., FUNCT, .TRUE., GRAD, .TRUE.)
88 C G IS THE PROJECTION OF THE GRADIENT ALONG SIG.
91 GTOT=SQRT(DOT(GRAD,GRAD,NVAR))
93 1WRITE(6,'('' LOOKS'',I3,'' ALPHA ='',F12.6,'' GRADIENT'',F12.3,
95 3LOOKS,ALPHA,SQRT(DOT(GRAD,GRAD,NVAR)),G
96 IF(GTOT .LT. GMINN) THEN
98 IF(ABS(AMIN-ALPHA) .GT.1.D-2) THEN
100 * WE CAN MOVE ANEXT TO A POINT NEAR, BUT NOT TOO NEAR, AMIN, SO THAT THE
101 * SECOND DERIVATIVESWILLBEREALISTIC(D2E/DX2=(GNEXT1-GMIN1)/(ANEXT-AMIN))
105 60 GNEXT1(I)=GMIN1(I)
109 IF(GMINN.LT.GMIN) XMIN1(I)=XPARAM(I)
111 IF(GMIN.GT.GMINN)GMIN=GMINN
113 IF(ITRYS .GT. 8) GOTO 80
114 IF (ABS(G/GSTORE).LT.TINY .OR. ABS(G) .LT. TOLERG) GO TO 80
115 IF(ABS(G) .LT. MAX(ABS(GA),ABS(GB)) .OR.
116 1 GA*GB .GT. 0.D0 .AND. G*GA .LT. 0.D0) THEN
118 C G IS AN IMPROVEMENT ON GA OR GB.
120 IF(ABS(GB) .LT. ABS(GA))THEN
130 C# WRITE(6,'(//10X,'' FAILED IN SEARCH, SEARCH CONTINUING'')')
134 GMINN=SQRT(DOT(GMIN1,GMIN1,NVAR))
136 90 XPARAM(I)=XMIN1(I)
138 WRITE(6,'('' AT EXIT FROM SEARCH'')')
139 WRITE(6,'('' XPARAM'',6F12.6)')(XPARAM(I),I=1,NVAR)
140 WRITE(6,'('' GNEXT1'',6F12.6)')(GNEXT1(I),I=1,NVAR)
141 WRITE(6,'('' GMIN1 '',6F12.6)')(GMIN1(I),I=1,NVAR)
142 WRITE(6,'('' AMIN, ANEXT,GMIN'',4F12.6)')
145 IF(GMINN.GT.GMIN)THEN
147 100 XPARAM(I)=XREF(I)