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 |