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