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,
26 & escloc,eliptran,esaxs,
27 & ehpb,ecorr,ecorr5,ecorr6,eello_turn4,eello_turn3,
28 & eturn6,eel_loc,edihcnstr,etors_d,estr,evdw2_14,esccor,tt,
29 & ehomology_constr,edfadis,edfator,edfanei,edfabet
30 integer i,ii,ik,iproc,iscor,j,k,l,ib,iparm,iprot,nlist
31 double precision qfree,sumprob,eini,efree,rmsdev
33 character*2 licz1,licz2
34 character*3 licz3,licz4
38 real*4 Fdimless(MaxStr),Fdimless_(MaxStr)
39 double precision enepot(MaxStr)
44 if (me.eq.Master) then
46 write (licz2,'(bz,i2.2)') islice
48 if (.not.separate_parset) then
49 bxname = prefix(:ilen(prefix))//".bx"
51 write (licz3,'(bz,i3.3)') myparm
52 bxname = prefix(:ilen(prefix))//"_par"//licz3//".bx"
55 if (.not.separate_parset) then
56 bxname = prefix(:ilen(prefix))//"_slice_"//licz2//".bx"
58 write (licz3,'(bz,i3.3)') myparm
59 bxname = prefix(:ilen(prefix))//"par_"//licz3//
60 & "_slice_"//licz2//".bx"
63 open (ientout,file=bxname,status="unknown",
64 & form="unformatted",access="direct",recl=lenrec1)
69 if (iparm.ne.iparmprint) exit
70 call restore_parm(iparm)
73 write (iout,*) "iparm",iparm," ib",ib
75 temper=1.0d0/(beta_h(ib,iparm)*1.987D-3)
76 c quot=1.0d0/(T0*beta_h(ib,iparm)*1.987D-3)
83 c fT(l)=kfacl/(kfacl-1.0d0+quotl)
85 if (rescale_mode.eq.1) then
86 quot=1.0d0/(T0*beta_h(ib,iparm)*1.987D-3)
88 tt=1.0d0/(beta_h(ib,iparm)*1.987D-3)
89 ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/320.0d0
101 fT(l)=kfacl/(kfacl-1.0d0+quotl)
103 else if (rescale_mode.eq.2) then
104 quot=1.0d0/(T0*beta_h(ib,iparm)*1.987D-3)
106 tt=1.0d0/(beta_h(ib,iparm)*1.987D-3)
107 ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/3200.d0
116 fT(l)=1.12692801104297249644d0/
117 & dlog(dexp(quotl)+dexp(-quotl))
119 c write (iout,*) 1.0d0/(beta_h(ib,iparm)*1.987D-3),ft
120 else if (rescale_mode.eq.0) then
126 & "Error in MAKE_ENSEMBLE: Wrong RESCALE_MODE:",rescale_mode
135 evdw=enetb(1,i,iparm)
136 evdw_t=enetb(21,i,iparm)
138 evdw2_14=enetb(17,i,iparm)
139 evdw2=enetb(2,i,iparm)+evdw2_14
141 evdw2=enetb(2,i,iparm)
146 evdw1=enetb(16,i,iparm)
151 ecorr=enetb(4,i,iparm)
152 ecorr5=enetb(5,i,iparm)
153 ecorr6=enetb(6,i,iparm)
154 eel_loc=enetb(7,i,iparm)
155 eello_turn3=enetb(8,i,iparm)
156 eello_turn4=enetb(9,i,iparm)
157 eturn6=enetb(10,i,iparm)
158 ebe=enetb(11,i,iparm)
159 escloc=enetb(12,i,iparm)
160 etors=enetb(13,i,iparm)
161 etors_d=enetb(14,i,iparm)
162 ehpb=enetb(15,i,iparm)
163 estr=enetb(18,i,iparm)
164 esccor=enetb(19,i,iparm)
165 edihcnstr=enetb(20,i,iparm)
166 eliptran=enetb(22,i,iparm)
167 esaxs=enetb(26,i,iparm)
168 ehomology_constr=enetb(27,i,iparm)
169 edfadis=enetb(28,i,iparm)
170 edfator=enetb(29,i,iparm)
171 edfanei=enetb(30,i,iparm)
172 edfabet=enetb(31,i,iparm)
174 & ehomology_constr=waga_homology(homol_nset)*ehomology_constr
176 if (shield_mode.gt.0) then
177 etot=ft(1)*wsc*(evdw+ft(6)*evdw_t)+ft(1)*wscp*evdw2
179 & +ft(1)*wvdwpp*evdw1
180 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
181 & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
182 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
183 & +ft(2)*wturn3*eello_turn3
184 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc
185 & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
186 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
189 & +wdfa_tor*edfator+wdfa_nei*edfanei+wdfa_beta*edfabet
191 etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees
193 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
194 & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
195 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
196 & +ft(2)*wturn3*eello_turn3
197 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc
198 & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
199 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
202 & +wdfa_tor*edfator+wdfa_nei*edfanei+wdfa_beta*edfabet
205 if (shield_mode.gt.0) then
206 etot=ft(1)*wsc*(evdw+ft(6)*evdw_t)+ft(1)*wscp*evdw2
207 & +ft(1)*welec*(ees+evdw1)
208 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
209 & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
210 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
211 & +ft(2)*wturn3*eello_turn3
212 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr
213 & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
214 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
217 & +wdfa_tor*edfator+wdfa_nei*edfanei+wdfa_beta*edfabet
219 etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2
220 & +ft(1)*welec*(ees+evdw1)
221 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
222 & +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
223 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
224 & +ft(2)*wturn3*eello_turn3
225 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr
226 & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
227 & +wbond*estr+wliptran*eliptran+wsaxs*esaxs
230 & +wdfa_tor*edfator+wdfa_nei*edfanei+wdfa_beta*edfabet
235 & beta_h(ib,iparm)*etot-entfac(i)
238 write (iout,*) i,indstart(me)+i-1,ib,
239 & 1.0d0/(1.987d-3*beta_h(ib,iparm)),potE(i,iparm),
240 & -entfac(i),Fdimless(i)
243 Fdimless(i)=beta_h(ib,iparm)*etot-entfac(i)
248 call MPI_Gatherv(Fdimless_(1),scount(me),
249 & MPI_REAL,Fdimless(1),
250 & scount(0),idispl(0),MPI_REAL,Master,
253 call MPI_Gatherv(potE(1,iparm),scount(me),
254 & MPI_DOUBLE_PRECISION,potE(1,iparm),
255 & scount(0),idispl(0),MPI_DOUBLE_PRECISION,Master,
257 call MPI_Gatherv(entfac(1),scount(me),
258 & MPI_DOUBLE_PRECISION,entfac(1),
259 & scount(0),idispl(0),MPI_DOUBLE_PRECISION,Master,
262 if (me.eq.Master) then
264 write (iout,*) "The FDIMLESS array before sorting"
266 write (iout,*) i,fdimless(i)
273 call mysort1(ntot(islice),Fdimless,iperm)
275 write (iout,*) "The FDIMLESS array after sorting"
277 write (iout,*) i,iperm(i),fdimless(i)
282 qfree=qfree+exp(-fdimless(i)+fdimless(1))
284 c write (iout,*) "qfree",qfree
287 do i=1,min0(ntot(islice),ensembles)
288 sumprob=sumprob+exp(-fdimless(i)+fdimless(1))/qfree
290 write (iout,*) i,ib,beta_h(ib,iparm),
291 & 1.0d0/(1.987d-3*beta_h(ib,iparm)),iperm(i),
292 & potE(iperm(i),iparm),
293 & -entfac(iperm(i)),fdimless(i),sumprob
295 if (sumprob.gt.0.99d0) goto 122
301 call MPI_Bcast(nlist, 1, MPI_INTEGER, Master, WHAM_COMM,
303 call MPI_Bcast(iperm,nlist,MPI_INTEGER,Master,WHAM_COMM,
308 do while (ii.lt.indstart(iproc).or.ii.gt.indend(iproc))
311 if (iproc.ge.nprocs) then
312 write (iout,*) "Fatal error: processor out of range",iproc
317 close (ientout,status="delete")
321 ik=ii-indstart(iproc)+1
322 if (iproc.ne.Master) then
323 if (me.eq.iproc) then
325 write (iout,*) "i",i," ii",ii," iproc",iproc," ik",ik,
326 & " energy",potE(ik,iparm)
328 call MPI_Send(potE(ik,iparm),1,MPI_DOUBLE_PRECISION,
329 & Master,i,WHAM_COMM,IERROR)
330 else if (me.eq.Master) then
331 call MPI_Recv(enepot(i),1,MPI_DOUBLE_PRECISION,iproc,i,
332 & WHAM_COMM,STATUS,IERROR)
334 else if (me.eq.Master) then
335 enepot(i)=potE(ik,iparm)
340 enepot(i)=potE(iperm(i),iparm)
344 if (me.eq.Master) then
346 write(licz3,'(bz,i3.3)') iparm
347 write(licz2,'(bz,i2.2)') islice
348 if (temper.lt.100.0d0) then
349 write(ctemper,'(f3.0)') temper
350 else if (temper.lt.1000.0) then
351 write (ctemper,'(f4.0)') temper
353 write (ctemper,'(f5.0)') temper
355 if (nparmset.eq.1) then
356 if (separate_parset) then
357 write(licz4,'(bz,i3.3)') myparm
358 pdbname=prefix(:ilen(prefix))//"_par"//licz4
360 pdbname=prefix(:ilen(prefix))
363 pdbname=prefix(:ilen(prefix))//"_parm_"//licz3
365 if (nslice.eq.1) then
366 pdbname=pdbname(:ilen(pdbname))//"_T_"//
367 & ctemper(:ilen(ctemper))//"pdb"
369 pdbname=pdbname(:ilen(pdbname))//"_slice_"//licz2//"_T_"//
370 & ctemper(:ilen(ctemper))//"pdb"
372 open(ipdb,file=pdbname)
374 read (ientout,rec=iperm(i))
375 & ((csingle(l,k),l=1,3),k=1,nres),
376 & ((csingle(l,k+nres),l=1,3),k=nnt,nct),
377 & nss,(ihpb(k),jhpb(k),k=1,nss),
378 & eini,efree,rmsdev,iscor
385 call pdbout(iperm(i),temper,eini,enepot(i),efree,rmsdev)
395 close(ientout,status="delete")
399 !--------------------------------------------------
400 subroutine mysort1(n, x, ipermut)
402 integer i,j,imax,ipm,n
410 if (x(j).lt.xtemp) then
418 ipermut(imax)=ipermut(i)