Statistiques
| Révision :

root / src / Extrapol_mixed.f90 @ 4

Historique | Voir | Annoter | Télécharger (6,41 ko)

1 1 equemene
SUBROUTINE Extrapol_mixed(s,dist,x0,y0,z0,xgeom,Coef)
2 1 equemene
3 1 equemene
! This subroutine constructs the path, and if dist<>Infinity, it samples
4 1 equemene
! the path to obtain geometries.
5 1 equemene
! Basically, you call it twice: i) dist=infinity, it will calculate the
6 1 equemene
! length of the path
7 1 equemene
! ii) dist finite, it will give you the images you want along the path.
8 1 equemene
!
9 1 equemene
! For now, it gives equidistant geometries
10 1 equemene
!!!!!!!!!!!!!!!!
11 1 equemene
!
12 1 equemene
! v2.0
13 1 equemene
! Uses Mix2cart for conversions.
14 1 equemene
15 1 equemene
16 1 equemene
  use Path_module
17 1 equemene
  use Io_module
18 1 equemene
19 1 equemene
20 1 equemene
  IMPLICIT NONE
21 1 equemene
22 1 equemene
23 1 equemene
  REAL(KREAL), INTENT(OUT) :: s
24 1 equemene
  REAL(KREAL), INTENT(IN) :: dist,X0(Nat),Y0(Nat),Z0(Nat)
25 1 equemene
  REAL(KREAL), INTENT(IN) :: Xgeom(NGeomI),Coef(NGeomI,NCoord)
26 1 equemene
27 1 equemene
  INTEGER(KINT) :: IdxGeom, I, J, K, Idx
28 1 equemene
  REAL(KREAL) :: Rmsd,MRot(3,3), ds, u, v
29 1 equemene
  REAL(KREAL) :: a_val, d
30 1 equemene
31 1 equemene
  REAL(KREAL), ALLOCATABLE :: XyzTmp(:,:), XyzTmp2(:,:) ! (Nat,3)
32 1 equemene
  REAL(KREAL), ALLOCATABLE :: IntCoordTmp(:),DerInt(:) ! (NCoord)
33 1 equemene
34 1 equemene
35 1 equemene
  LOGICAL ::  debug, print
36 1 equemene
  LOGICAL, EXTERNAL :: valid
37 1 equemene
38 1 equemene
  !We will calculate the length of the path, in MW coordinates...
39 1 equemene
  ! this is done is a stupid way: we interpolate the zmatrix values,
40 1 equemene
  ! convert them into cartesian, weight the cartesian
41 1 equemene
  ! and calculate the evolution of the distance !
42 1 equemene
  ! We have to follow the same procedure for every geometry
43 1 equemene
  ! so even for the first one, we have to convert it from zmat
44 1 equemene
  ! to cartesian !
45 1 equemene
46 1 equemene
  debug=valid("pathcreate")
47 1 equemene
  print=valid("printgeom")
48 1 equemene
49 1 equemene
  if (debug) Call Header("Entering Extrapol_mixed")
50 1 equemene
  if (debug) WRITE(*,*) "NFroz,NCart",NFroz,NCart
51 1 equemene
  ALLOCATE(XyzTmp(Nat,3),XyzTmp2(Nat,3),IntCoordTmp(NCoord),DerInt(NCoord))
52 1 equemene
  IdxGeom=1
53 1 equemene
54 1 equemene
  IntCoordTmp=IntCoordI(1,1:NCoord)
55 1 equemene
  call Mixed2Cart(Nat,IndZmat,IntCoordTmp,XyzTmp2(1,1))
56 1 equemene
57 1 equemene
  XyzTmp=XyzTmp2
58 1 equemene
59 1 equemene
! We align this geometry with the original one
60 1 equemene
! PFL 01/feb/2007: useless when dealing with more than three cartesian atoms
61 1 equemene
! PFL 17/July/2006: only if we have more than 4 atoms.
62 1 equemene
  IF ((NCart.LT.3).AND.(Nat.GT.4)) THEN
63 1 equemene
!  IF (Nat.GT.4) THEN
64 1 equemene
     Call  CalcRmsd(Nat, x0,y0,z0,                              &
65 1 equemene
          xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
66 1 equemene
          MRot,rmsd,FRot,FAlign)
67 1 equemene
  END IF
68 1 equemene
69 1 equemene
  XyzGeomF(IdxGeom,:,:)=Reshape(XyzTmp2(:,:),(/3,Nat/),ORDER=(/2,1/))
70 1 equemene
  IntCoordF(IdxGeom,:)=IntCoordI(1,:)
71 1 equemene
72 1 equemene
  if (print.AND.(Dist.LE.1e20)) THEN
73 1 equemene
     WRITE(IOOUT,'(1X,I5)') Nat
74 1 equemene
     WRITE(IOOUT,*) "# Cartesian Coordinates for geom",IdxGeom
75 1 equemene
     DO i=1,Nat
76 1 equemene
        If (Renum) THEN
77 1 equemene
           WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(I)),      &
78 1 equemene
                (XyzTmp2(Order(I),J),J=1,3)
79 1 equemene
        ELSE
80 1 equemene
           WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(OrderInv(I))),      &
81 1 equemene
                (XyzTmp2(I,J),J=1,3)
82 1 equemene
        END IF
83 1 equemene
     END DO
84 1 equemene
  END IF
85 1 equemene
86 1 equemene
! Calculate tangents for first geometry
87 1 equemene
  u=0.d0
88 1 equemene
     DO Idx=1,NCoord
89 1 equemene
           call splintder(u,IntCoordTmp(Idx),DerInt(Idx),NGeomI,xgeom(1),IntCoordI(1,Idx),Coef(1,Idx))
90 1 equemene
     END DO
91 1 equemene
     IntTangent(IdxGeom,:)=DerInt
92 1 equemene
93 1 equemene
94 1 equemene
! First geometry already initialized
95 1 equemene
96 1 equemene
  s=0.
97 1 equemene
!  valzmat=0.d0
98 1 equemene
99 1 equemene
  DO K=1,NMaxPtPath
100 1 equemene
     u=real(K)/NMaxPtPath*(NGeomI-1.)
101 1 equemene
102 1 equemene
     XYZTmp2=0.
103 1 equemene
104 1 equemene
! We generate the interpolated  coordinates
105 1 equemene
     DO Idx=1,NCoord
106 1 equemene
           call splintder(u,IntCoordTmp(Idx),DerInt(Idx),NGeomI,xgeom(1),IntCoordI(1,Idx),Coef(1,Idx))
107 1 equemene
     END DO
108 1 equemene
109 1 equemene
! We convert it into Cartesian coordinates
110 1 equemene
  call Mixed2Cart(Nat,IndZmat,IntCoordTmp,XyzTmp2(1,1))
111 1 equemene
112 1 equemene
! We calculate ds
113 1 equemene
     ds=0.
114 1 equemene
     DO I=1,Nat
115 1 equemene
        DO J=1,3
116 1 equemene
           ds=ds+MassAt(I)*(XYZTMp2(I,J)-XYZTmp(I,J))**2
117 1 equemene
           XYZTmp(I,J)=XyzTMP2(I,J)
118 1 equemene
        ENDDO
119 1 equemene
     ENDDO
120 1 equemene
     s=s+sqrt(ds)
121 1 equemene
122 1 equemene
!         if (debug) WRITE(*,*) "Debug u,s,dist",u,s,dist
123 1 equemene
     if (s>=dist) THEN
124 1 equemene
        s=s-dist
125 1 equemene
        IdxGeom=IdxGeom+1
126 1 equemene
        XyzGeomF(IdxGeom,:,:)=Reshape(XyzTmp2(:,:),(/3,Nat/),ORDER=(/2,1/))
127 1 equemene
128 1 equemene
        IntCoordF(IdxGeom,:)=IntCoordTmp
129 1 equemene
        IntTangent(IdxGeom,:)=DerInt
130 1 equemene
131 1 equemene
        if (print) THEN
132 1 equemene
           WRITE(IOOUT,'(1X,A,12(1X,F10.5))') "#Internal Coord",IntCoordTmp(1:NCoord)
133 1 equemene
           WRITE(IOOUT,'(1X,A,12(1X,F10.5))') "#Internal tan",IntTangent(IdxGeom,1:NCoord)
134 1 equemene
           WRITE(IOOUT,'(1X,I5)') Nat
135 1 equemene
           WRITE(IOOUT,*) "# Cartesian coord for Geometry ",IdxGeom,K,u,Xgeom(NGeomI)
136 1 equemene
137 1 equemene
! PFL 01/feb/2007: useless when dealing with more than three cartesian atoms
138 1 equemene
! PFL 17/July/2006: only if we have more than 4 atoms.
139 1 equemene
           IF ((NCart.LT.3).AND.(Nat.GT.4)) THEN
140 1 equemene
!           IF (Nat.GT.4) THEN
141 1 equemene
              Call  CalcRmsd(Nat, x0,y0,z0,                               &
142 1 equemene
                   xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),   &
143 1 equemene
                   MRot,rmsd,FRot,FAlign)
144 1 equemene
           END IF
145 1 equemene
146 1 equemene
           DO i=1,Nat
147 1 equemene
              If (Renum) THEN
148 1 equemene
                 WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(I)),   &
149 1 equemene
                      (XyzTmp2(Order(I),J),J=1,3)
150 1 equemene
              ELSE
151 1 equemene
                 WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(OrderInv(I))),    &
152 1 equemene
                      (XyzTmp2(I,J),J=1,3)
153 1 equemene
              END IF
154 1 equemene
           END DO
155 1 equemene
156 1 equemene
        END IF
157 1 equemene
     END IF
158 1 equemene
  ENDDO
159 1 equemene
160 1 equemene
161 1 equemene
  if ((s>=0.1*dist).AND.(IdxGeom.EQ.NGeomF)) THEN
162 1 equemene
     WRITE(*,*) "** PathCreate ***"
163 1 equemene
     WRITE(*,*) "Distribution of points along the path is wrong."
164 1 equemene
     WRITE(*,*) "Increase value of NMaxPtPath in the input file"
165 1 equemene
     WRITE(*,*) "Present value is:", NMaxPtPath
166 1 equemene
     STOP
167 1 equemene
  END IF
168 1 equemene
169 1 equemene
  IdxGeom=NGeomF
170 1 equemene
171 1 equemene
! We have to add the last geometry. We copy the last geom of Initial geometries.
172 1 equemene
     IntCoordF(IdxGeom,:)=IntCoordI(NGeomI,:)
173 1 equemene
     IntTangent(IdxGeom,:)=DerInt
174 1 equemene
175 1 equemene
! we convert it to cartesian geom
176 1 equemene
  call Mixed2Cart(Nat,IndZmat,IntCoordF(IdxGeom,1),XyzTmp2(1,1))
177 1 equemene
  XyzGeomF(IdxGeom,:,:)=Reshape(XyzTmp2(:,:),(/3,Nat/),ORDER=(/2,1/))
178 1 equemene
179 1 equemene
     if (print) THEN
180 1 equemene
        WRITE(IOOUT,'(1X,I5)') Nat
181 1 equemene
        WRITE(IOOUT,*) "# Cartesian coord for last Geometry ",IdxGeom,K,u,Xgeom(NGeomI)
182 1 equemene
! PFL 01/feb/2007: useless when dealing with more than three cartesian atoms
183 1 equemene
! PFL 17/July/2006: only if we have more than 4 atoms.
184 1 equemene
        IF ((NCART.LT.3).AND.(Nat.GT.4)) THEN
185 1 equemene
!       IF (Nat.GT.4) THEN
186 1 equemene
           Call  CalcRmsd(Nat, x0,y0,z0,                          &
187 1 equemene
                xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),    &
188 1 equemene
                MRot,rmsd,FRot,FAlign)
189 1 equemene
        END IF
190 1 equemene
191 1 equemene
        DO i=1,Nat
192 1 equemene
           If (Renum) THEN
193 1 equemene
              WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(I)),    &
194 1 equemene
                   (XyzTmp2(Order(I),J),J=1,3)
195 1 equemene
           ELSE
196 1 equemene
              WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(OrderInv(I))),     &
197 1 equemene
                   (XyzTmp2(I,J),J=1,3)
198 1 equemene
           END IF
199 1 equemene
        END DO
200 1 equemene
     END IF
201 1 equemene
202 1 equemene
203 1 equemene
  if (debug) WRITE(*,*) 's final =',s
204 1 equemene
205 1 equemene
  DEALLOCATE(XyzTmp,XyzTmp2)
206 1 equemene
207 1 equemene
  if (debug) Call Header("Extrapol_Mixed Over")
208 1 equemene
209 1 equemene
210 1 equemene
END SUBROUTINE EXTRAPOL_MIXED