Working gradient for PBC
[unres.git] / source / unres / src_MD-M / intcartderiv.F
1       subroutine intcartderiv
2       implicit real*8 (a-h,o-z)
3       include 'DIMENSIONS'
4 #ifdef MPI
5       include 'mpif.h'
6 #endif
7       include 'COMMON.SETUP'
8       include 'COMMON.CHAIN' 
9       include 'COMMON.VAR'
10       include 'COMMON.GEO'
11       include 'COMMON.INTERACT'
12       include 'COMMON.DERIV'
13       include 'COMMON.IOUNITS'
14       include 'COMMON.LOCAL'
15       include 'COMMON.SCCOR'
16       double precision dcostheta(3,2,maxres),
17      & dcosphi(3,3,maxres),dsinphi(3,3,maxres),
18      & dcosalpha(3,3,maxres),dcosomega(3,3,maxres),
19      & dsinomega(3,3,maxres),vo1(3),vo2(3),vo3(3),
20      & dummy(3),vp1(3),vp2(3),vp3(3),vpp1(3),n(3)
21        
22 #if defined(MPI) && defined(PARINTDER)
23       if (nfgtasks.gt.1 .and. me.eq.king) 
24      &  call MPI_Bcast(8,1,MPI_INTEGER,king,FG_COMM,IERROR)
25 #endif
26       pi4 = 0.5d0*pipol
27       pi34 = 3*pi4
28       
29 c      write (iout,*) "iphi1_start",iphi1_start," iphi1_end",iphi1_end      
30       do i=1,nres
31         do j=1,3
32           dtheta(j,1,i)=0.0d0
33           dtheta(j,2,i)=0.0d0
34           dphi(j,1,i)=0.0d0
35           dphi(j,2,i)=0.0d0
36           dphi(j,3,i)=0.0d0
37         enddo
38       enddo
39 c Derivatives of theta's
40 #if defined(MPI) && defined(PARINTDER)
41 c We need dtheta(:,:,i-1) to compute dphi(:,:,i)
42       do i=max0(ithet_start-1,3),ithet_end
43 #else
44       do i=3,nres
45 #endif
46         cost=dcos(theta(i))
47         sint=sqrt(1-cost*cost)
48         do j=1,3
49           dcostheta(j,1,i)=-(dc_norm(j,i-1)+cost*dc_norm(j,i-2))/
50      &    vbld(i-1)
51 c          if (itype(i-1).ne.ntyp1)
52           dtheta(j,1,i)=-dcostheta(j,1,i)/sint
53           dcostheta(j,2,i)=-(dc_norm(j,i-2)+cost*dc_norm(j,i-1))/
54      &    vbld(i)
55 c          if (itype(i-1).ne.ntyp1)
56           dtheta(j,2,i)=-dcostheta(j,2,i)/sint
57         enddo
58       enddo
59 #if defined(MPI) && defined(PARINTDER)
60 c We need dtheta(:,:,i-1) to compute dphi(:,:,i)
61       do i=max0(ithet_start-1,3),ithet_end
62 #else
63       do i=3,nres
64 #endif
65       if ((itype(i-1).ne.10).and.(itype(i-1).ne.ntyp1)) then
66         cost1=dcos(omicron(1,i))
67         sint1=sqrt(1-cost1*cost1)
68         cost2=dcos(omicron(2,i))
69         sint2=sqrt(1-cost2*cost2)
70        do j=1,3
71 CC Calculate derivative over first omicron (Cai-2,Cai-1,SCi-1) 
72           dcosomicron(j,1,1,i)=-(dc_norm(j,i-1+nres)+
73      &    cost1*dc_norm(j,i-2))/
74      &    vbld(i-1)
75           domicron(j,1,1,i)=-1/sint1*dcosomicron(j,1,1,i)
76           dcosomicron(j,1,2,i)=-(dc_norm(j,i-2)
77      &    +cost1*(dc_norm(j,i-1+nres)))/
78      &    vbld(i-1+nres)
79           domicron(j,1,2,i)=-1/sint1*dcosomicron(j,1,2,i)
80 CC Calculate derivative over second omicron Sci-1,Cai-1 Cai
81 CC Looks messy but better than if in loop
82           dcosomicron(j,2,1,i)=-(-dc_norm(j,i-1+nres)
83      &    +cost2*dc_norm(j,i-1))/
84      &    vbld(i)
85           domicron(j,2,1,i)=-1/sint2*dcosomicron(j,2,1,i)
86           dcosomicron(j,2,2,i)=-(dc_norm(j,i-1)
87      &     +cost2*(-dc_norm(j,i-1+nres)))/
88      &    vbld(i-1+nres)
89 c          write(iout,*) "vbld", i,itype(i),vbld(i-1+nres)
90           domicron(j,2,2,i)=-1/sint2*dcosomicron(j,2,2,i)
91         enddo
92        endif
93       enddo
94
95 c Derivatives of phi:
96 c If phi is 0 or 180 degrees, then the formulas 
97 c have to be derived by power series expansion of the
98 c conventional formulas around 0 and 180.
99 #ifdef PARINTDER
100       do i=iphi1_start,iphi1_end
101 #else
102       do i=4,nres      
103 #endif
104 c        if (itype(i-2).eq.ntyp1.or. itype(i-1).eq.ntyp1
105 c     &      .or. itype(i).eq.ntyp1 .or. itype(i-3).eq.ntyp1) cycle
106 c the conventional case
107         sint=dsin(theta(i))
108         sint1=dsin(theta(i-1))
109         sing=dsin(phi(i))
110         cost=dcos(theta(i))
111         cost1=dcos(theta(i-1))
112         cosg=dcos(phi(i))
113         scalp=scalar(dc_norm(1,i-3),dc_norm(1,i-1))
114         fac0=1.0d0/(sint1*sint)
115         fac1=cost*fac0
116         fac2=cost1*fac0
117         fac3=cosg*cost1/(sint1*sint1)
118         fac4=cosg*cost/(sint*sint)
119 c    Obtaining the gamma derivatives from sine derivative                                
120        if (phi(i).gt.-pi4.and.phi(i).le.pi4.or.
121      &     phi(i).gt.pi34.and.phi(i).le.pi.or.
122      &     phi(i).gt.-pi.and.phi(i).le.-pi34) then
123          call vecpr(dc_norm(1,i-1),dc_norm(1,i-2),vp1)
124          call vecpr(dc_norm(1,i-3),dc_norm(1,i-1),vp2)
125          call vecpr(dc_norm(1,i-3),dc_norm(1,i-2),vp3) 
126          do j=1,3
127             ctgt=cost/sint
128             ctgt1=cost1/sint1
129             cosg_inv=1.0d0/cosg
130 c            if (itype(i-1).ne.ntyp1 .and. itype(i-2).ne.ntyp1) then
131       dsinphi(j,1,i)=-sing*ctgt1*dtheta(j,1,i-1)
132      &        -(fac0*vp1(j)+sing*dc_norm(j,i-3))*vbld_inv(i-2)
133             dphi(j,1,i)=cosg_inv*dsinphi(j,1,i)
134             dsinphi(j,2,i)=
135      &        -sing*(ctgt1*dtheta(j,2,i-1)+ctgt*dtheta(j,1,i))
136      &        -(fac0*vp2(j)+sing*dc_norm(j,i-2))*vbld_inv(i-1)
137             dphi(j,2,i)=cosg_inv*dsinphi(j,2,i)
138             dsinphi(j,3,i)=-sing*ctgt*dtheta(j,2,i)
139      &        +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i)
140 c     &        +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i-1)
141             dphi(j,3,i)=cosg_inv*dsinphi(j,3,i)
142 c            endif
143 c Bug fixed 3/24/05 (AL)
144          enddo                                              
145 c   Obtaining the gamma derivatives from cosine derivative
146         else
147            do j=1,3
148 c           if (itype(i-1).ne.ntyp1 .and. itype(i-2).ne.ntyp1) then
149            dcosphi(j,1,i)=fac1*dcostheta(j,1,i-1)+fac3*
150      &     dcostheta(j,1,i-1)-fac0*(dc_norm(j,i-1)-scalp*
151      &     dc_norm(j,i-3))/vbld(i-2)
152            dphi(j,1,i)=-1/sing*dcosphi(j,1,i)       
153            dcosphi(j,2,i)=fac1*dcostheta(j,2,i-1)+fac2*
154      &     dcostheta(j,1,i)+fac3*dcostheta(j,2,i-1)+fac4*
155      &     dcostheta(j,1,i)
156            dphi(j,2,i)=-1/sing*dcosphi(j,2,i)      
157            dcosphi(j,3,i)=fac2*dcostheta(j,2,i)+fac4*
158      &     dcostheta(j,2,i)-fac0*(dc_norm(j,i-3)-scalp*
159      &     dc_norm(j,i-1))/vbld(i)
160            dphi(j,3,i)=-1/sing*dcosphi(j,3,i)       
161 c           endif
162          enddo
163         endif                                                                                            
164       enddo
165 Calculate derivative of Tauangle
166 #ifdef PARINTDER
167       do i=itau_start,itau_end
168 #else
169       do i=3,nres
170 #endif
171        if ((itype(i-2).eq.ntyp1).or.(itype(i-2).eq.10)) cycle
172 c       if ((itype(i-2).eq.ntyp1).or.(itype(i-2).eq.10).or.
173 c     &     (itype(i-1).eq.ntyp1).or.(itype(i).eq.ntyp1)) cycle
174 cc dtauangle(j,intertyp,dervityp,residue number)
175 cc INTERTYP=1 SC...Ca...Ca..Ca
176 c the conventional case
177         sint=dsin(theta(i))
178         sint1=dsin(omicron(2,i-1))
179         sing=dsin(tauangle(1,i))
180         cost=dcos(theta(i))
181         cost1=dcos(omicron(2,i-1))
182         cosg=dcos(tauangle(1,i))
183         do j=1,3
184         dc_norm2(j,i-2+nres)=-dc_norm(j,i-2+nres)
185 cc       write(iout,*) dc_norm2(j,i-2+nres),"dcnorm"
186         enddo
187         scalp=scalar(dc_norm2(1,i-2+nres),dc_norm(1,i-1))
188         fac0=1.0d0/(sint1*sint)
189         fac1=cost*fac0
190         fac2=cost1*fac0
191         fac3=cosg*cost1/(sint1*sint1)
192         fac4=cosg*cost/(sint*sint)
193 cc         write(iout,*) "faki",fac0,fac1,fac2,fac3,fac4
194 c    Obtaining the gamma derivatives from sine derivative                                
195        if (tauangle(1,i).gt.-pi4.and.tauangle(1,i).le.pi4.or.
196      &     tauangle(1,i).gt.pi34.and.tauangle(1,i).le.pi.or.
197      &     tauangle(1,i).gt.-pi.and.tauangle(1,i).le.-pi34) then
198          call vecpr(dc_norm(1,i-1),dc_norm(1,i-2),vp1)
199          call vecpr(dc_norm2(1,i-2+nres),dc_norm(1,i-1),vp2)
200          call vecpr(dc_norm2(1,i-2+nres),dc_norm(1,i-2),vp3)
201         do j=1,3
202             ctgt=cost/sint
203             ctgt1=cost1/sint1
204             cosg_inv=1.0d0/cosg
205             dsintau(j,1,1,i)=-sing*ctgt1*domicron(j,2,2,i-1)
206      &-(fac0*vp1(j)+sing*(dc_norm2(j,i-2+nres)))
207      & *vbld_inv(i-2+nres)
208             dtauangle(j,1,1,i)=cosg_inv*dsintau(j,1,1,i)
209             dsintau(j,1,2,i)=
210      &        -sing*(ctgt1*domicron(j,2,1,i-1)+ctgt*dtheta(j,1,i))
211      &        -(fac0*vp2(j)+sing*dc_norm(j,i-2))*vbld_inv(i-1)
212 c            write(iout,*) "dsintau", dsintau(j,1,2,i)
213             dtauangle(j,1,2,i)=cosg_inv*dsintau(j,1,2,i)
214 c Bug fixed 3/24/05 (AL)
215             dsintau(j,1,3,i)=-sing*ctgt*dtheta(j,2,i)
216      &        +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i)
217 c     &        +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i-1)
218             dtauangle(j,1,3,i)=cosg_inv*dsintau(j,1,3,i)
219          enddo
220 c   Obtaining the gamma derivatives from cosine derivative
221         else
222            do j=1,3
223            dcostau(j,1,1,i)=fac1*dcosomicron(j,2,2,i-1)+fac3*
224      &     dcosomicron(j,2,2,i-1)-fac0*(dc_norm(j,i-1)-scalp*
225      &     (dc_norm2(j,i-2+nres)))/vbld(i-2+nres)
226            dtauangle(j,1,1,i)=-1/sing*dcostau(j,1,1,i)
227            dcostau(j,1,2,i)=fac1*dcosomicron(j,2,1,i-1)+fac2*
228      &     dcostheta(j,1,i)+fac3*dcosomicron(j,2,1,i-1)+fac4*
229      &     dcostheta(j,1,i)
230            dtauangle(j,1,2,i)=-1/sing*dcostau(j,1,2,i)
231            dcostau(j,1,3,i)=fac2*dcostheta(j,2,i)+fac4*
232      &     dcostheta(j,2,i)-fac0*(-dc_norm(j,i-2+nres)-scalp*
233      &     dc_norm(j,i-1))/vbld(i)
234            dtauangle(j,1,3,i)=-1/sing*dcostau(j,1,3,i)
235 c         write (iout,*) "else",i
236          enddo
237         endif
238 c        do k=1,3                 
239 c        write(iout,*) "tu",i,k,(dtauangle(j,1,k,i),j=1,3)        
240 c        enddo                
241       enddo
242 CC Second case Ca...Ca...Ca...SC
243 #ifdef PARINTDER
244       do i=itau_start,itau_end
245 #else
246       do i=4,nres
247 #endif
248        if ((itype(i-1).eq.ntyp1).or.(itype(i-1).eq.10).or.
249      &    (itype(i-2).eq.ntyp1).or.(itype(i-3).eq.ntyp1)) cycle
250 c the conventional case
251         sint=dsin(omicron(1,i))
252         sint1=dsin(theta(i-1))
253         sing=dsin(tauangle(2,i))
254         cost=dcos(omicron(1,i))
255         cost1=dcos(theta(i-1))
256         cosg=dcos(tauangle(2,i))
257 c        do j=1,3
258 c        dc_norm2(j,i-1+nres)=-dc_norm(j,i-1+nres)
259 c        enddo
260         scalp=scalar(dc_norm(1,i-3),dc_norm(1,i-1+nres))
261         fac0=1.0d0/(sint1*sint)
262         fac1=cost*fac0
263         fac2=cost1*fac0
264         fac3=cosg*cost1/(sint1*sint1)
265         fac4=cosg*cost/(sint*sint)
266 c    Obtaining the gamma derivatives from sine derivative                                
267        if (tauangle(2,i).gt.-pi4.and.tauangle(2,i).le.pi4.or.
268      &     tauangle(2,i).gt.pi34.and.tauangle(2,i).le.pi.or.
269      &     tauangle(2,i).gt.-pi.and.tauangle(2,i).le.-pi34) then
270          call vecpr(dc_norm2(1,i-1+nres),dc_norm(1,i-2),vp1)
271          call vecpr(dc_norm(1,i-3),dc_norm(1,i-1+nres),vp2)
272          call vecpr(dc_norm(1,i-3),dc_norm(1,i-2),vp3)
273         do j=1,3
274             ctgt=cost/sint
275             ctgt1=cost1/sint1
276             cosg_inv=1.0d0/cosg
277             dsintau(j,2,1,i)=-sing*ctgt1*dtheta(j,1,i-1)
278      &        +(fac0*vp1(j)-sing*dc_norm(j,i-3))*vbld_inv(i-2)
279 c       write(iout,*) i,j,dsintau(j,2,1,i),sing*ctgt1*dtheta(j,1,i-1),
280 c     &fac0*vp1(j),sing*dc_norm(j,i-3),vbld_inv(i-2),"dsintau(2,1)"
281             dtauangle(j,2,1,i)=cosg_inv*dsintau(j,2,1,i)
282             dsintau(j,2,2,i)=
283      &        -sing*(ctgt1*dtheta(j,2,i-1)+ctgt*domicron(j,1,1,i))
284      &        -(fac0*vp2(j)+sing*dc_norm(j,i-2))*vbld_inv(i-1)
285 c            write(iout,*) "sprawdzenie",i,j,sing*ctgt1*dtheta(j,2,i-1),
286 c     & sing*ctgt*domicron(j,1,2,i),
287 c     & (fac0*vp2(j)+sing*dc_norm(j,i-2))*vbld_inv(i-1)
288             dtauangle(j,2,2,i)=cosg_inv*dsintau(j,2,2,i)
289 c Bug fixed 3/24/05 (AL)
290             dsintau(j,2,3,i)=-sing*ctgt*domicron(j,1,2,i)
291      &       +(fac0*vp3(j)-sing*dc_norm(j,i-1+nres))*vbld_inv(i-1+nres)
292 c     &        +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i-1)
293             dtauangle(j,2,3,i)=cosg_inv*dsintau(j,2,3,i)
294          enddo
295 c   Obtaining the gamma derivatives from cosine derivative
296         else
297            do j=1,3
298            dcostau(j,2,1,i)=fac1*dcostheta(j,1,i-1)+fac3*
299      &     dcostheta(j,1,i-1)-fac0*(dc_norm(j,i-1+nres)-scalp*
300      &     dc_norm(j,i-3))/vbld(i-2)
301            dtauangle(j,2,1,i)=-1/sing*dcostau(j,2,1,i)
302            dcostau(j,2,2,i)=fac1*dcostheta(j,2,i-1)+fac2*
303      &     dcosomicron(j,1,1,i)+fac3*dcostheta(j,2,i-1)+fac4*
304      &     dcosomicron(j,1,1,i)
305            dtauangle(j,2,2,i)=-1/sing*dcostau(j,2,2,i)
306            dcostau(j,2,3,i)=fac2*dcosomicron(j,1,2,i)+fac4*
307      &     dcosomicron(j,1,2,i)-fac0*(dc_norm(j,i-3)-scalp*
308      &     dc_norm(j,i-1+nres))/vbld(i-1+nres)
309            dtauangle(j,2,3,i)=-1/sing*dcostau(j,2,3,i)
310 c        write(iout,*) i,j,"else", dtauangle(j,2,3,i) 
311          enddo
312         endif                                    
313       enddo
314
315 CCC third case SC...Ca...Ca...SC
316 #ifdef PARINTDER
317
318       do i=itau_start,itau_end
319 #else
320       do i=3,nres
321 #endif
322 c the conventional case
323       if ((itype(i-1).eq.ntyp1).or.(itype(i-1).eq.10).or.
324      &(itype(i-2).eq.ntyp1).or.(itype(i-2).eq.10)) cycle
325         sint=dsin(omicron(1,i))
326         sint1=dsin(omicron(2,i-1))
327         sing=dsin(tauangle(3,i))
328         cost=dcos(omicron(1,i))
329         cost1=dcos(omicron(2,i-1))
330         cosg=dcos(tauangle(3,i))
331         do j=1,3
332         dc_norm2(j,i-2+nres)=-dc_norm(j,i-2+nres)
333 c        dc_norm2(j,i-1+nres)=-dc_norm(j,i-1+nres)
334         enddo
335         scalp=scalar(dc_norm2(1,i-2+nres),dc_norm(1,i-1+nres))
336         fac0=1.0d0/(sint1*sint)
337         fac1=cost*fac0
338         fac2=cost1*fac0
339         fac3=cosg*cost1/(sint1*sint1)
340         fac4=cosg*cost/(sint*sint)
341 c    Obtaining the gamma derivatives from sine derivative                                
342        if (tauangle(3,i).gt.-pi4.and.tauangle(3,i).le.pi4.or.
343      &     tauangle(3,i).gt.pi34.and.tauangle(3,i).le.pi.or.
344      &     tauangle(3,i).gt.-pi.and.tauangle(3,i).le.-pi34) then
345          call vecpr(dc_norm(1,i-1+nres),dc_norm(1,i-2),vp1)
346          call vecpr(dc_norm2(1,i-2+nres),dc_norm(1,i-1+nres),vp2)
347          call vecpr(dc_norm2(1,i-2+nres),dc_norm(1,i-2),vp3)
348         do j=1,3
349             ctgt=cost/sint
350             ctgt1=cost1/sint1
351             cosg_inv=1.0d0/cosg
352             dsintau(j,3,1,i)=-sing*ctgt1*domicron(j,2,2,i-1)
353      &        -(fac0*vp1(j)-sing*dc_norm(j,i-2+nres))
354      &        *vbld_inv(i-2+nres)
355             dtauangle(j,3,1,i)=cosg_inv*dsintau(j,3,1,i)
356             dsintau(j,3,2,i)=
357      &        -sing*(ctgt1*domicron(j,2,1,i-1)+ctgt*domicron(j,1,1,i))
358      &        -(fac0*vp2(j)+sing*dc_norm(j,i-2))*vbld_inv(i-1)
359             dtauangle(j,3,2,i)=cosg_inv*dsintau(j,3,2,i)
360 c Bug fixed 3/24/05 (AL)
361             dsintau(j,3,3,i)=-sing*ctgt*domicron(j,1,2,i)
362      &        +(fac0*vp3(j)-sing*dc_norm(j,i-1+nres))
363      &        *vbld_inv(i-1+nres)
364 c     &        +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i-1)
365             dtauangle(j,3,3,i)=cosg_inv*dsintau(j,3,3,i)
366          enddo
367 c   Obtaining the gamma derivatives from cosine derivative
368         else
369            do j=1,3
370            dcostau(j,3,1,i)=fac1*dcosomicron(j,2,2,i-1)+fac3*
371      &     dcosomicron(j,2,2,i-1)-fac0*(dc_norm(j,i-1+nres)-scalp*
372      &     dc_norm2(j,i-2+nres))/vbld(i-2+nres)
373            dtauangle(j,3,1,i)=-1/sing*dcostau(j,3,1,i)
374            dcostau(j,3,2,i)=fac1*dcosomicron(j,2,1,i-1)+fac2*
375      &     dcosomicron(j,1,1,i)+fac3*dcosomicron(j,2,1,i-1)+fac4*
376      &     dcosomicron(j,1,1,i)
377            dtauangle(j,3,2,i)=-1/sing*dcostau(j,3,2,i)
378            dcostau(j,3,3,i)=fac2*dcosomicron(j,1,2,i)+fac4*
379      &     dcosomicron(j,1,2,i)-fac0*(dc_norm2(j,i-2+nres)-scalp*
380      &     dc_norm(j,i-1+nres))/vbld(i-1+nres)
381            dtauangle(j,3,3,i)=-1/sing*dcostau(j,3,3,i)
382 c          write(iout,*) "else",i 
383          enddo
384         endif                                                                                            
385       enddo
386
387 #ifdef CRYST_SC
388 c   Derivatives of side-chain angles alpha and omega
389 #if defined(MPI) && defined(PARINTDER)
390         do i=ibond_start,ibond_end
391 #else
392         do i=2,nres-1           
393 #endif
394           if(itype(i).ne.10 .and. itype(i).ne.ntyp1) then         
395              fac5=1.0d0/dsqrt(2*(1+dcos(theta(i+1))))
396              fac6=fac5/vbld(i)
397              fac7=fac5*fac5
398              fac8=fac5/vbld(i+1)     
399              fac9=fac5/vbld(i+nres)                  
400              scala1=scalar(dc_norm(1,i-1),dc_norm(1,i+nres))
401              scala2=scalar(dc_norm(1,i),dc_norm(1,i+nres))
402              cosa=dsqrt(0.5d0/(1.0d0+dcos(theta(i+1))))*(
403      &       scalar(dC_norm(1,i),dC_norm(1,i+nres))
404      &       -scalar(dC_norm(1,i-1),dC_norm(1,i+nres)))
405              sina=sqrt(1-cosa*cosa)
406              sino=dsin(omeg(i))                                                                                              
407 c             write (iout,*) "i",i," cosa",cosa," sina",sina," sino",sino
408              do j=1,3     
409                 dcosalpha(j,1,i)=fac6*(scala1*dc_norm(j,i-1)-
410      &          dc_norm(j,i+nres))-cosa*fac7*dcostheta(j,1,i+1)
411                 dalpha(j,1,i)=-1/sina*dcosalpha(j,1,i)
412                 dcosalpha(j,2,i)=fac8*(dc_norm(j,i+nres)-
413      &          scala2*dc_norm(j,i))-cosa*fac7*dcostheta(j,2,i+1)
414                 dalpha(j,2,i)=-1/sina*dcosalpha(j,2,i)
415                 dcosalpha(j,3,i)=(fac9*(dc_norm(j,i)-
416      &          dc_norm(j,i-1))-(cosa*dc_norm(j,i+nres))/
417      &          vbld(i+nres))
418                 dalpha(j,3,i)=-1/sina*dcosalpha(j,3,i)
419             enddo
420 c obtaining the derivatives of omega from sines     
421             if(omeg(i).gt.-pi4.and.omeg(i).le.pi4.or.
422      &         omeg(i).gt.pi34.and.omeg(i).le.pi.or.
423      &         omeg(i).gt.-pi.and.omeg(i).le.-pi34) then
424                fac15=dcos(theta(i+1))/(dsin(theta(i+1))*
425      &         dsin(theta(i+1)))
426                fac16=dcos(alph(i))/(dsin(alph(i))*dsin(alph(i)))
427                fac17=1.0d0/(dsin(theta(i+1))*dsin(alph(i)))             
428                call vecpr(dc_norm(1,i+nres),dc_norm(1,i),vo1)
429                call vecpr(dc_norm(1,i+nres),dc_norm(1,i-1),vo2)
430                call vecpr(dc_norm(1,i),dc_norm(1,i-1),vo3)
431                coso_inv=1.0d0/dcos(omeg(i))                            
432                do j=1,3
433                  dsinomega(j,1,i)=sino*(fac15*dcostheta(j,1,i+1)
434      &           +fac16*dcosalpha(j,1,i))-fac17/vbld(i)*vo1(j)-(
435      &           sino*dc_norm(j,i-1))/vbld(i)
436                  domega(j,1,i)=coso_inv*dsinomega(j,1,i)
437                  dsinomega(j,2,i)=sino*(fac15*dcostheta(j,2,i+1)
438      &           +fac16*dcosalpha(j,2,i))+fac17/vbld(i+1)*vo2(j)
439      &           -sino*dc_norm(j,i)/vbld(i+1)
440                  domega(j,2,i)=coso_inv*dsinomega(j,2,i)                                                       
441                  dsinomega(j,3,i)=sino*fac16*dcosalpha(j,3,i)-
442      &           fac17/vbld(i+nres)*vo3(j)-sino*dc_norm(j,i+nres)/
443      &           vbld(i+nres)
444                  domega(j,3,i)=coso_inv*dsinomega(j,3,i)
445               enddo                              
446            else
447 c   obtaining the derivatives of omega from cosines
448              fac10=sqrt(0.5d0*(1-dcos(theta(i+1))))
449              fac11=sqrt(0.5d0*(1+dcos(theta(i+1))))
450              fac12=fac10*sina
451              fac13=fac12*fac12
452              fac14=sina*sina
453              do j=1,3                                    
454                 dcosomega(j,1,i)=(-(0.25d0*cosa/fac11*
455      &          dcostheta(j,1,i+1)+fac11*dcosalpha(j,1,i))*fac12+
456      &          (0.25d0/fac10*sina*dcostheta(j,1,i+1)+cosa/sina*
457      &          fac10*dcosalpha(j,1,i))*(scala2-fac11*cosa))/fac13
458                 domega(j,1,i)=-1/sino*dcosomega(j,1,i)
459                 dcosomega(j,2,i)=(((dc_norm(j,i+nres)-scala2*
460      &          dc_norm(j,i))/vbld(i+1)-0.25d0*cosa/fac11*
461      &          dcostheta(j,2,i+1)-fac11*dcosalpha(j,2,i))*fac12+
462      &          (scala2-fac11*cosa)*(0.25d0*sina/fac10*
463      &          dcostheta(j,2,i+1)+fac10*cosa/sina*dcosalpha(j,2,i)
464      &          ))/fac13
465                 domega(j,2,i)=-1/sino*dcosomega(j,2,i)          
466                 dcosomega(j,3,i)=1/fac10*((1/vbld(i+nres)*(dc_norm(j,i)-
467      &          scala2*dc_norm(j,i+nres))-fac11*dcosalpha(j,3,i))*sina+
468      &          (scala2-fac11*cosa)*(cosa/sina*dcosalpha(j,3,i)))/fac14
469                 domega(j,3,i)=-1/sino*dcosomega(j,3,i)                          
470             enddo           
471           endif
472          else
473            do j=1,3
474              do k=1,3
475                dalpha(k,j,i)=0.0d0
476                domega(k,j,i)=0.0d0
477              enddo
478            enddo
479          endif
480        enddo                                          
481 #endif
482 #if defined(MPI) && defined(PARINTDER)
483       if (nfgtasks.gt.1) then
484 #ifdef DEBUG
485 cd      write (iout,*) "Gather dtheta"
486 cd      call flush(iout)
487       write (iout,*) "dtheta before gather"
488       do i=1,nres
489         write (iout,'(i3,3(3f8.5,3x))') i,((dtheta(j,k,i),k=1,3),j=1,2)
490       enddo
491 #endif
492       call MPI_Gatherv(dtheta(1,1,ithet_start),ithet_count(fg_rank),
493      &  MPI_THET,dtheta(1,1,1),ithet_count(0),ithet_displ(0),MPI_THET,
494      &  king,FG_COMM,IERROR)
495 #ifdef DEBUG
496 cd      write (iout,*) "Gather dphi"
497 cd      call flush(iout)
498       write (iout,*) "dphi before gather"
499       do i=1,nres
500         write (iout,'(i3,3(3f8.5,3x))') i,((dphi(j,k,i),k=1,3),j=1,3)
501       enddo
502 #endif
503       call MPI_Gatherv(dphi(1,1,iphi1_start),iphi1_count(fg_rank),
504      &  MPI_GAM,dphi(1,1,1),iphi1_count(0),iphi1_displ(0),MPI_GAM,
505      &  king,FG_COMM,IERROR)
506 cd      write (iout,*) "Gather dalpha"
507 cd      call flush(iout)
508 #ifdef CRYST_SC
509       call MPI_Gatherv(dalpha(1,1,ibond_start),ibond_count(fg_rank),
510      &  MPI_GAM,dalpha(1,1,1),ibond_count(0),ibond_displ(0),MPI_GAM,
511      &  king,FG_COMM,IERROR)
512 cd      write (iout,*) "Gather domega"
513 cd      call flush(iout)
514       call MPI_Gatherv(domega(1,1,ibond_start),ibond_count(fg_rank),
515      &  MPI_GAM,domega(1,1,1),ibond_count(0),ibond_displ(0),MPI_GAM,
516      &  king,FG_COMM,IERROR)
517 #endif
518       endif
519 #endif
520 #ifdef DEBUG
521       write (iout,*) "dtheta after gather"
522       do i=1,nres
523         write (iout,'(i3,3(3f8.5,3x))') i,((dtheta(j,k,i),j=1,3),k=1,2)
524       enddo
525       write (iout,*) "dphi after gather"
526       do i=1,nres
527         write (iout,'(i3,3(3f8.5,3x))') i,((dphi(j,k,i),j=1,3),k=1,3)
528       enddo
529       write (iout,*) "dalpha after gather"
530       do i=1,nres
531         write (iout,'(i3,3(3f8.5,3x))') i,((dalpha(j,k,i),j=1,3),k=1,3)
532       enddo
533       write (iout,*) "domega after gather"
534       do i=1,nres
535         write (iout,'(i3,3(3f8.5,3x))') i,((domega(j,k,i),j=1,3),k=1,3)
536       enddo
537 #endif
538       return
539       end
540        
541       subroutine checkintcartgrad
542       implicit real*8 (a-h,o-z)
543       include 'DIMENSIONS'
544 #ifdef MPI
545       include 'mpif.h'
546 #endif
547       include 'COMMON.CHAIN' 
548       include 'COMMON.VAR'
549       include 'COMMON.GEO'
550       include 'COMMON.INTERACT'
551       include 'COMMON.DERIV'
552       include 'COMMON.IOUNITS'
553       include 'COMMON.SETUP'
554       double precision dthetanum(3,2,maxres),dphinum(3,3,maxres)
555      & ,dalphanum(3,3,maxres), domeganum(3,3,maxres)
556       double precision theta_s(maxres),phi_s(maxres),alph_s(maxres),
557      & omeg_s(maxres),dc_norm_s(3)
558       double precision aincr /1.0d-5/
559       
560       do i=1,nres
561         phi_s(i)=phi(i)
562         theta_s(i)=theta(i)     
563         alph_s(i)=alph(i)
564         omeg_s(i)=omeg(i)
565       enddo
566 c Check theta gradient
567       write (iout,*) 
568      & "Analytical (upper) and numerical (lower) gradient of theta"
569       write (iout,*) 
570       do i=3,nres
571         do j=1,3
572           dcji=dc(j,i-2)
573           dc(j,i-2)=dcji+aincr
574           call chainbuild_cart
575           call int_from_cart1(.false.)
576           dthetanum(j,1,i)=(theta(i)-theta_s(i))/aincr 
577           dc(j,i-2)=dcji
578           dcji=dc(j,i-1)
579           dc(j,i-1)=dc(j,i-1)+aincr
580           call chainbuild_cart    
581           dthetanum(j,2,i)=(theta(i)-theta_s(i))/aincr
582           dc(j,i-1)=dcji
583         enddo 
584         write (iout,'(i5,3f10.5,5x,3f10.5)') i,(dtheta(j,1,i),j=1,3),
585      &    (dtheta(j,2,i),j=1,3)
586         write (iout,'(5x,3f10.5,5x,3f10.5)') (dthetanum(j,1,i),j=1,3),
587      &    (dthetanum(j,2,i),j=1,3)
588         write (iout,'(5x,3f10.5,5x,3f10.5)') 
589      &    (dthetanum(j,1,i)/dtheta(j,1,i),j=1,3),
590      &    (dthetanum(j,2,i)/dtheta(j,2,i),j=1,3)
591         write (iout,*)
592       enddo
593 c Check gamma gradient
594       write (iout,*) 
595      & "Analytical (upper) and numerical (lower) gradient of gamma"
596       do i=4,nres
597         do j=1,3
598           dcji=dc(j,i-3)
599           dc(j,i-3)=dcji+aincr
600           call chainbuild_cart
601           dphinum(j,1,i)=(phi(i)-phi_s(i))/aincr  
602           dc(j,i-3)=dcji
603           dcji=dc(j,i-2)
604           dc(j,i-2)=dcji+aincr
605           call chainbuild_cart
606           dphinum(j,2,i)=(phi(i)-phi_s(i))/aincr 
607           dc(j,i-2)=dcji
608           dcji=dc(j,i-1)
609           dc(j,i-1)=dc(j,i-1)+aincr
610           call chainbuild_cart
611           dphinum(j,3,i)=(phi(i)-phi_s(i))/aincr
612           dc(j,i-1)=dcji
613         enddo 
614         write (iout,'(i5,3(3f10.5,5x))') i,(dphi(j,1,i),j=1,3),
615      &    (dphi(j,2,i),j=1,3),(dphi(j,3,i),j=1,3)
616         write (iout,'(5x,3(3f10.5,5x))') (dphinum(j,1,i),j=1,3),
617      &    (dphinum(j,2,i),j=1,3),(dphinum(j,3,i),j=1,3)
618         write (iout,'(5x,3(3f10.5,5x))') 
619      &    (dphinum(j,1,i)/dphi(j,1,i),j=1,3),
620      &    (dphinum(j,2,i)/dphi(j,2,i),j=1,3),
621      &    (dphinum(j,3,i)/dphi(j,3,i),j=1,3)
622         write (iout,*)
623       enddo
624 c Check alpha gradient
625       write (iout,*) 
626      & "Analytical (upper) and numerical (lower) gradient of alpha"
627       do i=2,nres-1
628        if(itype(i).ne.10) then
629             do j=1,3
630               dcji=dc(j,i-1)
631               dc(j,i-1)=dcji+aincr
632               call chainbuild_cart
633               dalphanum(j,1,i)=(alph(i)-alph_s(i))
634      &        /aincr  
635               dc(j,i-1)=dcji
636               dcji=dc(j,i)
637               dc(j,i)=dcji+aincr
638               call chainbuild_cart
639               dalphanum(j,2,i)=(alph(i)-alph_s(i))
640      &        /aincr 
641               dc(j,i)=dcji
642               dcji=dc(j,i+nres)
643               dc(j,i+nres)=dc(j,i+nres)+aincr
644               call chainbuild_cart
645               dalphanum(j,3,i)=(alph(i)-alph_s(i))
646      &        /aincr
647              dc(j,i+nres)=dcji
648             enddo
649           endif      
650         write (iout,'(i5,3(3f10.5,5x))') i,(dalpha(j,1,i),j=1,3),
651      &    (dalpha(j,2,i),j=1,3),(dalpha(j,3,i),j=1,3)
652         write (iout,'(5x,3(3f10.5,5x))') (dalphanum(j,1,i),j=1,3),
653      &    (dalphanum(j,2,i),j=1,3),(dalphanum(j,3,i),j=1,3)
654         write (iout,'(5x,3(3f10.5,5x))') 
655      &    (dalphanum(j,1,i)/dalpha(j,1,i),j=1,3),
656      &    (dalphanum(j,2,i)/dalpha(j,2,i),j=1,3),
657      &    (dalphanum(j,3,i)/dalpha(j,3,i),j=1,3)
658         write (iout,*)
659       enddo
660 c     Check omega gradient
661       write (iout,*) 
662      & "Analytical (upper) and numerical (lower) gradient of omega"
663       do i=2,nres-1
664        if(itype(i).ne.10) then
665             do j=1,3
666               dcji=dc(j,i-1)
667               dc(j,i-1)=dcji+aincr
668               call chainbuild_cart
669               domeganum(j,1,i)=(omeg(i)-omeg_s(i))
670      &        /aincr  
671               dc(j,i-1)=dcji
672               dcji=dc(j,i)
673               dc(j,i)=dcji+aincr
674               call chainbuild_cart
675               domeganum(j,2,i)=(omeg(i)-omeg_s(i))
676      &        /aincr 
677               dc(j,i)=dcji
678               dcji=dc(j,i+nres)
679               dc(j,i+nres)=dc(j,i+nres)+aincr
680               call chainbuild_cart
681               domeganum(j,3,i)=(omeg(i)-omeg_s(i))
682      &        /aincr
683              dc(j,i+nres)=dcji
684             enddo
685           endif      
686         write (iout,'(i5,3(3f10.5,5x))') i,(domega(j,1,i),j=1,3),
687      &    (domega(j,2,i),j=1,3),(domega(j,3,i),j=1,3)
688         write (iout,'(5x,3(3f10.5,5x))') (domeganum(j,1,i),j=1,3),
689      &    (domeganum(j,2,i),j=1,3),(domeganum(j,3,i),j=1,3)
690         write (iout,'(5x,3(3f10.5,5x))') 
691      &    (domeganum(j,1,i)/domega(j,1,i),j=1,3),
692      &    (domeganum(j,2,i)/domega(j,2,i),j=1,3),
693      &    (domeganum(j,3,i)/domega(j,3,i),j=1,3)
694         write (iout,*)
695       enddo
696       return
697       end
698 c------------------------------------------------------------
699       subroutine chainbuild_cart
700       implicit real*8 (a-h,o-z)
701       include 'DIMENSIONS'
702 #ifdef MPI
703       include 'mpif.h'
704 #endif
705       include 'COMMON.SETUP'
706       include 'COMMON.CHAIN' 
707       include 'COMMON.LOCAL'
708       include 'COMMON.TIME1'
709       include 'COMMON.IOUNITS'
710       
711 #ifdef MPI
712       if (nfgtasks.gt.1) then
713 c        write (iout,*) "BCAST in chainbuild_cart"
714 c        call flush(iout)
715 c Broadcast the order to build the chain and compute internal coordinates
716 c to the slaves. The slaves receive the order in ERGASTULUM.
717         time00=MPI_Wtime()
718 c      write (iout,*) "CHAINBUILD_CART: DC before BCAST"
719 c      do i=0,nres
720 c        write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3),
721 c     &   (dc(j,i+nres),j=1,3)
722 c      enddo 
723         if (fg_rank.eq.0) 
724      &    call MPI_Bcast(7,1,MPI_INTEGER,king,FG_COMM,IERROR)
725         time_bcast7=time_bcast7+MPI_Wtime()-time00
726         time01=MPI_Wtime()
727         call MPI_Bcast(dc(1,0),6*(nres+1),MPI_DOUBLE_PRECISION,
728      &    king,FG_COMM,IERR)
729 c      write (iout,*) "CHAINBUILD_CART: DC after BCAST"
730 c      do i=0,nres
731 c        write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3),
732 c     &   (dc(j,i+nres),j=1,3)
733 c      enddo 
734 c        write (iout,*) "End BCAST in chainbuild_cart"
735 c        call flush(iout)
736         time_bcast=time_bcast+MPI_Wtime()-time00
737         time_bcastc=time_bcastc+MPI_Wtime()-time01
738       endif
739 #endif
740       do j=1,3
741         c(j,1)=dc(j,0)
742 c        c(j,1)=c(j,1)
743       enddo
744       do i=2,nres
745         do j=1,3
746           c(j,i)=c(j,i-1)+dc(j,i-1)
747         enddo
748       enddo 
749       do i=1,nres
750         do j=1,3
751           c(j,i+nres)=c(j,i)+dc(j,i+nres)
752         enddo
753       enddo
754 c      write (iout,*) "CHAINBUILD_CART"
755 c      call cartprint
756       call int_from_cart1(.false.)
757       return
758       end