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