Statistiques
| Révision :

root / src / Step_DIIS_all.f90 @ 2

Historique | Voir | Annoter | Télécharger (16,19 ko)

1 1 equemene
!C  HEAT is never used, not even in call of Space(...)
2 1 equemene
!C  Geom = input parameter vector (Geometry).
3 1 equemene
!C  Grad = input gradient vector.
4 1 equemene
!C  Geom_new = New Geometry.
5 1 equemene
6 1 equemene
	  SUBROUTINE Step_diis_all(NGeomF,IGeom,Step,Geom,Grad,HP,HEAT,Hess,NCoord,allocation_flag,Tangent)
7 1 equemene
!      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
8 1 equemene
9 1 equemene
	  USE Io_module, only : IoOut
10 1 equemene
      USE Path_module, only : Vfree
11 1 equemene
12 1 equemene
      IMPLICIT NONE
13 1 equemene
      INTEGER, parameter :: KINT = kind(1)
14 1 equemene
      INTEGER, parameter :: KREAL = kind(1.0d0)
15 1 equemene
16 1 equemene
!      INCLUDE 'SIZES'
17 1 equemene
18 1 equemene
      INTEGER(KINT) :: NGeomF,IGeom
19 1 equemene
      REAL(KREAL) :: Geom_new(NCoord),Geom(NCoord),Grad(NCoord)
20 1 equemene
	  REAL(KREAL) :: Hess(NCoord*NCoord),Step(NCoord)
21 1 equemene
      REAL(KREAL) :: HEAT,HP
22 1 equemene
	  LOGICAL :: allocation_flag
23 1 equemene
	  INTEGER(KINT), INTENT(IN) :: NCoord
24 1 equemene
	  REAL(KREAL), INTENT(INOUT) :: Tangent(Ncoord)
25 1 equemene
26 1 equemene
!************************************************************************
27 1 equemene
!*                                                                      *
28 1 equemene
!*     DIIS PERFORMS DIRECT INVERSION IN THE ITERATIVE SUBSPACE         *
29 1 equemene
!*                                                                      *
30 1 equemene
!*     THIS INVOLVES SOLVING FOR C IN Geom(NEW) = Geom' - HG'			*
31 1 equemene
!*                                                                      *
32 1 equemene
!*  WHERE Geom' = SUM(C(I)Geom(I), THE C COEFFICIENTES COMING FROM      *
33 1 equemene
!*                                                                      *
34 1 equemene
!*                   | B   1 | . | C | = | 0 |                          *
35 1 equemene
!*                   | 1   0 |   |-L |   | 1 |                          *
36 1 equemene
!*                                                                      *
37 1 equemene
!*  WHERE B(I,J) =GRAD(I)H(T)HGRAD(J)  GRAD(I) = GRADIENT ON CYCLE I    *
38 1 equemene
!*                              Hess    = INVERSE HESSIAN				*
39 1 equemene
!*                                                                      *
40 1 equemene
!*                          REFERENCE                                   *
41 1 equemene
!*                                                                      *
42 1 equemene
!*  P. CSASZAR, P. PULAY, J. MOL. STRUCT. (THEOCHEM), 114, 31 (1984)    *
43 1 equemene
!*                                                                      *
44 1 equemene
!************************************************************************
45 1 equemene
!************************************************************************
46 1 equemene
!*                                                                      *
47 1 equemene
!*     GEOMETRY OPTIMIZATION USING THE METHOD OF DIRECT INVERSION IN    *
48 1 equemene
!*     THE ITERATIVE SUBSPACE (GDIIS), COMBINED WITH THE BFGS OPTIMIZER *
49 1 equemene
!*     (A VARIABLE METRIC METHOD)                                       *
50 1 equemene
!*                                                                      *
51 1 equemene
!*     WRITTEN BY PETER L. CUMMINS, UNIVERSITY OF SYDNEY, AUSTRALIA     *
52 1 equemene
!*                                                                      *
53 1 equemene
!*                              REFERENCE                               *
54 1 equemene
!*                                                                      *
55 1 equemene
!*      "COMPUTATIONAL STRATEGIES FOR THE OPTIMIZATION OF EQUILIBRIUM   *
56 1 equemene
!*     GEOMETRIES AND TRANSITION-STATE STRUCTURES AT THE SEMIEMPIRICAL  *
57 1 equemene
!*     LEVEL", PETER L. CUMMINS, JILL E. GREADY, J. COMP. CHEM., 10,    *
58 1 equemene
!*     939-950 (1989).                                                  *
59 1 equemene
!*                                                                      *
60 1 equemene
!*     MODIFIED BY JJPS TO CONFORM TO EXISTING MOPAC CONVENTIONS        *
61 1 equemene
!*                                                                      *
62 1 equemene
!************************************************************************
63 1 equemene
64 1 equemene
      ! MRESET = maximum number of iterations.
65 1 equemene
      INTEGER(KINT), PARAMETER :: MRESET=15, M2=(MRESET+1)*(MRESET+1) !M2 = 256
66 1 equemene
      REAL(KREAL), ALLOCATABLE, SAVE :: GeomSet(:,:),GradSet(:,:),ERR(:,:) ! MRESET*NCoord
67 1 equemene
      REAL(KREAL), SAVE :: ESET(MRESET)
68 1 equemene
	  REAL(KREAL), ALLOCATABLE, SAVE :: DXTMP(:,:),GSAVE(:,:) !NCoord, why DXTMP has SAVE attribute??
69 1 equemene
      REAL(KREAL) :: B(M2),BS(M2),BST(M2)
70 1 equemene
      LOGICAL DEBUG, PRINT
71 1 equemene
      INTEGER(KINT), ALLOCATABLE, SAVE :: MSET(:)
72 1 equemene
	  LOGICAL, ALLOCATABLE, SAVE :: FRST(:)
73 1 equemene
      INTEGER(KINT) :: NDIIS, MPLUS, INV, ITERA, MM, NFree, I, J, K
74 1 equemene
      INTEGER(KINT) :: JJ, KJ, JNV, II, IONE, IJ, INK,ITmp, Isch, Idx
75 1 equemene
      REAL(KREAL) :: XMax, XNorm, S, DET, THRES, Norm
76 1 equemene
	  REAL(KREAL), PARAMETER :: eps=1e-12
77 1 equemene
	  REAL(KREAL), PARAMETER :: crit=1e-8
78 1 equemene
	  REAL(KREAL), ALLOCATABLE :: Tanf(:) ! NCoord
79 1 equemene
	  REAL(KREAL), ALLOCATABLE :: HFree(:) ! NFree*NFree
80 1 equemene
	  REAL(KREAL), ALLOCATABLE :: Htmp(:,:) ! NCoord,NFree
81 1 equemene
	  REAL(KREAL), ALLOCATABLE :: Grad_free(:),Grad_new_free_inter(:),Step_free(:) ! NFree
82 1 equemene
	  REAL(KREAL), ALLOCATABLE :: Geom_free(:),Geom_new_free_inter(:),Geom_new_free(:) ! NFree
83 1 equemene
	  REAL(KREAL), ALLOCATABLE, SAVE :: GeomSet_free(:,:),GradSet_free(:,:)
84 1 equemene
85 1 equemene
      DEBUG=.TRUE.
86 1 equemene
      PRINT=.TRUE.
87 1 equemene
88 1 equemene
      IF (PRINT)  WRITE(*,'(/,''      BEGIN GDIIS   '')')
89 1 equemene
90 1 equemene
      ! Initialization
91 1 equemene
      IF (allocation_flag) THEN ! allocation_flag = .TRUE. at the begining and effective for all geometries in path.
92 1 equemene
      ! FRST(IGeom) will be set to False in Space, so no need to modify it here
93 1 equemene
         IF (ALLOCATED(GeomSet)) THEN
94 1 equemene
            IF (PRINT)  WRITE(*,'(/,''    In FRST, GDIIS Dealloc  '')')
95 1 equemene
            DEALLOCATE(GeomSet,GradSet,ERR,DXTMP,GSave,GeomSet_free,GradSet_free)
96 1 equemene
            RETURN
97 1 equemene
         ELSE
98 1 equemene
		    ! these allocated arrays need to be properly deallocated.
99 1 equemene
            IF (PRINT)  WRITE(*,'(/,''     In FRST,  GDIIS Alloc  '')')
100 1 equemene
            ALLOCATE(GeomSet(NGeomF,MRESET*NCoord),GradSet(NGeomF,MRESET*NCoord),ERR(NGeomF,MRESET*NCoord))
101 1 equemene
			ALLOCATE(GeomSet_free(NGeomF,MRESET*NCoord),GradSet_free(NGeomF,MRESET*NCoord))
102 1 equemene
            ALLOCATE(DXTMP(NGeomF,NCoord),GSAVE(NGeomF,NCoord),MSET(NGeomF),FRST(NGeomF))
103 1 equemene
			DO I=1,NGeomF
104 1 equemene
			   FRST(I) = .TRUE.
105 1 equemene
			   GeomSet(I,:) = 0.d0
106 1 equemene
			   GradSet(I,:) = 0.d0
107 1 equemene
			   ERR(I,:) = 0.d0
108 1 equemene
			   GeomSet_free(I,:) = 0.d0
109 1 equemene
			   GradSet_free(I,:) = 0.d0
110 1 equemene
			   DXTMP(I,:)=0.d0
111 1 equemene
			   GSAVE(I,:)=0.d0
112 1 equemene
			END DO
113 1 equemene
			MSET(:)=0
114 1 equemene
         END IF
115 1 equemene
		 allocation_flag = .FALSE.
116 1 equemene
      END IF
117 1 equemene
118 1 equemene
      ! Addded from here:
119 1 equemene
	  Call FreeMv(NCoord,Vfree) ! VFree(Ncoord,Ncoord)
120 1 equemene
      ! we orthogonalize Vfree to the tangent vector of this geom only if Tangent/=0.d0
121 1 equemene
      Norm=sqrt(dot_product(Tangent,Tangent))
122 1 equemene
      IF (Norm.GT.eps) THEN
123 1 equemene
         ALLOCATE(Tanf(NCoord))
124 1 equemene
125 1 equemene
         ! We normalize Tangent
126 1 equemene
         Tangent=Tangent/Norm
127 1 equemene
128 1 equemene
         ! We convert Tangent into Vfree only displacements. This is useless for now (2007.Apr.23)
129 1 equemene
		 ! as Vfree=Id matrix but it will be usefull as soon as we introduce constraints.
130 1 equemene
         DO I=1,NCoord
131 1 equemene
            Tanf(I)=dot_product(reshape(Vfree(:,I),(/NCoord/)),Tangent)
132 1 equemene
         END DO
133 1 equemene
         Tangent=0.d0
134 1 equemene
         DO I=1,NCoord
135 1 equemene
            Tangent=Tangent+Tanf(I)*Vfree(:,I)
136 1 equemene
         END DO
137 1 equemene
         ! first we subtract Tangent from vfree
138 1 equemene
         DO I=1,NCoord
139 1 equemene
            Norm=dot_product(reshape(vfree(:,I),(/NCoord/)),Tangent)
140 1 equemene
            Vfree(:,I)=Vfree(:,I)-Norm*Tangent
141 1 equemene
		 END DO
142 1 equemene
143 1 equemene
         Idx=0.
144 1 equemene
         ! Schmidt orthogonalization of the Vfree vectors
145 1 equemene
         DO I=1,NCoord
146 1 equemene
            ! We subtract the first vectors, we do it twice as the Schmidt procedure is not numerically stable.
147 1 equemene
            DO Isch=1,2
148 1 equemene
               DO J=1,Idx
149 1 equemene
                  Norm=dot_product(reshape(Vfree(:,I),(/NCoord/)),reshape(Vfree(:,J),(/NCoord/)))
150 1 equemene
                  Vfree(:,I)=Vfree(:,I)-Norm*Vfree(:,J)
151 1 equemene
               END DO
152 1 equemene
            END DO
153 1 equemene
            Norm=dot_product(reshape(Vfree(:,I),(/NCoord/)),reshape(Vfree(:,I),(/NCoord/)))
154 1 equemene
            IF (Norm.GE.crit) THEN
155 1 equemene
               Idx=Idx+1
156 1 equemene
               Vfree(:,Idx)=Vfree(:,I)/sqrt(Norm)
157 1 equemene
            END IF
158 1 equemene
         END DO
159 1 equemene
160 1 equemene
         Print *, 'Idx=', Idx
161 1 equemene
         IF (Idx/= NCoord-1) THEN
162 1 equemene
            WRITE(*,*) "Pb in orthogonalizing Vfree to tangent for geom",IGeom
163 1 equemene
            WRITE(IoOut,*) "Pb in orthogonalizing Vfree to tangent for geom",IGeom
164 1 equemene
            STOP
165 1 equemene
         END IF
166 1 equemene
167 1 equemene
         DEALLOCATE(Tanf)
168 1 equemene
         NFree=Idx
169 1 equemene
      ELSE ! Tangent =0, matches IF (Norm.GT.eps) THEN
170 1 equemene
         if (debug) WRITE(*,*) "Tangent=0, using full displacement"
171 1 equemene
         NFree=NCoord
172 1 equemene
      END IF !IF (Norm.GT.eps) THEN
173 1 equemene
174 1 equemene
      if (debug) WRITE(*,*) 'DBG Step_DIIS_All, IGeom, NFree=', IGeom, NFree
175 1 equemene
176 1 equemene
      ! We now calculate the new step
177 1 equemene
      ! we project the hessian onto the free vectors
178 1 equemene
      ALLOCATE(HFree(NFree*NFree),Htmp(NCoord,NFree),Grad_free(NFree),Grad_new_free_inter(NFree))
179 1 equemene
	  ALLOCATE(Geom_free(NFree),Step_free(NFree),Geom_new_free_inter(NFree),Geom_new_free(NFree))
180 1 equemene
      DO J=1,NFree
181 1 equemene
        DO I=1,NCoord
182 1 equemene
           Htmp(I,J)=0.d0
183 1 equemene
           DO K=1,NCoord
184 1 equemene
              Htmp(I,J)=Htmp(I,J)+Hess(((I-1)*NCoord)+K)*Vfree(K,J)
185 1 equemene
           END DO
186 1 equemene
        END DO
187 1 equemene
      END DO
188 1 equemene
      DO J=1,NFree
189 1 equemene
        DO I=1,NFree
190 1 equemene
		   HFree(I+((J-1)*NFree))=0.d0
191 1 equemene
           DO K=1,NCoord
192 1 equemene
			  HFree(I+((J-1)*NFree))=HFree(I+((J-1)*NFree))+Vfree(K,I)*Htmp(K,J)
193 1 equemene
           END DO
194 1 equemene
        END DO
195 1 equemene
      END DO
196 1 equemene
197 1 equemene
      DO I=1,NFree
198 1 equemene
         Grad_free(I)=dot_product(reshape(Vfree(:,I),(/NCoord/)),Grad)
199 1 equemene
		 Geom_free(I)=dot_product(reshape(Vfree(:,I),(/NCoord/)),Geom)
200 1 equemene
      END DO
201 1 equemene
      !Added Ends here.***********************************************
202 1 equemene
203 1 equemene
!C  SPACE SIMPLY LOADS THE CURRENT VALUES OF Geom AND GRAD INTO
204 1 equemene
!C  THE ARRAYS GeomSet AND GradSet
205 1 equemene
!C  HEAT is never used, not even in Space_all(...)
206 1 equemene
207 1 equemene
      CALL Space_all(NGeomF,IGeom,MRESET,MSET,Geom,Grad,HEAT,NCoord,GeomSet,GradSet,ESET,FRST)
208 1 equemene
209 1 equemene
      IF (PRINT)  WRITE(*,'(/,''       GDIIS after Space  '')')
210 1 equemene
211 1 equemene
	  DO J=1,MSet(IGeom)
212 1 equemene
         DO K=1,NFree
213 1 equemene
            GradSet_free(IGeom,((J-1)*NFree)+K)=dot_product(reshape(Vfree(:,K),(/NCoord/)),&
214 1 equemene
	     			  GradSet(IGeom,((J-1)*NCoord)+1:((J-1)*NCoord)+NCoord))
215 1 equemene
		    GeomSet_free(IGeom,((J-1)*NFree)+K)=dot_product(reshape(Vfree(:,K),(/NCoord/)),&
216 1 equemene
			          GeomSet(IGeom,((J-1)*NCoord)+1:((J-1)*NCoord)+NCoord))
217 1 equemene
         END DO
218 1 equemene
	  END DO
219 1 equemene
!C
220 1 equemene
!C     INITIALIZE SOME VARIABLES AND CONSTANTS
221 1 equemene
!C
222 1 equemene
      NDIIS = MSET(IGeom)
223 1 equemene
      MPLUS = MSET(IGeom) + 1
224 1 equemene
      MM = MPLUS * MPLUS
225 1 equemene
!C
226 1 equemene
!C     COMPUTE THE APPROXIMATE ERROR VECTORS
227 1 equemene
!C
228 1 equemene
      INV=-NFree
229 1 equemene
      DO 30 I=1,MSET(IGeom)
230 1 equemene
         INV = INV + NFree
231 1 equemene
         DO 30 J=1,NFree
232 1 equemene
            S = 0.D0
233 1 equemene
            KJ=(J*(J-1))/2
234 1 equemene
            DO 10 K=1,J
235 1 equemene
               KJ = KJ+1
236 1 equemene
   10       S = S - HFree(KJ) * GradSet_free(IGeom,INV+K)
237 1 equemene
            DO 20 K=J+1,NFree
238 1 equemene
               KJ = (K*(K-1))/2+J
239 1 equemene
   20       S = S - HFree(KJ) * GradSet_free(IGeom,INV+K)
240 1 equemene
   30 ERR(IGeom,INV+J) = S
241 1 equemene
242 1 equemene
!C
243 1 equemene
!C     CONSTRUCT THE GDIIS MATRIX
244 1 equemene
!C
245 1 equemene
      DO 40 I=1,MM
246 1 equemene
   40 B(I) = 1.D0
247 1 equemene
248 1 equemene
      JJ=0
249 1 equemene
      INV=-NFree
250 1 equemene
      DO 50 I=1,MSET(IGeom)
251 1 equemene
         INV=INV+NFree
252 1 equemene
         JNV=-NFree
253 1 equemene
         DO 50 J=1,MSET(IGeom)
254 1 equemene
            JNV=JNV+NFree
255 1 equemene
            JJ = JJ + 1
256 1 equemene
            B(JJ)=0.D0
257 1 equemene
            DO 50 K=1,NFree
258 1 equemene
			!Print *, 'B(',JJ,')=', B(JJ) + ERR(IGeom,INV+K) * ERR(IGeom,JNV+K)
259 1 equemene
   50 B(JJ) = B(JJ) + ERR(IGeom,INV+K) * ERR(IGeom,JNV+K)
260 1 equemene
261 1 equemene
     ! The following shifting is required to correct indices of B_ij elements in the GDIIS matrix.
262 1 equemene
	 ! The correction is needed because the last coloumn of the matrix contains all 1 and one zero.
263 1 equemene
      DO 60 I=MSET(IGeom)-1,1,-1
264 1 equemene
         DO 60 J=MSET(IGeom),1,-1
265 1 equemene
   60 B(I*MSET(IGeom)+J+I) = B(I*MSET(IGeom)+J)
266 1 equemene
267 1 equemene
      ! For the last row and last column of GEDIIS matrix:
268 1 equemene
      DO 70 I=1,MPLUS
269 1 equemene
         B(MPLUS*I) = 1.D0
270 1 equemene
   70 B(MPLUS*MSET(IGeom)+I) = 1.D0
271 1 equemene
      B(MM) = 0.D0
272 1 equemene
!C
273 1 equemene
!C     ELIMINATE ERROR VECTORS WITH THE LARGEST NORM
274 1 equemene
!C
275 1 equemene
   80 CONTINUE
276 1 equemene
      DO 90 I=1,MM
277 1 equemene
   90 BS(I) = B(I)
278 1 equemene
279 1 equemene
      IF (NDIIS .EQ. MSET(IGeom)) GO TO 140
280 1 equemene
      DO 130 II=1,MSET(IGeom)-NDIIS
281 1 equemene
         XMAX = -1.D10
282 1 equemene
         ITERA = 0
283 1 equemene
         DO 110 I=1,MSET(IGeom)
284 1 equemene
            XNORM = 0.D0
285 1 equemene
            INV = (I-1) * MPLUS
286 1 equemene
            DO 100 J=1,MSET(IGeom)
287 1 equemene
  100       XNORM = XNORM + ABS(B(INV + J))
288 1 equemene
            IF (XMAX.LT.XNORM .AND. XNORM.NE.1.0D0) THEN
289 1 equemene
               XMAX = XNORM
290 1 equemene
               ITERA = I
291 1 equemene
               IONE = INV + I
292 1 equemene
            ENDIF
293 1 equemene
  110    CONTINUE
294 1 equemene
295 1 equemene
         DO 120 I=1,MPLUS
296 1 equemene
            INV = (I-1) * MPLUS
297 1 equemene
            DO 120 J=1,MPLUS
298 1 equemene
               JNV = (J-1) * MPLUS
299 1 equemene
               IF (J.EQ.ITERA) B(INV + J) = 0.D0
300 1 equemene
               B(JNV + I) = B(INV + J)
301 1 equemene
			   !Print *,'B(JNV + I)=',B(JNV + I)
302 1 equemene
  120    CONTINUE
303 1 equemene
         B(IONE) = 1.0D0
304 1 equemene
  130 CONTINUE
305 1 equemene
  140 CONTINUE
306 1 equemene
!C
307 1 equemene
!C     OUTPUT THE GDIIS MATRIX
308 1 equemene
!C
309 1 equemene
      IF (DEBUG) THEN
310 1 equemene
         WRITE(*,'(/5X,'' GDIIS MATRIX'')')
311 1 equemene
         ITmp=min(12,MPLUS)
312 1 equemene
         DO IJ=1,MPLUS
313 1 equemene
            WRITE(*,'(12(F12.4,1X))') B((IJ-1)*MPLUS+1:(IJ-1)*MPLUS+ITmp)
314 1 equemene
         END DO
315 1 equemene
      ENDIF
316 1 equemene
!C
317 1 equemene
!C     SCALE DIIS MATRIX BEFORE INVERSION
318 1 equemene
!C
319 1 equemene
      DO 160 I=1,MPLUS
320 1 equemene
         II = MPLUS * (I-1) + I
321 1 equemene
		 !Print *, 'B(',II,')=', B(II)
322 1 equemene
		 !Print *, 'GSave(',IGeom,',',I,')=', 1.D0 / DSQRT(1.D-20+DABS(B(II)))
323 1 equemene
  160 GSAVE(IGeom,I) = 1.D0 / DSQRT(1.D-20+DABS(B(II)))
324 1 equemene
325 1 equemene
      GSAVE(IGeom,MPLUS) = 1.D0
326 1 equemene
      !Print *, 'GSave(',IGeom,',',MPlus,')=1.D0'
327 1 equemene
328 1 equemene
      DO 170 I=1,MPLUS
329 1 equemene
         DO 170 J=1,MPLUS
330 1 equemene
            IJ = MPLUS * (I-1) + J
331 1 equemene
  170 B(IJ) = B(IJ) * GSAVE(IGeom,I) * GSAVE(IGeom,J)
332 1 equemene
!C
333 1 equemene
!C     OUTPUT SCALED GDIIS MATRIX
334 1 equemene
!C
335 1 equemene
      IF (DEBUG) THEN
336 1 equemene
         WRITE(*,'(/5X,'' GDIIS MATRIX (SCALED)'')')
337 1 equemene
         ITmp=min(12,MPLUS)
338 1 equemene
         DO IJ=1,MPLUS
339 1 equemene
            WRITE(*,'(12(F12.4,1X))') B((IJ-1)*MPLUS+1:(IJ-1)*MPLUS+ITmp)
340 1 equemene
         END DO
341 1 equemene
      ENDIF
342 1 equemene
!C
343 1 equemene
!C     INVERT THE GDIIS MATRIX B
344 1 equemene
!C
345 1 equemene
      CALL MINV(B,MPLUS,DET) ! matrix inversion.
346 1 equemene
347 1 equemene
      DO 190 I=1,MPLUS
348 1 equemene
         DO 190 J=1,MPLUS
349 1 equemene
            IJ = MPLUS * (I-1) + J
350 1 equemene
			!Print *, 'B(',IJ,')=', B(IJ)
351 1 equemene
			!Print *, 'GSAVE(',IGeom,',',I,')=', GSAVE(IGeom,I)
352 1 equemene
			!Print *, 'GSAVE(',IGeom,',',J,')=', GSAVE(IGeom,J)
353 1 equemene
			!Print *, 'B(',IJ,')=', B(IJ) * GSAVE(I) * GSAVE(J)
354 1 equemene
  190 B(IJ) = B(IJ) * GSAVE(IGeom,I) * GSAVE(IGeom,J)
355 1 equemene
!C
356 1 equemene
!C     COMPUTE THE INTERMEDIATE INTERPOLATED PARAMETER AND GRADIENT VECTORS
357 1 equemene
!C
358 1 equemene
      !Print *, 'MSET(',IGeom,')=', MSET(IGeom), ' MPLUS=', MPLUS
359 1 equemene
      DO 200 K=1,NFree
360 1 equemene
         Geom_new_free_inter(K) = 0.D0
361 1 equemene
         Grad_new_free_inter(K) = 0.D0
362 1 equemene
         DO 200 I=1,MSET(IGeom)
363 1 equemene
            INK = (I-1) * NFree + K
364 1 equemene
            Geom_new_free_inter(K) = Geom_new_free_inter(K) + B(MPLUS*MSET(IGeom)+I) * GeomSet_free(IGeom,INK)
365 1 equemene
			!Print *, 'Geom_new_free_inter(',K,')=', Geom_new_free_inter(K)
366 1 equemene
			!Print *, 'B(MPLUS*MSET(',IGeom,')+',I,')=', B(MPLUS*MSET(IGeom)+I)
367 1 equemene
			!Print *, 'GeomSet_free(',IGeom,',',INK,')=', GeomSet_free(IGeom,INK)
368 1 equemene
  200 Grad_new_free_inter(K) = Grad_new_free_inter(K) + B(MPLUS*MSET(IGeom)+I) * GradSet_free(IGeom,INK)
369 1 equemene
      HP=0.D0
370 1 equemene
      DO 210 I=1,MSET(IGeom)
371 1 equemene
  210 HP=HP+B(MPLUS*MSET(IGeom)+I)*ESET(I)
372 1 equemene
      DO 220 K=1,NFree
373 1 equemene
  220 DXTMP(IGeom,K) = Geom_free(K) - Geom_new_free_inter(K)
374 1 equemene
      XNORM = SQRT(DOT_PRODUCT(DXTMP(IGeom,1:NFree),DXTMP(IGeom,1:NFree)))
375 1 equemene
      IF (PRINT) THEN
376 1 equemene
         WRITE (6,'(/10X,''DEVIATION IN X '',F10.6, 8X,''DETERMINANT '',G9.3)') XNORM,DET
377 1 equemene
         WRITE(*,'(10X,''GDIIS COEFFICIENTS'')')
378 1 equemene
         WRITE(*,'(10X,5F12.5)') (B(MPLUS*MSET(IGeom)+I),I=1,MSET(IGeom))
379 1 equemene
      ENDIF
380 1 equemene
381 1 equemene
!C     THE FOLLOWING TOLERENCES FOR XNORM AND DET ARE SOMEWHAT ARBITRARY!
382 1 equemene
      THRES = MAX(10.D0**(-NFree), 1.D-25)
383 1 equemene
      IF (XNORM.GT.2.D0 .OR. DABS(DET).LT. THRES) THEN
384 1 equemene
         IF (PRINT)THEN
385 1 equemene
            WRITE(*,*) "THE DIIS MATRIX IS ILL CONDITIONED"
386 1 equemene
            WRITE(*,*) " - PROBABLY, VECTORS ARE LINEARLY DEPENDENT - "
387 1 equemene
            WRITE(*,*) "THE DIIS STEP WILL BE REPEATED WITH A SMALLER SPACE"
388 1 equemene
         END IF
389 1 equemene
         DO 230 K=1,MM
390 1 equemene
  230    B(K) = BS(K)
391 1 equemene
         NDIIS = NDIIS - 1
392 1 equemene
         IF (NDIIS .GT. 0) GO TO 80
393 1 equemene
         IF (PRINT) WRITE(*,'(10X,''NEWTON-RAPHSON STEP TAKEN'')')
394 1 equemene
         DO 240 K=1,NFree
395 1 equemene
            Geom_new_free_inter(K) = Geom_free(K)
396 1 equemene
  240       Grad_new_free_inter(K) = Grad_free(K)
397 1 equemene
      ENDIF ! matches IF (XNORM.GT.2.D0 .OR. DABS(DET).LT. THRES) THEN, L378
398 1 equemene
399 1 equemene
	  ! q_{m+1} = q'_{m+1} - H^{-1}g'_{m+1}
400 1 equemene
	  Geom_new_free=0.d0
401 1 equemene
	  DO I = 1, NFree
402 1 equemene
	     DO J = 1, NFree
403 1 equemene
	        ! If Hinv=.False., then we need to invert Hess
404 1 equemene
		    !Geom_new_free(:) = Geom_new_free(:) + HFree(:,I)*Grad_new_free_inter(I)
405 1 equemene
		   Geom_new_free(J) = Geom_new_free(J) + HFree(I+((J-1)*NFree))*Grad_new_free_inter(I)
406 1 equemene
		 END DO
407 1 equemene
	  END DO
408 1 equemene
	  Geom_new_free(:) = Geom_new_free_inter(:) - Geom_new_free(:)
409 1 equemene
410 1 equemene
	  Step_free = Geom_new_free - Geom_free
411 1 equemene
412 1 equemene
	  Step = 0.d0
413 1 equemene
      DO I=1,NFree
414 1 equemene
		 Step = Step + Step_free(I)*Vfree(:,I)
415 1 equemene
      END DO
416 1 equemene
417 1 equemene
      DEALLOCATE(Hfree,Htmp,Grad_free,Grad_new_free_inter,Step_free,Geom_free)
418 1 equemene
      DEALLOCATE(Geom_new_free_inter,Geom_new_free)
419 1 equemene
420 1 equemene
	  IF (PRINT)  WRITE(*,'(/,''       END GDIIS  '',/)')
421 1 equemene
422 1 equemene
      END SUBROUTINE Step_diis_all