Statistiques
| Révision :

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