1 double precision function maxlik_pdb(n,x,g,ider)
4 include "DIMENSIONS.ZSCOPT"
6 parameter (nmax=max_paropt)
11 double precision g_(max_paropt),sumlik_(0:ntyp,0:ntyp),
12 & partf_,emin_,der_partf_(maxvar)
14 include "COMMON.IOUNITS"
15 include "COMMON.PMFDERIV"
16 include "COMMON.WEIGHTS"
17 include "COMMON.TORSION"
18 include "COMMON.FFIELD"
19 include "COMMON.PDBSTAT"
21 double precision b1m(3,2),b2m(3,2),dm(2,2),cm(2,2),
22 & b1m2(3,2),b2m1(3,2),b11,b12,b21,b22,c11,c12,d11,d12,c1(0:3),
23 & c2(0:3),em(2,2,2),em2(2,2,2),e0m(3),e0m2(3),jac(nmax)
24 double precision v1_kcc_loc(3,3,2),v2_kcc_loc(3,3,2),
25 & etoriv1(3,3,2),etoriv2(3,3,2),enei,boltz,emin,
27 double precision theta1,theta2,gam,thetap1,thetap2,gam1,gam2,
28 & phi,cost1,cost2,sint1,sint2,
29 & cosg,sing,cos2g,sin2g,sum,d3,delta,f,fb11,fb21,fb12,fb22,fc11,
30 & fc12,fd11,fd12,etori,sint1sint2,cosphi,sinphi,sumvalc,sumvals,
32 double precision conv /0.01745329251994329576d0/
33 double precision r0pp(3) /5.2739d0,5.4561d0,5.2261d0/
34 double precision epspp(3) /1.6027d0,1.4879d0,0.0779d0/
35 double precision dCACA(2) /3.784904d0,3.810180d0/
36 double precision facp1(4),facpp(4),facturn3,ddist
38 double precision x(n),g(n)
39 integer ipoint,iipoint,ip,it1,it2,itp1,itp2,i,j,k,l,ii,jj!,irt1,irt2
41 double precision sumlik(0:ntyp,0:ntyp),partf,der_partf(maxvar)
42 integer itheta1,itheta2,igam
43 vol = dlog((incr_theta*deg2rad)**2*incr_gam*deg2rad)
46 c nfun.eq.-1 : no broadcast
47 c n.eq.-1 : stop function evaluation
48 c nfun.ne.-1 .and. n.ne.-1 : master distribute variables to slaves, all do their share
50 call MPI_Bcast(ider,1,MPI_LOGICAL,Master,MPI_COMM_WORLD,ierror)
54 c write (iout,*) "MAXLIKPDB: ider",ider," lder",lder
57 c Zero out gradient and hessian
68 write (iout,*) "point",i," it1",it1," it2",it2
74 gam=(zz_pdb(3,i)+delta-pi)
75 call torval_e_der(n,it1,it2,theta1,theta2,gam,enei,jac,lder)
77 write (2,*) "i",i," it1",it1," it2",it2," theta1",theta1,
78 & " theta2",theta2," gamma",gam," enei",enei
80 sumlik(it1,it2)=sumlik(it1,it2)+beta_pdb*enei*resol(i)
82 c Contributions to the gradient and the hessian
84 g(k)=g(k)+beta_pdb*jac(k)*resol(i)
86 if (mask_beta_PDB.gt.0)
87 & g(mask_beta_PDB)=g(mask_beta_PDB)+enei*resol(i)
89 print *,"i",i," jac",jac(:n)," resol",resol(i)," g",g(:n)
95 call MPI_Reduce(sumlik_,sumlik,(ntyp+1)*(ntortyp+1),
96 & MPI_DOUBLE_PRECISION,MPI_SUM,Master,Comm1,ierror)
99 call MPI_Reduce(g_(1),g(1),n,MPI_DOUBLE_PRECISION,
100 & MPI_SUM,Master,Comm1,ierror)
101 c write (iout,*) "MAXLIKPDB: after reducing gradient"
108 write (iout,*) "sumlik",it1,it2,sumlik(it1,it2)
116 c Compute the partition functions for consecutive pairs of residue types
120 write (iout,'(a,2i2,2i10)')
121 & "BEGIN",it1,it2,istart_calka,iend_calka
124 do itheta1=70,160-incr_theta,incr_theta
125 do itheta2=70,160-incr_theta,incr_theta
126 do igam=-180,180-incr_gam,incr_gam
128 if (ii.ge.istart_calka .and. ii.le.iend_calka) then
129 theta1=(itheta1+0.5d0)*deg2rad
130 theta2=(itheta2+0.5d0)*deg2rad
131 gam=(igam+0.5d0)*deg2rad
132 call torval_e_der(n,it1,it2,theta1,theta2,gam,enei,
136 c write (iout,'(3i5,1pe15.5)') itheta1,itheta2,igam,enei
142 emin=energia(istart_calka)
143 do ii=istart_calka+1,iend_calka
144 if (energia(ii).lt.emin) emin=energia(ii)
148 call MPI_AllReduce(emin_,emin,1,
149 & MPI_DOUBLE_PRECISION,MPI_MIN,Comm1,ierror)
152 c write (2,*) it1,it2," emin",emin
156 do itheta1=70,160-incr_theta,incr_theta
157 do itheta2=70,160-incr_theta,incr_theta
158 do igam=-180,180-incr_gam,incr_gam
160 if (ii.ge.istart_calka .and. ii.le.iend_calka) then
161 theta1=(itheta1+0.5d0)*deg2rad
162 theta2=(itheta2+0.5d0)*deg2rad
163 gam=(igam+0.5d0)*deg2rad
164 c call torval_e_der(n,it1,it2,theta1,theta2,gam,enei,
166 enei=energia(ii)-emin
167 boltz = dsin(theta1)*dsin(theta2)*dexp(-beta_pdb*enei)
169 c write (iout,*) "it1",it1," it2",it2,
170 c & " theta1",theta1," theta2",theta2,
171 c & " gamma",gam," boltz",boltz," enei",enei,
174 call torval_e_der(n,it1,it2,theta1,theta2,gam,enei,
177 der_partf(i)=der_partf(i)-boltz*jac(i)
179 if (mask_beta_PDB.gt.0)
180 & der_partf(mask_beta_PDB)=der_partf(mask_beta_PDB)-
181 & boltz*enei/beta_pdb
188 write (iout,'(a,2i2)') "END",it1,it2
190 c write (iout,*) "partf before REDUCE",it1,it2,partf
193 call MPI_Reduce(partf_,partf,1,MPI_DOUBLE_PRECISION,
194 & MPI_SUM,Master,Comm1,ierror)
195 c write (iout,*) "Afte REDUCE: partf_",partf_," partf",partf
198 call MPI_Reduce(der_partf_(1),der_partf(1),n,
199 & MPI_DOUBLE_PRECISION,MPI_SUM,Master,Comm1,ierror)
200 c write (iout,*) "MAXLIKPDB: after reducing gradient"
203 if (me.eq.Master) then
205 sumlik(it1,it2)=sumlik(it1,it2)+dlog(partf)-beta_pdb*emin+vol
207 write(iout,*) "it1",it1," it2",it2," partf",partf," sumlik",
208 & sumlik(it1,it2)," emin",emin
212 g(i)=g(i)+beta_pdb*der_partf(i)/partf
223 c write (iout,*) "MAXLIKPDB: end of loop"
226 c Compute the total contribution to the target function from a given core
230 sum=sum+sumlik(it1,it2)
236 c----------------------------------------------------------------------
237 subroutine torval_e_der(nvar,it1,it2,theta1,theta2,gam,enei,jac,
241 include "DIMENSIONS.ZSCOPT"
243 parameter (nmax=max_paropt)
248 double precision g_(max_paropt),sum_
250 include "COMMON.IOUNITS"
251 include "COMMON.PMFDERIV"
252 include "COMMON.WEIGHTS"
253 include "COMMON.TORSION"
254 include "COMMON.FFIELD"
257 integer it1,it2,itp1,itp2,ip,i,j,k,l,ii,jj
258 double precision b1m(3,2),b2m(3,2),dm(2,2),cm(2,2),
259 & b1m2(3,2),b2m1(3,2),b11,b12,b21,b22,c11,c12,d11,d12,c1(0:3),
260 & c2(0:3),em(2,2,2),em2(2,2,2),e0m(3),e0m2(3),jac(nmax)
261 double precision v1_kcc_loc(3,3,2),v2_kcc_loc(3,3,2),
262 & etoriv1(3,3,2),etoriv2(3,3,2),enei,etori,ebendi1,ebendi2
263 double precision theta1,theta2,gam,thetap1,thetap2,gam1,gam2,
264 & phi,cost1,cost2,sint1,sint2,
265 & cosg,sing,cos2g,sin2g,sum,d3,delta,f,fb11,fb21,fb12,fb22,fc11,
266 & fc12,fd11,fd12,sint1sint2,cosphi,sinphi,sumvalc,sumvals
267 integer ind_ang /11/, ind_tor /13/
269 double precision tschebyshev
270 c following to test with selected types
276 if (iabs(it2).le.1) then
288 b1m(k,i)=bnew1tor(k,i,it2)
289 b1m2(k,i)=bnew2tor(k,i,it2)
290 b2m1(k,i)=bnew1tor(k,i,it1)
291 b2m(k,i)=bnew2tor(k,i,it1)
296 cm(k,i)=ccnewtor(k,i,it2)
297 dm(k,i)=ddnewtor(k,i,it1)
303 em(k,j,i)=eenewtor(k,j,i,it1)
304 em2(k,j,i)=eenewtor(k,j,i,it2)
308 c Invert coefficients for L-chirality
310 write(iout,*) "it1",it1," it2",it2
311 write(iout,*) "b1i (b1m)"
313 write(iout,'(2f10.5,5x,2f10.5)') b1m(i,1),b1m(i,2)
315 write(iout,*) "b2j (b1m2)"
317 write(iout,'(2f10.5,5x,2f10.5)') b1m2(i,1),b1m2(i,2)
319 write(iout,*) "b1j (b2m1)"
321 write(iout,'(2f10.5,5x,2f10.5)') b2m1(i,1),b2m1(i,2)
323 write(iout,*) "b2j (b2m)"
325 write(iout,'(2f10.5,5x,2f10.5)') b2m(i,1),b2m(i,2)
329 write (iout,'(2f10.5)') (cm(i,j),j=1,2)
333 write (iout,'(2f10.5)') (dm(i,j),j=1,2)
335 c print *,"em1",em," em2",em2," e0m",e0m," e02m",e0m2
343 v1_kcc_loc(k,l,1)=b2m(l,1)*b1m(k,1)+b2m(l,2)*b1m(k,2)
344 v2_kcc_loc(k,l,1)=b2m(l,2)*b1m(k,1)+b2m(l,1)*b1m(k,2)
349 v1_kcc_loc(k,l,2)=-(cm(k,1)*dm(l,1)-cm(k,2)*dm(l,2))
350 v2_kcc_loc(k,l,2)=-(cm(k,2)*dm(l,1)+cm(k,1)*dm(l,2))
361 c check with the formula from unres
375 sint1sint2=sint1sint2*sint1*sint2
380 sumvalc=sumvalc+v1_kcc_loc(l,k,j)*c1(k)*c2(l)
381 sumvals=sumvals+v2_kcc_loc(l,k,j)*c1(k)*c2(l)
382 etoriv1(l,k,j)=c1(k)*c2(l)*sint1sint2*cosphi
383 etoriv2(l,k,j)=c1(k)*c2(l)*sint1sint2*sinphi
386 etori=etori+(sumvalc*cosphi+sumvals*sinphi)*sint1sint2
388 c Bending contributions
389 ebendi1=v1bend_chyb(0,it1)+
390 & tschebyshev(1,nbend_kcc_Tb(it1),v1bend_chyb(1,it1),cost1)
391 ebendi2=v1bend_chyb(0,it2)+
392 & tschebyshev(1,nbend_kcc_Tb(it2),v1bend_chyb(1,it2),cost2)
393 c write (iout,*) "etori",etori," ebendi1",ebendi1," ebendi2",ebendi2
394 c Compute derivatives of the energy in torsional parameters
395 enei = wtor*etori+wang*(ebendi1+ebendi2)
397 write (iout,'(3f8.1,4(1pe15.5))') theta1*rad2deg,theta2*rad2deg,
398 & gam*rad2deg,etori,ebendi1,ebendi2,enei
407 c Derivatives in b1 of the second residue
411 jj=iabs(mask_bnew1tor(j,1,iabs(it2)))
414 jac(jj)=jac(jj)+etoriv1(j,k,1)*b2m(k,1)
415 & +etoriv2(j,k,1)*b2m(k,2)
418 jj=iabs(mask_bnew1tor(j,2,iabs(it2)))
422 jac(jj)=jac(jj)+etoriv1(j,k,1)*b2m(k,2)
423 & +etoriv2(j,k,1)*b2m(k,1)
424 else if (it2.lt.0) then
425 jac(jj)=jac(jj)-etoriv1(j,k,1)*b2m(k,2)
426 & -etoriv2(j,k,1)*b2m(k,1)
431 c Derivatives in b2 of the first residue
434 jj=iabs(mask_bnew2tor(j,1,it1))
437 jac(jj)=jac(jj)+etoriv1(k,j,1)*b1m(k,1)
438 & +etoriv2(k,j,1)*b1m(k,2)
441 jj=iabs(mask_bnew2tor(j,2,it1))
445 jac(jj)=jac(jj)+etoriv1(k,j,1)*b1m(k,2)
446 & +etoriv2(k,j,1)*b1m(k,1)
454 jj=iabs(mask_ccnewtor(j,1,iabs(it2)))
457 jac(jj)=jac(jj)-etoriv1(j,k,2)*dm(k,1)
458 & -etoriv2(j,k,2)*dm(k,2)
461 jj=iabs(mask_ccnewtor(j,2,iabs(it2)))
465 jac(jj)=jac(jj)+etoriv1(j,k,2)*dm(k,2)
466 & -etoriv2(j,k,2)*dm(k,1)
467 else if (it2.lt.0) then
468 jac(jj)=jac(jj)-etoriv1(j,k,2)*dm(k,2)
469 & +etoriv2(j,k,2)*dm(k,1)
476 jj=iabs(mask_ddnewtor(j,1,it1))
479 jac(jj)=jac(jj)-etoriv1(k,j,2)*cm(k,1)
480 & -etoriv2(k,j,2)*cm(k,2)
483 jj=iabs(mask_ddnewtor(j,2,it1))
487 jac(jj)=jac(jj)+etoriv1(k,j,2)*cm(k,2)
488 & -etoriv2(k,j,2)*cm(k,1)
497 do j=1,nbend_kcc_TB(it1)
498 ii = mask_v1bend_chyb(j,it1)
499 if (ii.gt.0) jac(ii) = wang*dcos(j*theta1)
501 do j=1,nbend_kcc_TB(it2)
502 ii = mask_v1bend_chyb(j,it2)
503 if (ii.gt.0) jac(ii) = jac(ii) + wang*dcos(j*theta2)
505 if (imask(ind_ang).gt.0) jac(imask(ind_ang))=ebendi1+ebendi2
506 if (imask(ind_tor).gt.0) jac(imask(ind_tor))=etori