Statistiques
| Révision :

root / src / ConvertBakerInternal_cart.f90 @ 2

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

1 1 equemene
SUBROUTINE ConvertBakerInternal_cart(IntCoord_k,IntCoord,x_k,y_k,z_k,x,y,z,XPrim,XPrimRef)
2 1 equemene
3 1 equemene
!================================================================
4 1 equemene
! Converts the positions in Baker Coordinates to cartesian coordinates
5 1 equemene
!================================================================
6 1 equemene
!
7 1 equemene
! Input:
8 1 equemene
!    Incoord_k(NCoord) REAL: Starting internal coordinates
9 1 equemene
!    IntCoord(NCoord) REAL: Coordinate to convert to cartesian coordinates
10 1 equemene
!    x_k,y_k,z_k(Nat) REAL: Starting cartesian geometry
11 1 equemene
!    XPrimRef(NPrim) REAL: Reference values for Primitives coordinates (mainly for dihedral)
12 1 equemene
!
13 1 equemene
! Output:
14 1 equemene
!    x,y,z(Nat) REAL: Cartesian coordinates corresponding to IntCoord
15 1 equemene
!    XPrim(NPrim) REAL: Primitives for the cartesian coordinates. (This is a by-product)
16 1 equemene
!
17 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
18 1 equemene
19 1 equemene
! BTransInv,UMat should be passed as arguments of this subroutine.
20 1 equemene
21 1 equemene
22 1 equemene
  ! IdxGeom: geometry index.
23 1 equemene
  ! Internal coordinates IntCoord(NCoord) is to be converted
24 1 equemene
  ! into Cartesian coordinates x(Nat),y(Nat),z(Nat).
25 1 equemene
26 1 equemene
  use Path_module, only : Nat,AtName,IntCoordI,XyzGeomI,BMat_BakerT,NPrim,&
27 1 equemene
       BTransInv,BBT,BBT_inv,BprimT,a0,ScanCoord,Coordinate,&
28 1 equemene
       Xprimitive,Pi,NGeomI,IntCoordF,BTransInv_local,Xprimitive_t,&
29 1 equemene
       Symmetry_elimination,NCoord,UMat_local
30 1 equemene
  ! UMat_local is allocated in Calc_baker.f90
31 1 equemene
  ! XyzGeomI(NGeomI,3,Nat),BMat_BakerT(3*Nat,NCoord),a0=0.529177249d0
32 1 equemene
33 1 equemene
  Use Io_Module
34 1 equemene
  use VarTypes
35 1 equemene
  IMPLICIT NONE
36 1 equemene
37 1 equemene
  REAL(KREAL), INTENT(OUT) :: x(Nat),y(Nat),z(Nat)
38 1 equemene
  REAL(KREAL), INTENT(IN) :: x_k(Nat),y_k(Nat),z_k(Nat)
39 1 equemene
  REAL(KREAL), INTENT(IN) :: IntCoord(NCoord)
40 1 equemene
  REAL(KREAL), INTENT(INOUT) ::  IntCoord_k(NCoord)
41 1 equemene
  REAL(KREAL), INTENT(IN) :: XPrimRef(NPrim)
42 1 equemene
  REAL(KREAL), INTENT(OUT) :: XPrim(NPrim)
43 1 equemene
44 1 equemene
45 1 equemene
  ! IdxGeom: geometry index.
46 1 equemene
  Integer(KINT) :: n1,n2,n3,I,J,K,Counter
47 1 equemene
  REAL(KREAL) :: normDeltaX_int
48 1 equemene
49 1 equemene
  REAL(KREAL), ALLOCATABLE :: DeltaX_int(:)  !DeltaX_int(NPrim,3*Nat-6), 3*Nat-6??
50 1 equemene
  REAL(KREAL), ALLOCATABLE :: DeltaX_cart(:) !DeltaX_cart(3*Nat)
51 1 equemene
  REAL(KREAL), ALLOCATABLE :: Geom(:,:) !(3,Nat)
52 1 equemene
  REAL(KREAL), ALLOCATABLE :: X_cart_k(:,:) ! (3,Nat)
53 1 equemene
  REAL(KREAL), ALLOCATABLE :: GMat(:,:) !(NPrim,NPrim)
54 1 equemene
  REAL(KREAL), ALLOCATABLE :: EigVec(:,:), EigVal(:) ! EigVec(NPrim,NPrim)
55 1 equemene
  REAL(KREAL), ALLOCATABLE :: UMat_tmp(:,:)
56 1 equemene
  REAL(KREAL), ALLOCATABLE :: V(:,:) ! (NCoord,NCoord)
57 1 equemene
58 1 equemene
  REAL(KREAL) ::  vx,vy,vz,dist,Norm
59 1 equemene
  REAL(KREAL) :: vx1,vy1,vz1,norm1
60 1 equemene
  REAL(KREAL) :: vx2,vy2,vz2,norm2
61 1 equemene
  REAL(KREAL) :: vx3,vy3,vz3,norm3
62 1 equemene
  REAL(KREAL) :: vx4,vy4,vz4,norm4
63 1 equemene
  REAL(KREAL) :: vx5,vy5,vz5,norm5
64 1 equemene
  REAL(KREAL) :: val,val_d, Q, T
65 1 equemene
  REAL(KREAL) :: Angle, angle_d, tol,Delta,DiheTmp
66 1 equemene
  REAL(KREAL) :: MRot(3,3), Rmsd
67 1 equemene
  REAL(KREAL), PARAMETER :: Crit=1e-08
68 1 equemene
69 1 equemene
  EXTERNAL Angle, angle_d
70 1 equemene
  LOGICAL :: debug, FAIL
71 1 equemene
72 1 equemene
  INTEGER(KINT), PARAMETER :: NbItMax=50
73 1 equemene
74 1 equemene
75 1 equemene
  INTERFACE
76 1 equemene
     function valid(string) result (isValid)
77 1 equemene
       CHARACTER(*), intent(in) :: string
78 1 equemene
       logical                  :: isValid
79 1 equemene
     END function VALID
80 1 equemene
81 1 equemene
82 1 equemene
83 1 equemene
     SUBROUTINE Calc_Xprim(nat,x,y,z,Coordinate,NPrim,XPrimitive,XPrimRef)
84 1 equemene
       !
85 1 equemene
       ! This subroutine uses the description of a list of Coordinates
86 1 equemene
       ! to compute the values of the coordinates for a given geometry.
87 1 equemene
       !
88 1 equemene
!!!!!!!!!!
89 1 equemene
       ! Input:
90 1 equemene
       !   Na: INTEGER, Number of atoms
91 1 equemene
       !  x,y,z(Na): REAL, cartesian coordinates of the considered geometry
92 1 equemene
       ! Coordinate (Pointer(ListCoord)): description of the wanted coordiantes
93 1 equemene
       ! NPrim, INTEGER: Number of coordinates to compute
94 1 equemene
       !
95 1 equemene
       ! Optional: XPrimRef(NPrim) REAL: array that contains coordinates values for
96 1 equemene
       ! a former geometry. Useful for Dihedral angles evolution...
97 1 equemene
98 1 equemene
!!!!!!!!!!!
99 1 equemene
       ! Output:
100 1 equemene
       ! XPrimimite(NPrim) REAL: array that will contain the values of the coordinates
101 1 equemene
       !
102 1 equemene
!!!!!!!!!
103 1 equemene
104 1 equemene
       Use VarTypes
105 1 equemene
       Use Io_module
106 1 equemene
       Use Path_module, only : pi
107 1 equemene
108 1 equemene
       IMPLICIT NONE
109 1 equemene
110 1 equemene
       Type (ListCoord), POINTER :: Coordinate
111 1 equemene
       INTEGER(KINT), INTENT(IN) :: Nat,NPrim
112 1 equemene
       REAL(KREAL), INTENT(IN) :: x(Nat), y(Nat), z(Nat)
113 1 equemene
       REAL(KREAL), INTENT(IN), OPTIONAL :: XPrimRef(NPrim)
114 1 equemene
       REAL(KREAL), INTENT(OUT) :: XPrimitive(NPrim)
115 1 equemene
116 1 equemene
     END SUBROUTINE CALC_XPRIM
117 1 equemene
  END INTERFACE
118 1 equemene
119 1 equemene
120 1 equemene
  debug=valid('ConvertBakerInternal_cart')
121 1 equemene
  if (debug) WRITE(*,*) '=======Entering ConvertBakerInternal_cart======='
122 1 equemene
123 1 equemene
  FAIL = .FALSE.
124 1 equemene
125 1 equemene
!!!!!!
126 1 equemene
  ! Allocation phase
127 1 equemene
128 1 equemene
  ALLOCATE(DeltaX_int(NCoord),DeltaX_cart(3*Nat))
129 1 equemene
  ALLOCATE(UMat_tmp(NPrim,NCoord))
130 1 equemene
  ALLOCATE(X_cart_k(3,Nat))
131 1 equemene
  ALLOCATE(Geom(3,Nat),BprimT(3*Nat,NPrim))
132 1 equemene
  ALLOCATE(BBT(NCoord,NCoord))
133 1 equemene
  ALLOCATE(BBT_inv(NCoord,NCoord))
134 1 equemene
  ALLOCATE(Gmat(NPrim,NPrim))
135 1 equemene
  ALLOCATE(EigVal(NPrim),EigVec(NPrim,NPrim))
136 1 equemene
137 1 equemene
138 1 equemene
  if (debug) THEN
139 1 equemene
     WRITE(*,*) "Checking purposes...."
140 1 equemene
     WRITE(*,*) "Trying ot convert Xint initial (IntCoord)"
141 1 equemene
     WRITE(*,'(50(1X,F12.8))') IntCoord(:)
142 1 equemene
     WRITE(*,*) "BTransInv_local"
143 1 equemene
     DO J=1,3*Nat
144 1 equemene
        WRITE(*,'(50(1X,F12.8))') BTransInv_local(:,J)
145 1 equemene
     END DO
146 1 equemene
     WRITE(*,*) "Xint initial (IntCoord_k)"
147 1 equemene
     WRITE(*,'(50(1X,F12.8))') IntCoord_k(:)
148 1 equemene
     WRITE(*,*) "Cartesian coordinates"
149 1 equemene
     WRITE(*,*) Nat
150 1 equemene
     WRITE(*,*) 'GeomCart in ConvertBakerInternal_cart'
151 1 equemene
     DO I=1,Nat
152 1 equemene
        WRITE(*,'(1X,A,I4,3(1X,F12.4))') AtName(I),I,X_k(I),Y_k(i),Z_k(i)
153 1 equemene
     END DO
154 1 equemene
     WRITE(*,*) "Calculating actual values using x_k,y_k,z_k"
155 1 equemene
156 1 equemene
!     WRITE(*,*) "First, with Calc_XPrim"
157 1 equemene
!     WRITE(*,*) "Coordinate:",associated(Coordinate)
158 1 equemene
     Call Calc_Xprim(nat,x_k,y_k,z_k,Coordinate,NPrim,XPrimitive_t,XPrimRef)
159 1 equemene
160 1 equemene
!      I=0 ! index for the NPrim (NPrim is the number of ! primitive coordinates).
161 1 equemene
!      ScanCoord=>Coordinate
162 1 equemene
!      DO WHILE (Associated(ScanCoord%next))
163 1 equemene
!         I=I+1
164 1 equemene
!         SELECT CASE (ScanCoord%Type)
165 1 equemene
!         CASE ('BOND')
166 1 equemene
!            Print *, I, ':',  ScanCoord%At1, '-', ScanCoord%At2, '=', Xprimitive_t(I)
167 1 equemene
!         CASE ('ANGLE')
168 1 equemene
!            Print *, I, ':', ScanCoord%At1, '-', ScanCoord%At2,'-',ScanCoord%At3, '=', Xprimitive_t(I)*180./Pi
169 1 equemene
!         CASE ('DIHEDRAL')
170 1 equemene
!            Print *, I, ':',  ScanCoord%At1, '-',ScanCoord%At2,'-',ScanCoord%At3,'-',&
171 1 equemene
!            ScanCoord%At4,'=',Xprimitive_t(I)*180./Pi
172 1 equemene
!         END SELECT
173 1 equemene
!         ScanCoord => ScanCoord%next
174 1 equemene
!      END DO ! matches DO WHILE (Associated(ScanCoord%next))
175 1 equemene
176 1 equemene
!      WRITE(*,*) "Second with normal proc"
177 1 equemene
!      I=0 ! index for the NPrim (NPrim is the number of ! primitive coordinates).
178 1 equemene
!      Xprimitive_t=0.d0
179 1 equemene
!      ScanCoord=>Coordinate
180 1 equemene
!      DO WHILE (Associated(ScanCoord%next))
181 1 equemene
!         I=I+1
182 1 equemene
!         SELECT CASE (ScanCoord%Type)
183 1 equemene
!         CASE ('BOND')
184 1 equemene
!            Call vecteur(ScanCoord%At2,ScanCoord%At1,x_k,y_k,z_k,vx2,vy2,vz2,Norm2)
185 1 equemene
!            Xprimitive_t(I) = Norm2
186 1 equemene
!            Print *, I, ':',  ScanCoord%At1, '-', ScanCoord%At2, '=', Xprimitive_t(I)
187 1 equemene
!         CASE ('ANGLE')
188 1 equemene
!            Call vecteur(ScanCoord%At2,ScanCoord%At3,x_k,y_k,z_k,vx1,vy1,vz1,Norm1)
189 1 equemene
!            Call vecteur(ScanCoord%At2,ScanCoord%At1,x_k,y_k,z_k,vx2,vy2,vz2,Norm2)
190 1 equemene
!            Xprimitive_t(I) = angle(vx1,vy1,vz1,Norm1,vx2,vy2,vz2,Norm2)*Pi/180.
191 1 equemene
!            Print *, I, ':', ScanCoord%At1, '-', ScanCoord%At2,'-',ScanCoord%At3, '=', Xprimitive_t(I)*180./Pi
192 1 equemene
!         CASE ('DIHEDRAL')
193 1 equemene
!            Call vecteur(ScanCoord%At2,ScanCoord%At1,x_k,y_k,z_k,vx1,vy1,vz1,Norm1)
194 1 equemene
!            Call vecteur(ScanCoord%At2,ScanCoord%At3,x_k,y_k,z_k,vx2,vy2,vz2,Norm2)
195 1 equemene
!            Call vecteur(ScanCoord%At3,ScanCoord%At4,x_k,y_k,z_k,vx3,vy3,vz3,Norm3)
196 1 equemene
!            Call produit_vect(vx3,vy3,vz3,norm3,vx2,vy2,vz2,norm2,vx5,vy5,vz5,norm5)
197 1 equemene
!            Call produit_vect(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2,vx4,vy4,vz4,norm4)
198 1 equemene
! !!! PFL 28 Feb 2008 Test to be sure that angle does not change by more than Pi
199 1 equemene
!            !           Xprimitive_t(I)=angle_d(vx4,vy4,vz4,norm4,vx5,vy5,vz5,norm5,vx2,vy2,vz2,norm2)*Pi/180.
200 1 equemene
!            DiheTmp= angle_d(vx4,vy4,vz4,norm4,vx5,vy5,vz5,norm5, &
201 1 equemene
!                 vx2,vy2,vz2,norm2)
202 1 equemene
!            Xprimitive_t(I) = DiheTmp*Pi/180.
203 1 equemene
!            ! We treat large dihedral angles differently as +180=-180 mathematically and physically
204 1 equemene
!            ! but this causes lots of troubles when converting baker to cart.
205 1 equemene
!            ! So we ensure that large dihedral angles always have the same sign
206 1 equemene
!            if (abs(ScanCoord%SignDihedral).NE.1) THEN
207 1 equemene
!               ScanCoord%SignDihedral=Int(Sign(1.,DiheTmp))
208 1 equemene
!            ELSE
209 1 equemene
!               If ((abs(DiheTmp).GE.170.D0).AND.(Sign(1.,DiheTmp)*ScanCoord%SignDihedral<0)) THEN
210 1 equemene
!                  Xprimitive_t(I) = DiheTmp*Pi/180.+ ScanCoord%SignDihedral*2.*Pi
211 1 equemene
!               END IF
212 1 equemene
!            END IF
213 1 equemene
214 1 equemene
!            IF (abs(Xprimitive_t(I)-XPrimRef(I)).GE.Pi) THEN
215 1 equemene
!               if ((Xprimitive_t(I)-XPrimRef(I)).GE.Pi) THEN
216 1 equemene
!                  Xprimitive_t(I)=Xprimitive_t(I)-2.d0*Pi
217 1 equemene
!               ELSE
218 1 equemene
!                  Xprimitive_t(I)=Xprimitive_t(I)+2.d0*Pi
219 1 equemene
!               END IF
220 1 equemene
!            END IF
221 1 equemene
222 1 equemene
!            Print *, I, ':',  ScanCoord%At1, '-',ScanCoord%At2,'-',ScanCoord%At3,'-',&
223 1 equemene
!            ScanCoord%At4,'=',Xprimitive_t(I)*180./Pi
224 1 equemene
!         END SELECT
225 1 equemene
!         ScanCoord => ScanCoord%next
226 1 equemene
!      END DO ! matches DO WHILE (Associated(ScanCoord%next))
227 1 equemene
228 1 equemene
     IntCoord_k=0.d0
229 1 equemene
     DO I=1, NPrim
230 1 equemene
        ! Transpose of UMat is needed below, that is why UMat(I,:).
231 1 equemene
        IntCoord_k(:)=IntCoord_k(:)+UMat_local(I,:)*Xprimitive_t(I)
232 1 equemene
     END DO
233 1 equemene
     WRITE(*,*) "Xint (intCoord_k) cooresponding to x_k,y_k,z_k"
234 1 equemene
     WRITE(*,'(50(1X,F12.8))') IntCoord_k(:)
235 1 equemene
     WRITE(*,*) "UMat_local"
236 1 equemene
     DO I=1, NPrim
237 1 equemene
        WRITE(*,'(50(1X,F12.8))') UMat_local(I,:)
238 1 equemene
     END DO
239 1 equemene
240 1 equemene
     !     Geom(1,:)=X_k(1:Nat)/a0
241 1 equemene
     !     Geom(2,:)=y_k(1:Nat)/a0
242 1 equemene
     !     Geom(3,:)=z_k(1:Nat)/a0
243 1 equemene
244 1 equemene
     Geom(1,:)=X_k(1:Nat)
245 1 equemene
     Geom(2,:)=y_k(1:Nat)
246 1 equemene
     Geom(3,:)=z_k(1:Nat)
247 1 equemene
248 1 equemene
     ! Computing B^prim:
249 1 equemene
     BprimT=0.d0
250 1 equemene
     ScanCoord=>Coordinate
251 1 equemene
     I=0
252 1 equemene
     DO WHILE (Associated(ScanCoord%next))
253 1 equemene
        I=I+1
254 1 equemene
        SELECT CASE (ScanCoord%Type)
255 1 equemene
        CASE ('BOND')
256 1 equemene
           CALL CONSTRAINTS_BONDLENGTH_DER(Nat,ScanCoord%at1,ScanCoord%AT2,Geom,BprimT(1,I))
257 1 equemene
        CASE ('ANGLE')
258 1 equemene
           CALL CONSTRAINTS_BONDANGLE_DER(Nat,ScanCoord%At1,ScanCoord%AT2,ScanCoord%At3,Geom,BprimT(1,I))
259 1 equemene
        CASE ('DIHEDRAL')
260 1 equemene
           CALL CONSTRAINTS_TORSION_DER2(Nat,ScanCoord%At1,ScanCoord%AT2,ScanCoord%At3,ScanCoord%At4,Geom,BprimT(1,I))
261 1 equemene
        END SELECT
262 1 equemene
        ScanCoord => ScanCoord%next
263 1 equemene
     END DO
264 1 equemene
265 1 equemene
     !     if (debug) THEN
266 1 equemene
     !        WRITE(*,*) "PFL DBG, I,NPrim,BPrimT",I,NPrim
267 1 equemene
     !        DO I=1,NPrim
268 1 equemene
     !           WRITE(*,'(50(1X,F12.6))') BPrimT(:,I)
269 1 equemene
     !        END DO
270 1 equemene
     !     END IF
271 1 equemene
272 1 equemene
     BMat_BakerT = 0.d0
273 1 equemene
     DO I=1,NCoord
274 1 equemene
        DO J=1,NPrim
275 1 equemene
           !BprimT is transpose of B^prim.
276 1 equemene
           !B = UMat^T B^prim, B^T = (B^prim)^T UMat
277 1 equemene
           BMat_BakerT(:,I)=BMat_BakerT(:,I)+BprimT(:,J)*UMat_local(J,I)
278 1 equemene
        END DO
279 1 equemene
     END DO
280 1 equemene
281 1 equemene
     BBT = 0.d0
282 1 equemene
     DO I=1,NCoord
283 1 equemene
        DO J=1,3*Nat 	! BBT(:,I) forms BB^T
284 1 equemene
           BBT(:,I) = BBT(:,I) + BMat_BakerT(J,:)*BMat_BakerT(J,I)
285 1 equemene
        END DO
286 1 equemene
     END DO
287 1 equemene
288 1 equemene
     BBT_inv = 0.d0
289 1 equemene
290 1 equemene
     !Print *, 'NCoord=', NCoord
291 1 equemene
     !Print *, 'BBT='
292 1 equemene
     DO J=1,NCoord
293 1 equemene
        ! WRITE(*,'(50(1X,F12.6))') BBT(:,J)
294 1 equemene
     END DO
295 1 equemene
     !Print *, 'End of BBT'
296 1 equemene
     ! GenInv is in Mat_util.f90
297 1 equemene
     Call GenInv(NCoord,BBT,BBT_inv,NCoord)
298 1 equemene
!     ALLOCATE(V(NCoord,NCoord))
299 1 equemene
!     tol = 1e-12
300 1 equemene
!     ! BBT is destroyed by GINVSE
301 1 equemene
!     Call GINVSE(BBT,NCoord,NCoord,BBT_inv,NCoord,NCoord,NCoord,tol,V,NCoord,FAIL,IOOUT)
302 1 equemene
!     DEALLOCATE(V)
303 1 equemene
!     IF(Fail) Then
304 1 equemene
!        WRITE (*,*) "Failed in generalized inverse, L220, ConvertBaker...f90"
305 1 equemene
!        STOP
306 1 equemene
!     END IF
307 1 equemene
308 1 equemene
     !Print *, 'BBT_inv='
309 1 equemene
     DO J=1,NCoord
310 1 equemene
        ! WRITE(*,'(50(1X,F10.2))') BBT_inv(:,J)
311 1 equemene
        ! Print *, BBT_inv(:,J)
312 1 equemene
     END DO
313 1 equemene
     !Print *, 'End of BBT_inv'
314 1 equemene
315 1 equemene
     ! Calculation of (B^T)^-1 = (BB^T)^-1B:
316 1 equemene
     BTransInv_local = 0.d0
317 1 equemene
     DO I=1,3*Nat
318 1 equemene
        DO J=1,NCoord
319 1 equemene
           BTransInv_local(:,I)=BTransInv_local(:,I)+BBT_inv(:,J)*BMat_BakerT(I,J)
320 1 equemene
        END DO
321 1 equemene
     END DO
322 1 equemene
323 1 equemene
     !Print *, 'BMat_BakerT='
324 1 equemene
     DO J=1,3*Nat
325 1 equemene
        !WRITE(*,'(50(1X,F12.8))') BMat_BakerT(:,J)
326 1 equemene
     END DO
327 1 equemene
     !Print *, 'End of BMat_BakerT'
328 1 equemene
329 1 equemene
     WRITE(*,*) "BTransInv_local Trans corresponding to x_k,y_k,z_k"
330 1 equemene
     DO J=1,3*Nat
331 1 equemene
        WRITE(*,'(50(1X,F12.8))') BTransInv_local(:,J)
332 1 equemene
     END DO
333 1 equemene
334 1 equemene
335 1 equemene
  END IF
336 1 equemene
337 1 equemene
  DeltaX_int(:) = IntCoord(:)-IntCoord_k(:)
338 1 equemene
339 1 equemene
  X_cart_k(1,:) = x_k(:)
340 1 equemene
  X_cart_k(2,:) = y_k(:)
341 1 equemene
  X_cart_k(3,:) = z_k(:)
342 1 equemene
343 1 equemene
  normDeltaX_int=0.d0 ! This is to be implemented.
344 1 equemene
  DO I=1, NCoord
345 1 equemene
     normDeltaX_int=normDeltaX_int+DeltaX_int(I)*DeltaX_int(I)
346 1 equemene
  END DO
347 1 equemene
  normDeltaX_int = sqrt(normDeltaX_int)
348 1 equemene
  ! I just need initial value of normDeltaX_int to be .GT. 1d-11,
349 1 equemene
  ! that is why it is initialized to 1.d0
350 1 equemene
  !normDeltaX_int = 1.d0
351 1 equemene
352 1 equemene
  if (debug) WRITE(*,*) "Entering the loop"
353 1 equemene
  Counter = 0
354 1 equemene
  DO While ((normDeltaX_int .GT. Crit) .AND. (Counter .LT. NbItMax))
355 1 equemene
     !DO While (normDeltaX_int .GT. 1d-6)
356 1 equemene
     Counter = Counter + 1
357 1 equemene
     DeltaX_cart = 0.d0
358 1 equemene
!     if (normDeltaX_int.LE.1e-4) THEN
359 1 equemene
!        DeltaX_int=DeltaX_int*1e4
360 1 equemene
!     END IF
361 1 equemene
     DO I=1,NCoord
362 1 equemene
        ! below BTransInv_local(I,:) is used because actually we need Transpose of BTransInv_local.
363 1 equemene
        DeltaX_cart(:)=DeltaX_cart(:)+BTransInv_local(I,:)*DeltaX_int(I)
364 1 equemene
     END DO
365 1 equemene
!     if (normDeltaX_int.LE.1e-4) THEN
366 1 equemene
!        DeltaX_int=DeltaX_int*1e-4
367 1 equemene
!     DeltaX_cart=DeltaX_cart*1e-4
368 1 equemene
!     END IF
369 1 equemene
370 1 equemene
371 1 equemene
           if (debug) THEN
372 1 equemene
              WRITE(*,*) "Info for iteration:",counter
373 1 equemene
              Print *, 'DeltaX_int='
374 1 equemene
              WRITE(*,'(50(1X,F12.8))') DeltaX_int
375 1 equemene
              Print *, 'DeltaX_cart,norm',sqrt(dot_product(DeltaX_cart,DeltaX_cart))
376 1 equemene
              DO J=1,Nat
377 1 equemene
              WRITE(*,'(1X,A4,3(1X,F15.11),3(1X,D25.15))') AtName(J),DeltaX_cart(3*J-2:3*J),DeltaX_cart(3*J-2:3*J)
378 1 equemene
              END DO
379 1 equemene
              Print *, 'BTransInv_local Trans='
380 1 equemene
              DO J=1,3*Nat
381 1 equemene
                 WRITE(*,'(50(1X,F12.8))') BTransInv_local(:,J)
382 1 equemene
              END DO
383 1 equemene
              Print *, 'DeltaX_int='
384 1 equemene
              WRITE(*,'(50(1X,F12.8))') DeltaX_int
385 1 equemene
           END IF
386 1 equemene
387 1 equemene
     ! Finite precision error correction step:
388 1 equemene
!     DO I=1,3*Nat
389 1 equemene
!        IF (DeltaX_cart(I) .NE. 0.d0) Then
390 1 equemene
!           IF(abs(DeltaX_cart(I)) .LT. 1d-10) Then
391 1 equemene
!              !Print *, 'Correcting DeltaX_cart(',I,')=', DeltaX_cart(I)
392 1 equemene
!              DeltaX_cart(I) = 0.d0
393 1 equemene
!           END IF
394 1 equemene
!        END IF
395 1 equemene
!     END DO
396 1 equemene
397 1 equemene
     ! new cartesian coordinates:
398 1 equemene
     DO I=1, Nat
399 1 equemene
        X_cart_k(1,I) = X_cart_k(1,I) + DeltaX_cart(3*I-2)
400 1 equemene
        X_cart_k(2,I) = X_cart_k(2,I) + DeltaX_cart(3*I-1)
401 1 equemene
        X_cart_k(3,I) = X_cart_k(3,I) + DeltaX_cart(3*I)
402 1 equemene
     END DO
403 1 equemene
404 1 equemene
     !     Geom(1,:)=X_cart_k(1,1:Nat)/a0
405 1 equemene
     !     Geom(2,:)=X_cart_k(2,1:Nat)/a0
406 1 equemene
     !     Geom(3,:)=X_cart_k(3,1:Nat)/a0
407 1 equemene
     Geom(1,:)=X_cart_k(1,1:Nat)
408 1 equemene
     Geom(2,:)=X_cart_k(2,1:Nat)
409 1 equemene
     Geom(3,:)=X_cart_k(3,1:Nat)
410 1 equemene
411 1 equemene
     if (debug) THEN
412 1 equemene
     WRITE(*,*) 'GeomCart used to compute BPrim'
413 1 equemene
     DO I=1,Nat
414 1 equemene
        WRITE(*,'(1X,A,I4,3(1X,F12.4))') AtName(I),I,Geom(1,I),Geom(2,i),Geom(3,i)
415 1 equemene
     END DO
416 1 equemene
     END IF
417 1 equemene
418 1 equemene
     ! Computing B^prim:
419 1 equemene
     BprimT=0.d0
420 1 equemene
     ScanCoord=>Coordinate
421 1 equemene
     I=0
422 1 equemene
     DO WHILE (Associated(ScanCoord%next))
423 1 equemene
        I=I+1
424 1 equemene
        SELECT CASE (ScanCoord%Type)
425 1 equemene
        CASE ('BOND')
426 1 equemene
           CALL CONSTRAINTS_BONDLENGTH_DER(Nat,ScanCoord%at1,ScanCoord%AT2,Geom,BprimT(1,I))
427 1 equemene
        CASE ('ANGLE')
428 1 equemene
           CALL CONSTRAINTS_BONDANGLE_DER(Nat,ScanCoord%At1,ScanCoord%AT2,ScanCoord%At3,Geom,BprimT(1,I))
429 1 equemene
        CASE ('DIHEDRAL')
430 1 equemene
           CALL CONSTRAINTS_TORSION_DER2(Nat,ScanCoord%At1,ScanCoord%AT2,ScanCoord%At3,ScanCoord%At4,Geom,BprimT(1,I))
431 1 equemene
        END SELECT
432 1 equemene
        ScanCoord => ScanCoord%next
433 1 equemene
     END DO
434 1 equemene
435 1 equemene
     if (debug) THEN
436 1 equemene
        WRITE(*,*) "Bprim "
437 1 equemene
        DO J=1,3*Nat
438 1 equemene
           WRITE(*,'(50(1X,F12.6))') BprimT(J,:)
439 1 equemene
        END DO
440 1 equemene
     END IF
441 1 equemene
442 1 equemene
443 1 equemene
     BMat_BakerT = 0.d0
444 1 equemene
     DO I=1,NCoord
445 1 equemene
        DO J=1,NPrim
446 1 equemene
           !BprimT is transpose of B^prim.
447 1 equemene
           !B = UMat^T B^prim, B^T = (B^prim)^T UMat
448 1 equemene
           BMat_BakerT(:,I)=BMat_BakerT(:,I)+BprimT(:,J)*UMat_local(J,I)
449 1 equemene
        END DO
450 1 equemene
     END DO
451 1 equemene
452 1 equemene
     ! ADDED FROM HERE:
453 1 equemene
     ! We now compute G=B(BT) matrix
454 1 equemene
     !IF (IOptt .EQ. 5000) Then
455 1 equemene
     !GMat=0.d0
456 1 equemene
     !DO I=1,NPrim
457 1 equemene
     !  DO J=1,3*Nat
458 1 equemene
     !    GMat(:,I)=Gmat(:,I)+BprimT(J,:)*BprimT(J,I) !*1.d0/mass(atome(int(K/3.d0)))
459 1 equemene
     !END DO
460 1 equemene
     !END DO
461 1 equemene
462 1 equemene
     ! We diagonalize G
463 1 equemene
     !Call Jacobi(GMat,NPrim,EigVal,EigVec,NPrim)
464 1 equemene
     !Call Trie(NPrim,EigVal,EigVec,NPrim)
465 1 equemene
466 1 equemene
     ! We construct the new DzDc(b=baker) matrix
467 1 equemene
     ! UMat is nonredundant vector set, i.e. set of eigenvectors of
468 1 equemene
     !  BB^T corresponding to eigenvalues > zero.
469 1 equemene
470 1 equemene
     !UMat=0.d0
471 1 equemene
     !UMat_tmp=0.d0
472 1 equemene
     !BMat_BakerT = 0.d0
473 1 equemene
     !J=0
474 1 equemene
     !DO I=1,NPrim
475 1 equemene
     !  IF (abs(eigval(I))>=1e-6) THEN
476 1 equemene
     !   J=J+1
477 1 equemene
     !  DO K=1,NPrim
478 1 equemene
     ! BprimT is transpose of B^prim.
479 1 equemene
     ! B = UMat^T B^prim, B^T = (B^prim)^T UMat
480 1 equemene
     !BMat_BakerT(:,J)=BMat_BakerT(:,J)+BprimT(:,K)*Eigvec(K,I)
481 1 equemene
     ! END DO
482 1 equemene
     !IF(J .GT. 3*Nat-6) THEN
483 1 equemene
     !WRITE(*,*) 'Number of vectors in Eigvec with eigval .GT. &
484 1 equemene
     !	  1e-6 (=UMat) (=' ,J,') exceeded 3*Nat-6=',3*Nat-6, &
485 1 equemene
     !    'Stopping the calculation.'
486 1 equemene
     !	 STOP
487 1 equemene
     !  END IF
488 1 equemene
     ! UMat_tmp(:,J) =  Eigvec(:,I)
489 1 equemene
     ! END IF
490 1 equemene
     !END DO
491 1 equemene
492 1 equemene
     ! THIS IS TO BE CORRECTED, A special case for debugging C2H3F case:
493 1 equemene
     !J=0
494 1 equemene
     !DO I=1, 3*Nat-6
495 1 equemene
     ! IF ((I .NE. 6) .AND. (I .NE. 7) .AND. (I .NE. 9)) Then
496 1 equemene
     !  J=J+1
497 1 equemene
     ! Print *, 'J=', J, ' I=', I
498 1 equemene
     !UMat(:,J) = UMat_tmp(:,I)
499 1 equemene
     !     END IF
500 1 equemene
     ! END DO
501 1 equemene
     !BMat_BakerT=0.d0
502 1 equemene
     !    DO I=1,NCoord
503 1 equemene
     !      DO J=1,NPrim
504 1 equemene
     ! B = UMat^T B^prim, B^T = (B^prim)^T UMat
505 1 equemene
     !       BMat_BakerT(:,I)=BMat_BakerT(:,I)+BprimT(:,J)*UMat(J,I)
506 1 equemene
     !    END DO
507 1 equemene
     !END DO
508 1 equemene
     ! TO BE CORRECTED, ENDS HERE.
509 1 equemene
510 1 equemene
     !END IF
511 1 equemene
     ! END of the new changes.
512 1 equemene
513 1 equemene
     BBT = 0.d0
514 1 equemene
     DO I=1,NCoord
515 1 equemene
        DO J=1,3*Nat 	! BBT(:,I) forms BB^T
516 1 equemene
           BBT(:,I) = BBT(:,I) + BMat_BakerT(J,:)*BMat_BakerT(J,I)
517 1 equemene
        END DO
518 1 equemene
     END DO
519 1 equemene
520 1 equemene
     BBT_inv = 0.d0
521 1 equemene
522 1 equemene
     !Print *, 'NCoord=', NCoord
523 1 equemene
     !Print *, 'BBT='
524 1 equemene
     DO J=1,NCoord
525 1 equemene
        ! WRITE(*,'(50(1X,F12.6))') BBT(:,J)
526 1 equemene
     END DO
527 1 equemene
     !Print *, 'End of BBT'
528 1 equemene
     ! GenInv is in Mat_util.f90
529 1 equemene
     Call GenInv(NCoord,BBT,BBT_inv,NCoord)
530 1 equemene
     !     if (debug) THEN
531 1 equemene
     !        WRITE(*,*) 'BBT_inv by GenInv'
532 1 equemene
     !        DO J=1,NCoord
533 1 equemene
     !           WRITE(*,'(50(1X,F12.6))') BBT_inv(:,J)
534 1 equemene
     !        END DO
535 1 equemene
     !     END IF
536 1 equemene
537 1 equemene
!    ALLOCATE(V(NCoord,NCoord))
538 1 equemene
!    tol = 1e-12
539 1 equemene
!    ! BBT is destroyed by GINVSE
540 1 equemene
!    Call GINVSE(BBT,NCoord,NCoord,BBT_inv,NCoord,NCoord,NCoord,tol,V,NCoord,FAIL,IOOUT)
541 1 equemene
!    DEALLOCATE(V)
542 1 equemene
!    IF(Fail) Then
543 1 equemene
!       WRITE (*,*) "Failed in generalized inverse, L220, ConvertBaker...f90"
544 1 equemene
!       STOP
545 1 equemene
!    END IF
546 1 equemene
547 1 equemene
     !     if (debug) THEN
548 1 equemene
     !        WRITE(*,*) 'BBT_inv by Genvse'
549 1 equemene
     !        DO J=1,NCoord
550 1 equemene
     !           WRITE(*,'(50(1X,F12.6))') BBT_inv(:,J)
551 1 equemene
     !        END DO
552 1 equemene
     !     END IF
553 1 equemene
554 1 equemene
     !Print *, 'End of BBT_inv'
555 1 equemene
556 1 equemene
     ! Calculation of (B^T)^-1 = (BB^T)^-1B:
557 1 equemene
     BTransInv_local = 0.d0
558 1 equemene
     DO I=1,3*Nat
559 1 equemene
        DO J=1,NCoord
560 1 equemene
           BTransInv_local(:,I)=BTransInv_local(:,I)+BBT_inv(:,J)*BMat_BakerT(I,J)
561 1 equemene
        END DO
562 1 equemene
     END DO
563 1 equemene
564 1 equemene
     !     if (debug) THEN
565 1 equemene
     !        Print *, 'BMat_BakerT='
566 1 equemene
     !        DO J=1,3*Nat
567 1 equemene
     !           WRITE(*,'(50(1X,F12.6))') BMat_BakerT(:,J)
568 1 equemene
     !        END DO
569 1 equemene
     !        Print *, 'End of BMat_BakerT'
570 1 equemene
     !     END IF
571 1 equemene
572 1 equemene
     !      if (debug) THEN
573 1 equemene
     !         Print *, 'BTransInv_local Trans='
574 1 equemene
     !         DO J=1,3*Nat
575 1 equemene
     !            WRITE(*,'(50(1X,F16.6))') BTransInv_local(:,J)
576 1 equemene
     !         END DO
577 1 equemene
     !         Print *, 'End of BTransInv_local Trans'
578 1 equemene
     !      END IF
579 1 equemene
580 1 equemene
     ! New cartesian cooordinates:
581 1 equemene
     x(:) = X_cart_k(1,:)
582 1 equemene
     y(:) = X_cart_k(2,:)
583 1 equemene
     z(:) = X_cart_k(3,:)
584 1 equemene
585 1 equemene
586 1 equemene
     Call Calc_Xprim(nat,x,y,z,Coordinate,NPrim,XPrimitive_t,XPrimRef)
587 1 equemene
588 1 equemene
!      I=0 ! index for the NPrim (NPrim is the number of
589 1 equemene
!      ! primitive coordinates).
590 1 equemene
!      Xprimitive_t=0.d0
591 1 equemene
!      ScanCoord=>Coordinate
592 1 equemene
!      DO WHILE (Associated(ScanCoord%next))
593 1 equemene
!         I=I+1
594 1 equemene
!         SELECT CASE (ScanCoord%Type)
595 1 equemene
!         CASE ('BOND')
596 1 equemene
!            Call vecteur(ScanCoord%At2,ScanCoord%At1,x,y,z,vx2,vy2,vz2,Norm2)
597 1 equemene
!            Xprimitive_t(I) = Norm2
598 1 equemene
!            !Print *, I, ':',  ScanCoord%At1, '-', ScanCoord%At2, '=', Xprimitive_t(I)
599 1 equemene
!         CASE ('ANGLE')
600 1 equemene
!            Call vecteur(ScanCoord%At2,ScanCoord%At3,x,y,z,vx1,vy1,vz1,Norm1)
601 1 equemene
!            Call vecteur(ScanCoord%At2,ScanCoord%At1,x,y,z,vx2,vy2,vz2,Norm2)
602 1 equemene
!            Xprimitive_t(I) = angle(vx1,vy1,vz1,Norm1,vx2,vy2,vz2,Norm2)*Pi/180.
603 1 equemene
!            !Print *, I, ':', ScanCoord%At1, '-', ScanCoord%At2,'-',ScanCoord%At3, '=', Xprimitive_t(I)*180./Pi
604 1 equemene
!         CASE ('DIHEDRAL')
605 1 equemene
!            Call vecteur(ScanCoord%At2,ScanCoord%At3,x,y,z,vx2,vy2,vz2,Norm2)
606 1 equemene
!            Call vecteur(ScanCoord%At2,ScanCoord%At1,x,y,z,vx1,vy1,vz1,Norm1)
607 1 equemene
!            Call vecteur(ScanCoord%At3,ScanCoord%At4,x,y,z,vx3,vy3,vz3,Norm3)
608 1 equemene
!            Call produit_vect(vx3,vy3,vz3,norm3,vx2,vy2,vz2,norm2,vx5,vy5,vz5,norm5)
609 1 equemene
!            Call produit_vect(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2,vx4,vy4,vz4,norm4)
610 1 equemene
! !!! PFL 28 Feb 2008 Test to be sure that angle does not change by more than Pi
611 1 equemene
!            !           Xprimitive_t(I)=angle_d(vx4,vy4,vz4,norm4,vx5,vy5,vz5,norm5,vx2,vy2,vz2,norm2)*Pi/180.
612 1 equemene
!            DiheTmp=angle_d(vx4,vy4,vz4,norm4,vx5,vy5,vz5,norm5,vx2,vy2,vz2,norm2)
613 1 equemene
!            Xprimitive_t(I) = DiheTmp*Pi/180.
614 1 equemene
!            ! We treat large dihedral angles differently as +180=-180 mathematically and physically
615 1 equemene
!            ! but this causes lots of troubles when converting baker to cart.
616 1 equemene
!            ! So we ensure that large dihedral angles always have the same sign
617 1 equemene
!            if (abs(ScanCoord%SignDihedral).NE.1) THEN
618 1 equemene
!               ScanCoord%SignDihedral=Int(Sign(1.d0,DiheTmp))
619 1 equemene
!            ELSE
620 1 equemene
!               If ((abs(DiheTmp).GE.170.D0).AND.(Sign(1.,DiheTmp)*ScanCoord%SignDihedral<0)) THEN
621 1 equemene
!                  Xprimitive_t(I) = DiheTmp*Pi/180.+ ScanCoord%SignDihedral*2.*Pi
622 1 equemene
!               END IF
623 1 equemene
!            END IF
624 1 equemene
625 1 equemene
626 1 equemene
627 1 equemene
!            !Print *, I, ':',  ScanCoord%At1, '-',ScanCoord%At2,'-',ScanCoord%At3,'-',&
628 1 equemene
!            !ScanCoord%At4,'=',Xprimitive_t(I)*180./Pi
629 1 equemene
!         END SELECT
630 1 equemene
!         ScanCoord => ScanCoord%next
631 1 equemene
!      END DO ! matches DO WHILE (Associated(ScanCoord%next))
632 1 equemene
633 1 equemene
     !     if (debug) THEN
634 1 equemene
     !        WRITE(*,*) "Xprimitive_t"
635 1 equemene
     !        WRITE(*,'(50(1X,F12.6))') Xprimitive_t
636 1 equemene
     !     END IF
637 1 equemene
638 1 equemene
     IntCoord_k=0.d0
639 1 equemene
     DO I=1, NPrim
640 1 equemene
        ! Transpose of UMat is needed below, that is why UMat(I,:).
641 1 equemene
        IntCoord_k(:)=IntCoord_k(:)+UMat_local(I,:)*Xprimitive_t(I)
642 1 equemene
     END DO
643 1 equemene
644 1 equemene
     if (debug) THEN
645 1 equemene
        WRITE(*,*) "New Xint (IntCoord_k)"
646 1 equemene
        WRITE(*,'(50(1X,F12.8))') IntCoord_k
647 1 equemene
        WRITE(*,*) "Target (IntCoord)"
648 1 equemene
        WRITE(*,'(50(1X,F12.8))') IntCoord
649 1 equemene
650 1 equemene
     END IF
651 1 equemene
652 1 equemene
653 1 equemene
     ! Computing DeltaX_int
654 1 equemene
655 1 equemene
     DeltaX_int(:) = IntCoord(:)-IntCoord_k(:)
656 1 equemene
657 1 equemene
658 1 equemene
659 1 equemene
660 1 equemene
     ! norm2 of DeltaX_int is being calculated here:
661 1 equemene
     normDeltaX_int=0.d0
662 1 equemene
     DO I=1, NCoord
663 1 equemene
        normDeltaX_int=normDeltaX_int+DeltaX_int(I)*DeltaX_int(I)
664 1 equemene
     END DO
665 1 equemene
     normDeltaX_int = sqrt(normDeltaX_int)
666 1 equemene
667 1 equemene
          if (debug) THEN
668 1 equemene
             WRITE(*,*) "New Delta_Xint (deltaX_int)"
669 1 equemene
             WRITE(*,'(50(1X,F12.6))') DeltaX_int
670 1 equemene
             WRITE(*,*) "Norm:",normDeltaX_int
671 1 equemene
          END IF
672 1 equemene
673 1 equemene
     !IF (Counter .GE. 400) THEN
674 1 equemene
     !Print *, 'Counter=', Counter, 'normDeltaX_int=', normDeltaX_int
675 1 equemene
     !Print *, 'DeltaX_int='
676 1 equemene
     !WRITE(*,'(50(1X,F8.2))') DeltaX_int
677 1 equemene
     !END IF
678 1 equemene
679 1 equemene
     IF (Mod(Counter,1).EQ.0) THEN
680 1 equemene
        !WRITE(*,*) Nat
681 1 equemene
        !WRITE(*,*) 'GeomCart in ConvertBakerInternal_cart'
682 1 equemene
        DO I=1,Nat
683 1 equemene
           !	WRITE(*,'(1X,A,I4,3(1X,F12.4))') AtName(I),I,X_Cart_k(1:3,I)
684 1 equemene
        END DO
685 1 equemene
     END IF
686 1 equemene
687 1 equemene
     !call two_norm(DeltaX_int,normDeltaX_int,3*Nat)
688 1 equemene
  END DO !matches DO While (normDeltaX_int .GT. 1d-11)
689 1 equemene
690 1 equemene
  IF (debug) THEN
691 1 equemene
  WRITE(*,*) 'GeomCart in ConvertBakerInternal_cart'
692 1 equemene
  DO I=1,Nat
693 1 equemene
     WRITE(*,'(1X,A,I4,3(1X,F12.4))') AtName(I),I,X_Cart_k(1:3,I)
694 1 equemene
  END DO
695 1 equemene
  END IF
696 1 equemene
697 1 equemene
  if (debug) THEN
698 1 equemene
     WRITE(*,*) "Bmat_bakerT"
699 1 equemene
     DO J=1,NCoord
700 1 equemene
        WRITE(*,'(50(1X,F12.6))') BMat_BakerT(:,J)
701 1 equemene
     END DO
702 1 equemene
  END IF
703 1 equemene
704 1 equemene
705 1 equemene
706 1 equemene
  !IF (IOptt .GE. 2) THEN
707 1 equemene
  !   Print  *, 'Counter=', Counter
708 1 equemene
  !END IF
709 1 equemene
  IF (Counter .GE. NbItMax) Then
710 1 equemene
     Print *, 'Counter GE 500, Stopping, normDeltaX_int=', normDeltaX_int
711 1 equemene
     STOP
712 1 equemene
  END IF
713 1 equemene
714 1 equemene
715 1 equemene
     x(:) = X_cart_k(1,:)
716 1 equemene
     y(:) = X_cart_k(2,:)
717 1 equemene
     z(:) = X_cart_k(3,:)
718 1 equemene
719 1 equemene
720 1 equemene
!  call CalcRmsd(Nat,x_k,y_k,z_k,x,y,z,MRot,rmsd,.TRUE.,.TRUE.)
721 1 equemene
722 1 equemene
723 1 equemene
  if (debug) WRITE(*,*) "COnverted in ",counter," iterations"
724 1 equemene
725 1 equemene
  DEALLOCATE(Geom,DeltaX_int,DeltaX_cart)
726 1 equemene
  DEALLOCATE(BprimT,BBT,BBT_inv,UMat_tmp)
727 1 equemene
  DEALLOCATE(X_cart_k)
728 1 equemene
  DEALLOCATE(GMat,EigVal,EigVec)
729 1 equemene
730 1 equemene
  XPrim=Xprimitive_t
731 1 equemene
732 1 equemene
  if (debug) WRITE(*,*) '=====ConvertBakerInternal_cart Over====='
733 1 equemene
734 1 equemene
END SUBROUTINE ConvertBakerInternal_cart