OSDN Git Service

MOPAC 6.06 is included in the binary
[molby/Molby.git] / mopac606_nbo / src / search.f
1       SUBROUTINE SEARCH(XPARAM,ALPHA,SIG,NVAR,GMIN,OKF, FUNCT)
2       IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3       INCLUDE 'SIZES'
4       DIMENSION XPARAM(*), SIG(*)
5 ************************************************************************
6 *
7 * SEARCH PERFORMS A LINE SEARCH FOR POWSQ. IT MINIMIZES THE NORM OF
8 *        THE GRADIENT VECTOR IN THE DIRECTION SIG.
9 *
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)
14 *
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)
22       COMMON/KEYWRD/ KEYWRD
23       COMMON /NUMCAL/ NUMCAL
24       DIMENSION GRAD(MAXPAR),XREF(MAXPAR), GREF(MAXPAR), XMIN1(MAXPAR)
25       SAVE DEBUG, G,  TINY, LOOKS, TOLERG
26       CHARACTER*241 KEYWRD
27       LOGICAL DEBUG, OKF, NOPR
28       DATA ICALCN/0/
29       IF (ICALCN.NE.NUMCAL) THEN
30          ICALCN=NUMCAL
31 C
32 C    TOLG   = CRITERION FOR EXIT BY RELATIVE CHANGE IN GRADIENT.
33 C
34          DEBUG=(INDEX(KEYWRD,'LINMIN') .NE. 0)
35          NOPR=( .NOT. DEBUG)
36          LOOKS=0
37          OKF=.TRUE.
38          TINY=0.1D0
39          TOLERG=0.02D0
40          G=100.D0
41          ALPHA=0.1D0
42       ENDIF
43       DO 10 I=1,NVAR
44          GREF(I)  =GMIN1(I)
45          GNEXT1(I)=GMIN1(I)
46          XMIN1(I) =XPARAM(I)
47    10 XREF(I)  =XPARAM(I)
48       IF(ABS(ALPHA) .GT. 0.2)ALPHA=SIGN(0.2D0,ALPHA)
49       IF(DEBUG) THEN
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)
54       ENDIF
55       GB=DOT(GMIN1,GREF,NVAR)
56       IF(DEBUG) WRITE(6,'('' GRADIENT AT START OF SEARCH:'',F16.6)')
57      1SQRT(GB)
58       GSTORE=GB
59       AMIN=0.D0
60       GMINN=1.D9
61 C
62 C
63       TA=0.D0
64       GA=GB
65       GB=1.D9
66       ITRYS=0
67       GOTO 30
68    20 SUM=GA/(GA-GB)
69       ITRYS=ITRYS+1
70       IF(ABS(SUM) .GT. 3.D0) SUM=SIGN(3.D0,SUM)
71       ALPHA=(TB-TA)*SUM+TA
72 C
73 C         XPARAM IS THE GEOMETRY OF THE PREDICTED MINIMUM ALONG THE LINE
74 C
75    30 CONTINUE
76       DO 40 I=1,NVAR
77    40 XPARAM(I)=XREF(I)+ALPHA*SIG(I)
78 C
79 C         CALCULATE GRADIENT NORM AND GRADIENTS AT THE PREDICTED MINIMUM
80 C
81       IF(ITRYS.EQ.1)THEN
82          DO 50 I=1,NVAR
83    50    GRAD(I)=0.D0
84       ENDIF
85       CALL COMPFG (XPARAM, .TRUE., FUNCT, .TRUE., GRAD, .TRUE.)
86       LOOKS=LOOKS+1
87 C
88 C          G IS THE PROJECTION OF THE GRADIENT ALONG SIG.
89 C
90       G=DOT(GREF,GRAD,NVAR)
91       GTOT=SQRT(DOT(GRAD,GRAD,NVAR))
92       IF( .NOT. NOPR)
93      1WRITE(6,'('' LOOKS'',I3,'' ALPHA ='',F12.6,'' GRADIENT'',F12.3,
94      2'' G  ='',F16.6)')
95      3LOOKS,ALPHA,SQRT(DOT(GRAD,GRAD,NVAR)),G
96       IF(GTOT .LT. GMINN) THEN
97          GMINN=GTOT
98          IF(ABS(AMIN-ALPHA) .GT.1.D-2) THEN
99 *
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))
102 *
103             ANEXT=AMIN
104             DO 60 I=1,NVAR
105    60       GNEXT1(I)=GMIN1(I)
106          ENDIF
107          AMIN=ALPHA
108          DO 70 I=1,NVAR
109             IF(GMINN.LT.GMIN) XMIN1(I)=XPARAM(I)
110    70    GMIN1(I)=GRAD(I)
111          IF(GMIN.GT.GMINN)GMIN=GMINN
112       ENDIF
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
117 C
118 C   G IS AN IMPROVEMENT ON GA OR GB.
119 C
120          IF(ABS(GB) .LT. ABS(GA))THEN
121             TA=ALPHA
122             GA=G
123             GO TO 20
124          ELSE
125             TB=ALPHA
126             GB=G
127             GO TO 20
128          ENDIF
129       ELSE
130 C#         WRITE(6,'(//10X,'' FAILED IN SEARCH, SEARCH CONTINUING'')')
131          GOTO 80
132       ENDIF
133    80 CONTINUE  
134       GMINN=SQRT(DOT(GMIN1,GMIN1,NVAR))
135       DO 90 I=1,NVAR
136    90 XPARAM(I)=XMIN1(I)
137       IF(DEBUG) THEN
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)')
143      1    AMIN,ANEXT,GMIN
144       ENDIF
145       IF(GMINN.GT.GMIN)THEN
146          DO 100 I=1,NVAR
147   100    XPARAM(I)=XREF(I)
148       ENDIF
149       RETURN
150 C
151       END