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,ehomology_constr,
27 & ehpb,ecorr,ecorr5,ecorr6,eello_turn4,eello_turn3,
28 & eturn6,eel_loc,edihcnstr,etors_d,estr,evdw2_14,esccor,tt,
29 & 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 ehomology_constr=enetb(22,i,iparm)
167 edfadis=enetb(23,i,iparm)
168 edfator=enetb(24,i,iparm)
169 edfanei=enetb(25,i,iparm)
170 edfabet=enetb(26,i,iparm)
172 & ehomology_constr=waga_homology(homol_nset)*ehomology_constr
174 etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees
176 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
177 & +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
178 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
179 & +ft(2)*wturn3*eello_turn3
180 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc
181 & +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
182 & +wbond*estr+ehomology_constr
184 & +wdfa_tor*edfator+wdfa_nei*edfanei+wdfa_beta*edfabet
186 etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2
187 & +ft(1)*welec*(ees+evdw1)
188 & +wang*ebe+ft(1)*wtor*etors+wscloc*escloc
189 & +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
190 & +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4
191 & +ft(2)*wturn3*eello_turn3
192 & +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr
193 & +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor
194 & +wbond*estr+ehomology_constr
196 & +wdfa_tor*edfator+wdfa_nei*edfanei+wdfa_beta*edfabet
200 & beta_h(ib,iparm)*etot-entfac(i)
203 write (iout,*) 'EEE',i,indstart(me)+i-1,ib,
204 & 1.0d0/(1.987d-3*beta_h(ib,iparm)),potE(i,iparm),
205 & -entfac(i),Fdimless(i)
208 Fdimless(i)=beta_h(ib,iparm)*etot-entfac(i)
213 call MPI_Gatherv(Fdimless_(1),scount(me),
214 & MPI_REAL,Fdimless(1),
215 & scount(0),idispl(0),MPI_REAL,Master,
218 call MPI_Gatherv(potE(1,iparm),scount(me),
219 & MPI_DOUBLE_PRECISION,potE(1,iparm),
220 & scount(0),idispl(0),MPI_DOUBLE_PRECISION,Master,
222 call MPI_Gatherv(entfac(1),scount(me),
223 & MPI_DOUBLE_PRECISION,entfac(1),
224 & scount(0),idispl(0),MPI_DOUBLE_PRECISION,Master,
227 if (me.eq.Master) then
229 write (iout,*) "The FDIMLESS array before sorting"
231 write (iout,*) i,fdimless(i)
238 call mysort1(ntot(islice),Fdimless,iperm)
240 write (iout,*) "The FDIMLESS array after sorting"
242 write (iout,*) i,iperm(i),fdimless(i)
247 qfree=qfree+exp(-fdimless(i)+fdimless(1))
249 c write (iout,*) "qfree",qfree
252 do i=1,min0(ntot(islice),ensembles)
253 sumprob=sumprob+exp(-fdimless(i)+fdimless(1))/qfree
255 write (iout,*) i,ib,beta_h(ib,iparm),
256 & 1.0d0/(1.987d-3*beta_h(ib,iparm)),iperm(i),
257 & potE(iperm(i),iparm),
258 & -entfac(iperm(i)),fdimless(i),sumprob
260 if (sumprob.gt.0.99d0) goto 122
266 call MPI_Bcast(nlist, 1, MPI_INTEGER, Master, WHAM_COMM,
268 call MPI_Bcast(iperm,nlist,MPI_INTEGER,Master,WHAM_COMM,
273 do while (ii.lt.indstart(iproc).or.ii.gt.indend(iproc))
276 if (iproc.ge.nprocs) then
277 write (iout,*) "Fatal error: processor out of range",iproc
282 close (ientout,status="delete")
286 ik=ii-indstart(iproc)+1
287 if (iproc.ne.Master) then
288 if (me.eq.iproc) then
290 write (iout,*) "i",i," ii",ii," iproc",iproc," ik",ik,
291 & " energy",potE(ik,iparm)
293 call MPI_Send(potE(ik,iparm),1,MPI_DOUBLE_PRECISION,
294 & Master,i,WHAM_COMM,IERROR)
295 else if (me.eq.Master) then
296 call MPI_Recv(enepot(i),1,MPI_DOUBLE_PRECISION,iproc,i,
297 & WHAM_COMM,STATUS,IERROR)
299 else if (me.eq.Master) then
300 enepot(i)=potE(ik,iparm)
305 enepot(i)=potE(iperm(i),iparm)
309 if (me.eq.Master) then
311 write(licz3,'(bz,i3.3)') iparm
312 write(licz2,'(bz,i2.2)') islice
313 if (temper.lt.100.0d0) then
314 write(ctemper,'(f3.0)') temper
315 else if (temper.lt.1000.0) then
316 write (ctemper,'(f4.0)') temper
318 write (ctemper,'(f5.0)') temper
320 if (nparmset.eq.1) then
321 if (separate_parset) then
322 write(licz4,'(bz,i3.3)') myparm
323 pdbname=prefix(:ilen(prefix))//"_par"//licz4
325 pdbname=prefix(:ilen(prefix))
328 pdbname=prefix(:ilen(prefix))//"_parm_"//licz3
330 if (nslice.eq.1) then
331 pdbname=pdbname(:ilen(pdbname))//"_T_"//
332 & ctemper(:ilen(ctemper))//"pdb"
334 pdbname=pdbname(:ilen(pdbname))//"_slice_"//licz2//"_T_"//
335 & ctemper(:ilen(ctemper))//"pdb"
337 open(ipdb,file=pdbname)
339 read (ientout,rec=iperm(i))
340 & ((csingle(l,k),l=1,3),k=1,nres),
341 & ((csingle(l,k+nres),l=1,3),k=nnt,nct),
342 & nss,(ihpb(k),jhpb(k),k=1,nss),
343 & eini,efree,rmsdev,iscor
350 call pdbout(iperm(i),temper,eini,enepot(i),efree,rmsdev)
351 cc if (temper.eq.300.0d0) then
352 cc write(iout,*) 'Gral i=',iperm(i) ,eini,enepot(i),efree
356 cc if (temper.eq.300.0d0) then
357 cc write(iout,*) 'Gral i=',i ,eini,enepot(i),efree
368 close(ientout,status="delete")
372 !--------------------------------------------------
373 subroutine mysort1(n, x, ipermut)
375 integer i,j,imax,ipm,n
383 if (x(j).lt.xtemp) then
391 ipermut(imax)=ipermut(i)