1 subroutine WHAM_CALC(islice,*)
2 ! Weighed Histogram Analysis Method (WHAM) code
3 ! Written by A. Liwo based on the work of Kumar et al.,
4 ! J.Comput.Chem., 13, 1011 (1992)
6 ! 2/1/05 Multiple temperatures allowed.
7 ! 2/2/05 Free energies calculated directly from data points
8 ! acc. to Eq. (21) of Kumar et al.; final histograms also
9 ! constructed based on this equation.
10 ! 2/12/05 Multiple parameter sets included
12 ! 2/2/05 Parallel version
15 include "DIMENSIONS.ZSCOPT"
16 include "DIMENSIONS.FREE"
18 parameter (NGridT=400)
19 integer MaxBinRms,MaxBinRgy
20 parameter (MaxBinRms=100,MaxBinRgy=100)
22 c parameter (MaxHdim=200)
24 parameter (maxinde=200)
28 integer ierror,errcode,status(MPI_STATUS_SIZE)
30 include "COMMON.CONTROL"
31 include "COMMON.IOUNITS"
33 include "COMMON.ENERGIES"
34 include "COMMON.FFIELD"
35 include "COMMON.SBRIDGE"
37 include "COMMON.ENEPS"
38 include "COMMON.SHIELD"
39 integer MaxPoint,MaxPointProc
40 parameter (MaxPoint=MaxStr,
41 & MaxPointProc=MaxStr_Proc)
42 double precision finorm_max,potfac,entmin,entmax,expfac,vf
43 parameter (finorm_max=1.0d0)
45 integer i,ii,j,jj,k,kk,l,m,ind,iter,t,tmax,ient,ientmax,iln
46 integer start,end,iharm,ib,iib,nbin1,nbin,nbin_rms,nbin_rgy,
47 & nbin_rmsrgy,liczba,iparm,nFi,indrgy,indrms
48 integer htot(0:MaxHdim),histent(0:2000)
49 double precision v(MaxPointProc,MaxR,MaxT_h,Max_Parm)
50 double precision energia(0:max_ene)
52 integer tmax_t,upindE_p
53 double precision fi_p(MaxR,MaxT_h,Max_Parm),
54 & fimax_p(MaxR,MaxT_h,Max_Parm)
55 double precision sumW_p(0:nGridT,Max_Parm),
56 & sumE_p(0:nGridT,Max_Parm),sumEsq_p(0:nGridT,Max_Parm),
57 & sumQ_p(MaxQ1,0:nGridT,Max_Parm),
58 & sumQsq_p(MaxQ1,0:nGridT,Max_Parm),
59 & sumEQ_p(MaxQ1,0:nGridT,Max_Parm),
60 & sumEprim_p(MaxQ1,0:nGridT,Max_Parm),
61 & sumEbis_p(0:nGridT,Max_Parm)
62 double precision hfin_p(0:MaxHdim,maxT_h),
63 & hfin_ent_p(0:MaxHdim),histE_p(0:maxindE),sumH,
64 & hrmsrgy_p(0:MaxBinRgy,0:MaxBinRms,maxT_h)
65 double precision rgymin_t,rmsmin_t,rgymax_t,rmsmax_t
66 double precision potEmin_t,entmin_p,entmax_p
67 double precision ePMF,ePMF_q
68 double precision weimax_(0:ngridT)
69 integer histent_p(0:2000)
70 logical lprint /.true./
72 double precision delta_T /1.0d0/
73 double precision rgymin,rmsmin,rgymax,rmsmax
74 double precision sumW(0:NGridT,Max_Parm),sumE(0:NGridT,Max_Parm),
75 & sumEsq(0:NGridT,Max_Parm),sumQ(MaxQ1,0:NGridT,Max_Parm),
76 & sumQsq(MaxQ1,0:NGridT,Max_Parm),sumEQ(MaxQ1,0:NGridT,Max_Parm),
77 & sumEprim(0:NGridT,Max_Parm),sumEbis(0:NGridT,Max_Parm),betaT,
79 double precision fi(MaxR,maxT_h,Max_Parm),
80 & fimax(MaxR,maxT_h,Max_Parm),
81 & dd,dd1,dd2,hh,dmin,denom,finorm,avefi,pom,
82 & hfin(0:MaxHdim,maxT_h),histE(0:maxindE),
83 & hrmsrgy(0:MaxBinRgy,0:MaxBinRms,maxT_h),
85 & hfin_ent(0:MaxHdim),vmax,aux,weimax(0:nGridT,Max_Parm)
86 double precision fT(6),fTprim(6),fTbis(6),quot,quotl1,quotl,kfacl,
87 & eprim,ebis,temper,kfac/2.4d0/,T0/300.0d0/,startGridT/200.0d0/,
88 & eplus,eminus,logfac,tanhT,tt
89 double precision etot,evdw,evdw_t,evdw2,ees,evdw1,ebe,etors,
90 & escloc,ehpb,ecorr,ecorr5,ecorr6,eello_turn4,eello_turn3,
91 & eturn6,eel_loc,edihcnstr,etors_d,estr,evdw2_14,esccor,
94 integer ind_point(maxpoint),upindE,indE
103 write(licz2,'(bz,i2.2)') islice
105 write (iout,'(//80(1h-)/"Solving WHAM equations for slice",
106 & i2/80(1h-)//)') islice
107 write (iout,*) "delta",delta," nbin1",nbin1
108 write (iout,*) "MaxN",MaxN," MaxQ",MaxQ," MaHdim",MaxHdim
126 c write (iout,*) "i",i," potE",(potE(i,j),j=1,nParmset)
128 if (potE(i,j).le.potEmin) potEmin=potE(i,j)
130 if (q(nQ+1,i).lt.rmsmin) rmsmin=q(nQ+1,i)
131 if (q(nQ+1,i).gt.rmsmax) rmsmax=q(nQ+1,i)
132 if (q(nQ+2,i).lt.rgymin) rgymin=q(nQ+2,i)
133 if (q(nQ+2,i).gt.rgymax) rgymax=q(nQ+2,i)
136 ind=(q(j,i)-dmin+1.0d-8)/delta
138 ind_point(i)=ind_point(i)+ind
140 ind_point(i)=ind_point(i)+nbin1**(j-1)*ind
142 c write (iout,*) "i",i," j",j," q",q(j,i)," ind_point",
145 if (ind_point(i).lt.0 .or. ind_point(i).gt.MaxHdim) then
146 write (iout,*) "Error - index exceeds range for point",i,
147 & " q=",q(j,i)," ind",ind_point(i)
149 write (iout,*) "Processor",me1
151 call MPI_Abort(MPI_COMM_WORLD, Ierror, Errcode )
156 if (ind_point(i).gt.tmax) tmax=ind_point(i)
157 htot(ind_point(i))=htot(ind_point(i))+1
159 write (iout,*) "i",i,"q",(q(j,i),j=1,nQ)," ind",ind_point(i),
160 & " htot",htot(ind_point(i))
165 write (iout,*) "potEmin before reduce",potEmin
167 write (iout,'(a)') "Numbers of counts in Q bins"
169 if (htot(t).gt.0) then
170 write (iout,'(i15,$)') t
173 jj = mod(liczba,nbin1)
175 write (iout,'(i5,$)') jj
177 write (iout,'(i8)') htot(t)
181 write (iout,'(a,i3)') "Number of data points for parameter set",
183 write (iout,'(i7,$)') ((snk(m,ib,iparm,islice),m=1,nr(ib,iparm)),
185 write (iout,'(i8)') stot(islice)
191 call MPI_AllReduce(tmax,tmax_t,1,MPI_INTEGER,MPI_MAX,
194 call MPI_AllReduce(potEmin,potEmin_t,1,MPI_DOUBLE_PRECISION,
195 & MPI_MIN,WHAM_COMM,IERROR)
196 call MPI_AllReduce(rmsmin,rmsmin_t,1,MPI_DOUBLE_PRECISION,
197 & MPI_MIN,WHAM_COMM,IERROR)
198 call MPI_AllReduce(rmsmax,rmsmax_t,1,MPI_DOUBLE_PRECISION,
199 & MPI_MAX,WHAM_COMM,IERROR)
200 call MPI_AllReduce(rgymin,rgymin_t,1,MPI_DOUBLE_PRECISION,
201 & MPI_MIN,WHAM_COMM,IERROR)
202 call MPI_AllReduce(rgymax,rgymax_t,1,MPI_DOUBLE_PRECISION,
203 & MPI_MAX,WHAM_COMM,IERROR)
204 c potEmin=potEmin_t/2
210 write (iout,*) "potEmin",potEmin
212 rmsmin=deltrms*dint(rmsmin/deltrms)
213 rmsmax=deltrms*dint(rmsmax/deltrms)
214 rgymin=deltrms*dint(rgymin/deltrgy)
215 rgymax=deltrms*dint(rgymax/deltrgy)
216 nbin_rms=(rmsmax-rmsmin)/deltrms
217 nbin_rgy=(rgymax-rgymin)/deltrgy
218 write (iout,*) "rmsmin",rmsmin," rmsmax",rmsmax," rgymin",rgymin,
219 & " rgymax",rgymax," nbin_rms",nbin_rms," nbin_rgy",nbin_rgy
226 write (iout,*) "nFi",nFi
227 ! Compute the Boltzmann factor corresponing to restrain potentials in different
234 c write (9,'(3i5,f10.5)') i,(iparm,potE(i,iparm),iparm=1,nParmSet)
238 write (iout,'(2i5,21f8.2)') i,iparm,
239 & (enetb(k,i,iparm),k=1,22)
242 call restore_parm(iparm)
244 write (iout,*) wsc,wscp,welec,wvdwpp,wang,wtor,wscloc,
245 & wcorr,wcorr5,wcorr6,wturn4,wturn3,wturn6,wel_loc,
246 & wtor_d,wsccor,wbond
249 if (rescale_mode.eq.1) then
250 quot=1.0d0/(beta_h(ib,iparm)*1.987D-3*T0)
257 fT(l)=kfacl/(kfacl-1.0d0+quotl)
260 tt = 1.0d0/(beta_h(ib,iparm)*1.987D-3)
261 ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/320.0d0
263 ft(6)=1.0d0/(beta_h(ib,iparm)*1.987D-3*T0)
267 else if (rescale_mode.eq.2) then
268 quot=1.0d0/(T0*beta_h(ib,iparm)*1.987D-3)
272 fT(l)=1.12692801104297249644d0/
273 & dlog(dexp(quotl)+dexp(-quotl))
276 tt = 1.0d0/(beta_h(ib,iparm)*1.987D-3)
277 ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/320.0d0
279 ft(6)=1.0d0/(beta_h(ib,iparm)*1.987D-3*T0)
283 c write (iout,*) 1.0d0/(beta_h(ib,iparm)*1.987D-3),ft
284 else if (rescale_mode.eq.0) then
289 write (iout,*) "Error in WHAM_CALC: wrong RESCALE_MODE",
294 evdw=enetb(1,i,iparm)
295 evdw_t=enetb(21,i,iparm)
296 write (iout,*) "evdw",evdw," evdw_t",evdw_t
298 evdw2_14=enetb(17,i,iparm)
299 evdw2=enetb(2,i,iparm)+evdw2_14
301 evdw2=enetb(2,i,iparm)
306 evdw1=enetb(16,i,iparm)
311 ecorr=enetb(4,i,iparm)
312 ecorr5=enetb(5,i,iparm)
313 ecorr6=enetb(6,i,iparm)
314 eel_loc=enetb(7,i,iparm)
315 eello_turn3=enetb(8,i,iparm)
316 eello_turn4=enetb(9,i,iparm)
317 eturn6=enetb(10,i,iparm)
318 ebe=enetb(11,i,iparm)
319 escloc=enetb(12,i,iparm)
320 etors=enetb(13,i,iparm)
321 etors_d=enetb(14,i,iparm)
322 ehpb=enetb(15,i,iparm)
323 estr=enetb(18,i,iparm)
324 esccor=enetb(19,i,iparm)
325 edihcnstr=enetb(20,i,iparm)
326 eliptran=enetb(22,i,iparm)
327 esaxs=enetb(26,i,iparm)
330 write (iout,'(3i5,6f5.2,14f12.3)') i,ib,iparm,(ft(l),l=1,6),
331 & evdw+evdw_t,evdw2,ees,evdw1,ecorr,eel_loc,estr,ebe,escloc,
332 & etors,etors_d,eello_turn3,eello_turn4,esccor,esaxs
336 if (shield_mode.gt.0) then
337 etot=ft(1)*wsc*(evdw+ft(6)*evdw_t)+ft(1)*wscp*evdw2
339 & +ft(1)*wvdwpp*evdw1
340 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
341 ! & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
342 & +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
343 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
344 & +ft(2)*wturn3*eello_turn3
345 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc
346 & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
347 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
349 etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees
351 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
352 c & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
353 & +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
354 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
355 & +ft(2)*wturn3*eello_turn3
356 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc
357 & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
358 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
361 if (shield_mode.gt.0) then
362 etot=ft(1)*wsc*(evdw+ft(6)*evdw_t)+ft(1)*wscp*evdw2
363 & +ft(1)*welec*(ees+evdw1)
364 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
365 c & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
366 & +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
367 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
368 & +ft(2)*wturn3*eello_turn3
369 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr
370 & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
371 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
373 etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2
374 & +ft(1)*welec*(ees+evdw1)
375 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
376 c & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
377 & +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
378 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
379 & +ft(2)*wturn3*eello_turn3
380 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr
381 & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
382 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
387 write (iout,*) i,iparm,1.0d0/(beta_h(ib,iparm)*1.987D-3),
392 if (iparm.eq.1 .and. ib.eq.1) then
393 write (iout,*)"Conformation",i
396 energia(k)=enetb(k,i,iparm)
398 call enerprint(energia(0),fT)
406 Econstr=Econstr+Kh(j,kk,ib,iparm)
407 & *(dd-q0(j,kk,ib,iparm))**2
409 c Adaptive potential contribution
411 call PMF_energy(q(1,i),ib,kk,iparm,ePMF,ePMF_q)
415 & -beta_h(ib,iparm)*(etot-potEmin+Econstr)
417 write (iout,'(4i5,4e15.5)') i,kk,ib,iparm,
418 & etot,potEmin,etot-potEmin,v(i,kk,ib,iparm)
424 ! Simple iteration to calculate free energies corresponding to all simulation
428 ! Compute new free-energy values corresponding to the righ-hand side of the
429 ! equation and their derivatives.
430 write (iout,*) "------------------------fi"
440 vf=v(t,l,k,i)+f(l,k,i)
441 if (vf.gt.vmax) vmax=vf
449 aux=f(l,k,i)+v(t,l,k,i)-vmax
451 & denom=denom+snk(l,k,i,islice)*dexp(aux)
455 entfac(t)=-dlog(denom)-vmax
457 write (iout,*) t,"vmax",vmax," denom",denom,"entfac",entfac(t)
463 do ii=1,nR(iib,iparm)
465 fimax_p(ii,iib,iparm)=v(1,ii,iib,iparm)+entfac(1)
467 if(v(t,ii,iib,iparm)+entfac(t).gt.fimax_p(ii,iib,iparm))
468 & fimax_p(ii,iib,iparm)=v(t,ii,iib,iparm)+entfac(t)
471 fimax(ii,iib,iparm)=v(1,ii,iib,iparm)+entfac(1)
473 if(v(t,ii,iib,iparm)+entfac(t).gt.fimax(ii,iib,iparm))
474 & fimax(ii,iib,iparm)=v(t,ii,iib,iparm)+entfac(t)
481 call MPI_AllReduce(fimax_p(1,1,1),fimax(1,1,1),
482 & maxR*MaxT_h*nParmSet,MPI_DOUBLE_PRECISION,
483 & MPI_MAX,WHAM_COMM,IERROR)
487 do ii=1,nR(iib,iparm)
489 fi_p(ii,iib,iparm)=0.0d0
491 fi_p(ii,iib,iparm)=fi_p(ii,iib,iparm)
492 & +dexp(v(t,ii,iib,iparm)+entfac(t)-fimax(ii,iib,iparm))
494 write (iout,'(4i5,3e15.5)') t,ii,iib,iparm,
495 & v(t,ii,iib,iparm),entfac(t),fi_p(ii,iib,iparm)
499 fi(ii,iib,iparm)=0.0d0
501 fi(ii,iib,iparm)=fi(ii,iib,iparm)
502 & +dexp(v(t,ii,iib,iparm)+entfac(t)-fimax(ii,iib,iparm))
511 write (iout,*) "fi before MPI_Reduce me",me,' master',master
513 do ib=1,nT_h(nparmset)
514 write (iout,*) "iparm",iparm," ib",ib
515 write (iout,*) "beta=",beta_h(ib,iparm)
516 write (iout,'(8e15.5)') (fi_p(i,ib,iparm),i=1,nR(ib,iparm))
520 c write (iout,*) "REDUCE size",maxR,MaxT_h,nParmSet,
521 c & maxR*MaxT_h*nParmSet
522 c write (iout,*) "MPI_COMM_WORLD",MPI_COMM_WORLD,
523 c & " WHAM_COMM",WHAM_COMM
524 call MPI_Reduce(fi_p(1,1,1),fi(1,1,1),maxR*MaxT_h*nParmSet,
525 & MPI_DOUBLE_PRECISION,
526 & MPI_SUM,Master,WHAM_COMM,IERROR)
528 write (iout,*) "fi after MPI_Reduce nparmset",nparmset
530 write (iout,*) "iparm",iparm
532 write (iout,*) "beta=",beta_h(ib,iparm)
533 write (iout,'(8e15.5)') (fi(i,ib,iparm),i=1,nR(ib,iparm))
537 if (me1.eq.Master) then
543 fi(i,ib,iparm)=-dlog(fi(i,ib,iparm))-fimax(i,ib,iparm)
544 avefi=avefi+fi(i,ib,iparm)
550 write (iout,*) "Parameter set",iparm
552 write (iout,*) "beta=",beta_h(ib,iparm)
554 fi(i,ib,iparm)=fi(i,ib,iparm)-avefi
556 write (iout,'(8f10.5)') (fi(i,ib,iparm),i=1,nR(ib,iparm))
557 write (iout,'(8f10.5)') (f(i,ib,iparm),i=1,nR(ib,iparm))
561 ! Compute the norm of free-energy increments.
566 finorm=finorm+dabs(fi(i,ib,iparm)-f(i,ib,iparm))
567 f(i,ib,iparm)=fi(i,ib,iparm)
572 write (iout,*) 'Iteration',iter,' finorm',finorm
576 call MPI_Bcast(f(1,1,1),MaxR*MaxT_h*nParmSet,
577 & MPI_DOUBLE_PRECISION,Master,
579 call MPI_Bcast(finorm,1,MPI_DOUBLE_PRECISION,Master,
582 ! Exit, if the increment norm is smaller than pre-assigned tolerance.
583 if (finorm.lt.fimin) then
584 write (iout,*) 'Iteration converged'
591 ! Now, put together the histograms from all simulations, in order to get the
592 ! unbiased total histogram.
602 write (iout,*) "--------------hist"
606 sumW_p(i,iparm)=0.0d0
607 sumE_p(i,iparm)=0.0d0
608 sumEbis_p(i,iparm)=0.0d0
609 sumEsq_p(i,iparm)=0.0d0
611 sumQ_p(j,i,iparm)=0.0d0
612 sumQsq_p(j,i,iparm)=0.0d0
613 sumEQ_p(j,i,iparm)=0.0d0
623 sumEbis(i,iparm)=0.0d0
624 sumEsq(i,iparm)=0.0d0
626 sumQ(j,i,iparm)=0.0d0
627 sumQsq(j,i,iparm)=0.0d0
628 sumEQ(j,i,iparm)=0.0d0
634 c 8/26/05 entropy distribution
639 c ent=-dlog(entfac(t))
641 if (ent.lt.entmin_p) entmin_p=ent
642 if (ent.gt.entmax_p) entmax_p=ent
644 write (iout,*) "entmin",entmin_p," entmax",entmax_p
646 call MPI_Allreduce(entmin_p,entmin,1,MPI_DOUBLE_PRECISION,MPI_MIN,
648 call MPI_Allreduce(entmax_p,entmax,1,MPI_DOUBLE_PRECISION,MPI_MAX,
650 ientmax=entmax-entmin
651 if (ientmax.gt.2000) ientmax=2000
652 write (iout,*) "entmin",entmin," entmax",entmax," ientmax",ientmax
655 c ient=-dlog(entfac(t))-entmin
656 ient=entfac(t)-entmin
657 if (ient.le.2000) histent_p(ient)=histent_p(ient)+1
659 call MPI_Allreduce(histent_p(0),histent(0),ientmax+1,MPI_INTEGER,
660 & MPI_SUM,WHAM_COMM,IERROR)
661 if (me1.eq.Master) then
662 write (iout,*) "Entropy histogram"
664 write(iout,'(f15.4,i10)') entmin+i,histent(i)
672 if (ent.lt.entmin) entmin=ent
673 if (ent.gt.entmax) entmax=ent
675 ientmax=-dlog(entmax)-entmin
676 if (ientmax.gt.2000) ientmax=2000
678 ient=entfac(t)-entmin
679 if (ient.le.2000) histent(ient)=histent(ient)+1
681 write (iout,*) "Entropy histogram"
683 write(iout,'(2f15.4)') entmin+i,histent(i)
688 call restore_parm(iparm)
714 hrmsrgy(j,i,ib)=0.0d0
716 hrmsrgy_p(j,i,ib)=0.0d0
726 indE = aint(potE(t,iparm)-aint(potEmin))
727 if (indE.ge.0 .and. indE.le.maxinde) then
728 if (indE.gt.upindE_p) upindE_p=indE
729 histE_p(indE)=histE_p(indE)+dexp(-entfac(t))
733 expfac=dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t))
734 hfin_p(ind,ib)=hfin_p(ind,ib)+
735 & dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t))
737 indrgy=dint((q(nQ+2,t)-rgymin)/deltrgy)
738 indrms=dint((q(nQ+1,t)-rmsmin)/deltrms)
739 hrmsrgy_p(indrgy,indrms,ib)=
740 & hrmsrgy_p(indrgy,indrms,ib)+expfac
745 expfac=dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t))
746 hfin(ind,ib)=hfin(ind,ib)+
747 & dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t))
749 indrgy=dint((q(nQ+2,t)-rgymin)/deltrgy)
750 indrms=dint((q(nQ+1,t)-rmsmin)/deltrms)
751 hrmsrgy(indrgy,indrms,ib)=
752 & hrmsrgy(indrgy,indrms,ib)+expfac
758 c Thermo and ensemble averages
761 betaT=startGridT+k*delta_T
762 call temp_scalfac(betaT,ft,ftprim,ftbis,*10)
763 c write (iout,*) "ftprim",ftprim
764 c write (iout,*) "ftbis",ftbis
765 betaT=1.0d0/(1.987D-3*betaT)
766 c 7/10/18 AL Determine the max Botzmann weights for each temerature
767 call sum_ene(1,iparm,ft,etot)
768 weimax(k,iparm)=-betaT*(etot-potEmin)+entfac(1)
769 c write (iout,*) "k",k," t",1," weight",weimax(k,iparm)
775 call sum_ene(t,iparm,ft,etot)
776 weight=-betaT*(etot-potEmin)+entfac(t)
777 c write (iout,*) "k",k," t",t," weight",weight
778 if (weight.gt.weimax(k,iparm)) weimax(k,iparm)=weight
783 write (iout,*) "weimax before REDUCE"
784 write (iout,*) (weimax(k,iparm),k=0,ngridt)
787 weimax_(k)=weimax(k,iparm)
789 call MPI_Allreduce(weimax_(0),weimax(0,iparm),nGridT+1,
790 & MPI_DOUBLE_PRECISION,MPI_MAX,WHAM_COMM,IERROR)
792 write (iout,*) "weimax"
793 write (iout,*) (weimax(k,iparm),k=0,ngridt)
796 temper=startGridT+k*delta_T
797 betaT=1.0d0/(1.987D-3*temper)
798 call temp_scalfac(temper,ft,ftprim,ftbis,*10)
805 hfin_ent_p(ind)=hfin_ent_p(ind)+dexp(entfac(t))
807 hfin_ent(ind)=hfin_ent(ind)+dexp(entfac(t))
809 c write (iout,'(2i5,20f8.2)') t,t,(enetb(k,t,iparm),k=1,18)
810 c call restore_parm(iparm)
811 call sum_ene_deriv(t,iparm,ft,ftprim,ftbis,etot,eprim,ebis)
812 weight=dexp(-betaT*(etot-potEmin)+entfac(t)-weimax(k,iparm))
814 write (iout,*) "iparm",iparm," t",t," betaT",betaT,
815 & " etot",etot," entfac",entfac(t)," boltz",
816 & -betaT*(etot-potEmin)+entfac(t)," weimax",weimax(k,iparm),
817 & " weight",weight," ebis",ebis
819 etot=etot-temper*eprim
821 sumW_p(k,iparm)=sumW_p(k,iparm)+weight
822 sumE_p(k,iparm)=sumE_p(k,iparm)+etot*weight
823 sumEbis_p(k,iparm)=sumEbis_p(k,iparm)+ebis*weight
824 sumEsq_p(k,iparm)=sumEsq_p(k,iparm)+etot**2*weight
826 sumQ_p(j,k,iparm)=sumQ_p(j,k,iparm)+q(j,t)*weight
827 sumQsq_p(j,k,iparm)=sumQsq_p(j,k,iparm)+q(j,t)**2*weight
828 sumEQ_p(j,k,iparm)=sumEQ_p(j,k,iparm)
829 & +etot*q(j,t)*weight
832 sumW(k,iparm)=sumW(k,iparm)+weight
833 sumE(k,iparm)=sumE(k,iparm)+etot*weight
834 sumEbis(k,iparm)=sumEbis(k,iparm)+ebis*weight
835 sumEsq(k,iparm)=sumEsq(k,iparm)+etot**2*weight
837 sumQ(j,k,iparm)=sumQ(j,k,iparm)+q(j,t)*weight
838 sumQsq(j,k,iparm)=sumQsq(j,k,iparm)+q(j,t)**2*weight
839 sumEQ(j,k,iparm)=sumEQ(j,k,iparm)
840 & +etot*q(j,t)*weight
846 if (histout) call MPI_Reduce(hfin_p(0,ib),hfin(0,ib),nbin,
847 & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR)
849 call MPI_Reduce(hrmsrgy_p(0,0,ib),hrmsrgy(0,0,ib),
850 & (MaxBinRgy+1)*(nbin_rms+1),MPI_DOUBLE_PRECISION,MPI_SUM,Master,
854 call MPI_Reduce(upindE_p,upindE,1,
855 & MPI_INTEGER,MPI_MAX,Master,WHAM_COMM,IERROR)
856 call MPI_Reduce(histE_p(0),histE(0),maxindE,
857 & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR)
859 if (me1.eq.master) then
863 write (iout,'(6x,$)')
864 write (iout,'(f20.2,$)') (1.0d0/(1.987D-3*beta_h(ib,iparm)),
868 write (iout,'(/a)') 'Final histograms'
870 if (nslice.eq.1) then
871 if (separate_parset) then
872 write(licz3,"(bz,i3.3)") myparm
873 histname=prefix(:ilen(prefix))//'_par'//licz3//'.hist'
875 histname=prefix(:ilen(prefix))//'.hist'
878 if (separate_parset) then
879 write(licz3,"(bz,i3.3)") myparm
880 histname=prefix(:ilen(prefix))//'_par'//licz3//
881 & '_slice_'//licz2//'.hist'
883 histname=prefix(:ilen(prefix))//'_slice_'//licz2//'.hist'
886 #if defined(AIX) || defined(PGI)
887 open (ihist,file=histname,position='append')
889 open (ihist,file=histname,access='append')
899 if (sumH.gt.0.0d0) then
901 jj = mod(liczba,nbin1)
903 write (iout,'(f6.3,$)') dmin+(jj+0.5d0)*delta
905 & write (ihist,'(f6.3,$)') dmin+(jj+0.5d0)*delta
908 write (iout,'(e20.10,$)') hfin(t,ib)
909 if (histfile) write (ihist,'(e20.10,$)') hfin(t,ib)
911 write (iout,'(i5)') iparm
912 if (histfile) write (ihist,'(i5)') iparm
919 if (nslice.eq.1) then
920 if (separate_parset) then
921 write(licz3,"(bz,i3.3)") myparm
922 histname=prefix(:ilen(prefix))//"_par"//licz3//'.ent'
924 histname=prefix(:ilen(prefix))//'.ent'
927 if (separate_parset) then
928 write(licz3,"(bz,i3.3)") myparm
929 histname=prefix(:ilen(prefix))//'par_'//licz3//
930 & '_slice_'//licz2//'.ent'
932 histname=prefix(:ilen(prefix))//'_slice_'//licz2//'.ent'
935 #if defined(AIX) || defined(PGI)
936 open (ihist,file=histname,position='append')
938 open (ihist,file=histname,access='append')
940 write (ihist,'(a)') "# Microcanonical entropy"
942 write (ihist,'(f8.0,$)') dint(potEmin)+i
943 if (histE(i).gt.0.0e0) then
944 write (ihist,'(f15.5,$)') dlog(histE(i))
946 write (ihist,'(f15.5,$)') 0.0d0
952 write (iout,*) "Microcanonical entropy"
954 write (iout,'(f8.0,$)') dint(potEmin)+i
955 if (histE(i).gt.0.0e0) then
956 write (iout,'(f15.5,$)') dlog(histE(i))
958 write (iout,'(f15.5,$)') 0.0d0
963 if (nslice.eq.1) then
964 if (separate_parset) then
965 write(licz3,"(bz,i3.3)") myparm
966 histname=prefix(:ilen(prefix))//'_par'//licz3//'.rmsrgy'
968 histname=prefix(:ilen(prefix))//'.rmsrgy'
971 if (separate_parset) then
972 write(licz3,"(bz,i3.3)") myparm
973 histname=prefix(:ilen(prefix))//'_par'//licz3//
974 & '_slice_'//licz2//'.rmsrgy'
976 histname=prefix(:ilen(prefix))//'_slice_'//licz2//'.rmsrgy'
979 #if defined(AIX) || defined(PGI)
980 open (ihist,file=histname,position='append')
982 open (ihist,file=histname,access='append')
986 write(ihist,'(2f8.2,$)')
987 & rgymin+deltrgy*j,rmsmin+deltrms*i
989 if (hrmsrgy(j,i,ib).gt.0.0d0) then
990 write(ihist,'(e14.5,$)')
991 & -dlog(hrmsrgy(j,i,ib))/beta_h(ib,iparm)
994 write(ihist,'(e14.5,$)') 1.0d6
997 write (ihist,'(i2)') iparm
1005 call MPI_Reduce(hfin_ent_p(0),hfin_ent(0),nbin,
1006 & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR)
1007 call MPI_Reduce(sumW_p(0,1),sumW(0,1),(nGridT+1)*nParmSet,
1008 & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR)
1009 call MPI_Reduce(sumE_p(0,1),sumE(0,1),(nGridT+1)*nParmSet,
1010 & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR)
1011 call MPI_Reduce(sumEbis_p(0,1),sumEbis(0,1),(nGridT+1)*nParmSet,
1012 & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR)
1013 call MPI_Reduce(sumEsq_p(0,1),sumEsq(0,1),(nGridT+1)*nParmSet,
1014 & MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR)
1015 call MPI_Reduce(sumQ_p(1,0,1),sumQ(1,0,1),
1016 & MaxQ1*(nGridT+1)*nParmSet,MPI_DOUBLE_PRECISION,MPI_SUM,Master,
1018 call MPI_Reduce(sumQsq_p(1,0,1),sumQsq(1,0,1),
1019 & MaxQ1*(nGridT+1)*nParmSet,MPI_DOUBLE_PRECISION,MPI_SUM,Master,
1021 call MPI_Reduce(sumEQ_p(1,0,1),sumEQ(1,0,1),
1022 & MaxQ1*(nGridT+1)*nParmSet,MPI_DOUBLE_PRECISION,MPI_SUM,Master,
1024 if (me.eq.master) then
1026 write (iout,'(/a)') 'Thermal characteristics of folding'
1027 if (nslice.eq.1) then
1030 nazwa=prefix(:ilen(prefix))//"_slice_"//licz2
1033 if (nparmset.eq.1 .and. .not.separate_parset) then
1034 nazwa=nazwa(:iln)//".thermal"
1035 else if (nparmset.eq.1 .and. separate_parset) then
1036 write(licz3,"(bz,i3.3)") myparm
1037 nazwa=nazwa(:iln)//"_par_"//licz3//".thermal"
1040 if (nparmset.gt.1) then
1041 write(licz3,"(bz,i3.3)") iparm
1042 nazwa=nazwa(:iln)//"_par_"//licz3//".thermal"
1045 if (separate_parset) then
1046 write (iout,'(a,i3)') "Parameter set",myparm
1048 write (iout,'(a,i3)') "Parameter set",iparm
1051 sumE(i,iparm)=sumE(i,iparm)/sumW(i,iparm)
1052 sumEbis(i,iparm)=(startGridT+i*delta_T)*sumEbis(i,iparm)/
1054 sumEsq(i,iparm)=(sumEsq(i,iparm)/sumW(i,iparm)
1055 & -sumE(i,iparm)**2)/(1.987D-3*(startGridT+i*delta_T)**2)
1057 sumQ(j,i,iparm)=sumQ(j,i,iparm)/sumW(i,iparm)
1058 sumQsq(j,i,iparm)=sumQsq(j,i,iparm)/sumW(i,iparm)
1059 & -sumQ(j,i,iparm)**2
1060 sumEQ(j,i,iparm)=sumEQ(j,i,iparm)/sumW(i,iparm)
1061 & -sumQ(j,i,iparm)*sumE(i,iparm)
1063 sumW(i,iparm)=(-dlog(sumW(i,iparm))-weimax(i,iparm))*(1.987D-3*
1064 & (startGridT+i*delta_T))+potEmin
1065 write (iout,'(f7.1,2f15.5,$)') startGridT+i*delta_T,
1066 & sumW(i,iparm),sumE(i,iparm)
1067 write (iout,'(f10.5,$)') (sumQ(j,i,iparm),j=1,nQ+2)
1068 write (iout,'(e15.5,$)') sumEsq(i,iparm)-sumEbis(i,iparm),
1069 & (sumQsq(j,i,iparm),j=1,nQ+2),(sumEQ(j,i,iparm),j=1,nQ+2)
1071 write (34,'(f7.1,2f15.5,$)') startGridT+i*delta_T,
1072 & sumW(i,iparm),sumE(i,iparm)
1073 write (34,'(f10.5,$)') (sumQ(j,i,iparm),j=1,nQ+2)
1074 write (34,'(e15.5,$)') sumEsq(i,iparm)-sumEbis(i,iparm),
1075 & (sumQsq(j,i,iparm),j=1,nQ+2),(sumEQ(j,i,iparm),j=1,nQ+2)
1083 if (hfin_ent(t).gt.0.0d0) then
1085 jj = mod(liczba,nbin1)
1086 write (iout,'(f6.3,e20.10," ent")') dmin+(jj+0.5d0)*delta,
1088 if (histfile) write (ihist,'(f6.3,e20.10," ent")')
1089 & dmin+(jj+0.5d0)*delta,
1093 if (histfile) close(ihist)
1097 ! Write data for zscore
1098 if (nslice.eq.1) then
1099 zscname=prefix(:ilen(prefix))//".zsc"
1101 zscname=prefix(:ilen(prefix))//"_slice_"//licz2//".zsc"
1103 #if defined(AIX) || defined(PGI)
1104 open (izsc,file=prefix(:ilen(prefix))//'.zsc',position='append')
1106 open (izsc,file=prefix(:ilen(prefix))//'.zsc',access='append')
1108 write (izsc,'("NQ=",i1," NPARM=",i1)') nQ,nParmSet
1110 write (izsc,'("NT=",i1)') nT_h(iparm)
1112 write (izsc,'("TEMP=",f6.1," NR=",i2," SNK=",$)')
1113 & 1.0d0/(beta_h(ib,iparm)*1.987D-3),nR(ib,iparm)
1114 jj = min0(nR(ib,iparm),7)
1115 write (izsc,'(i8,$)') (snk(i,ib,iparm,islice),i=1,jj)
1116 write (izsc,'(a1,$)') (" ",i=22+8*jj+1,79)
1117 write (izsc,'("&")')
1118 if (nR(ib,iparm).gt.7) then
1119 do ii=8,nR(ib,iparm),9
1120 jj = min0(nR(ib,iparm),ii+8)
1121 write (izsc,'(i8,$)') (snk(i,ib,iparm,islice),i=ii,jj)
1122 write (izsc,'(a1,$') (" ",i=(jj-ii+1)*8+1,79)
1123 write (izsc,'("&")')
1126 write (izsc,'("FI=",$)')
1127 jj=min0(nR(ib,iparm),7)
1128 write (izsc,'(f10.5,$)') (fi(i,ib,iparm),i=1,jj)
1129 write (izsc,'(a1,$)') (" ",i=3+10*jj+1,79)
1130 write (izsc,'("&")')
1131 if (nR(ib,iparm).gt.7) then
1132 do ii=8,nR(ib,iparm),9
1133 jj = min0(nR(ib,iparm),ii+8)
1134 write (izsc,'(f10.5,$)') (fi(i,ib,iparm),i=ii,jj)
1135 if (jj.eq.nR(ib,iparm)) then
1138 write (izsc,'(a1,$)') (" ",i=10*(jj-ii+1)+1,79)
1139 write (izsc,'(t80,"&")')
1144 write (izsc,'("KH=",$)')
1145 write (izsc,'(f7.2,$)') (Kh(j,i,ib,iparm),j=1,nQ)
1146 write (izsc,'(" Q0=",$)')
1147 write (izsc,'(f7.5,$)') (q0(j,i,ib,iparm),j=1,nQ)
1162 c------------------------------------------------------------------------
1163 subroutine temp_scalfac(betaT,ft,ftprim,ftbis,*)
1165 include "DIMENSIONS"
1166 include "DIMENSIONS.FREE"
1167 include "COMMON.CONTROL"
1168 include "COMMON.FREE"
1169 include "COMMON.IOUNITS"
1170 double precision fT(6),fTprim(6),fTbis(6),quot,quotl1,quotl,kfacl,
1171 & kfac/2.4d0/,T0/300.0d0/,startGridT/200.0d0/,
1172 & logfac,tanhT,betaT,denom,eplus,eminus
1174 if (rescale_mode.eq.1) then
1182 denom=kfacl-1.0d0+quotl
1184 ftprim(l)=-l*ft(l)*quotl1/(T0*denom)
1185 ftbis(l)=l*kfacl*quotl1*
1186 & (2*l*quotl-(l-1)*denom)/(quot*t0*t0*denom**3)
1189 ft(6)=(320.0d0+80.0d0*dtanh((betaT-320.0d0)/80.0d0))/
1191 ftprim(6)=1.0d0/(320.0d0*dcosh((betaT-320.0d0)/80.0d0)**2)
1192 ftbis(6)=-2.0d0*dtanh((betaT-320.0d0)/80.0d0)
1193 & /(320.0d0*80.0d0*dcosh((betaT-320.0d0)/80.0d0)**3)
1194 #elif defined(FUNCT)
1203 else if (rescale_mode.eq.2) then
1211 logfac=1.0d0/dlog(eplus+eminus)
1212 tanhT=(eplus-eminus)/(eplus+eminus)
1213 fT(l)=1.12692801104297249644d0*logfac
1214 ftprim(l)=-l*quotl1*ft(l)*tanhT*logfac/T0
1215 ftbis(l)=(l-1)*ftprim(l)/(quot*T0)-
1216 & 2*l*quotl1/T0*logfac*
1217 & (2*l*quotl1*ft(l)/(T0*(eplus+eminus)**2)
1221 ft(6)=(320.0d0+80.0d0*dtanh((betaT-320.0d0)/80.0d0))/
1223 ftprim(6)=1.0d0/(320.0d0*dcosh((betaT-320.0d0)/80.0d0)**2)
1224 ftbis(6)=-2.0d0*dtanh((betaT-320.0d0)/80.0d0)
1225 & /(320.0d0*80.0d0*dcosh((betaT-320.0d0)/80.0d0)**3)
1226 #elif defined(FUNCT)
1235 else if (rescale_mode.eq.0) then
1241 write (iout,*) "Error in WHAM_CALC: wrong RESCALE_MODE",
1248 c--------------------------------------------------------------------
1249 subroutine sum_ene(t,iparm,ft,etot)
1251 include 'DIMENSIONS'
1252 include 'DIMENSIONS.ZSCOPT'
1253 include 'DIMENSIONS.FREE'
1254 include 'COMMON.CONTROL'
1255 include 'COMMON.FFIELD'
1256 include "COMMON.SBRIDGE"
1257 include "COMMON.ENERGIES"
1258 include "COMMON.IOUNITS"
1260 double precision fT(6)
1261 double precision etot,evdw,evdw_t,evdw2,ees,evdw1,ebe,etors,
1262 & escloc,ehpb,ecorr,ecorr5,ecorr6,eello_turn4,eello_turn3,
1263 & eturn6,eel_loc,edihcnstr,etors_d,estr,evdw2_14,esccor,
1265 evdw=enetb(21,t,iparm)
1266 evdw_t=enetb(1,t,iparm)
1268 evdw2_14=enetb(17,t,iparm)
1269 evdw2=enetb(2,t,iparm)+evdw2_14
1271 evdw2=enetb(2,t,iparm)
1275 ees=enetb(3,t,iparm)
1276 evdw1=enetb(16,t,iparm)
1278 ees=enetb(3,t,iparm)
1281 ecorr=enetb(4,t,iparm)
1282 ecorr5=enetb(5,t,iparm)
1283 ecorr6=enetb(6,t,iparm)
1284 eel_loc=enetb(7,t,iparm)
1285 eello_turn3=enetb(8,t,iparm)
1286 eello_turn4=enetb(9,t,iparm)
1287 eturn6=enetb(10,t,iparm)
1288 ebe=enetb(11,t,iparm)
1289 escloc=enetb(12,t,iparm)
1290 etors=enetb(13,t,iparm)
1291 etors_d=enetb(14,t,iparm)
1292 ehpb=enetb(15,t,iparm)
1293 estr=enetb(18,t,iparm)
1294 esccor=enetb(19,t,iparm)
1295 edihcnstr=enetb(20,t,iparm)
1296 eliptran=enetb(22,t,iparm)
1297 esaxs=enetb(26,t,iparm)
1299 if (shield_mode.gt.0) then
1300 etot=ft(1)*wsc*(evdw+ft(6)*evdw_t)+ft(1)*wscp*evdw2
1302 & +ft(1)*wvdwpp*evdw1
1303 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
1304 c & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1305 & +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1306 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
1307 & +ft(2)*wturn3*eello_turn3
1308 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc
1309 & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
1310 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
1312 etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees
1314 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
1315 c & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1316 & +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1317 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
1318 & +ft(2)*wturn3*eello_turn3
1319 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc
1320 & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
1321 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
1324 if (shield_mode.gt.0) then
1325 etot=ft(1)*wsc*(evdw+ft(6)*evdw_t)+ft(1)*wscp*evdw2
1326 & +ft(1)*welec*(ees+evdw1)
1327 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
1328 c & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1329 & +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1330 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
1331 & +ft(2)*wturn3*eello_turn3
1332 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr
1333 & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
1334 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
1336 etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2
1337 & +ft(1)*welec*(ees+evdw1)
1338 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
1339 c & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1340 & +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1341 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
1342 & +ft(2)*wturn3*eello_turn3
1343 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr
1344 & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
1345 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
1350 c--------------------------------------------------------------------
1351 subroutine sum_ene_deriv(t,iparm,ft,ftprim,ftbis,etot,eprim,ebis)
1353 include 'DIMENSIONS'
1354 include 'DIMENSIONS.ZSCOPT'
1355 include 'DIMENSIONS.FREE'
1356 include 'COMMON.CONTROL'
1357 include 'COMMON.FFIELD'
1358 include "COMMON.SBRIDGE"
1359 include 'COMMON.ENERGIES'
1360 include "COMMON.IOUNITS"
1362 double precision fT(6),fTprim(6),fTbis(6),
1364 double precision etot,evdw,evdw_t,evdw2,ees,evdw1,ebe,etors,
1365 & escloc,ehpb,ecorr,ecorr5,ecorr6,eello_turn4,eello_turn3,
1366 & eturn6,eel_loc,edihcnstr,etors_d,estr,evdw2_14,esccor,
1368 evdw=enetb(21,t,iparm)
1369 evdw_t=enetb(1,t,iparm)
1371 evdw2_14=enetb(17,t,iparm)
1372 evdw2=enetb(2,t,iparm)+evdw2_14
1374 evdw2=enetb(2,t,iparm)
1378 ees=enetb(3,t,iparm)
1379 evdw1=enetb(16,t,iparm)
1381 ees=enetb(3,t,iparm)
1384 ecorr=enetb(4,t,iparm)
1385 ecorr5=enetb(5,t,iparm)
1386 ecorr6=enetb(6,t,iparm)
1387 eel_loc=enetb(7,t,iparm)
1388 eello_turn3=enetb(8,t,iparm)
1389 eello_turn4=enetb(9,t,iparm)
1390 eturn6=enetb(10,t,iparm)
1391 ebe=enetb(11,t,iparm)
1392 escloc=enetb(12,t,iparm)
1393 etors=enetb(13,t,iparm)
1394 etors_d=enetb(14,t,iparm)
1395 ehpb=enetb(15,t,iparm)
1396 estr=enetb(18,t,iparm)
1397 esccor=enetb(19,t,iparm)
1398 edihcnstr=enetb(20,t,iparm)
1399 eliptran=enetb(22,t,iparm)
1400 esaxs=enetb(26,t,iparm)
1402 if (shield_mode.gt.0) then
1403 etot=ft(1)*wsc*(evdw+ft(6)*evdw_t)+ft(1)*wscp*evdw2
1405 & +ft(1)*wvdwpp*evdw1
1406 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
1407 c & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1408 & +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1409 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
1410 & +ft(2)*wturn3*eello_turn3
1411 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc
1412 & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
1413 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
1414 eprim=ftprim(1)*(ft(6)*evdw_t+evdw)
1415 C & +ftprim(6)*evdw_t
1416 & +ftprim(1)*wscp*evdw2
1417 & +ftprim(1)*welec*ees
1418 & +ftprim(1)*wvdwpp*evdw1
1419 & +ftprim(1)*wtor*etors+
1420 & ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+
1421 & ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+
1422 & ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eturn6+
1423 & ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+
1424 & ftprim(1)*wsccor*esccor
1425 ebis=ftbis(1)*wsc*(evdw+ft(6)*evdw_t)
1426 & +ftbis(1)*wscp*evdw2+
1427 & ftbis(1)*welec*ees
1428 & +ftbis(1)*wvdwpp*evdw
1429 & +ftbis(1)*wtor*etors+
1430 & ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+
1431 & ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+
1432 & ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eturn6+
1433 & ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+
1434 & ftbis(1)*wsccor*esccor
1436 etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees
1438 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
1439 c & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1440 & +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1441 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
1442 & +ft(2)*wturn3*eello_turn3
1443 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc
1444 & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
1445 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
1446 eprim=ftprim(6)*evdw_t+ftprim(1)*welec*ees
1447 & +ftprim(1)*wtor*etors+
1448 & ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+
1449 & ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+
1450 & ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eturn6+
1451 & ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+
1452 & ftprim(1)*wsccor*esccor
1453 ebis=ftbis(1)*welec*ees+ftbis(1)*wtor*etors+
1454 & ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+
1455 & ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+
1456 & ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eturn6+
1457 & ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+
1458 & ftbis(1)*wsccor*esccor
1461 if (shield_mode.gt.0) then
1462 etot=ft(1)*wsc*(evdw+ft(6)*evdw_t)+ft(1)*wscp*evdw2
1463 & +ft(1)*welec*(ees+evdw1)
1464 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
1465 c & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1466 & +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1467 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
1468 & +ft(2)*wturn3*eello_turn3
1469 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr
1470 & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
1471 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
1472 eprim=ftprim(1)*(evdw+ft(6)*evdw_t)
1473 & +ftprim(1)*welec*(ees+evdw1)
1474 & +ftprim(1)*wtor*etors+
1475 & ftprim(1)*wscp*evdw2+
1476 & ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+
1477 & ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+
1478 & ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eturn6+
1479 & ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+
1480 & ftprim(1)*wsccor*esccor
1481 ebis= ftbis(1)*(evdw+ft(6)*evdw_t)
1482 & +ftbis(1)*wscp*evdw2
1483 & +ftbis(1)*welec*(ees+evdw1)+ftbis(1)*wtor*etors+
1484 & ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+
1485 & ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+
1486 & ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eturn6+
1487 & ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+
1488 & ftprim(1)*wsccor*esccor
1490 etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2
1491 & +ft(1)*welec*(ees+evdw1)
1492 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
1493 c & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1494 & +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
1495 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
1496 & +ft(2)*wturn3*eello_turn3
1497 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr
1498 & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
1499 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
1500 eprim=ftprim(6)*evdw_t+ftprim(1)*welec*(ees+evdw1)
1501 & +ftprim(1)*wtor*etors+
1502 & ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+
1503 & ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+
1504 & ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eturn6+
1505 & ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+
1506 & ftprim(1)*wsccor*esccor
1507 ebis=ftbis(1)*welec*(ees+evdw1)+ftbis(1)*wtor*etors+
1508 & ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+
1509 & ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+
1510 & ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eturn6+
1511 & ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+
1512 & ftprim(1)*wsccor*esccor