root / src / IntCoord_der.f90 @ 2
Historique | Voir | Annoter | Télécharger (50,73 ko)
1 |
|
---|---|
2 |
SUBROUTINE VPRD(X,Y,Z) |
3 |
! ****************************************************************** |
4 |
! ** CROSS PRODUCT (VECTOR PRODUCT OF TWO VECTORS) ** |
5 |
! ****************************************************************** |
6 |
Use VarTypes |
7 |
IMPLICIT NONE |
8 |
REAL(KREAL),INTENT(IN) :: X(3) |
9 |
REAL(KREAL),INTENT(IN) :: Y(3) |
10 |
REAL(KREAL),INTENT(OUT):: Z(3) |
11 |
! ****************************************************************** |
12 |
Z(1)=X(2)*Y(3)-X(3)*Y(2) |
13 |
Z(2)=X(3)*Y(1)-X(1)*Y(3) |
14 |
Z(3)=X(1)*Y(2)-X(2)*Y(1) |
15 |
RETURN |
16 |
END |
17 |
|
18 |
! .................................................................. |
19 |
SUBROUTINE CONSTRAINTS_BONDLENGTH_DER(NAT,IAT1,IAT2,R0,B) |
20 |
! ****************************************************************** |
21 |
! ** ** |
22 |
! ** BOND-LENGTH CONSTRAINT : SET UP COORDINATES ** |
23 |
! ** ** |
24 |
! ****************************************************************** |
25 |
Use VarTypes |
26 |
IMPLICIT NONE |
27 |
INTEGER(KINT),INTENT(IN) :: NAT |
28 |
INTEGER(KINT),INTENT(IN) :: IAT1 |
29 |
INTEGER(KINT),INTENT(IN) :: IAT2 |
30 |
REAL(KREAL) ,INTENT(IN) :: R0(3,NAT) |
31 |
REAL(KREAL) ,INTENT(OUT):: B(3,NAT) |
32 |
|
33 |
INTEGER(KINT) :: I,J |
34 |
REAL(KREAL) :: DIS,DI,DJ |
35 |
REAL(KREAL) :: DELTAK |
36 |
REAL(KREAL) :: SVAR |
37 |
real(KREAL) :: dr(3) |
38 |
! ****************************************************************** |
39 |
DR(:)=R0(:,IAT2)-R0(:,IAT1) |
40 |
! |
41 |
! ================================================================== |
42 |
! == CALCULATE VALUE AND FIRST TWO DERIVATIVES OF D=|R_2-R_2| == |
43 |
! ================================================================== |
44 |
DIS=DSQRT(DOT_PRODUCT(DR,DR)) |
45 |
DO I=1,3 |
46 |
DI=DR(I)/DIS |
47 |
B(I,IAT2)=DI |
48 |
B(I,IAT1)=-DI |
49 |
ENDDO |
50 |
RETURN |
51 |
END SUBROUTINE CONSTRAINTS_BONDLENGTH_DER |
52 |
|
53 |
SUBROUTINE CONSTRAINTS_GLC_DER(NAT,VEC,B) |
54 |
! ****************************************************************** |
55 |
! ** CONSTRAINTS_SETGLC ** |
56 |
! ** SET GENERAL LINEAR CONSTRAINT (GLC) CONST+VEC*R=0 ** |
57 |
! ** ** |
58 |
! ** APPROXIMATES CONSTRAINT FUNCTION (WITHOUT VALUE) ** |
59 |
! ** BY AN QUADRATIC POLYNOM IN A+B*R+0.5*R*C*R ** |
60 |
! ** THE CONSTRAINT IS THE POLYNOMIAL MINUS THE VALUE FROM THE ** |
61 |
! ** REFERENCE STRUCTURE ** |
62 |
! ****************************************************************** |
63 |
Use VarTypes |
64 |
IMPLICIT NONE |
65 |
INTEGER(KINT),INTENT(IN) :: NAT |
66 |
REAL(KREAL) ,INTENT(IN) :: VEC(3,NAT) |
67 |
REAL(KREAL) ,INTENT(OUT):: B(3,NAT) |
68 |
INTEGER(KINT) :: IAT,I |
69 |
! ****************************************************************** |
70 |
DO IAT=1,NAT |
71 |
DO I=1,3 |
72 |
B(I,IAT)=VEC(I,IAT) |
73 |
ENDDO |
74 |
ENDDO |
75 |
RETURN |
76 |
END SUBROUTINE CONSTRAINTS_GLC_DER |
77 |
|
78 |
|
79 |
SUBROUTINE CONSTRAINTS_SUBSTITUTION_DER(NAT,IAT1,IAT2,IAT3,R0,B) |
80 |
! ****************************************************************** |
81 |
! ** CONSTRAINTS_SETsubstitution ** |
82 |
! ** APPROXIMATES CONSTRAINT FUNCTION (WITHOUT VALUE) ** |
83 |
! ** BY AN QUADRATIC POLYNOMial IN A+B*R+0.5*R*C*R ** |
84 |
! ** THE CONSTRAINT IS THE POLYNOMIAL MINUS THE VALUE FROM THE ** |
85 |
! ** REFERENCE STRUCTURE ** |
86 |
! ** CONSTRAINS THE difference OF THE BOND DISTANCES BETWEEN ** |
87 |
! ** R1-R2 AND R2-R3 ** |
88 |
! ****************************************************************** |
89 |
Use Vartypes |
90 |
implicit none |
91 |
INTEGER(KINT),INTENT(IN) :: NAT |
92 |
INTEGER(KINT),INTENT(IN) :: IAT1 |
93 |
INTEGER(KINT),INTENT(IN) :: IAT2 |
94 |
INTEGER(KINT),INTENT(IN) :: IAT3 |
95 |
REAL(KREAL) ,INTENT(OUT):: B(3,NAT) |
96 |
REAL(KREAL) ,INTENT(IN) :: R0(3,NAT) |
97 |
REAL(KREAL) :: X(9),DI(9) |
98 |
real(KREAL) :: phi |
99 |
REAL(KREAL) :: X1X2,Y1Y2,Z1Z2,X2X3,Y2Y3,Z2Z3,D12,D22, & |
100 |
D1,D2,D13,D23 |
101 |
integer(KINT) :: i,j |
102 |
! ****************************************************************** |
103 |
! |
104 |
! --- TRANSFER R0 TO X ARRAY TO MAKE HANDLING AND PASSING EASIER |
105 |
DO I=1,3 |
106 |
X(I) =R0(I,IAT1) |
107 |
X(I+3)=R0(I,IAT2) |
108 |
X(I+6)=R0(I,IAT3) |
109 |
ENDDO |
110 |
! |
111 |
! --- FOR THE FOLLOWING, THE CONSTRAINT ITSELF WILL BE CALLED PHI |
112 |
! --- CALCULATE PHI,D PHI/D X_I, D^2 PHI/D X_I D X_J |
113 |
! |
114 |
X1X2=X(1)-X(4) |
115 |
Y1Y2=X(2)-X(5) |
116 |
Z1Z2=X(3)-X(6) |
117 |
X2X3=X(4)-X(7) |
118 |
Y2Y3=X(5)-X(8) |
119 |
Z2Z3=X(6)-X(9) |
120 |
! |
121 |
D12=(X1X2)**2 + (Y1Y2)**2 + (Z1Z2)**2 |
122 |
D22=(X2X3)**2 + (Y2Y3)**2 + (Z2Z3)**2 |
123 |
D1= SQRT(D12) |
124 |
D2= SQRT(D22) |
125 |
D13= D1**3 |
126 |
D23= D2**3 |
127 |
PHI= D1 - D2 |
128 |
! |
129 |
B(1,IAT1)= (X1X2)/D1 |
130 |
B(1,IAT2)= -((X1X2)/D1) - (X2X3)/D2 |
131 |
B(1,IAT3)= (X2X3)/D2 |
132 |
B(2,IAT1)= (Y1Y2)/D1 |
133 |
B(2,IAT2)= -((Y1Y2)/D1) - (Y2Y3)/D2 |
134 |
B(2,IAT3)= (Y2Y3)/D2 |
135 |
B(3,IAT1)= (Z1Z2)/D1 |
136 |
B(3,IAT2)= -((Z1Z2)/D1) - (Z2Z3)/D2 |
137 |
B(3,IAT3)= (Z2Z3)/D2 |
138 |
! |
139 |
RETURN |
140 |
END SUBROUTINE CONSTRAINTS_SUBSTITUTION_DER |
141 |
|
142 |
! .................................................................. |
143 |
SUBROUTINE CONSTRAINTS_BONDANGLE_DER(NAT,IAT1,IAT2,IAT3,R0,B) |
144 |
! ****************************************************************** |
145 |
! ** |
146 |
! ** CONSTRAINS THE ANGLE ENCLOSED BETWEEN ATOMS IAT1--IAT2--IAT3 |
147 |
! ** In the followin, IAT1 is also denoted by A, IAT2 by B and IAT3 by C |
148 |
! ** |
149 |
! ****************************************************************** |
150 |
Use VarTypes |
151 |
IMPLICIT none |
152 |
INTEGER(KINT),INTENT(IN) :: NAT |
153 |
INTEGER(KINT),INTENT(IN) :: IAT1 |
154 |
INTEGER(KINT),INTENT(IN) :: IAT2 |
155 |
INTEGER(KINT),INTENT(IN) :: IAT3 |
156 |
REAL(KREAL) ,INTENT(OUT):: B(3,NAT) |
157 |
REAL(KREAL) ,INTENT(IN) :: R0(3,NAT) |
158 |
REAL(KREAL) :: X(9),DI(9),DIDJ(9,9),B1(9) |
159 |
real(KREAL) :: phi |
160 |
integer(KINT) :: i,j,ichk, iat |
161 |
REAL(KREAL) :: UU ! U*U |
162 |
REAL(KREAL) :: VV ! V*V |
163 |
REAL(KREAL) :: UV ! U*V |
164 |
REAL(KREAL) :: D ! 1/SQRT(A*B) |
165 |
REAL(KREAL) :: DADX(9) |
166 |
REAL(KREAL) :: DBDX(9) |
167 |
REAL(KREAL) :: DCDX(9) |
168 |
REAL(KREAL) :: DDDX(9) |
169 |
REAL(KREAL) :: DJDX(9) |
170 |
REAL(KREAL) :: DVDX(9) |
171 |
REAL(KREAL) :: DGDX(9) ! D(A*B)/DX |
172 |
REAL(KREAL) :: AB,AB2N,V,PREFAC |
173 |
REAL(KREAL) :: COSPHI,SINPHI |
174 |
REAL(KREAL) :: DIVDX,AI |
175 |
! |
176 |
! Variable used in case of a linear molecule with three atoms call A,B and C |
177 |
! Phi is the ABC angle |
178 |
! Threshold use to decide that sin(Phi)=0. |
179 |
REAL(KREAL), PARAMETER :: ThreshSin=1e-7 |
180 |
! Sine and Cosine of the euler Phi angle between ABC and x axis |
181 |
REAL(KREAL) :: CosP,SinP |
182 |
! Sine and Cosine of the euler theta angle between ABC and z axis |
183 |
REAL(KREAL) :: CosTheta,SinTheta |
184 |
! Vectors CB, CA,AB |
185 |
REAL(KREAL) ::vCB(3),vCA(3),vAB(3) |
186 |
! distance AB in the xAy plane |
187 |
REAL(KREAL) :: dABxy |
188 |
! cosine of the BAC angle |
189 |
REAL(KREAL) :: CosBAC |
190 |
! cosine of the BCA angle |
191 |
REAL(KREAL) :: CosBCA |
192 |
|
193 |
! |
194 |
! For debugginh purposes: |
195 |
LOGICAL, PARAMETER :: Debug=.False. |
196 |
|
197 |
|
198 |
IF (Debug) WRITE(*,*) "================ Entering CONSTRAINTS_BONDANGLE_DER ==========" |
199 |
! ****************************************************************** |
200 |
! |
201 |
! ================================================================== |
202 |
! == SET UP CONSTRAINT IN COORDINATE SPACE == |
203 |
! ================================================================== |
204 |
! |
205 |
! ================================================================== |
206 |
! == CALCULATE VALUE AND FIRST TWO DERIVATIVES OF == |
207 |
! == PHI=<X1-X2|X3-X2>/SQRT(<X1-X2|X1-X2><X3-X2|X3-X2>) == |
208 |
! ================================================================== |
209 |
! --- TRANSFER R0 TO X ARRAY TO MAKE HANDLING AND PASSING EASIER |
210 |
DO I=1,3 |
211 |
X(I) =R0(I,IAT1) |
212 |
X(I+3)=R0(I,IAT2) |
213 |
X(I+6)=R0(I,IAT3) |
214 |
ENDDO |
215 |
|
216 |
if (debug) THEN |
217 |
WRITE(*,*) "X=",X |
218 |
WRITE(*,*) "A=",X(1)-X(4),X(2)-X(5),X(3)-X(6) |
219 |
WRITE(*,*) "B=",X(7)-X(4),X(8)-X(5),X(9)-X(6) |
220 |
END IF |
221 |
|
222 |
! ---------------------------------------------------------------- |
223 |
! --- R1=X(1:3) R2=X(4:6) R3=X(7:9) |
224 |
! --- U=R1-R2 V=R3-R2 |
225 |
! --- A=U*U=d(At1-At2)**2 |
226 |
! --- B=V*V=d(At2-At3)**2 |
227 |
! --- C=U*V=vec(At2-At1)*vec(At2-At3) |
228 |
! ---------------------------------------------------------------- |
229 |
UU=(X(1)-X(4))**2 + (X(2)-X(5))**2 + (X(3)-X(6))**2 |
230 |
VV=(X(7)-X(4))**2 + (X(8)-X(5))**2 + (X(9)-X(6))**2 |
231 |
UV=(X(1)-X(4))*(X(7)-X(4)) & |
232 |
+(X(2)-X(5))*(X(8)-X(5)) & |
233 |
+(X(3)-X(6))*(X(9)-X(6)) |
234 |
AB=UU*VV |
235 |
D=SQRT(AB) |
236 |
COSPHI=UV/D !=COS(PHI) |
237 |
PHI=DACOS(COSPHI) |
238 |
SINPHI=DSQRT(1.D0-COSPHI**2) |
239 |
|
240 |
IF (SINPHI.GE.ThreshSin) THEN |
241 |
! The following evaluation of the derivative involves |
242 |
! 1/sinphi... so we test that it is not 0 :-) |
243 |
! --- CALCULATE DADX |
244 |
DADX(1)= 2.D0*(X(1)-X(4)) |
245 |
DADX(2)= 2.D0*(X(2)-X(5)) |
246 |
DADX(3)= 2.D0*(X(3)-X(6)) |
247 |
DADX(4)=-2.D0*(X(1)-X(4)) |
248 |
DADX(5)=-2.D0*(X(2)-X(5)) |
249 |
DADX(6)=-2.D0*(X(3)-X(6)) |
250 |
DADX(7)= 0.D0 |
251 |
DADX(8)= 0.D0 |
252 |
DADX(9)= 0.D0 |
253 |
! --- CALCULATE DBDX |
254 |
DBDX(1)= 0.D0 |
255 |
DBDX(2)= 0.D0 |
256 |
DBDX(3)= 0.D0 |
257 |
DBDX(4)=-2.D0*(X(7)-X(4)) |
258 |
DBDX(5)=-2.D0*(X(8)-X(5)) |
259 |
DBDX(6)=-2.D0*(X(9)-X(6)) |
260 |
DBDX(7)= 2.D0*(X(7)-X(4)) |
261 |
DBDX(8)= 2.D0*(X(8)-X(5)) |
262 |
DBDX(9)= 2.D0*(X(9)-X(6)) |
263 |
! --- CALCULATE DCDX |
264 |
DCDX(1)= X(7)-X(4) |
265 |
DCDX(2)= X(8)-X(5) |
266 |
DCDX(3)= X(9)-X(6) |
267 |
DCDX(4)=-X(7)+2.D0*X(4)-X(1) |
268 |
DCDX(5)=-X(8)+2.D0*X(5)-X(2) |
269 |
DCDX(6)=-X(9)+2.D0*X(6)-X(3) |
270 |
DCDX(7)= X(1)-X(4) |
271 |
DCDX(8)= X(2)-X(5) |
272 |
DCDX(9)= X(3)-X(6) |
273 |
|
274 |
! WRITE(*,*) 'PFL DER ANGLE' |
275 |
! WRITE(*,'(15(1X,F10.6))') DADX |
276 |
! WRITE(*,'(15(1X,F10.6))') DBDX |
277 |
! WRITE(*,'(15(1X,F10.6))') DCDX |
278 |
|
279 |
! ================================================================== |
280 |
! == CALCULATE PHI ETC =========================================== |
281 |
! ================================================================== |
282 |
! --- CALCULATE DERIVATIVE OF ARCCOS |
283 |
V=-1.D0/SINPHI !=-SIN(PHI)=D(ACOS(PHI))/D(COSPHI) |
284 |
! --- CALCULATE FIRST DERIVATIVES OF G=A*B |
285 |
DO I=1,9 |
286 |
DGDX(I)=DADX(I)*VV+UU*DBDX(I) |
287 |
ENDDO |
288 |
! --- CALCULATE DDDX |
289 |
AB2N=0.5D0/D |
290 |
DO I=1,9 |
291 |
DDDX(I)=AB2N*DGDX(I) |
292 |
ENDDO |
293 |
! --- CALCULATE FIRST DERIVATIVES OF J |
294 |
PREFAC=1.D0/AB |
295 |
DO I=1,9 |
296 |
DJDX(I)=(DCDX(I)*D-UV*DDDX(I))*PREFAC |
297 |
ENDDO |
298 |
! --- CALCULATE FIRST DERIVATIVE |
299 |
DO I=1,9 |
300 |
DI(I)=DJDX(I)*V |
301 |
ENDDO |
302 |
! |
303 |
! Store it back to B |
304 |
DO I=1,3 |
305 |
B(I,IAT1)=DI(I) |
306 |
B(I,IAT2)=DI(I+3) |
307 |
B(I,IAT3)=DI(I+6) |
308 |
ENDDO |
309 |
|
310 |
ELSE |
311 |
! First calculate cosP, sinP, CosTheta, SinTheta |
312 |
dABxy=sqrt((X(4)-X(1))**2+(X(5)-X(2))**2) |
313 |
cosP=abs((X(7)-X(1)))/sqrt((X(7)-X(1))**2+(X(8)-X(2))**2) |
314 |
! SinP=(X(8)-X(2))/sqrt((X(7)-X(1))**2+(X(8)-X(2))**2) |
315 |
sinP=sqrt(1.d0-cosP**2) |
316 |
cosTheta=(X(6)-X(3))/(sqrt(UU)) |
317 |
SinTheta=dABxy/(sqrt(UU)) |
318 |
IF (SinTheta.le.ThreshSin) THEN |
319 |
! Theta=0, so that the euler Phi angle is ill-defined. We put it to 0: |
320 |
CosP=1.d0 |
321 |
SinP=0.d0 |
322 |
END IF |
323 |
IF (Debug) WRITE(*,*) "CosP,SinP ",CosP,SinP |
324 |
if (debug) WRITE(*,*) "CosTheta,SinTheta",CosTheta,SinTheta |
325 |
! We calculate cos(BAC) and cos(BCA) because they are needed to calculate |
326 |
! the derivatives for the centre atom (B) |
327 |
DO I=1,3 |
328 |
vCB(I)=X(3+I)-X(6+I) |
329 |
vCA(I)=X(I)-X(6+I) |
330 |
vAB(I)=x(3+I)-x(I) |
331 |
END DO |
332 |
CosBCA=DOT_PRODUCT(vCB,vCA)/sqrt(DOT_PRODUCT(vCB,vCB)*DOT_PRODUCT(vCA,vCA)) |
333 |
CosBAC=-DOT_PRODUCT(vAB,vCA)/sqrt(DOT_PRODUCT(vAB,vAB)*DOT_PRODUCT(vCA,vCA)) |
334 |
if (debug) WRITE(*,*) "CosBAC,CosBCA:",CosBAC,CosBCA |
335 |
! Sign of the derivatives are -1 for Phi=Pi and 1 for Phi=0 |
336 |
! ie is cos(Phi). |
337 |
DI(1)=COSPHI/sqrt(UU) |
338 |
DI(2)=DI(1) |
339 |
DI(3)=0.d0 |
340 |
DI(7)=COSPHI/sqrt(VV) |
341 |
DI(8)=DI(7) |
342 |
DI(9)=0.d0 |
343 |
DI(4)=CosBCA*DI(1)+cosBAC*DI(7) |
344 |
DI(5)=DI(4) |
345 |
DI(6)=0.D0 |
346 |
if (debug) WRITE(*,'(A,9(1X,F12.6))') 'DI=',DI(1:9) |
347 |
if (debug) THEN |
348 |
WRITE(*,'(3(1X,F12.6))') cosTheta*CosP,sinP,-cosP*sinTheta |
349 |
WRITE(*,'(3(1X,F12.6))') -cosTheta*sinP,cosP,sinP*sinTheta |
350 |
WRITE(*,'(3(1X,F12.6))') sinTheta,0.,cosTheta |
351 |
END IF |
352 |
! We now take care of the fact that the three fragment are |
353 |
! not along the Z-axis |
354 |
B(1,Iat1)=cosTheta*CosP*DI(1)+sinP*DI(2)-cosP*sinTheta*DI(3) |
355 |
B(1,Iat2)=cosTheta*CosP*DI(4)+sinP*DI(5)-cosP*sinTheta*DI(6) |
356 |
B(1,Iat3)=cosTheta*CosP*DI(7)+sinP*DI(8)-cosP*sinTheta*DI(9) |
357 |
B(2,Iat1)=-cosTheta*SinP*DI(1)+cosP*DI(2)+sinP*sinTheta*DI(3) |
358 |
B(2,Iat2)=-cosTheta*SinP*DI(4)+cosP*DI(5)+sinP*sinTheta*DI(6) |
359 |
B(2,Iat3)=-cosTheta*SinP*DI(7)+cosP*DI(8)+sinP*sinTheta*DI(9) |
360 |
B(3,Iat1)=sinTheta*DI(1)+cosTheta*DI(3) |
361 |
B(3,Iat2)=sinTheta*DI(4)+cosTheta*DI(6) |
362 |
B(3,Iat3)=sinTheta*DI(7)+cosTheta*DI(9) |
363 |
END IF |
364 |
|
365 |
IF (Debug) WRITE(*,*) "================ Exiting CONSTRAINTS_BONDANGLE_DER ==========" |
366 |
END SUBROUTINE CONSTRAINTS_BONDANGLE_DER |
367 |
|
368 |
|
369 |
! .................................................................. |
370 |
SUBROUTINE CONSTRAINTS_TORSION_DER(NAT,IAT1,IAT2,IAT3,IAT4,R0,B) |
371 |
! ****************************************************************** |
372 |
! ** |
373 |
! ** CONSTRAINS THE TORSION OF IAT1-IAT2---IAT3-IAT4 |
374 |
! ** |
375 |
! ****************************************************************** |
376 |
Use VarTypes |
377 |
IMPLICIT none |
378 |
INTEGER(KINT),INTENT(IN) :: NAT |
379 |
INTEGER(KINT),INTENT(IN) :: IAT1 |
380 |
INTEGER(KINT),INTENT(IN) :: IAT2 |
381 |
INTEGER(KINT),INTENT(IN) :: IAT3 |
382 |
INTEGER(KINT),INTENT(IN) :: IAT4 |
383 |
REAL(KREAL) ,INTENT(IN) :: R0(3,NAT) |
384 |
REAL(KREAL) ,INTENT(OUT):: B(3,NAT) |
385 |
REAL(KREAL) :: X(12),DI(12),DIDJ(12,12),B1(12) |
386 |
REAL(KREAL) :: P(3),Q(3),T(3),U(3),R(3),W(3) |
387 |
real(KREAL) :: phi |
388 |
integer(KINT) :: i,j,ichk,k |
389 |
|
390 |
REAL(KREAL) :: TORS, PP,QQ, PQ |
391 |
REAL(KREAL) :: DADX(12),DBDX(12),DCDX(12) |
392 |
REAL(KREAL) :: DDDX(12),DJDX(12),DVDX(12),DGDX(12),DPDX(3,12),DQDX(3,12) |
393 |
REAL(KREAL) :: D2QDX2(3,12,12),D2PDX2(3,12,12) |
394 |
REAL(KREAL) :: D2BDX2(12,12),D2ADX2(12,12),D2CDX2(12,12),D2DDX2(12,12) |
395 |
real(KREAL) :: d,coverd,abyb2n,abyb,ai,divdx,prefac,v |
396 |
|
397 |
! ****************************************************************** |
398 |
! |
399 |
! --- TRANSFER R0 TO X ARRAY TO MAKE HANDLING AND PASSING EASIER |
400 |
DO I=1,3 |
401 |
X(I)=R0(I,IAT1) |
402 |
X(I+3)=R0(I,IAT2) |
403 |
X(I+6)=R0(I,IAT3) |
404 |
X(I+9)=R0(I,IAT4) |
405 |
ENDDO |
406 |
! |
407 |
! --- CALCULATE PHI,D PHI/D X_I, D^2 PHI/D X_I D X_J |
408 |
T(:)=X(1:3) -X(4:6) |
409 |
U(:)=X(7:9) -X(4:6) |
410 |
R(:)=X(10:12)-X(7:9) |
411 |
W(:)=X(4:6) -X(7:9) |
412 |
CALL VPRD(T,U,P) |
413 |
CALL VPRD(W,R,Q) |
414 |
PQ=DOT_PRODUCT(P,Q) |
415 |
PP=DOT_PRODUCT(P,P) |
416 |
QQ=DOT_PRODUCT(Q,Q) |
417 |
! |
418 |
ABYB=PP*QQ |
419 |
D=ABYB**0.5D0 |
420 |
COVERD=PQ/D |
421 |
ABYB2N=0.5D0/D |
422 |
! |
423 |
TORS=DACOS(COVERD) |
424 |
WRITE(*,*) "Torsion derivs Phi=", Tors*180./3.1415926,Iat1,Iat2,Iat3,Iat4 |
425 |
! |
426 |
! ---------------------------------------------------------------- |
427 |
! --- CALCULATE FIRST DERIVATIVES |
428 |
! ---------------------------------------------------------------- |
429 |
! --- CALCULATE DERIVATIVE OF ARCCOS |
430 |
IF (dabs(DABS(COVERD)-1.d0) < 1.D-9) THEN |
431 |
WRITE(*,*) 'WARNING: DERIVATIVE OF TORSION AT ZERO AND PI IS UNDEFINED!' |
432 |
COVERD=sign(0.999d0,COVERD) |
433 |
TORS=DACOS(COVERD) |
434 |
!WRITE(*,*) "Torsion derivs, Phi=", Tors |
435 |
|
436 |
! V=0.D0 |
437 |
! ELSE |
438 |
END IF |
439 |
V=-1.D0/DSQRT(1.D0-(COVERD)**2.D0) |
440 |
! ENDIF |
441 |
! --- CALCULATE DPDX |
442 |
! --- ZERO OUT SPARSE MATRIX |
443 |
DO J=1,3 |
444 |
DO I=1,12 |
445 |
DPDX(J,I)=0.D0 |
446 |
DQDX(J,I)=0.D0 |
447 |
ENDDO |
448 |
ENDDO |
449 |
DPDX(1,2)=X(9)-X(6) |
450 |
DPDX(1,3)=X(5)-X(8) |
451 |
DPDX(1,5)=X(3)-X(9) |
452 |
DPDX(1,6)=X(8)-X(2) |
453 |
DPDX(1,8)=X(6)-X(3) |
454 |
DPDX(1,9)=X(2)-X(5) |
455 |
DPDX(2,1)=X(6)-X(9) |
456 |
DPDX(2,3)=X(7)-X(4) |
457 |
DPDX(2,4)=X(9)-X(3) |
458 |
DPDX(2,6)=X(1)-X(7) |
459 |
DPDX(2,7)=X(3)-X(6) |
460 |
DPDX(2,9)=X(4)-X(1) |
461 |
DPDX(3,1)=X(8)-X(5) |
462 |
DPDX(3,2)=X(4)-X(7) |
463 |
DPDX(3,4)=X(2)-X(8) |
464 |
DPDX(3,5)=X(7)-X(1) |
465 |
DPDX(3,7)=X(5)-X(2) |
466 |
DPDX(3,8)=X(1)-X(4) |
467 |
! --- CALCULATE DQDX |
468 |
DQDX(1,5)=X(12)-X(9) |
469 |
DQDX(1,6)=X(8)-X(11) |
470 |
DQDX(1,8)=X(6)-X(12) |
471 |
DQDX(1,9)=X(11)-X(5) |
472 |
DQDX(1,11)=X(9)-X(6) |
473 |
DQDX(1,12)=X(5)-X(8) |
474 |
DQDX(2,4)=X(9)-X(12) |
475 |
DQDX(2,6)=X(10)-X(7) |
476 |
DQDX(2,7)=X(12)-X(6) |
477 |
DQDX(2,9)=X(4)-X(10) |
478 |
DQDX(2,10)=X(6)-X(9) |
479 |
DQDX(2,12)=X(7)-X(4) |
480 |
DQDX(3,4)=X(11)-X(8) |
481 |
DQDX(3,5)=X(7)-X(10) |
482 |
DQDX(3,7)=X(5)-X(11) |
483 |
DQDX(3,8)=X(10)-X(4) |
484 |
DQDX(3,10)=X(8)-X(5) |
485 |
DQDX(3,11)=X(4)-X(7) |
486 |
|
487 |
! WRITE(*,*) 'DP/DX(1) ' |
488 |
! WRITE(*,'(1X,12(F9.5,1X))') DPDX(1,:) |
489 |
! WRITE(*,*) 'DP/DX(2) ' |
490 |
! WRITE(*,'(1X,12(F9.5,1X))') DPDX(2,:) |
491 |
! WRITE(*,*) 'DP/DX(3) ' |
492 |
! WRITE(*,'(1X,12(F9.5,1X))') DPDX(3,:) |
493 |
! WRITE(*,*) 'DQ/DX(1) ' |
494 |
! WRITE(*,'(1X,12(F9.5,1X))') DQDX(1,:) |
495 |
! WRITE(*,*) 'DQ/DX(2) ' |
496 |
! WRITE(*,'(1X,12(F9.5,1X))') DQDX(2,:) |
497 |
! WRITE(*,*) 'DQ/DX(3) ' |
498 |
! WRITE(*,'(1X,12(F9.5,1X))') DQDX(3,:) |
499 |
|
500 |
! --- CALCULATE DADX |
501 |
DO I=1,12 |
502 |
DADX(I)=0.D0 |
503 |
DBDX(I)=0.D0 |
504 |
DCDX(I)=0.D0 |
505 |
DO J=1,3 |
506 |
DADX(I)=DADX(I)+2.D0*P(J)*DPDX(J,I) |
507 |
DBDX(I)=DBDX(I)+2.D0*Q(J)*DQDX(J,I) |
508 |
DCDX(I)=DCDX(I)+DPDX(J,I)*Q(J)+P(J)*DQDX(J,I) |
509 |
ENDDO |
510 |
ENDDO |
511 |
|
512 |
! --- CALCULATE FIRST DERIVATIVES OF G |
513 |
DO I=1,12 |
514 |
DGDX(I)=DADX(I)*QQ+PP*DBDX(I) |
515 |
ENDDO |
516 |
! --- CALCULATE DDDX |
517 |
DO I=1,12 |
518 |
DDDX(I)=ABYB2N*DGDX(I) |
519 |
ENDDO |
520 |
! --- CALCULATE FIRST DERIVATIVES OF J |
521 |
PREFAC=1.D0/ABYB |
522 |
DO I=1,12 |
523 |
DJDX(I)=(DCDX(I)*D-PQ*DDDX(I))*PREFAC |
524 |
ENDDO |
525 |
! --- CALCULATE FIRST DERIVATIVE |
526 |
DO I=1,12 |
527 |
DI(I)=DJDX(I)*V |
528 |
ENDDO |
529 |
|
530 |
! WRITE(*,*) 'PFL 1st DER TORSION' |
531 |
! WRITE(*,'(15(1X,F10.6))') DADX(:) |
532 |
! WRITE(*,'(15(1X,F10.6))') DBDX(:) |
533 |
! WRITE(*,'(15(1X,F10.6))') DCDX(:) |
534 |
! WRITE(*,'(15(1X,F10.6))') DGDX(:) |
535 |
! WRITE(*,'(15(1X,F10.6))') DDDX(:) |
536 |
! WRITE(*,'(15(1X,F10.6))') DJDX(:) |
537 |
! WRITE(*,'(15(1X,F10.6))') DI(:) |
538 |
|
539 |
|
540 |
! ------------------------------------------------------------- |
541 |
! --- CALCULATE B |
542 |
! ------------------------------------------------------------- |
543 |
|
544 |
WRITE(*,*) 'DER TOR 1' |
545 |
WRITE(*,*) DI(1:3) |
546 |
WRITE(*,*) DI(4:6) |
547 |
WRITE(*,*) DI(7:9) |
548 |
WRITE(*,*) DI(10:12) |
549 |
|
550 |
DO I=1,3 |
551 |
B(I,IAT1)=DI(I) |
552 |
B(I,IAT2)=DI(I+3) |
553 |
B(I,IAT3)=DI(I+6) |
554 |
B(I,IAT4)=DI(I+9) |
555 |
END DO |
556 |
END SUBROUTINE CONSTRAINTS_TORSION_DER |
557 |
|
558 |
|
559 |
! .................................................................. |
560 |
SUBROUTINE CONSTRAINTS_TORSION_DER3(NAT,IAT1,IAT2,IAT3,IAT4,R0,B) |
561 |
! ****************************************************************** |
562 |
! ** |
563 |
! ** CONSTRAINS THE TORSION OF IAT1-IAT2---IAT3-IAT4 |
564 |
! ** |
565 |
! ****************************************************************** |
566 |
use VarTypes |
567 |
IMPLICIT none |
568 |
INTEGER(KINT),INTENT(IN) :: NAT |
569 |
INTEGER(KINT),INTENT(IN) :: IAT1 |
570 |
INTEGER(KINT),INTENT(IN) :: IAT2 |
571 |
INTEGER(KINT),INTENT(IN) :: IAT3 |
572 |
INTEGER(KINT),INTENT(IN) :: IAT4 |
573 |
REAL(KREAL) ,INTENT(IN) :: R0(3,NAT) |
574 |
REAL(KREAL) ,INTENT(OUT):: B(3,NAT) |
575 |
REAL(KREAL) :: X(12),DI(12),DIDJ(12,12),B1(12) |
576 |
REAL(KREAL) :: P(3),Q(3),T(3),U(3),R(3),W(3) |
577 |
REAL(KREAL) :: Rij(3), rkj(3), rkl(3),rmj(3),rnk(3) |
578 |
REAL(KREAL) :: Nrij, Nrkj, Nrkl, Nrmj, Nrnk |
579 |
REAL(KREAL) :: SignPhi |
580 |
real(KREAL) :: phi |
581 |
integer(KINT) :: i,j,ichk,k |
582 |
|
583 |
REAL(KREAL) :: TORS, PP,QQ, PQ |
584 |
REAL(KREAL) :: DADX(12),DBDX(12),DCDX(12) |
585 |
REAL(KREAL) :: DDDX(12),DJDX(12),DVDX(12),DGDX(12),DPDX(3,12),DQDX(3,12) |
586 |
REAL(KREAL) :: D2QDX2(3,12,12),D2PDX2(3,12,12) |
587 |
REAL(KREAL) :: D2BDX2(12,12),D2ADX2(12,12),D2CDX2(12,12),D2DDX2(12,12) |
588 |
real(KREAL) :: d,coverd,abyb2n,abyb,ai,divdx,prefac,v |
589 |
|
590 |
LOGICAL :: Debug=.TRUE. |
591 |
|
592 |
! ****************************************************************** |
593 |
! |
594 |
if (debug) WRITE(*,*) "============= Entering CONSTRAINTS_TORSION_DER3 ===============" |
595 |
|
596 |
! --- TRANSFER R0 TO X ARRAY TO MAKE HANDLING AND PASSING EASIER |
597 |
|
598 |
DO I=1,3 |
599 |
X(I)=R0(I,IAT1) |
600 |
X(I+3)=R0(I,IAT2) |
601 |
X(I+6)=R0(I,IAT3) |
602 |
X(I+9)=R0(I,IAT4) |
603 |
ENDDO |
604 |
|
605 |
if (debug) THEN |
606 |
WRITE(*,'(1X,I5,3(1X,F10.6))') IAt1,R0(:,IAT1) |
607 |
WRITE(*,'(1X,I5,3(1X,F10.6))') IAt2,R0(:,IAT2) |
608 |
WRITE(*,'(1X,I5,3(1X,F10.6))') IAt3,R0(:,IAT3) |
609 |
WRITE(*,'(1X,I5,3(1X,F10.6))') IAt4,R0(:,IAT4) |
610 |
END IF |
611 |
! |
612 |
Rij=X(4:6)-X(1:3) |
613 |
Rkj=X(4:6)-X(7:9) |
614 |
Rkl=X(10:12)-X(7:9) |
615 |
|
616 |
Call VPRD(Rij,Rkj,Rmj) |
617 |
Call Vprd(Rkj,Rkl,Rnk) |
618 |
NRmj=DOT_PRODUCT(Rmj,Rmj) |
619 |
NRnk=DOT_PRODUCT(Rnk,Rnk) |
620 |
NRkj=sqrt(DOT_PRODUCT(Rkj,Rkj)) |
621 |
|
622 |
Coverd=DOT_PRODUCT(Rmj,Rnk)/sqrt(NRmj*NRnk) |
623 |
CALL VPRD(Rmj,Rnk,T) |
624 |
SignPhi=Sign(1.d0,DOT_PRODUCT(Rkj,T)) |
625 |
! SignPhi=Sign(1.d0,DOT_PRODUCT(Rkj,T)) |
626 |
! WRITE(*,*) "DBG Tor 2 signphi, dacos(coverd), sign(1.d0,signphi)", & |
627 |
! signphi, dacos(coverd), sign(1.d0,signphi) |
628 |
! |
629 |
TORS=-1.d0*DACOS(COVERD)*signPhi |
630 |
|
631 |
if (debug) WRITE(*,*) "Torsion derivs 3, Phi=", Tors*180./3.1415926,Iat1,Iat2,Iat3,Iat4 |
632 |
! |
633 |
! ---------------------------------------------------------------- |
634 |
! --- CALCULATE FIRST DERIVATIVES |
635 |
! ---------------------------------------------------------------- |
636 |
DI(1:3)=NRkj/NRmj*Rmj |
637 |
DI(10:12)=-NRkj/NRnk*Rnk |
638 |
DI(4:6)=(DOT_PRODUCT(Rij,Rkj)/Nrkj**2-1.d0)*DI(1:3)-(DOT_PRODUCT(Rkl,Rkj)/NRkj**2)*DI(10:12) |
639 |
DI(7:9)=(DOT_PRODUCT(Rkl,Rkj)/Nrkj**2-1.d0)*DI(10:12)-(DOT_PRODUCT(Rij,Rkj)/NRkj**2)*DI(1:3) |
640 |
|
641 |
|
642 |
DI=DI*SignPhi |
643 |
|
644 |
if (debug) THEN |
645 |
WRITE(*,*) 'DER TOR 3' |
646 |
WRITE(*,*) DI(1:3) |
647 |
WRITE(*,*) DI(4:6) |
648 |
WRITE(*,*) DI(7:9) |
649 |
WRITE(*,*) DI(10:12) |
650 |
END IF |
651 |
|
652 |
DO I=1,3 |
653 |
B(I,IAT1)=DI(I) |
654 |
B(I,IAT2)=DI(I+3) |
655 |
B(I,IAT3)=DI(I+6) |
656 |
B(I,IAT4)=DI(I+9) |
657 |
END DO |
658 |
|
659 |
if (debug) WRITE(*,*) "============= CONSTRAINTS_TORSION_DER3 over ===============" |
660 |
|
661 |
END SUBROUTINE CONSTRAINTS_TORSION_DER3 |
662 |
|
663 |
|
664 |
! .................................................................. |
665 |
SUBROUTINE CONSTRAINTS_TORSION_DER2(NAT,IAT1,IAT2,IAT3,IAT4,R0,DZDC) |
666 |
! ****************************************************************** |
667 |
! ** |
668 |
! ** CONSTRAINS THE TORSION OF IAT1-IAT2---IAT3-IAT4 |
669 |
! |
670 |
! corresponding to P - Q - R - S atoms iun the following |
671 |
! This comes from ADF, and in turns comes from formulas from: "Vibrational States", S.Califano (Wiley, 1976) |
672 |
! derivatives w.r.t P: (a*b)B/abs(a*b)**2) |
673 |
! w.r.t. S : (b*c)B/abs(b*c)**2 |
674 |
! w.r.t. Q : 1/B**2 x ( C*dS + (a-b)*dP ) * b |
675 |
! where * stands for vector product and capitals denote lengths |
676 |
! ------------------------------------------------------------- |
677 |
! a=P-Q |
678 |
! b=R-Q |
679 |
! theta=angle(a,b) |
680 |
! phi (negative of the dihedral angle) |
681 |
! c=S-R |
682 |
|
683 |
! ** |
684 |
! ****************************************************************** |
685 |
use VarTypes |
686 |
IMPLICIT none |
687 |
INTEGER(KINT),INTENT(IN) :: NAT |
688 |
INTEGER(KINT),INTENT(IN) :: IAT1 |
689 |
INTEGER(KINT),INTENT(IN) :: IAT2 |
690 |
INTEGER(KINT),INTENT(IN) :: IAT3 |
691 |
INTEGER(KINT),INTENT(IN) :: IAT4 |
692 |
REAL(KREAL) ,INTENT(IN) :: R0(3,NAT) |
693 |
REAL(KREAL) ,INTENT(OUT):: DZDC(3,NAT) |
694 |
REAL(KREAL) :: DI(12) |
695 |
REAL(KREAL) :: A(3),B(3),C(3),Vec(3) |
696 |
REAL(KREAL) :: U(3),V(3) |
697 |
real(KREAL) :: phi |
698 |
integer(KINT) :: i,j,ichk,k |
699 |
|
700 |
REAL(KREAL) :: norm1,norm2,norm3 |
701 |
real(KREAL) :: s,bleng |
702 |
|
703 |
REAL(KREAL), PARAMETER :: eps=1e-10 |
704 |
|
705 |
LOGICAL :: Debug,Failed,valid |
706 |
EXTERNAL :: Valid |
707 |
|
708 |
! ****************************************************************** |
709 |
! |
710 |
debug=valid('TORSION_DER') |
711 |
if (debug) WRITE(*,*) "============= Entering CONSTRAINTS_TORSION_DER2 ===============" |
712 |
|
713 |
if (debug) THEN |
714 |
WRITE(*,'(1X,I5,3(1X,F10.6))') IAt1,R0(:,IAT1) |
715 |
WRITE(*,'(1X,I5,3(1X,F10.6))') IAt2,R0(:,IAT2) |
716 |
WRITE(*,'(1X,I5,3(1X,F10.6))') IAt3,R0(:,IAT3) |
717 |
WRITE(*,'(1X,I5,3(1X,F10.6))') IAt4,R0(:,IAT4) |
718 |
END IF |
719 |
! |
720 |
A=R0(:,IAT1)-R0(:,IAT2) |
721 |
B=R0(:,IAT3)-R0(:,IAT2) |
722 |
C=R0(:,IAT4)-R0(:,IAT3) |
723 |
DZDC=0. |
724 |
|
725 |
|
726 |
! ---------------------------------------------------------------- |
727 |
! --- We check that PQR and QRS are not aligned. |
728 |
! If they are, we return 0. as derivatives instead of just crashing. |
729 |
! ---------------------------------------------------------------- |
730 |
call produit_vect (b(1),b(2),b(3),Norm1,c(1),c(2),c(3),Norm2, vec(1),vec(2),vec(3),Norm3) |
731 |
norm1=sqrt(dot_product(b,b)) |
732 |
norm2=sqrt(dot_product(c,c)) |
733 |
Failed=.FALSE. |
734 |
|
735 |
if (Norm3 <= eps) then |
736 |
WRITE(*,*) '*** WARNING: ILL-DEFINED DIHEDRAL ANGLE(S)' |
737 |
write (*,*) 'QRS aligned',iat2,iat3,iat4 |
738 |
Failed=.TRUE. |
739 |
end if |
740 |
call produit_vect (b(1),b(2),b(3),Norm1,a(1),a(2),a(3),Norm2, vec(1),vec(2),vec(3),Norm3) |
741 |
if (norm3 <= eps) then |
742 |
WRITE(*,*) '*** WARNING: ILL-DEFINED DIHEDRAL ANGLE(S)' |
743 |
write (*,*) 'PQR aligned',iat1,iat2,iat3 |
744 |
Failed=.TRUE. |
745 |
end if |
746 |
|
747 |
! ---------------------------------------------------------------- |
748 |
! --- CALCULATE FIRST DERIVATIVES |
749 |
! ---------------------------------------------------------------- |
750 |
|
751 |
bleng = sqrt (b(1)**2 + b(2)**2 + b(3)**2) |
752 |
call produit_vect (a(1),a(2),a(3),Norm1,b(1),b(2),b(3),Norm2, vec(1),vec(2),vec(3),Norm3) |
753 |
s = bleng / (vec(1)**2 + vec(2)**2 + vec(3)**2) |
754 |
! dzdc(:,ip,3,ip) = s * vec |
755 |
dzdc(:,iat1) = s * vec |
756 |
|
757 |
call produit_vect (b(1),b(2),b(3),Norm1,c(1),c(2),c(3),Norm2, vec(1),vec(2),vec(3),Norm3) |
758 |
s = bleng / (vec(1)**2 + vec(2)**2 + vec(3)**2) |
759 |
! dzdc(:,is,3,ip) = s * vec |
760 |
dzdc(:,iat4) = s * vec |
761 |
|
762 |
|
763 |
call produit_vect (c(1),c(2),c(3),Norm1, & |
764 |
dzdc(1,iat4), dzdc(2,iat4), dzdc(3,iat4), Norm2, & |
765 |
u(1),u(2),u(3),Norm3) |
766 |
vec = a - b |
767 |
call produit_vect (vec(1),vec(2),vec(3),Norm1, & |
768 |
dzdc(1,iat1), dzdc(2,iat1), dzdc(3,iat1), Norm2, & |
769 |
v(1),v(2),v(3),Norm3) |
770 |
vec = u + v |
771 |
call produit_vect (vec(1),vec(2),vec(3),Norm1, & |
772 |
b(1), b(2), b(3), Norm2, & |
773 |
u(1),u(2),u(3),Norm3) |
774 |
|
775 |
! dzdc(:,iq,3,ip) = u / bleng**2 |
776 |
! dzdc(:,ir,3,ip) = - (dzdc(:,ip,3,ip) + dzdc(:,iq,3,ip) + dzdc(:,is,3,ip)) |
777 |
dzdc(:,iat2) = u / bleng**2 |
778 |
dzdc(:,iat3) = - (dzdc(:,iat1) + dzdc(:,iat2) + dzdc(:,iat4)) |
779 |
|
780 |
if (debug) THEN |
781 |
WRITE(*,*) 'DER TOR 2' |
782 |
WRITE(*,*) DZDC(:,IAT1) |
783 |
WRITE(*,*) DZDC(:,IAT2) |
784 |
WRITE(*,*) DZDC(:,IAT3) |
785 |
WRITE(*,*) DZDC(:,IAT4) |
786 |
END IF |
787 |
|
788 |
if (Failed) DZDC=0. |
789 |
|
790 |
if (debug) WRITE(*,*) "============= CONSTRAINTS_TORSION_DER2 over ===============" |
791 |
|
792 |
END SUBROUTINE CONSTRAINTS_TORSION_DER2 |
793 |
|
794 |
! Not yet implemented |
795 |
|
796 |
|
797 |
! ! .................................................................. |
798 |
! SUBROUTINE CONSTRAINTS_COGSEP_DER(NAT,GROUP1,GROUP2,R0,RMass,B) |
799 |
! ! ****************************************************************** |
800 |
! ! ** SET UP CONSTRAINT IN COORDINATE SPACE ** |
801 |
! ! ** CONSTRAINT IS THE DISTANCE BETWEEN THE CENTER OF GRAVITIES ** |
802 |
! ! ** OF TWO NAMED GROUPS ** |
803 |
! ! ** ** |
804 |
! ! ** THE CONSTRAINT IS EXPRESSED AS A+B*R+0.5*R*C*R=0 ** |
805 |
! ! ** ** |
806 |
! ! ****************************************************************** |
807 |
! use Geometry_module |
808 |
|
809 |
! Use VarTypes |
810 |
! IMPLICIT NONE |
811 |
! INTEGER(KINT) ,INTENT(IN) :: NAT |
812 |
! CHARACTER(*),INTENT(IN) :: GROUP1 ! NAME OF FIRST GROUP |
813 |
! CHARACTER(*),INTENT(IN) :: GROUP2 ! NAME OF SECOND GROUP |
814 |
! REAL(KREAL) ,INTENT(OUT):: B(3,NAT) |
815 |
! REAL(KREAL) ,INTENT(IN) :: R0(3,NAT) |
816 |
! REAL(KREAL) :: RMASS(NAT),A |
817 |
! LOGICAL(4) :: TMEMBER1(NAT) |
818 |
! LOGICAL(4) :: TMEMBER2(NAT) |
819 |
! REAL(KREAL) :: SUMMASS1,SUMMASS2 |
820 |
! REAL(KREAL) :: COG1(3) ! COG OF FIRST GROUP |
821 |
! REAL(KREAL) :: COG2(3) ! COG OF SECOND GROUP |
822 |
! REAL(KREAL) :: X(3) ! COG1-COG2 |
823 |
! REAL(KREAL) :: COGSEP |
824 |
! REAL(KREAL) :: DADX(3) |
825 |
! INTEGER(KINT) :: I,J,IAT,IAT1,IAT2 |
826 |
! ! ****************************************************************** |
827 |
|
828 |
! CALL GROUPLIST_MEMBERS(GROUP1,TMEMBER1) |
829 |
! CALL GROUPLIST_MEMBERS(GROUP2,TMEMBER2) |
830 |
! ! |
831 |
! ! ================================================================== |
832 |
! ! == CALCULATE CENTERS OF GRAVITY == |
833 |
! ! ================================================================== |
834 |
! SUMMASS1=0.D0 |
835 |
! SUMMASS2=0.D0 |
836 |
! COG1(:)=0.D0 |
837 |
! COG2(:)=0.D0 |
838 |
! DO IAT=1,NAT |
839 |
! IF(TMEMBER1(IAT)) THEN |
840 |
! SUMMASS1=SUMMASS1+RMASS(IAT) |
841 |
! COG1(:)=COG1(:)+RMASS(IAT)*R0(:,IAT) |
842 |
! ENDIF |
843 |
! IF(TMEMBER2(IAT)) THEN |
844 |
! SUMMASS2=SUMMASS2+RMASS(IAT) |
845 |
! COG2(:)=COG2(:)+RMASS(IAT)*R0(:,IAT) |
846 |
! ENDIF |
847 |
! ENDDO |
848 |
! COG1(:)=COG1(:)/SUMMASS1 |
849 |
! COG2(:)=COG2(:)/SUMMASS2 |
850 |
! ! |
851 |
! ! ============================================================= |
852 |
! ! == SEPARATION BETWEEN THE CENTERS OF GRAVITY == |
853 |
! ! ============================================================= |
854 |
! X(:)=COG1(:)-COG2(:) |
855 |
! ! |
856 |
! ! ============================================================= |
857 |
! ! == CALCULATE A(X) AND ITS DERIVATIVES == |
858 |
! ! ============================================================= |
859 |
! A=SQRT(DOT_PRODUCT(X(:),X(:))) |
860 |
! DADX(:)=X(:)/A |
861 |
|
862 |
! DO IAT1=1,NAT |
863 |
! IF(TMEMBER1(IAT1)) THEN |
864 |
! B(:,IAT1)=B(:,IAT1)+DADX(:)*RMASS(IAT1)/SUMMASS1 |
865 |
! END IF |
866 |
! IF(TMEMBER2(IAT1)) THEN |
867 |
! B(:,IAT1)=B(:,IAT1)-DADX(:)*RMASS(IAT1)/SUMMASS2 |
868 |
! END IF |
869 |
! END DO |
870 |
|
871 |
! END SUBROUTINE CONSTRAINTS_COGSEP_DER |
872 |
|
873 |
|
874 |
! ! .................................................................. |
875 |
! SUBROUTINE CONSTRAINTS_COGANG_DER(NAT,GROUP1,GROUP2,GROUP3,R0,RMass,B) |
876 |
! ! ****************************************************************** |
877 |
! ! ** SET UP CONSTRAINT IN COORDINATE SPACE ** |
878 |
! ! ** CONSTRAINT IS THE ANGLE BETWEEN THE CENTER OF GRAVITIES ** |
879 |
! ! ** OF THREE NAMED GROUPS ** |
880 |
! ! ** ** |
881 |
! ! ** THE CONSTRAINT IS EXPRESSED AS A+B*R+0.5*R*C*R=0 ** |
882 |
! ! This makes heavy use of BONDANGLEDERIVS |
883 |
! ! ** ** |
884 |
! ! ****************************************************************** |
885 |
! IMPLICIT NONE |
886 |
! INTEGER(KINT) ,INTENT(IN) :: NAT |
887 |
! CHARACTER(*),INTENT(IN) :: GROUP1 ! NAME OF FIRST GROUP |
888 |
! CHARACTER(*),INTENT(IN) :: GROUP2 ! NAME OF SECOND GROUP |
889 |
! CHARACTER(*),INTENT(IN) :: GROUP3 ! NAME OF THIRD GROUP |
890 |
! REAL(KREAL) ,INTENT(OUT):: B(3,NAT) |
891 |
! REAL(KREAL) ,INTENT(IN) :: R0(3,NAT) |
892 |
! REAL(KREAL) :: RMASS(NAT) |
893 |
! LOGICAL(4) :: TMEMBER1(NAT) |
894 |
! LOGICAL(4) :: TMEMBER2(NAT) |
895 |
! LOGICAL(4) :: TMEMBER3(NAT) |
896 |
! REAL(KREAL) :: SUMMASS1,SUMMASS2, SUMMASS3 |
897 |
! REAL(KREAL) :: COG1(3) ! COG OF FIRST GROUP |
898 |
! REAL(KREAL) :: COG2(3) ! COG OF SECOND GROUP |
899 |
! REAL(KREAL) :: COG3(3) ! COG OF THIRD GROUP |
900 |
! REAL(KREAL) :: DCOG1(3,NAT), DCOG2(3,NAT), DCOG3(3,NAT) |
901 |
! REAL(KREAL) :: vecU(3), vecV(3) |
902 |
! REAL(KREAL) :: UU, VV, UV |
903 |
! INTEGER(KINT) :: I,J,IAT,IAT1,IAT2,JAT |
904 |
! REAL(KREAL) :: Pi |
905 |
! ! From BONDANGLEDERIVS |
906 |
! REAL(KREAL) :: D ! 1/SQRT(A*B) |
907 |
! REAL(KREAL) :: DUUDX(3,NAT) |
908 |
! REAL(KREAL) :: DVVDX(3,NAT) |
909 |
! REAL(KREAL) :: DUVDX(3,NAT) |
910 |
! REAL(KREAL) :: DDDX(3,NAT) |
911 |
! REAL(KREAL) :: DJDX(3,NAT) |
912 |
! REAL(KREAL) :: DVDX(3,NAT) |
913 |
! REAL(KREAL) :: DGDX(3,NAT) ! D(A*B)/DX |
914 |
! REAL(KREAL) :: AB,AB2N,V,PREFAC |
915 |
! REAL(KREAL) :: PHI,COSPHI,SINPHI |
916 |
! REAL(KREAL) :: DIVDX,AI |
917 |
|
918 |
|
919 |
! ! ****************************************************************** |
920 |
! CALL GROUPLIST_MEMBERS(GROUP1,TMEMBER1) |
921 |
! CALL GROUPLIST_MEMBERS(GROUP2,TMEMBER2) |
922 |
! CALL GROUPLIST_MEMBERS(GROUP3,TMEMBER3) |
923 |
! ! |
924 |
! ! ================================================================== |
925 |
! ! == CALCULATE CENTERS OF GRAVITY == |
926 |
! ! ================================================================== |
927 |
! SUMMASS1=0.D0 |
928 |
! SUMMASS2=0.D0 |
929 |
! SUMMASS3=0.D0 |
930 |
! COG1(:)=0.D0 |
931 |
! COG2(:)=0.D0 |
932 |
! COG3(:)=0.D0 |
933 |
! DO IAT=1,NAT |
934 |
! IF(TMEMBER1(IAT)) THEN |
935 |
! SUMMASS1=SUMMASS1+RMASS(IAT) |
936 |
! COG1(:)=COG1(:)+RMASS(IAT)*R0(:,IAT) |
937 |
! ENDIF |
938 |
! IF(TMEMBER2(IAT)) THEN |
939 |
! SUMMASS2=SUMMASS2+RMASS(IAT) |
940 |
! COG2(:)=COG2(:)+RMASS(IAT)*R0(:,IAT) |
941 |
! ENDIF |
942 |
! IF(TMEMBER3(IAT)) THEN |
943 |
! SUMMASS3=SUMMASS3+RMASS(IAT) |
944 |
! COG3(:)=COG3(:)+RMASS(IAT)*R0(:,IAT) |
945 |
! ENDIF |
946 |
|
947 |
! ENDDO |
948 |
! COG1(:)=COG1(:)/SUMMASS1 |
949 |
! COG2(:)=COG2(:)/SUMMASS2 |
950 |
! COG3(:)=COG3(:)/SUMMASS3 |
951 |
! ! |
952 |
! ! |
953 |
! vecU(:)=COG1(:)-COG2(:) |
954 |
! vecV(:)=COG3(:)-COG2(:) |
955 |
|
956 |
! UV=DOT_PRODUCT(vecU,vecV) |
957 |
! UU=DOT_PRODUCT(vecU,vecU) |
958 |
! VV=DOT_PRODUCT(vecV,vecV) |
959 |
! ! We now calculate the first derivatives of the COG vs the atomic |
960 |
! ! Coords... |
961 |
! DCOG1=0. |
962 |
! DCOG2=0. |
963 |
! DCOG3=0. |
964 |
! DO IAT=1,NAT |
965 |
! IF (TMEMBER1(IAT)) DCOG1(:,IAT)=RMASS(IAT)/SUMMASS1 |
966 |
! IF (TMEMBER2(IAT)) DCOG2(:,IAT)=RMASS(IAT)/SUMMASS2 |
967 |
! IF (TMEMBER3(IAT)) DCOG3(:,IAT)=RMASS(IAT)/SUMMASS3 |
968 |
! END DO |
969 |
! ! We now calculate the first derivatives of UU, VV, UV |
970 |
! DUUDX=0. |
971 |
! DVVDX=0. |
972 |
! DUVDX=0. |
973 |
! DO IAT=1,NAT |
974 |
! DUUDX(:,IAT)=2.D0*(COG1(:)-COG2(:))*(DCOG1(:,IAT)-DCOG2(:,IAT)) |
975 |
! DVVDX(:,IAT)=2.D0*(COG3(:)-COG2(:))*(DCOG3(:,IAT)-DCOG2(:,IAT)) |
976 |
! DUVDX(:,IAT)=(COG3(:)-COG2(:))*(DCOG1(:,IAT)-DCOG2(:,IAT)) + & |
977 |
! (DCOG3(:,IAT)-DCOG2(:,IAT))*(COG1(:)-COG2(:)) |
978 |
! END DO |
979 |
|
980 |
! ! WRITE(*,*) 'PFL DER COGANGLE' |
981 |
! ! WRITE(*,'(15(1X,F10.6))') DUUDX(:,:) |
982 |
! ! WRITE(*,'(15(1X,F10.6))') DVVDX(:,:) |
983 |
! ! WRITE(*,'(15(1X,F10.6))') DUVDX(:,:) |
984 |
|
985 |
|
986 |
! ! We now go for the hard part: calculate Phi, dPhi/dx, d2Phi/dxidxj |
987 |
! Pi=DACOS(-1.D0) |
988 |
! AB=UU*VV |
989 |
! D=SQRT(AB) |
990 |
! COSPHI=UV/D !=COS(PHI) |
991 |
! PHI=DACOS(COSPHI) |
992 |
! ! WRITE(*,*) 'COGANGLE Phi=',Phi,Phi*180/Pi |
993 |
! ! --- CALCULATE DERIVATIVE OF ARCCOS |
994 |
! SINPHI=DSQRT(1.D0-COSPHI**2) |
995 |
! V=-1.D0/SINPHI !=-SIN(PHI)=D(ACOS(PHI))/D(COSPHI) |
996 |
! ! --- CALCULATE FIRST DERIVATIVES OF G=A*B |
997 |
! DGDX(:,:)=DUUDX(:,:)*VV+DVVDX(:,:)*UU |
998 |
! ! --- CALCULATE DDDX |
999 |
! AB2N=0.5D0/D |
1000 |
! DDDX(:,:)=AB2N*DGDX(:,:) |
1001 |
! ! --- CALCULATE FIRST DERIVATIVES OF J = COS(PHI) |
1002 |
! PREFAC=1.D0/AB |
1003 |
! DJDX(:,:)=(DUVDX(:,:)*D-UV*DDDX(:,:))*PREFAC |
1004 |
! ! --- CALCULATE FIRST DERIVATIVE |
1005 |
! B(:,:)=DJDX(:,:)*V |
1006 |
|
1007 |
! END SUBROUTINE CONSTRAINTS_COGANG_DER |
1008 |
|
1009 |
! ! .................................................................. |
1010 |
! SUBROUTINE CONSTRAINTS_COGTORSION_DER(NAT,GROUP1,GROUP2, GROUP3,GROUP4, R0,RMAss,B) |
1011 |
! ! ****************************************************************** |
1012 |
! ! ** SET UP CONSTRAINT IN COORDINATE SPACE ** |
1013 |
! ! ** CONSTRAINT IS THE ANGLE BETWEEN THE CENTER OF GRAVITIES ** |
1014 |
! ! ** OF THREE NAMED GROUPS ** |
1015 |
! ! ** ** |
1016 |
! ! ** THE CONSTRAINT IS EXPRESSED AS A+B*R+0.5*R*C*R=0 ** |
1017 |
! ! This makes heavy use of BONDANGLEDERIVS |
1018 |
! ! ** ** |
1019 |
! ! ****************************************************************** |
1020 |
! IMPLICIT NONE |
1021 |
! INTEGER(KINT) ,INTENT(IN) :: NAT |
1022 |
! CHARACTER(*),INTENT(IN) :: GROUP1 ! NAME OF FIRST GROUP |
1023 |
! CHARACTER(*),INTENT(IN) :: GROUP2 ! NAME OF SECOND GROUP |
1024 |
! CHARACTER(*),INTENT(IN) :: GROUP3 ! NAME OF THIRD GROUP |
1025 |
! CHARACTER(*),INTENT(IN) :: GROUP4 ! NAME OF FOURTH GROUP |
1026 |
! REAL(KREAL) ,INTENT(OUT):: B(3,NAT) |
1027 |
! REAL(KREAL) ,INTENT(IN) :: R0(3,NAT) |
1028 |
! REAL(KREAL) :: RMASS(NAT) |
1029 |
! LOGICAL(4) :: TMEMBER1(NAT) |
1030 |
! LOGICAL(4) :: TMEMBER2(NAT) |
1031 |
! LOGICAL(4) :: TMEMBER3(NAT) |
1032 |
! LOGICAL(4) :: TMEMBER4(NAT) |
1033 |
! REAL(KREAL) :: SUMMASS1,SUMMASS2, SUMMASS3, SUMMASS4 |
1034 |
! REAL(KREAL) :: COG1(3) ! COG OF FIRST GROUP |
1035 |
! REAL(KREAL) :: COG2(3) ! COG OF SECOND GROUP |
1036 |
! REAL(KREAL) :: COG3(3) ! COG OF THIRD GROUP |
1037 |
! REAL(KREAL) :: COG4(3) ! COG OF FOURTH GROUP |
1038 |
! ! Even thought D COG(i)/DXj =0 (ie COG_x depends only on x-coordinates |
1039 |
! ! of the atoms, not on y or z), we store a 3,3*NAT matrix to make |
1040 |
! ! handling easier below |
1041 |
! REAL(KREAL) :: DCOG1(3,3,NAT), DCOG2(3,3,NAT), & |
1042 |
! DCOG3(3,3,NAT), DCOG4(3,3,NAT) |
1043 |
! REAL(KREAL) :: T(3), U(3), R(3), W(3), P(3), Q(3) |
1044 |
! REAL(KREAL) :: PP, QQ, PQ |
1045 |
! INTEGER(KINT) :: I,J,IAT,IAT1,IAT2,JAT |
1046 |
! REAL(KREAL) :: Pi, Phi |
1047 |
! ! From BONDANGLEDERIVS |
1048 |
! REAL(KREAL) :: D ! SQRT(PP*QQ) |
1049 |
! REAL(KREAL) :: DPDX(3,3,NAT) |
1050 |
! REAL(KREAL) :: DQDX(3,3,NAT) |
1051 |
! REAL(KREAL) :: DPPDX(3,NAT) |
1052 |
! REAL(KREAL) :: DQQDX(3,NAT) |
1053 |
! REAL(KREAL) :: DPQDX(3,NAT) |
1054 |
! REAL(KREAL) :: DDDX(3,NAT) |
1055 |
! REAL(KREAL) :: DJDX(3,NAT) ! D(C/D)/DX*D2 |
1056 |
! REAL(KREAL) :: DVDX(3,NAT) |
1057 |
! REAL(KREAL) :: DGDX(3,NAT) ! D(A*B)/DX |
1058 |
! REAL(KREAL) :: AB,AB2N,V,PREFAC,ABYB,ABYB2N |
1059 |
! REAL(KREAL) :: COSPHI,SINPHI |
1060 |
|
1061 |
|
1062 |
! ! ****************************************************************** |
1063 |
|
1064 |
! ! WRITE(*,*) 'ENTERING SET_COGTORSION' |
1065 |
! ! WRITE(*,*) 'G1:',TRIM(GROUP1),' G2:',TRIM(GROUP2),' G3:',TRIM(GROUP3),' G4:',TRIM(GROUP4) |
1066 |
|
1067 |
! ! ================================================================== |
1068 |
! ! == DETERMINE GROUPS AND ATOM-MASSES |
1069 |
! ! ================================================================== |
1070 |
|
1071 |
! CALL GROUPLIST_MEMBERS(GROUP1,TMEMBER1) |
1072 |
! CALL GROUPLIST_MEMBERS(GROUP2,TMEMBER2) |
1073 |
! CALL GROUPLIST_MEMBERS(GROUP3,TMEMBER3) |
1074 |
! CALL GROUPLIST_MEMBERS(GROUP4,TMEMBER4) |
1075 |
|
1076 |
! ! |
1077 |
! ! ================================================================== |
1078 |
! ! == CALCULATE CENTER OF GRAVITY FOR GROUPS |
1079 |
! ! ================================================================== |
1080 |
! SUMMASS1=0.D0 |
1081 |
! SUMMASS2=0.D0 |
1082 |
! SUMMASS3=0.D0 |
1083 |
! SUMMASS4=0.D0 |
1084 |
|
1085 |
! COG1=0.D0 |
1086 |
! COG2=0.D0 |
1087 |
! COG3=0.D0 |
1088 |
! COG4=0.D0 |
1089 |
|
1090 |
! DO IAT=1,NAT |
1091 |
! ! One atom can belong to many groups as we are looking at |
1092 |
! ! center of gravity of the groups |
1093 |
! IF (TMEMBER1(IAT)) THEN |
1094 |
! SUMMASS1=SUMMASS1+RMASS(IAT) |
1095 |
! COG1(:)=COG1(:)+RMASS(IAT)*R0(:,IAT) |
1096 |
! END IF |
1097 |
! IF (TMEMBER2(IAT)) THEN |
1098 |
! SUMMASS2=SUMMASS2+RMASS(IAT) |
1099 |
! COG2(:)=COG2(:)+RMASS(IAT)*R0(:,IAT) |
1100 |
! END IF |
1101 |
! IF (TMEMBER3(IAT)) THEN |
1102 |
! SUMMASS3=SUMMASS3+RMASS(IAT) |
1103 |
! COG3(:)=COG3(:)+RMASS(IAT)*R0(:,IAT) |
1104 |
! END IF |
1105 |
! IF (TMEMBER4(IAT)) THEN |
1106 |
! SUMMASS4=SUMMASS4+RMASS(IAT) |
1107 |
! COG4(:)=COG4(:)+RMASS(IAT)*R0(:,IAT) |
1108 |
! END IF |
1109 |
! ENDDO |
1110 |
|
1111 |
! COG1(:)=COG1(:)/SUMMASS1 |
1112 |
! COG2(:)=COG2(:)/SUMMASS2 |
1113 |
! COG3(:)=COG3(:)/SUMMASS3 |
1114 |
! COG4(:)=COG4(:)/SUMMASS4 |
1115 |
! T(:)=COG1(:)-COG2(:) |
1116 |
! U(:)=COG3(:)-COG2(:) |
1117 |
! R(:)=COG4(:)-COG3(:) |
1118 |
! W(:)=COG2(:)-COG3(:) |
1119 |
|
1120 |
! CALL VPRD(T,U,P) ! P=CROSS-PRODUCT(T,U) |
1121 |
! CALL VPRD(W,R,Q) |
1122 |
! PQ=DOT_PRODUCT(P,Q) |
1123 |
! PP=DOT_PRODUCT(P,P) |
1124 |
! QQ=DOT_PRODUCT(Q,Q) |
1125 |
! ABYB=PP*QQ |
1126 |
! D=SQRT(ABYB) |
1127 |
|
1128 |
! ABYB2N=0.5D0/D |
1129 |
! COSPHI=PQ/D |
1130 |
! Phi=DACOS(COSPHI) |
1131 |
! Pi=DACOS(-1.0D0) |
1132 |
! SINPHI=DSQRT(1.D0-(COSPHI)**2.D0) |
1133 |
|
1134 |
! ! --- CALCULATE DERIVATIVE OF ARCCOS |
1135 |
! IF (dabs(DABS(COSPHI)-1.d0) < 1.D-9) THEN |
1136 |
! WRITE(*,*) 'WARNING: DERIVATIVE OF TORSION AT ZERO AND PI IS |
1137 |
! &UNDEFINED!' |
1138 |
! V=0.D0 |
1139 |
! ELSE |
1140 |
! V=-1.D0/SINPHI |
1141 |
! ENDIF |
1142 |
|
1143 |
! ! WRITE(*,*) 'Phi et al',Phi,Phi*180./Pi,cosphi,sinphi,V |
1144 |
|
1145 |
! ! We now calculate the first derivatives of the COG vs the atomic |
1146 |
! ! Coords... |
1147 |
! DCOG1=0. |
1148 |
! DCOG2=0. |
1149 |
! DCOG3=0. |
1150 |
! DCOG4=0. |
1151 |
! DO IAT=1,NAT |
1152 |
! IF (TMEMBER1(IAT)) THEN |
1153 |
! DO J=1,3 |
1154 |
! DCOG1(J,J,IAT)=RMASS(IAT)/SUMMASS1 |
1155 |
! END DO |
1156 |
! END IF |
1157 |
! IF (TMEMBER2(IAT)) THEN |
1158 |
! DO J=1,3 |
1159 |
! DCOG2(J,J,IAT)=RMASS(IAT)/SUMMASS2 |
1160 |
! END DO |
1161 |
! END IF |
1162 |
! IF (TMEMBER3(IAT)) THEN |
1163 |
! DO J=1,3 |
1164 |
! DCOG3(J,J,IAT)=RMASS(IAT)/SUMMASS3 |
1165 |
! END DO |
1166 |
! END IF |
1167 |
! IF (TMEMBER4(IAT)) THEN |
1168 |
! DO J=1,3 |
1169 |
! DCOG4(J,J,IAT)=RMASS(IAT)/SUMMASS4 |
1170 |
! END DO |
1171 |
! END IF |
1172 |
! END DO |
1173 |
|
1174 |
! ! We now calculate the first derivatives of P, Q |
1175 |
! DPDX=0. |
1176 |
! DQDX=0. |
1177 |
! DO I=1,NAT |
1178 |
! DO J=1,3 |
1179 |
! DPDX(1,J,I)=(DCOG1(2,J,I)-DCOG2(2,J,I))*(COG3(3)-COG2(3)) & |
1180 |
! & +(COG1(2)-COG2(2))*(DCOG3(3,J,I)-DCOG2(3,J,I)) & |
1181 |
! & -(DCOG1(3,J,I)-DCOG2(3,J,I))*(COG3(2)-COG2(2)) & |
1182 |
! & -(COG1(3)-COG2(3))*(DCOG3(2,J,I)-DCOG2(2,J,I)) |
1183 |
! DPDX(2,J,I)=(DCOG1(3,J,I)-DCOG2(3,J,I))*(COG3(1)-COG2(1)) & |
1184 |
! & +(COG1(3)-COG2(3))*(DCOG3(1,J,I)-DCOG2(1,J,I)) & |
1185 |
! & -(DCOG1(1,J,I)-DCOG2(1,J,I))*(COG3(3)-COG2(3)) & |
1186 |
! & -( COG1(1)-COG2(1))*(DCOG3(3,J,I)-DCOG2(3,J,I)) |
1187 |
! DPDX(3,J,I)=(DCOG1(1,J,I)-DCOG2(1,J,I))*(COG3(2)-COG2(2)) & |
1188 |
! & +(COG1(1)-COG2(1))*(DCOG3(2,J,I)-DCOG2(2,J,I)) & |
1189 |
! & -(DCOG1(2,J,I)-DCOG2(2,J,I))*(COG3(1)-COG2(1)) & |
1190 |
! & -(COG1(2)-COG2(2))*(DCOG3(1,J,I)-DCOG2(1,J,I)) |
1191 |
! DQDX(1,J,I)=(DCOG2(2,J,I)-DCOG3(2,J,I))*(COG4(3)-COG3(3)) & |
1192 |
! & +(COG2(2)-COG3(2))*(DCOG4(3,J,I)-DCOG3(3,J,I)) & |
1193 |
! & -(DCOG2(3,J,I)-DCOG3(3,J,I))*(COG4(2)-COG3(2)) & |
1194 |
! & -(COG2(3)-COG3(3))*(DCOG4(2,J,I)-DCOG3(2,J,I)) |
1195 |
! DQDX(2,J,I)=(DCOG2(3,J,I)-DCOG3(3,J,I))*(COG4(1)-COG3(1)) & |
1196 |
! & +(COG2(3)-COG3(3))*(DCOG4(1,J,I)-DCOG3(1,J,I)) & |
1197 |
! & -(DCOG2(1,J,I)-DCOG3(1,J,I))*(COG4(3)-COG3(3)) & |
1198 |
! & -( COG2(1)-COG3(1))*(DCOG4(3,J,I)-DCOG3(3,J,I)) |
1199 |
! DQDX(3,J,I)=(DCOG2(1,J,I)-DCOG3(1,J,I))*(COG4(2)-COG3(2)) & |
1200 |
! & +(COG2(1)-COG3(1))*(DCOG4(2,J,I)-DCOG3(2,J,I)) & |
1201 |
! & -(DCOG2(2,J,I)-DCOG3(2,J,I))*(COG4(1)-COG3(1)) & |
1202 |
! & -(COG2(2)-COG3(2))*(DCOG4(1,J,I)-DCOG3(1,J,I)) |
1203 |
|
1204 |
! END DO |
1205 |
! END DO |
1206 |
|
1207 |
|
1208 |
! ! WRITE(*,*) 'DP/DX(1) ' |
1209 |
! ! WRITE(*,'(1X,12(F9.5,1X))') DPDX(1,1:3,5:8) |
1210 |
! ! WRITE(*,*) 'DP/DX(2) ' |
1211 |
! ! WRITE(*,'(1X,12(F9.5,1X))') DPDX(2,1:3,5:8) |
1212 |
! ! WRITE(*,*) 'DP/DX(3) ' |
1213 |
! ! WRITE(*,'(1X,12(F9.5,1X))') DPDX(3,1:3,5:8) |
1214 |
! ! WRITE(*,*) 'DQ/DX(1) ' |
1215 |
! ! WRITE(*,'(1X,12(F9.5,1X))') DQDX(1,1:3,5:8) |
1216 |
! ! WRITE(*,*) 'DQ/DX(2) ' |
1217 |
! ! WRITE(*,'(1X,12(F9.5,1X))') DQDX(2,1:3,5:8) |
1218 |
! ! WRITE(*,*) 'DQ/DX(3) ' |
1219 |
! ! WRITE(*,'(1X,12(F9.5,1X))') DQDX(3,1:3,5:8) |
1220 |
|
1221 |
! ! We now calculate the first derivatives of PP, QQ and PQ and DD/DX*2D |
1222 |
|
1223 |
! DPPDX=0. |
1224 |
! DQQDX=0. |
1225 |
! DPQDX=0. |
1226 |
! PREFAC=1.d0/ABYB |
1227 |
! DO IAT=1,NAT |
1228 |
! DO J=1,3 |
1229 |
! DPPDX(J,IAT)=2.D0*(P(1)*DPDX(1,J,IAT)+P(2)*DPDX(2,J,IAT)+ |
1230 |
! & P(3)*DPDX(3,J,IAT)) |
1231 |
! DQQDX(J,IAT)=2.D0*(Q(1)*DQDX(1,J,IAT)+Q(2)*DQDX(2,J,IAT)+ |
1232 |
! & Q(3)*DQDX(3,J,IAT)) |
1233 |
! DPQDX(J,IAT)=P(1)*DQDX(1,J,IAT)+DPDX(1,J,IAT)*Q(1) |
1234 |
! & +P(2)*DQDX(2,J,IAT)+DPDX(2,J,IAT)*Q(2) |
1235 |
! & +P(3)*DQDX(3,J,IAT)+DPDX(3,J,IAT)*Q(3) |
1236 |
! DGDX(J,IAT)=DPPDX(J,IAT)*QQ+PP*DQQDX(J,IAT) |
1237 |
! DDDX(J,IAT)=DGDX(J,IAT)*ABYB2N |
1238 |
! DJDX(J,IAT)=(DPQDX(J,IAT)*D-PQ*DDDX(J,IAT))*PREFAC |
1239 |
! B(J,IAT)=DJDX(J,IAT)*V |
1240 |
! END DO |
1241 |
! END DO |
1242 |
|
1243 |
! END SUBROUTINE CONSTRAINTS_COGTORSION_DER |
1244 |
|
1245 |
|
1246 |
! ! .................................................................. |
1247 |
! SUBROUTINE CONSTRAINTS_COGDIFF_DER(NAT,GROUP1,GROUP2, |
1248 |
! & GROUP3,R0,RMAss,B) |
1249 |
! ! ****************************************************************** |
1250 |
! ! ** SET UP CONSTRAINT IN COORDINATE SPACE ** |
1251 |
! ! ** CONSTRAINT IS THE DIFFERENCE BETWEEN THE DISTANCES BETWEEN ** |
1252 |
! ! ** THE CENTER OF GRAVITIES OF THREE NAMED GROUPS ** |
1253 |
! ! ** ** |
1254 |
! ! ** THE CONSTRAINT IS EXPRESSED AS A+B*R+0.5*R*C*R=0 ** |
1255 |
! ! ** ** |
1256 |
! ! ****************************************************************** |
1257 |
! IMPLICIT NONE |
1258 |
! INTEGER(KINT) ,INTENT(IN) :: NAT |
1259 |
! CHARACTER(*),INTENT(IN) :: GROUP1 ! NAME OF FIRST GROUP |
1260 |
! CHARACTER(*),INTENT(IN) :: GROUP2 ! NAME OF SECOND GROUP |
1261 |
! CHARACTER(*),INTENT(IN) :: GROUP3 ! NAME OF THIRD GROUP |
1262 |
! REAL(KREAL) ,INTENT(OUT):: B(3,NAT) |
1263 |
! REAL(KREAL) ,INTENT(IN) :: R0(3,NAT) |
1264 |
! REAL(KREAL) ,INTENT(IN) :: RMASS(NAT) |
1265 |
! LOGICAL(4) :: TMEMBER1(NAT) |
1266 |
! LOGICAL(4) :: TMEMBER2(NAT) |
1267 |
! LOGICAL(4) :: TMEMBER3(NAT) |
1268 |
! REAL(KREAL) :: SUMMASS1,SUMMASS2, SUMMASS3 |
1269 |
! REAL(KREAL) :: COG1(3) ! COG OF FIRST GROUP |
1270 |
! REAL(KREAL) :: COG2(3) ! COG OF SECOND GROUP |
1271 |
! REAL(KREAL) :: COG3(3) ! COG OF THIRD GROUP |
1272 |
! REAL(KREAL) :: DCOG1(3,NAT), DCOG2(3,NAT), DCOG3(3,NAT) |
1273 |
! REAL(KREAL) :: vecU(3), vecV(3) |
1274 |
! REAL(KREAL) :: UU, VV, UV |
1275 |
! INTEGER(KINT) :: I,J,IAT,IAT1,IAT2,JAT |
1276 |
! REAL(KREAL) :: Pi |
1277 |
! ! From BONDANGLEDERIVS |
1278 |
! REAL(KREAL) :: D1,D2 |
1279 |
! REAL(KREAL) :: DUUDX(3,NAT) |
1280 |
! REAL(KREAL) :: DVVDX(3,NAT) |
1281 |
! REAL(KREAL) :: DUVDX(3,NAT) |
1282 |
! REAL(KREAL) :: DDDX(3,NAT) |
1283 |
! REAL(KREAL) :: DJDX(3,NAT) |
1284 |
! REAL(KREAL) :: DVDX(3,NAT) |
1285 |
! REAL(KREAL) :: DGDX(3,NAT) ! D(A*B)/DX |
1286 |
! REAL(KREAL) :: DIDJ(3,NAT,3,NAT), DI(3,NAT) |
1287 |
! REAL(KREAL) :: AB,AB2N,V,PREFAC |
1288 |
! REAL(KREAL) :: PHI,COSPHI,SINPHI |
1289 |
! REAL(KREAL) :: DIVDX,AI |
1290 |
|
1291 |
|
1292 |
! ! ****************************************************************** |
1293 |
|
1294 |
! CALL GROUPLIST_MEMBERS(GROUP1,TMEMBER1) |
1295 |
! CALL GROUPLIST_MEMBERS(GROUP2,TMEMBER2) |
1296 |
! CALL GROUPLIST_MEMBERS(GROUP3,TMEMBER3) |
1297 |
! ! |
1298 |
! ! ================================================================== |
1299 |
! ! == CALCULATE CENTERS OF GRAVITY == |
1300 |
! ! ================================================================== |
1301 |
! SUMMASS1=0.D0 |
1302 |
! SUMMASS2=0.D0 |
1303 |
! SUMMASS3=0.D0 |
1304 |
! COG1(:)=0.D0 |
1305 |
! COG2(:)=0.D0 |
1306 |
! COG3(:)=0.D0 |
1307 |
! DO IAT=1,NAT |
1308 |
! IF(TMEMBER1(IAT)) THEN |
1309 |
! SUMMASS1=SUMMASS1+RMASS(IAT) |
1310 |
! COG1(:)=COG1(:)+RMASS(IAT)*R0(:,IAT) |
1311 |
! ENDIF |
1312 |
! IF(TMEMBER2(IAT)) THEN |
1313 |
! SUMMASS2=SUMMASS2+RMASS(IAT) |
1314 |
! COG2(:)=COG2(:)+RMASS(IAT)*R0(:,IAT) |
1315 |
! ENDIF |
1316 |
! IF(TMEMBER3(IAT)) THEN |
1317 |
! SUMMASS3=SUMMASS3+RMASS(IAT) |
1318 |
! COG3(:)=COG3(:)+RMASS(IAT)*R0(:,IAT) |
1319 |
! ENDIF |
1320 |
|
1321 |
! ENDDO |
1322 |
! COG1(:)=COG1(:)/SUMMASS1 |
1323 |
! COG2(:)=COG2(:)/SUMMASS2 |
1324 |
! COG3(:)=COG3(:)/SUMMASS3 |
1325 |
! ! |
1326 |
! ! |
1327 |
! vecU(:)=COG1(:)-COG2(:) |
1328 |
! vecV(:)=COG3(:)-COG2(:) |
1329 |
|
1330 |
! UU=DOT_PRODUCT(vecU,vecU) |
1331 |
! VV=DOT_PRODUCT(vecV,vecV) |
1332 |
! ! We now calculate the first derivatives of the COG vs the atomic |
1333 |
! ! Coords... |
1334 |
! DCOG1=0. |
1335 |
! DCOG2=0. |
1336 |
! DCOG3=0. |
1337 |
! DO IAT=1,NAT |
1338 |
! IF (TMEMBER1(IAT)) DCOG1(:,IAT)=RMASS(IAT)/SUMMASS1 |
1339 |
! IF (TMEMBER2(IAT)) DCOG2(:,IAT)=RMASS(IAT)/SUMMASS2 |
1340 |
! IF (TMEMBER3(IAT)) DCOG3(:,IAT)=RMASS(IAT)/SUMMASS3 |
1341 |
! END DO |
1342 |
! ! We now calculate the first derivatives of UU, VV |
1343 |
! DUUDX=0. |
1344 |
! DVVDX=0. |
1345 |
! DO IAT=1,NAT |
1346 |
! DUUDX(:,IAT)=2.D0*(COG1(:)-COG2(:))*(DCOG1(:,IAT)-DCOG2(:,IAT)) |
1347 |
! DVVDX(:,IAT)=2.D0*(COG3(:)-COG2(:))*(DCOG3(:,IAT)-DCOG2(:,IAT)) |
1348 |
! END DO |
1349 |
! ! WRITE(*,*) 'PFL DER COGDIFF' |
1350 |
! ! WRITE(*,'(15(1X,F10.6))') DUUDX(:,:) |
1351 |
! ! WRITE(*,'(15(1X,F10.6))') DVVDX(:,:) |
1352 |
|
1353 |
! ! We now use the fact that Sigma=sqrt(UU) - sqrt(VV) to calculate the |
1354 |
! ! first derivatives of Sigma along R |
1355 |
|
1356 |
! ! Calculate the first derivatives and second derivatives. |
1357 |
! D1=dsqrt(UU) |
1358 |
! D2=dsqrt(VV) |
1359 |
! B(:,:)=0.5d0*( DUUDX(:,:)/D1 - DVVDX(:,:)/D2 ) |
1360 |
|
1361 |
! END SUBROUTINE CONSTRAINTS_COGDIFF_DER |
1362 |
|