Statistiques
| Révision :

root / src / Extrapol_int.f90 @ 2

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

1
SUBROUTINE Extrapol_int(iopt,s,dist,x0,y0,z0,xgeom,Coef,XgeomF)
2

    
3
  ! This subroutine constructs the path, and if dist<>Infinity, it samples
4
  ! the path to obtain geometries.
5
  ! Basically, you call it twice: i) dist=infinity, it will calculate the length of the path
6
  ! ii) dist finite, it will give you the images you want along the path.
7
  !
8
  ! For now, it gives equidistant geometries
9
  !
10

    
11
  ! Default value of FRot=.TRUE.
12
  ! Default value of NMaxPtPath = 1000
13
  ! IntCoordI(:,:) ! (NGeomI,3*Nat-6)
14
  ! XyzGeomF(:,:,:) ! (NGeomF,3,Nat)
15
  ! Default value of FAlign=.TRUE.
16
  use Path_module, only : NMaxPtPath, IntCoordI, Pi, IndZmat, XyzGeomF, &
17
       IntCoordF, IntTangent, Renum, Nom, Order, MassAt, SGeom, XyzGeomI, &
18
       Atome, Nat, NGeomI, NCoord, NGeomF, OrderInv,NFroz,FrozAtoms
19
  ! IndZmat(Nat,5)
20

    
21
  use Io_module
22

    
23

    
24
  IMPLICIT NONE
25

    
26

    
27
  REAL(KREAL), INTENT(OUT) :: s
28
  ! X0(Nat),Y0(Nat),Z0(Nat): reference geometry.
29
  REAL(KREAL), INTENT(IN) :: dist,X0(Nat),Y0(Nat),Z0(Nat)
30
  REAL(KREAL), INTENT(IN) :: Xgeom(NGeomI),Coef(NGeomI,NCoord)
31
  ! Iopt: Number of the cycles for the optimization
32
  INTEGER(KINT), INTENT(IN) :: Iopt
33
  REAL(KREAL), INTENT(OUT) :: XGeomF(NGeomF)
34

    
35
  INTEGER(KINT) :: IdxGeom, I, J, K, Idx
36
  REAL(KREAL) :: Rmsd,MRot(3,3), ds, u, v
37
  REAL(KREAL) :: a_val, d
38

    
39
  REAL(KREAL), ALLOCATABLE :: XyzTmp(:,:), XyzTmp2(:,:) ! (Nat,3)
40
  REAL(KREAL), ALLOCATABLE :: ValZmat(:,:),DerInt(:) ! (Nat,3)
41

    
42

    
43
  LOGICAL ::  debug, print,printspline
44
  LOGICAL, EXTERNAL :: valid
45

    
46
  INTEGER(KINT) :: NSpline
47
  CHARACTER(LCHARS) :: FileSpline,TmpChar
48

    
49

    
50
  !	LOGICAL :: FAlign=.FALSE., FRot=.FALSE.
51

    
52
  ! We will calculate the length of the path, in MW coordinates...
53
  ! this is done is a stupid way: we interpolate the zmatrix values,
54
  ! convert them into cartesian, weight the cartesian
55
  ! and calculate the evolution of the distance ! 
56
  ! We have to follow the same procedure for every geometry
57
  ! so even for the first one, we have to convert it from zmat
58
  ! to cartesian !
59

    
60
  debug=valid("pathcreate")
61
  print=valid("printgeom")
62
  printspline=(valid("printspline").AND.(dist<=1e30))
63

    
64
  if (debug) Call Header("Entering Extrapol_int")
65

    
66
! We want 100 points along the interpolating path
67
  NSpline=int(NMaxPtPath/100)
68
  if (printspline) THEN
69
     WRITE(TmpChar,'(I5)') Iopt
70
     FileSpline=Trim(adjustL(PathName)) // '_spline.' // AdjustL(TRIM(TmpChar))
71
     OPEN(IOTMP,FILE=FileSpline)
72

    
73
  END IF
74

    
75
  ALLOCATE(XyzTmp(Nat,3),XyzTmp2(Nat,3),valzmat(Nat,3),DerInt(NCoord))
76
  IdxGeom=1
77

    
78
  XYZTmp2(1,1)=0.
79
  XYZTmp2(1,2)=0.
80
  XYZTmp2(1,3)=0.
81
  XYZTmp2(2,2)=0.
82
  XYZTmp2(2,3)=0.
83
  XYZTmp2(3,3)=0.
84

    
85
  valzmat=0.
86
  valzmat(2,1)=IntCoordI(1,1)
87
  valzmat(3,1)=IntCoordI(1,2)
88
  valzmat(3,2)=IntCoordI(1,3)*180./Pi
89
  Idx=4
90
  DO I=4,Nat
91
     ValZmat(I,1)=IntCoordI(1,Idx)
92
     Idx=Idx+1
93
     DO J=2,3
94
        ValZmat(I,J)=IntCoordI(1,Idx)*180./Pi
95
        Idx=Idx+1
96
     END DO
97
  END DO
98

    
99
  XyzTmp2(2,1)=valzmat(2,1)
100
  d=valzmat(3,1)
101
  a_val=valzmat(3,2)/180.*Pi
102
  !              write(*,*) "aval,pi",a_val,valzmat(3,2),pi
103
  if (Nat.GE.3) THEN
104
     if (IndZmat(3,2).EQ.1)  THEN
105
        XyzTmp2(3,1)=XYzTmp2(1,1)+d*cos(a_val)
106
     ELSE
107
        XyzTmp2(3,1)=XyzTmp2(2,1)-d*cos(a_val)
108
     ENDIF
109
     XyzTmp2(3,2)=d*sin(a_val)
110
  ENDIF
111
  !              i=1
112
  !                WRITE(*,*) 'TOTOCart:',i, (XYzTMP2(I,J),J=1,3)
113
  !                WRITE(*,*) 'TOTOZma:',i, (valzmat(I,J),J=1,3)
114
  !              i=2
115
  !                WRITE(*,*) 'TOTOCart:',i, (XYzTMP2(I,J),J=1,3)
116
  !                WRITE(*,*) 'TOTOZma:',i, (valzmat(I,J),J=1,3)
117
  !              i=3
118
  !                WRITE(*,*) 'TOTOCart:',i, (XYzTMP2(I,J),J=1,3)
119
  !                WRITE(*,*) 'TOTOZma:',i, (valzmat(I,J),J=1,3)
120

    
121
  DO i=4,Nat
122
     call ConvertZmat_cart(i,IndZmat,valzmat,                &
123
          XYzTMP2(1,1), XYzTMP2(1,2),XYzTMP2(1,3))
124
     !                  WRITE(*,*) 'TOTOZma:',i,IndZmat(I,1),            &
125
     !                        (IndZmat(I,J+1),valzmat(I,J),J=1,3)
126
     !                   WRITE(*,*) 'TOTOCart:',i, (XYzTMP2(I,J),J=1,3)
127
  END DO
128

    
129
  ! We align this geometry with the original one
130
  ! PFL 17/July/2006: only if we have more than 4 atoms.
131
  IF (Nat.GE.4) THEN
132
     ! The rotation matrix MRot has INTENT(OUT) in subroutine rotation_matrix(...),
133
     ! which is called in the CalcRmsd(...).
134
     ! PFL 24 Nov 2008 ->
135
     ! If we have frozen atoms we align only those ones.
136
     if (NFroz.GT.0) THEN
137
        Call AlignPartial(Nat,x0,y0,z0,                     &
138
             xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
139
             FrozAtoms,MRot)
140
     ELSE
141
        Call  CalcRmsd(Nat, x0,y0,z0,                              &
142
             xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
143
             MRot,rmsd,.TRUE.,.TRUE.)
144
     END IF
145
     ! <- PFL 24 Nov 2008
146
  END IF
147

    
148
  XyzGeomF(IdxGeom,:,:)=Reshape(XyzTmp2(:,:),(/3,Nat/),ORDER=(/2,1/))
149
  IntCoordF(IdxGeom,:)=IntCoordI(1,:)
150

    
151
  ! We calculate the first derivatives
152
  u=0.d0
153
  DO Idx=1,NCoord
154
     call splintder(u,v,DerInt(iDX),NGeomI,xgeom(1),IntCoordI(1,Idx),Coef(1,Idx))
155
  END DO
156
  IntTangent(IdxGeom,:)=DerInt
157

    
158
  if (print.AND.(Dist.LE.1e20)) THEN
159
     WRITE(IOOUT,'(1X,I5)') Nat
160
     WRITE(IOOUT,*) "# Cartesian Coordinates for geom",IdxGeom
161
     DO i=1,Nat
162
        If (Renum) THEN
163
           WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(I)),      &
164
                (XyzTmp2(Order(I),J),J=1,3)
165
        ELSE
166
           WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(OrderInv(I))),      &
167
                (XyzTmp2(I,J),J=1,3)
168
        END IF
169
     END DO
170
  END IF
171

    
172
  ! We initialize the first geometry
173
  ! PFL 26 Nov 2008 ->
174
  ! Now, I copy XyzTmp2 into XyzTmp because XyzTmp2 has been aligned
175
  ! with the reference geometry
176

    
177
  XyzTmp=XyzTmp2
178

    
179
  !   XyzTmp(1,1)=0.
180
  !   XyzTmp(1,2)=0.
181
  !   XyzTmp(1,3)=0.
182
  !   XyzTmp(2,2)=0.
183
  !   XyzTmp(2,3)=0.     
184
  !   XyzTmp(3,3)=0.
185

    
186
  !   XyzTmp(2,1)=valzmat(2,1)
187
  !   d=valzmat(3,1)
188
  !   a_val=valzmat(3,2)/180.*Pi
189

    
190
  !   if (Nat.GE.3) THEN
191
  !      if (IndZmat(3,2).EQ.1)  THEN
192
  !         XyzTmp(3,1)=XYzTmp(1,1)+d*cos(a_val)
193
  !      ELSE
194
  !         XyzTmp(3,1)=XyzTmp(2,1)-d*cos(a_val)
195
  !      ENDIF
196
  !      XyzTmp(3,2)=d*sin(a_val)
197
  !   ENDIF
198

    
199
  !   DO i=4,Nat
200
  !      call ConvertZmat_cart(i,IndZmat,valzmat,        &
201
  !           XYzTMP(1,1), XYzTMP(1,2),XYzTMP(1,3))
202
  !   END DO
203

    
204
  ! <- PFL 26 Nov 2008
205

    
206
  s=0.
207
  if (printspline) THEN
208
     SELECT CASE (Nat)
209
     CASE(2)
210
        WRITE(IOTMP,'(15(1X,F10.5))') s,valzmat(2,1)
211
     CASE (3)
212
        WRITE(IOTMP,'(15(1X,F10.5))') s,valzmat(2,1),valzmat(3,1:2)
213
     CASE(4:)
214
        WRITE(IOTMP,'(15(1X,F10.5))') s,valzmat(2,1),valzmat(3,1:2),valzmat(4:Nat,1:3)
215
     END SELECT
216
  END IF
217
  valzmat=0.d0
218

    
219
  DO K=1,NMaxPtPath
220
     u=real(K)/NMaxPtPath*(NGeomI-1.)
221

    
222
     XYZTmp2(1,1)=0.
223
     XYZTmp2(1,2)=0.
224
     XYZTmp2(1,3)=0.
225
     XYZTmp2(2,2)=0.
226
     XYZTmp2(2,3)=0.
227
     XYZTmp2(3,3)=0.
228

    
229
     ! We generate the interpolated Zmatrix
230
     call splintder(u,v,DerInt(1),NGeomI,xgeom(1),IntCoordI(1,1),Coef(1,1))
231
     valzmat(2,1)=v
232
     call splintder(u,v,DerInt(2),NGeomI,xgeom(1),IntCoordI(1,2),Coef(1,2))
233
     valzmat(3,1)=v
234
     call splintder(u,v,DerInt(3),NGeomI,xgeom(1),IntCoordI(1,3),Coef(1,3))
235
     valzmat(3,2)=v*180./Pi
236
     Idx=4
237
     DO I=4,Nat
238
        call splintder(u,v,DerInt(Idx),NGeomI,xgeom(1),IntCoordI(1,Idx),Coef(1,Idx))
239
        valzmat(I,1)=v
240
        Idx=Idx+1
241
        DO J=2,3
242
           call splintder(u,v,DerInt(Idx),NGeomI,xgeom(1),IntCoordI(1,Idx),Coef(1,Idx))
243
           valzmat(I,J)=v*180./pi
244
           Idx=Idx+1
245
        END DO
246
     END DO ! matches DO I=4,Nat
247

    
248
     ! We convert it into Cartesian coordinates
249
     XyzTmp2(2,1)=valzmat(2,1)
250
     d=valzmat(3,1)
251
     a_val=valzmat(3,2)/180.*Pi
252
     if (Nat.GE.3) THEN
253
        if (IndZmat(3,2).EQ.1)  THEN
254
           XyzTmp2(3,1)=XYzTmp2(1,1)+d*cos(a_val)
255
        ELSE
256
           XyzTmp2(3,1)=XyzTmp2(2,1)-d*cos(a_val)
257
        ENDIF
258
        XyzTmp2(3,2)=d*sin(a_val)
259
     ENDIF
260

    
261
     DO I=4,Nat
262
        call ConvertZmat_cart(I,IndZmat,valzmat,       &
263
             XYzTMP2(1,1), XYzTMP2(1,2),XYzTMP2(1,3))
264
     END DO
265

    
266
     IF (Nat.GE.4) THEN
267
        ! PFL 24 Nov 2008 ->
268
        ! If we have frozen atoms we align only those ones.
269
        if (NFroz.GT.0) THEN
270
           Call AlignPartial(Nat,x0,y0,z0,                     &
271
                xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
272
                FrozAtoms,MRot)
273
        ELSE
274
           ! PFL 26 Nov 2008!
275
           ! Note to myself: in Extrapol_cart we always align on x0,y0,z0 but here
276
           ! we align on the previous geom... what is the best ? Is there a difference ?
277
           Call  CalcRmsd(Nat, XyzTmp(1:Nat,1),XyzTmp(1:Nat,2),XyzTmp(1:Nat,3), &
278
                xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
279
                MRot,rmsd,.TRUE.,.TRUE.)
280
        END IF
281
        ! <- PFL 24 Nov 2008
282
     END IF
283

    
284
     ds=0.
285
     DO I=1,Nat
286
        DO J=1,3
287
           ds=ds+MassAt(I)*(XYZTMp2(I,J)-XYZTmp(I,J))**2
288
           XYZTmp(I,J)=XyzTMP2(I,J)
289
        END DO
290
     END DO
291

    
292

    
293
     s=s+sqrt(ds)
294

    
295
     if ((printspline).AND.(MOD(K,NSpline).EQ.0)) THEN
296
        SELECT CASE (Nat)
297
        CASE(2)
298
           WRITE(IOTMP,'(15(1X,F10.5))') s,valzmat(2,1)
299
        CASE (3)
300
           WRITE(IOTMP,'(15(1X,F10.5))') s,valzmat(2,1),valzmat(3,1:2)
301
        CASE(4:)
302
           WRITE(IOTMP,'(15(1X,F10.5))') s,valzmat(2,1),valzmat(3,1:2),valzmat(4:Nat,1:3)
303
        END SELECT
304
     END IF
305

    
306
     !         if (debug) WRITE(*,*) "Debug u,s,dist",u,s,dist
307
     if (s>=dist) THEN
308
        if (debug) THEN
309
           WRITE(*,*) "DBG Zmat",s
310
           WRITE(*,'(1X,I5)') IndZmat(1,1)
311
           WRITE(*,'(1X,I5,I5,1X,F10.4)') IndZmat(2,1),IndZmat(2,2),valzmat(2,1)
312
           WRITE(*,'(1X,I5,2(I5,1X,F10.4))') IndZmat(3,1),IndZmat(3,2),valzmat(3,1)  &
313
                ,IndZmat(3,3),valzmat(3,2)
314
           DO I=4,Nat
315
              WRITE(*,'(1X,I5,3(I5,1X,F10.4))') IndZmat(I,1),IndZmat(I,2),valzmat(I,1)  &
316
                   ,IndZmat(I,3),valzmat(I,2),IndZmat(I,4),valzmat(I,3)
317
           END DO
318
        END IF ! matches if (debug) THEN
319

    
320
        s=s-dist
321
        IdxGeom=IdxGeom+1
322
        SGeom(IdxGeom)=s+IdxGeom*dist
323
        XgeomF(IdxGeom)=u
324
        XyzGeomF(IdxGeom,:,:)=Reshape(XyzTmp2(:,:),(/3,Nat/),ORDER=(/2,1/))
325
        IntCoordF(IdxGeom,1)=valzmat(2,1)
326
        IntCoordF(IdxGeom,2)=valzmat(3,1)
327
        IntCoordF(IdxGeom,3)=valzmat(3,2)/180.*Pi
328
        Idx=4
329
        DO I=4,Nat
330
           IntCoordF(IdxGeom,Idx)=valzmat(I,1)
331
           IntCoordF(IdxGeom,Idx+1)=valzmat(I,2)/180.*Pi
332
           IntCoordF(IdxGeom,Idx+2)=valzmat(I,3)/180.*Pi
333
           Idx=Idx+3
334
        END DO
335
        IntTangent(IdxGeom,:)=DerInt
336

    
337
        if (print) THEN
338
           WRITE(IOOUT,'(1X,I5)') Nat
339
           WRITE(IOOUT,*) "# Cartesian coord for Geometry ",IdxGeom,K
340
           ! PFL 17/July/2006: only if we have more than 4 atoms.
341
           IF (Nat.GE.4) THEN
342
              ! PFL 24 Nov 2008 ->
343
              ! If we have frozen atoms we align only those ones.
344
              if (NFroz.GT.0) THEN
345
                 Call AlignPartial(Nat,x0,y0,z0,                     &
346
                      xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
347
                      FrozAtoms,MRot)
348
              ELSE
349
                 Call  CalcRmsd(Nat, x0,y0,z0,                               &
350
                      xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),   &
351
                      MRot,rmsd,.TRUE.,.TRUE.)
352
              END IF
353
              ! <- PFL 24 Nov 2008
354

    
355
           END IF
356

    
357
           DO I=1,Nat
358
              If (Renum) THEN
359
                 WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(I)),   &
360
                      (XyzTmp2(Order(I),J),J=1,3)
361
              ELSE
362
                 WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(OrderInv(I))),    &
363
                      (XyzTmp2(I,J),J=1,3)
364
              END IF
365
           END DO
366

    
367
        END IF ! matches if (print) THEN
368
     END IF ! matches if (s>=dist) THEN
369
  END DO ! matches DO K=1,NMaxPtPath, Is it correct??
370

    
371

    
372
  if (printspline) THEN
373
     SELECT CASE (Nat)
374
     CASE(2)
375
        WRITE(IOTMP,'(15(1X,F10.5))') s,valzmat(2,1)
376
     CASE (3)
377
        WRITE(IOTMP,'(15(1X,F10.5))') s,valzmat(2,1),valzmat(3,1:2)
378
     CASE(4:)
379
        WRITE(IOTMP,'(15(1X,F10.5))') s,valzmat(2,1),valzmat(3,1:2),valzmat(4:Nat,1:3)
380
     END SELECT
381
  END IF
382

    
383
  if (s>=0.9*dist) THEN
384
     if (debug) WRITE(*,*) "DBG Extrapol_int L383: Adding last geom"
385
     write(*,*) "Extrapol_int u,xgeom(NGeomI),s,dist,s-dist",u,xgeom(NGeomI),s,dist,s-dist
386
!     u=xgeom(NGeomI)
387
     s=s-dist
388

    
389

    
390
!      ! We generate the interpolated Zmatrix
391
!      call splintder(u,v,DerInt(1),NGeomI,xgeom(1),IntCoordI(1,1),Coef(1,1))
392
!      valzmat(2,1)=v
393
!      call splintder(u,v,DerInt(2),NGeomI,xgeom(1),IntCoordI(1,2),Coef(1,2))
394
!      valzmat(3,1)=v
395
!      call splintder(u,v,DerInt(3),NGeomI,xgeom(1),IntCoordI(1,3),Coef(1,3))
396
!      valzmat(3,2)=v*180./Pi
397
!      Idx=4
398
!      DO I=4,Nat
399
!         call splintder(u,v,DerInt(Idx),NGeomI,xgeom(1),IntCoordI(1,Idx),Coef(1,Idx))
400
!         valzmat(I,1)=v
401
!         Idx=Idx+1
402
!         DO J=2,3
403
!            call splintder(u,v,DerInt(Idx),NGeomI,xgeom(1),IntCoordI(1,Idx),Coef(1,Idx))
404
!            valzmat(I,J)=v*180./pi
405
!            Idx=Idx+1
406
!         END DO
407
!      END DO ! matches DO I=4,Nat
408

    
409
!      ! We convert it into Cartesian coordinates
410
!      XyzTmp2(2,1)=valzmat(2,1)
411
!      d=valzmat(3,1)
412
!      a_val=valzmat(3,2)/180.*Pi
413
!      if (Nat.GE.3) THEN
414
!         if (IndZmat(3,2).EQ.1)  THEN
415
!            XyzTmp2(3,1)=XYzTmp2(1,1)+d*cos(a_val)
416
!         ELSE
417
!            XyzTmp2(3,1)=XyzTmp2(2,1)-d*cos(a_val)
418
!         ENDIF
419
!         XyzTmp2(3,2)=d*sin(a_val)
420
!      ENDIF
421

    
422
!      DO I=4,Nat
423
!         call ConvertZmat_cart(I,IndZmat,valzmat,       &
424
!              XYzTMP2(1,1), XYzTMP2(1,2),XYzTMP2(1,3))
425
!      END DO
426

    
427
!      IF (Nat.GE.4) THEN
428
!         ! PFL 24 Nov 2008 ->
429
!         ! If we have frozen atoms we align only those ones.
430
!         if (NFroz.GT.0) THEN
431
!            Call AlignPartial(Nat,x0,y0,z0,                     &
432
!                 xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
433
!                 FrozAtoms,MRot)
434
!         ELSE
435
!            ! PFL 26 Nov 2008!
436
!            ! Note to myself: in Extrapol_cart we always align on x0,y0,z0 but here
437
!            ! we align on the previous geom... what is the best ? Is there a difference ?
438
!            Call  CalcRmsd(Nat, XyzTmp(1:Nat,1),XyzTmp(1:Nat,2),XyzTmp(1:Nat,3), &
439
!                 xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
440
!                 MRot,rmsd,.TRUE.,.TRUE.)
441
!         END IF
442
!         ! <- PFL 24 Nov 2008
443
!      END IF
444

    
445
     IdxGeom=IdxGeom+1
446

    
447

    
448

    
449
     IF (IdxGeom.GT.NGeomF) THEN
450
        WRITE(IOOUT,*) "!!! ERROR in Extrapol_int !!!!"
451
        WRITE(IOOUT,*) "Too many structures. Increase NMaxPath"
452
        WRITE(*,*) "** PathCreate ***"
453
        WRITE(*,*) "Distribution of points along the path is wrong."
454
        WRITE(*,*) "Increase value of NMaxPtPath in the input file"
455
        WRITE(*,*) "Present value is:", NMaxPtPath
456
        STOP
457
     END IF
458

    
459
     SGeom(IdxGeom)=s+IdxGeom*dist
460
     XgeomF(IdxGeom)=min(u,NGeomI-1.d0)
461
     XyzGeomF(IdxGeom,:,:)=Reshape(XyzTmp2(:,:),(/3,Nat/),ORDER=(/2,1/))
462
     !  XyzGeomF(IdxGeom,:,:)=XyzTmp2(:,:)
463
     IntCoordF(IdxGeom,1)=valzmat(2,1)
464
     IntCoordF(IdxGeom,2)=valzmat(3,1)
465
     IntCoordF(IdxGeom,3)=valzmat(3,2)/180.*Pi
466
     Idx=4
467
     DO I=4,Nat
468
        IntCoordF(IdxGeom,Idx)=valzmat(I,1)
469
        IntCoordF(IdxGeom,Idx+1)=valzmat(I,2)/180.*Pi
470
        IntCoordF(IdxGeom,Idx+2)=valzmat(I,3)/180.*Pi
471
        Idx=Idx+3
472
     END DO
473
     IntTangent(IdxGeom,:)=DerInt     
474

    
475
     if (print) THEN
476
        WRITE(IOOUT,'(1X,I5)') Nat
477
        WRITE(IOOUT,*) "# Cartesian coord for Geometry ",IdxGeom,K
478
        ! PFL 17/July/2006: only if we have more than 4 atoms.
479
        IF (Nat.GE.4) THEN
480
           ! PFL 24 Nov 2008 ->
481
           ! If we have frozen atoms we align only those ones.
482
           if (NFroz.GT.0) THEN
483
              Call AlignPartial(Nat,x0,y0,z0,                     &
484
                   xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
485
                   FrozAtoms,MRot)
486
           ELSE
487
              Call  CalcRmsd(Nat, x0,y0,z0,                               &
488
                   xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),   &
489
                   MRot,rmsd,.TRUE.,.TRUE.)
490
           END IF
491
           ! <- PFL 24 Nov 2008
492
        END IF
493

    
494
        DO I=1,Nat
495
           If (Renum) THEN
496
              WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(I)),    &
497
                   (XyzTmp2(Order(I),J),J=1,3)
498
           ELSE
499
              WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(OrderInv(I))),     &
500
                   (XyzTmp2(I,J),J=1,3)
501
           END IF
502
        END DO ! matches DO I=1,Nat
503
     END IF ! matches if (print) THEN
504
  END IF ! matches if (s>=0.9*dist) THEN
505

    
506
  if (debug) WRITE(*,*) 's final =',s
507

    
508
  DEALLOCATE(XyzTmp,XyzTmp2,valzmat)
509

    
510
  if (printspline) CLOSE(IOTMP)
511

    
512
  if (debug) Call Header("Extrapol_int Over")
513

    
514

    
515
END SUBROUTINE EXTRAPOL_INT