Statistiques
| Révision :

root / src / Extrapol_cart.f90 @ 2

Historique | Voir | Annoter | Télécharger (12,42 ko)

1 1 equemene
SUBROUTINE Extrapol_cart(iopt,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 length of the path
6 1 equemene
  ! ii) dist finite, it will give you the images you want along the path.
7 1 equemene
  !
8 1 equemene
  ! For now, it gives equidistant geometries
9 1 equemene
  !
10 1 equemene
11 1 equemene
  use Path_module
12 1 equemene
  use Io_module
13 1 equemene
14 1 equemene
15 1 equemene
  IMPLICIT NONE
16 1 equemene
17 1 equemene
18 1 equemene
  REAL(KREAL), INTENT(OUT) :: s
19 1 equemene
  ! X0(Nat),Y0(Nat),Z0(Nat): reference geometry.
20 1 equemene
  REAL(KREAL), INTENT(IN) :: dist,X0(Nat),Y0(Nat),Z0(Nat)
21 1 equemene
  REAL(KREAL), INTENT(IN) :: Xgeom(NGeomI),Coef(NGeomI,NCoord)
22 1 equemene
! Iopt: Number of the cycles for the optimization
23 1 equemene
  INTEGER(KINT), INTENT(IN) :: Iopt
24 1 equemene
  INTEGER(KINT) :: IdxGeom, I, J, K, Idx,Iat, IGeom
25 1 equemene
! NSpline is the number of points along the interpolating path
26 1 equemene
  INTEGER(KINT) :: NSpline
27 1 equemene
! FileSpline: Filename to save the interpolating path coordinates
28 1 equemene
  CHARACTER(LCHARS) :: FileSpline,TmpChar
29 1 equemene
  REAL(KREAL) :: Rmsd,MRot(3,3), ds, u, v
30 1 equemene
  REAL(KREAL) :: a_val, d
31 1 equemene
32 1 equemene
  REAL(KREAL), ALLOCATABLE :: XyzTmp(:,:), XyzTmp2(:,:) ! (Nat,3)
33 1 equemene
  REAL(KREAL), ALLOCATABLE :: DerXyz(:,:) ! Nat,3
34 1 equemene
35 1 equemene
36 1 equemene
  LOGICAL ::  debug, print, printspline
37 1 equemene
  LOGICAL, EXTERNAL :: valid
38 1 equemene
39 1 equemene
  !We will calculate the length of the path, in MW coordinates...
40 1 equemene
  ! this is done is a stupid way: we interpolate the zmatrix values,
41 1 equemene
  ! convert them into cartesian, weight the cartesian
42 1 equemene
  ! and calculate the evolution of the distance !
43 1 equemene
  ! We have to follow the same procedure for every geometry
44 1 equemene
  ! so even for the first one, we have to convert it from zmat
45 1 equemene
  ! to cartesian !
46 1 equemene
47 1 equemene
  debug=valid("pathcreate")
48 1 equemene
  print=valid("printgeom")
49 1 equemene
50 1 equemene
  printspline=(valid("printspline").AND.(dist<=1e30))
51 1 equemene
52 1 equemene
  if (debug) Call Header("Entering Extrapol_cart")
53 1 equemene
54 1 equemene
! We want 100 points along the interpolating path
55 1 equemene
  NSpline=int(NMaxPtPath/100)
56 1 equemene
57 1 equemene
  if (printspline) THEN
58 1 equemene
     WRITE(TmpChar,'(I5)') Iopt
59 1 equemene
     FileSpline=Trim(adjustL(PathName)) // '_spline.' // AdjustL(TRIM(TmpChar))
60 1 equemene
     OPEN(IOTMP,FILE=FileSpline)
61 1 equemene
62 1 equemene
  END IF
63 1 equemene
64 1 equemene
65 1 equemene
  ALLOCATE(XyzTmp(Nat,3),XyzTmp2(Nat,3),DerXyz(Nat,3))
66 1 equemene
67 1 equemene
!  XyzTmp2=Reshape(XyzGeomI(1,:,:),(/Nat,3/),ORDER=(/2,1/))
68 1 equemene
69 1 equemene
  if (debug) THEN
70 1 equemene
     WRITE(*,*) "DBG Extrapol_cart Initial geometries"
71 1 equemene
     DO IGeom=1,NGeomI
72 1 equemene
        WRITE(*,*) 'XyzGeomI, IGeom=',IGeom
73 1 equemene
        DO I=1,Nat
74 1 equemene
           WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(I)),      &
75 1 equemene
                (XyzGeomI(IGeom,J,I),J=1,3)
76 1 equemene
        END DO
77 1 equemene
     END DO
78 1 equemene
  END IF
79 1 equemene
80 1 equemene
81 1 equemene
! In order to mesure only the relevant distance between two points
82 1 equemene
! we align all geometries on the original one
83 1 equemene
84 1 equemene
   DO IGeom=1,NGeomI
85 1 equemene
86 1 equemene
      XyzTmp2=Reshape(XyzGeomI(IGeom,:,:),(/Nat,3/),ORDER=(/2,1/))
87 1 equemene
  ! We align this geometry with the original one
88 1 equemene
  ! PFL 17/July/2006: only if we have more than 4 atoms.
89 1 equemene
!  IF (Nat.GT.4) THEN
90 1 equemene
! PFL 24 Nov 2008 ->
91 1 equemene
! If we have frozen atoms we align only those ones.
92 1 equemene
! PFL 8 Feb 2011 ->
93 1 equemene
! I add a flag to see if we should align or not.
94 1 equemene
! For small systems, it might be better to let the user align himself
95 1 equemene
      IF (Align) THEN
96 1 equemene
         if (NFroz.GT.0) THEN
97 1 equemene
            Call AlignPartial(Nat,x0,y0,z0,                     &
98 1 equemene
                 xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
99 1 equemene
                 FrozAtoms,MRot)
100 1 equemene
         ELSE
101 1 equemene
            Call  CalcRmsd(Nat, x0,y0,z0,                              &
102 1 equemene
                 xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
103 1 equemene
                 MRot,rmsd,.TRUE.,.TRUE.)
104 1 equemene
         END IF
105 1 equemene
! <- PFL 24 Nov 2008
106 1 equemene
      END IF
107 1 equemene
! -> PFL 8 Feb 2011
108 1 equemene
!  END IF
109 1 equemene
110 1 equemene
  XyzGeomI(IGeom,:,:)=Reshape(XyzTmp2(:,:),(/3,Nat/),ORDER=(/2,1/))
111 1 equemene
 END DO
112 1 equemene
113 1 equemene
   if (print) THEN
114 1 equemene
      WRITE(*,*) "Aligned geometries"
115 1 equemene
      DO J=1, NGeomI
116 1 equemene
         WRITE(IOOUT,*) Nat
117 1 equemene
         WRITE(IOOUT,*) " Aligned geometry ",J,"/",NGeomI
118 1 equemene
           DO i=1,Nat
119 1 equemene
              WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(I)),    &
120 1 equemene
                   XyzGeomI(J,1:3,I)
121 1 equemene
           END DO
122 1 equemene
        END DO
123 1 equemene
     END IF
124 1 equemene
125 1 equemene
  XyzGeomF(1,:,:)=XyzGeomI(1,:,:)
126 1 equemene
127 1 equemene
128 1 equemene
  ! We initialize the first geometry
129 1 equemene
130 1 equemene
  XyzTmp=Reshape(XyzGeomI(1,:,:),(/Nat,3/),ORDER=(/2,1/))
131 1 equemene
132 1 equemene
  ! We align this geometry with the original one
133 1 equemene
  ! PFL 17/July/2006: only if we have more than 4 atoms.
134 1 equemene
!  IF (Nat.GT.4) THEN
135 1 equemene
! PFL 24 Nov 2008 ->
136 1 equemene
! If we have frozen atoms we align only those ones.
137 1 equemene
! PFL 8 Feb 2011 ->
138 1 equemene
! I add a flag to see if we should align or not.
139 1 equemene
! For small systems, it might be better to let the user align himself
140 1 equemene
      IF (Align) THEN
141 1 equemene
         if (NFroz.GT.0) THEN
142 1 equemene
            Call AlignPartial(Nat,x0,y0,z0,                     &
143 1 equemene
                 xyzTmp(1,1),xyzTmp(1,2),xyzTMP(1,3),       &
144 1 equemene
                 FrozAtoms,MRot)
145 1 equemene
         ELSE
146 1 equemene
            Call  CalcRmsd(Nat, x0,y0,z0,                              &
147 1 equemene
                 xyzTmp(1,1),xyzTmp(1,2),xyzTMP(1,3),       &
148 1 equemene
                 MRot,rmsd,.TRUE.,.TRUE.)
149 1 equemene
         END IF
150 1 equemene
! <- PFL 24 Nov 2008
151 1 equemene
      END IF
152 1 equemene
! -> PFL 8 Feb 2011
153 1 equemene
!  END IF
154 1 equemene
155 1 equemene
156 1 equemene
157 1 equemene
  s=0.d0
158 1 equemene
  if (printspline) THEN
159 1 equemene
     u=0.d0
160 1 equemene
     DO Iat=1,Nat
161 1 equemene
        ! We generate the interpolated coordinates
162 1 equemene
        if (Linear) THEN
163 1 equemene
           call LinearInt(u,XyzTmp2(Iat,1),DerXyz(Iat,1),NGeomI,xgeom(1),XyzGeomI(1,1,Iat))
164 1 equemene
           call LinearInt(u,XyzTmp2(Iat,2),DerXyz(Iat,2),NGeomI,xgeom(1),XyzGeomI(1,2,Iat))
165 1 equemene
           call LinearInt(u,XyzTmp2(Iat,3),DerXyz(Iat,3),NGeomI,xgeom(1),XyzGeomI(1,3,Iat))
166 1 equemene
167 1 equemene
        ELSE
168 1 equemene
           call splintder(u,XyzTmp2(Iat,1),DerXyz(Iat,1),NGeomI,xgeom(1),XyzGeomI(1,1,Iat),Coef(1,3*Iat-2))
169 1 equemene
           call splintder(u,XyzTmp2(Iat,2),DerXyz(Iat,2),NGeomI,xgeom(1),XyzGeomI(1,2,Iat),Coef(1,3*Iat-1))
170 1 equemene
           call splintder(u,XyzTmp2(Iat,3),DerXyz(Iat,3),NGeomI,xgeom(1),XyzGeomI(1,3,Iat),Coef(1,3*Iat))
171 1 equemene
        END IF
172 1 equemene
     END DO
173 1 equemene
174 1 equemene
     WRITE(IOTMP,*) Nat
175 1 equemene
     WRITE(IOTMP,'(1X,A,1X,F15.6)') "Debug Spline - Coord=Cart,s=",s
176 1 equemene
     DO Iat=1,Nat
177 1 equemene
        WRITE(IOTMP,'(1X,A2,3(1X,F15.6))') Nom(Atome(Iat)),    &
178 1 equemene
                   (XyzTmp2(Iat,1:3))
179 1 equemene
     END DO
180 1 equemene
  END IF
181 1 equemene
182 1 equemene
 IdxGeom=1
183 1 equemene
184 1 equemene
  DO K=1,NMaxPtPath
185 1 equemene
     u=real(K)/NMaxPtPath*(NGeomI-1.)
186 1 equemene
187 1 equemene
     DO Iat=1,Nat
188 1 equemene
        ! We generate the interpolated coordinates
189 1 equemene
        if (Linear) THEN
190 1 equemene
           call LinearInt(u,XyzTmp2(Iat,1),DerXyz(Iat,1),NGeomI,xgeom(1),XyzGeomI(1,1,Iat))
191 1 equemene
           call LinearInt(u,XyzTmp2(Iat,2),DerXyz(Iat,2),NGeomI,xgeom(1),XyzGeomI(1,2,Iat))
192 1 equemene
           call LinearInt(u,XyzTmp2(Iat,3),DerXyz(Iat,3),NGeomI,xgeom(1),XyzGeomI(1,3,Iat))
193 1 equemene
194 1 equemene
        ELSE
195 1 equemene
           call splintder(u,XyzTmp2(Iat,1),DerXyz(Iat,1),NGeomI,xgeom(1),XyzGeomI(1,1,Iat),Coef(1,3*Iat-2))
196 1 equemene
           call splintder(u,XyzTmp2(Iat,2),DerXyz(Iat,2),NGeomI,xgeom(1),XyzGeomI(1,2,Iat),Coef(1,3*Iat-1))
197 1 equemene
           call splintder(u,XyzTmp2(Iat,3),DerXyz(Iat,3),NGeomI,xgeom(1),XyzGeomI(1,3,Iat),Coef(1,3*Iat))
198 1 equemene
        END IF
199 1 equemene
     END DO
200 1 equemene
201 1 equemene
202 1 equemene
  ! We align this geometry with the original one
203 1 equemene
  ! PFL 17/July/2006: only if we have more than 4 atoms.
204 1 equemene
!  IF (Nat.GT.4) THEN
205 1 equemene
! PFL 24 Nov 2008 ->
206 1 equemene
! If we have frozen atoms we align only those ones.
207 1 equemene
! PFL 8 Feb 2011 ->
208 1 equemene
! I add a flag to see if we should align or not.
209 1 equemene
! For small systems, it might be better to let the user align himself
210 1 equemene
      IF (Align) THEN
211 1 equemene
         if (NFroz.GT.0) THEN
212 1 equemene
            Call AlignPartial(Nat,x0,y0,z0,                     &
213 1 equemene
                 xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
214 1 equemene
                 FrozAtoms,MRot)
215 1 equemene
         ELSE
216 1 equemene
            Call  CalcRmsd(Nat, x0,y0,z0,                              &
217 1 equemene
                 xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
218 1 equemene
                 MRot,rmsd,.TRUE.,.TRUE.)
219 1 equemene
         END IF
220 1 equemene
! <- PFL 24 Nov 2008
221 1 equemene
      END IF
222 1 equemene
! -> PFL 8 Feb 2011
223 1 equemene
!  END IF
224 1 equemene
225 1 equemene
226 1 equemene
227 1 equemene
     ds=0.
228 1 equemene
     DO I=1,Nat
229 1 equemene
        DO J=1,3
230 1 equemene
           ds=ds+MassAt(I)*(XYZTMp2(I,J)-XYZTmp(I,J))**2
231 1 equemene
           XYZTmp(I,J)=XyzTMP2(I,J)
232 1 equemene
        ENDDO
233 1 equemene
     ENDDO
234 1 equemene
     s=s+sqrt(ds)
235 1 equemene
236 1 equemene
     !         if (debug) WRITE(*,*) "Debug u,s,dist",u,s,dist
237 1 equemene
238 1 equemene
  if ((printspline).AND.(MOD(K,NSpline).EQ.0)) THEN
239 1 equemene
     WRITE(IOTMP,*) Nat
240 1 equemene
     WRITE(IOTMP,'(1X,A,1X,F15.6)') "Debug Spline - Coord=Cart,s=",s
241 1 equemene
     DO Iat=1,Nat
242 1 equemene
        WRITE(IOTMP,'(1X,A2,3(1X,F15.6))') Nom(Atome(Iat)),    &
243 1 equemene
                   (XyzTmp2(Iat,1:3))
244 1 equemene
     END DO
245 1 equemene
  END IF
246 1 equemene
247 1 equemene
248 1 equemene
     if (s>=dist) THEN
249 1 equemene
250 1 equemene
        if (debug) THEN
251 1 equemene
           WRITE(*,*) "DBG Interpol_cart",s
252 1 equemene
           DO i=1,Nat
253 1 equemene
              WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(I)),    &
254 1 equemene
                   (XyzTmp2(I,J),J=1,3)
255 1 equemene
           END DO
256 1 equemene
        END IF
257 1 equemene
258 1 equemene
        s=s-dist
259 1 equemene
        IdxGeom=IdxGeom+1
260 1 equemene
261 1 equemene
  ! We align this geometry with the original one
262 1 equemene
  ! PFL 17/July/2006: only if we have more than 4 atoms.
263 1 equemene
!  IF (Nat.GT.4) THEN
264 1 equemene
! PFL 24 Nov 2008 ->
265 1 equemene
! If we have frozen atoms we align only those ones.
266 1 equemene
! PFL 8 Feb 2011 ->
267 1 equemene
! I add a flag to see if we should align or not.
268 1 equemene
! For small systems, it might be better to let the user align himself
269 1 equemene
      IF (Align) THEN
270 1 equemene
         if (NFroz.GT.0) THEN
271 1 equemene
            Call AlignPartial(Nat,x0,y0,z0,                     &
272 1 equemene
                 xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
273 1 equemene
                 FrozAtoms,MRot)
274 1 equemene
         ELSE
275 1 equemene
            Call  CalcRmsd(Nat, x0,y0,z0,                              &
276 1 equemene
                 xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
277 1 equemene
                 MRot,rmsd,.TRUE.,.TRUE.)
278 1 equemene
         END IF
279 1 equemene
! <- PFL 24 Nov 2008
280 1 equemene
      END IF
281 1 equemene
! -> PFL 8 Feb 2011
282 1 equemene
!  END IF
283 1 equemene
284 1 equemene
        XyzGeomF(IdxGeom,:,:)=Reshape(XyzTmp2(:,:),(/3,Nat/),ORDER=(/2,1/))
285 1 equemene
        XyzTangent(IdxGeom,:)=Reshape(DerXyz(:,:),(/3*Nat/))
286 1 equemene
287 1 equemene
        if (print) THEN
288 1 equemene
           WRITE(IOOUT,'(1X,I5)') Nat
289 1 equemene
           WRITE(IOOUT,*) "# Cartesian coord for Geometry ",IdxGeom,K
290 1 equemene
291 1 equemene
           DO i=1,Nat
292 1 equemene
              WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(I)),    &
293 1 equemene
                   (XyzTmp2(I,J),J=1,3)
294 1 equemene
           END DO
295 1 equemene
296 1 equemene
        END IF
297 1 equemene
     END IF  ! s>= dist
298 1 equemene
  ENDDO  ! K
299 1 equemene
300 1 equemene
301 1 equemene
  if (s>=0.9*dist) THEN
302 1 equemene
     s=s-dist
303 1 equemene
     XyzTmp2=Reshape(XyzGeomI(NGeomI,:,:),(/Nat,3/),ORDER=(/2,1/))
304 1 equemene
305 1 equemene
  if (printspline) THEN
306 1 equemene
     WRITE(IOTMP,*) Nat
307 1 equemene
     WRITE(IOTMP,*) "Debug Spline - Coord=Cart,s=",s
308 1 equemene
     DO Iat=1,Nat
309 1 equemene
        WRITE(IOTMP,'(1X,A2,3(1X,F15.6))') Nom(Atome(Iat)),    &
310 1 equemene
                   (XyzTmp2(Iat,1:3))
311 1 equemene
     END DO
312 1 equemene
  END IF
313 1 equemene
314 1 equemene
315 1 equemene
  ! We align this geometry with the original one
316 1 equemene
  ! PFL 17/July/2006: only if we have more than 4 atoms.
317 1 equemene
!  IF (Nat.GT.4) THEN
318 1 equemene
! PFL 24 Nov 2008 ->
319 1 equemene
! If we have frozen atoms we align only those ones.
320 1 equemene
! PFL 8 Feb 2011 ->
321 1 equemene
! I add a flag to see if we should align or not.
322 1 equemene
! For small systems, it might be better to let the user align himself
323 1 equemene
      IF (Align) THEN
324 1 equemene
         if (NFroz.GT.0) THEN
325 1 equemene
            Call AlignPartial(Nat,x0,y0,z0,                     &
326 1 equemene
                 xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
327 1 equemene
                 FrozAtoms,MRot)
328 1 equemene
         ELSE
329 1 equemene
            Call  CalcRmsd(Nat, x0,y0,z0,                              &
330 1 equemene
                 xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
331 1 equemene
                 MRot,rmsd,.TRUE.,.TRUE.)
332 1 equemene
         END IF
333 1 equemene
! <- PFL 24 Nov 2008
334 1 equemene
      END IF
335 1 equemene
! -> PFL 8 Feb 2011
336 1 equemene
!  END IF
337 1 equemene
338 1 equemene
     IdxGeom=IdxGeom+1
339 1 equemene
340 1 equemene
    IF (IdxGeom.GT.NGeomF) THEN
341 1 equemene
        WRITE(IOOUT,*) "!!! ERROR in Extrapol_cart !!!!"
342 1 equemene
        WRITE(IOOUT,*) "Too many structures. Increase NMaxPath"
343 1 equemene
        WRITE(*,*) "** PathCreate ***"
344 1 equemene
        WRITE(*,*) "Distribution of points along the path is wrong."
345 1 equemene
        WRITE(*,*) "Increase value of NMaxPtPath in the input file"
346 1 equemene
        WRITE(*,*) "Present value is:", NMaxPtPath
347 1 equemene
        STOP
348 1 equemene
     END IF
349 1 equemene
350 1 equemene
351 1 equemene
  ! We align this geometry with the original one
352 1 equemene
  ! PFL 17/July/2006: only if we have more than 4 atoms.
353 1 equemene
!  IF (Nat.GT.4) THEN
354 1 equemene
! PFL 24 Nov 2008 ->
355 1 equemene
! If we have frozen atoms we align only those ones.
356 1 equemene
! PFL 8 Feb 2011 ->
357 1 equemene
! I add a flag to see if we should align or not.
358 1 equemene
! For small systems, it might be better to let the user align himself
359 1 equemene
      IF (Align) THEN
360 1 equemene
         if (NFroz.GT.0) THEN
361 1 equemene
            Call AlignPartial(Nat,x0,y0,z0,                     &
362 1 equemene
                 xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
363 1 equemene
                 FrozAtoms,MRot)
364 1 equemene
         ELSE
365 1 equemene
            Call  CalcRmsd(Nat, x0,y0,z0,                              &
366 1 equemene
                 xyzTmp2(1,1),xyzTmp2(1,2),xyzTMP2(1,3),       &
367 1 equemene
                 MRot,rmsd,.TRUE.,.TRUE.)
368 1 equemene
         END IF
369 1 equemene
! <- PFL 24 Nov 2008
370 1 equemene
      END IF
371 1 equemene
! -> PFL 8 Feb 2011
372 1 equemene
!  END IF
373 1 equemene
374 1 equemene
     XyzGeomF(IdxGeom,:,:)=Reshape(XyzTmp2(:,:),(/3,Nat/),ORDER=(/2,1/))
375 1 equemene
     XyzTangent(IdxGeom,:)=Reshape(DerXyz(:,:),(/3*Nat/))
376 1 equemene
377 1 equemene
     if (print) THEN
378 1 equemene
        WRITE(IOOUT,'(1X,I5)') Nat
379 1 equemene
        WRITE(IOOUT,*) "# Cartesian coord for Geometry ",IdxGeom,K
380 1 equemene
381 1 equemene
        DO i=1,Nat
382 1 equemene
           WRITE(IOOUT,'(1X,A2,3(1X,F15.6))') Nom(Atome(I)),     &
383 1 equemene
                (XyzTmp2(I,J),J=1,3)
384 1 equemene
        END DO
385 1 equemene
     END IF
386 1 equemene
  END IF
387 1 equemene
388 1 equemene
  DEALLOCATE(XyzTmp,XyzTmp2)
389 1 equemene
390 1 equemene
  if (debug) WRITE(*,*) 's final =',s
391 1 equemene
392 1 equemene
  if (printspline) CLOSE(IOTMP)
393 1 equemene
394 1 equemene
  if (debug) Call Header("Extrapol_cart over")
395 1 equemene
396 1 equemene
END SUBROUTINE EXTRAPOL_CART