1 subroutine make_ensembles(islice,*)
2 ! construct the conformational ensembles at REMD temperatures
5 include "DIMENSIONS.ZSCOPT"
6 include "DIMENSIONS.FREE"
10 integer ierror,errcode,status(MPI_STATUS_SIZE)
12 include "COMMON.IOUNITS"
13 include "COMMON.CONTROL"
15 include "COMMON.ENERGIES"
16 include "COMMON.FFIELD"
17 include "COMMON.INTERACT"
18 include "COMMON.SBRIDGE"
19 include "COMMON.CHAIN"
20 include "COMMON.PROTFILES"
22 real*4 csingle(3,maxres2)
23 double precision fT(6),fTprim(6),fTbis(6),quot,quotl1,quotl,kfacl,
24 & eprim,ebis,temper,kfac/2.4d0/,T0/300.0d0/
25 double precision etot,evdw,evdw_t,evdw2,ees,evdw1,ebe,etors,
27 & ehpb,ecorr,ecorr5,ecorr6,eello_turn4,eello_turn3,
28 & eturn6,eel_loc,edihcnstr,etors_d,estr,evdw2_14,esccor,tt
29 integer i,ii,ik,iproc,iscor,j,k,l,ib,iparm,iprot,nlist
30 double precision qfree,sumprob,eini,efree,rmsdev
32 character*2 licz1,licz2
33 character*3 licz3,licz4
37 real*4 Fdimless(MaxStr)
38 double precision enepot(MaxStr)
43 if (me.eq.Master) then
45 write (licz2,'(bz,i2.2)') islice
47 if (.not.separate_parset) then
48 bxname = prefix(:ilen(prefix))//".bx"
50 write (licz3,'(bz,i3.3)') myparm
51 bxname = prefix(:ilen(prefix))//"_par"//licz3//".bx"
54 if (.not.separate_parset) then
55 bxname = prefix(:ilen(prefix))//"_slice_"//licz2//".bx"
57 write (licz3,'(bz,i3.3)') myparm
58 bxname = prefix(:ilen(prefix))//"par_"//licz3//
59 & "_slice_"//licz2//".bx"
62 open (ientout,file=bxname,status="unknown",
63 & form="unformatted",access="direct",recl=lenrec1)
68 if (iparm.ne.iparmprint) exit
69 call restore_parm(iparm)
72 write (iout,*) "iparm",iparm," ib",ib
74 temper=1.0d0/(beta_h(ib,iparm)*1.987D-3)
75 c quot=1.0d0/(T0*beta_h(ib,iparm)*1.987D-3)
82 c fT(l)=kfacl/(kfacl-1.0d0+quotl)
84 if (rescale_mode.eq.1) then
85 quot=1.0d0/(T0*beta_h(ib,iparm)*1.987D-3)
87 tt=1.0d0/(beta_h(ib,iparm)*1.987D-3)
88 ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/320.0d0
100 fT(l)=kfacl/(kfacl-1.0d0+quotl)
102 else if (rescale_mode.eq.2) then
103 quot=1.0d0/(T0*beta_h(ib,iparm)*1.987D-3)
105 tt=1.0d0/(beta_h(ib,iparm)*1.987D-3)
106 ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/3200.d0
115 fT(l)=1.12692801104297249644d0/
116 & dlog(dexp(quotl)+dexp(-quotl))
118 c write (iout,*) 1.0d0/(beta_h(ib,iparm)*1.987D-3),ft
119 else if (rescale_mode.eq.0) then
125 & "Error in MAKE_ENSEMBLE: Wrong RESCALE_MODE:",rescale_mode
134 evdw=enetb(1,i,iparm)
135 evdw_t=enetb(21,i,iparm)
137 evdw2_14=enetb(17,i,iparm)
138 evdw2=enetb(2,i,iparm)+evdw2_14
140 evdw2=enetb(2,i,iparm)
145 evdw1=enetb(16,i,iparm)
150 ecorr=enetb(4,i,iparm)
151 ecorr5=enetb(5,i,iparm)
152 ecorr6=enetb(6,i,iparm)
153 eel_loc=enetb(7,i,iparm)
154 eello_turn3=enetb(8,i,iparm)
155 eello_turn4=enetb(9,i,iparm)
156 eturn6=enetb(10,i,iparm)
157 ebe=enetb(11,i,iparm)
158 escloc=enetb(12,i,iparm)
159 etors=enetb(13,i,iparm)
160 etors_d=enetb(14,i,iparm)
161 ehpb=enetb(15,i,iparm)
162 estr=enetb(18,i,iparm)
163 esccor=enetb(19,i,iparm)
164 edihcnstr=enetb(20,i,iparm)
166 etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees
168 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
169 & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
170 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
171 & +ft(2)*wturn3*eello_turn3
172 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc
173 & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
176 etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2
177 & +ft(1)*welec*(ees+evdw1)
178 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
179 & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
180 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
181 & +ft(2)*wturn3*eello_turn3
182 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr
183 & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
188 & beta_h(ib,iparm)*etot-entfac(i)
191 write (iout,*) i,indstart(me)+i-1,ib,
192 & 1.0d0/(1.987d-3*beta_h(ib,iparm)),potE(i,iparm),
193 & -entfac(i),Fdimless(i)
196 Fdimless(i)=beta_h(ib,iparm)*etot-entfac(i)
201 call MPI_Gatherv(Fdimless(1),scount(me),
202 & MPI_REAL,Fdimless(1),
203 & scount(0),idispl(0),MPI_REAL,Master,
206 call MPI_Gatherv(potE(1,iparm),scount(me),
207 & MPI_DOUBLE_PRECISION,potE(1,iparm),
208 & scount(0),idispl(0),MPI_DOUBLE_PRECISION,Master,
210 call MPI_Gatherv(entfac(1),scount(me),
211 & MPI_DOUBLE_PRECISION,entfac(1),
212 & scount(0),idispl(0),MPI_DOUBLE_PRECISION,Master,
215 if (me.eq.Master) then
217 write (iout,*) "The FDIMLESS array before sorting"
219 write (iout,*) i,fdimless(i)
226 call mysort1(ntot(islice),Fdimless,iperm)
228 write (iout,*) "The FDIMLESS array after sorting"
230 write (iout,*) i,iperm(i),fdimless(i)
235 qfree=qfree+exp(-fdimless(i)+fdimless(1))
237 c write (iout,*) "qfree",qfree
240 do i=1,min0(ntot(islice),ensembles)
241 sumprob=sumprob+exp(-fdimless(i)+fdimless(1))/qfree
243 write (iout,*) i,ib,beta_h(ib,iparm),
244 & 1.0d0/(1.987d-3*beta_h(ib,iparm)),iperm(i),
245 & potE(iperm(i),iparm),
246 & -entfac(iperm(i)),fdimless(i),sumprob
248 if (sumprob.gt.0.99d0) goto 122
254 call MPI_Bcast(nlist, 1, MPI_INTEGER, Master, WHAM_COMM,
256 call MPI_Bcast(iperm,nlist,MPI_INTEGER,Master,WHAM_COMM,
261 do while (ii.lt.indstart(iproc).or.ii.gt.indend(iproc))
264 if (iproc.ge.nprocs) then
265 write (iout,*) "Fatal error: processor out of range",iproc
270 close (ientout,status="delete")
274 ik=ii-indstart(iproc)+1
275 if (iproc.ne.Master) then
276 if (me.eq.iproc) then
278 write (iout,*) "i",i," ii",ii," iproc",iproc," ik",ik,
279 & " energy",potE(ik,iparm)
281 call MPI_Send(potE(ik,iparm),1,MPI_DOUBLE_PRECISION,
282 & Master,i,WHAM_COMM,IERROR)
283 else if (me.eq.Master) then
284 call MPI_Recv(enepot(i),1,MPI_DOUBLE_PRECISION,iproc,i,
285 & WHAM_COMM,STATUS,IERROR)
287 else if (me.eq.Master) then
288 enepot(i)=potE(ik,iparm)
293 enepot(i)=potE(iperm(i),iparm)
297 if (me.eq.Master) then
299 write(licz3,'(bz,i3.3)') iparm
300 write(licz2,'(bz,i2.2)') islice
301 if (temper.lt.100.0d0) then
302 write(ctemper,'(f3.0)') temper
303 else if (temper.lt.1000.0) then
304 write (ctemper,'(f4.0)') temper
306 write (ctemper,'(f5.0)') temper
308 if (nparmset.eq.1) then
309 if (separate_parset) then
310 write(licz4,'(bz,i3.3)') myparm
311 pdbname=prefix(:ilen(prefix))//"_par"//licz4
313 pdbname=prefix(:ilen(prefix))
316 pdbname=prefix(:ilen(prefix))//"_parm_"//licz3
318 if (nslice.eq.1) then
319 pdbname=pdbname(:ilen(pdbname))//"_T_"//
320 & ctemper(:ilen(ctemper))//"pdb"
322 pdbname=pdbname(:ilen(pdbname))//"_slice_"//licz2//"_T_"//
323 & ctemper(:ilen(ctemper))//"pdb"
325 open(ipdb,file=pdbname)
327 read (ientout,rec=iperm(i))
328 & ((csingle(l,k),l=1,3),k=1,nres),
329 & ((csingle(l,k+nres),l=1,3),k=nnt,nct),
330 & nss,(ihpb(k),jhpb(k),k=1,nss),
331 & eini,efree,rmsdev,iscor
338 call pdbout(iperm(i),temper,eini,enepot(i),efree,rmsdev)
348 close(ientout,status="delete")
352 !--------------------------------------------------
353 subroutine mysort1(n, x, ipermut)
355 integer i,j,imax,ipm,n
363 if (x(j).lt.xtemp) then
371 ipermut(imax)=ipermut(i)