2 c Optimize the UNRES energy function by minimization of a quartic target
3 c function or by the VMC method.
9 cMS$ATTRIBUTES C :: proc_proc
12 include "DIMENSIONS.ZSCOPT"
15 integer IERROR,ERRCODE,kolor,key
18 include "COMMON.IOUNITS"
19 include "COMMON.OPTIM"
20 include "COMMON.WEIGHTS"
22 double precision rr,x(max_paropt)
25 c print *,"Starting..."
27 c print *,"Initializing MPI..."
28 call MPI_Init( IERROR )
29 call MPI_Comm_rank( MPI_COMM_WORLD, me, IERROR )
30 call MPI_Comm_size( MPI_COMM_WORLD, nprocs, IERROR )
31 c print *,"Finished initializing MPI..."
34 c print *,"Me",me," Master",master," Ierror",ierror
36 write(iout,*) "SEVERE ERROR - Can't initialize MPI."
37 call mpi_finalize(ierror)
52 c print *,"calling openunits"
54 c print *,"openunits called"
55 call read_general_data(*10)
56 write (iout,'(80(1h-)/10x,
57 & "Maximum likelihood optimization of UNRES energy function",
58 & " v. 05/10/16"/80(1h-))')
62 write (iout,*) "Finished READ_GENERAL_DATA"
65 call parmread(iparm,*10)
67 call read_pmf_data(*10)
68 write (iout,*) "Finished parmread"
70 call read_optim_parm(*10)
71 call print_general_data(*10)
72 call read_protein_data(*10)
73 write (iout,*) "Finished READ_PROTEIN_DATA"
75 call read_database(*10)
76 write (iout,*) "Finished READ_DATABASE"
79 c write (iout,*) Me,' calling PROC_GROUPS'
81 c write (iout,*) Me,' calling WORK_PARTITION_MAP'
82 c call work_partition_map(nvarr)
85 if (torsion_pmf.or.turn_pmf.or.eello_pmf.or.angle_PMF)
87 if (pdbpmf) call pdbstatread(*10)
89 call proc_data(nvarr,x,*10)
92 if (me.eq.Master) then
94 call maxlikopt(nvarr,x)
101 call MPI_Finalize( IERROR )
106 10 write (iout,*) "Error termination of the program"
107 call MPI_Finalize( IERROR )
110 c------------------------------------------------------------------------------
114 parameter (ntasks=11)
115 include "DIMENSIONS.ZSCOPT"
120 double precision ttask_all(ntasks)
121 integer nctask_all(ntasks)
123 include "COMMON.IOUNITS"
125 double precision ttask
127 common /timing/ ttask(ntasks),nctask(ntasks)
128 character*16 tname(ntasks) /"function","gradient",9*''/
131 write (iout,'(80(1h-))')
133 write (iout,*) "Routine call info from the processor ",me," ..."
135 write (iout,*) "Routine call info ..."
138 write (iout,'(65(1h-))')
139 write (iout,100) "task"," # calls"," total time",
141 write (iout,'(65(1h-))')
143 write (iout,200) tname(i),nctask(i),ttask(i),
144 & ttask(i)/(nctask(i)+1.0d-10)
148 call MPI_Reduce(ttask(1),ttask_all(1),ntasks,
149 & MPI_DOUBLE_PRECISION, MPI_SUM, Master, WHAM_COMM,IERROR)
150 call MPI_Reduce(nctask(1),nctask_all(1),ntasks,
151 & MPI_INTEGER, MPI_SUM, Master, WHAM_COMM,IERROR)
152 if (Me.eq.Master) then
153 write (iout,'(80(1h-))')
154 write (iout,*) "Routine call info from all processors ..."
156 write (iout,'(65(1h-))')
157 write (iout,100) "task"," # calls"," total time",
159 write (iout,'(65(1h-))')
161 write (iout,200) tname(i),nctask_all(i),ttask_all(i),
162 & ttask_all(i)/(nctask_all(i)+1.0d-10)
168 100 format(a,t21,a,t31,a,t46,a)
169 200 format(a,t21,i10,f15.2,f15.8)
171 c------------------------------------------------------------------------------
173 subroutine proc_groups
174 C Split the processors into the Master and Workers group, if needed.
177 include "DIMENSIONS.ZSCOPT"
179 include "COMMON.IOUNITS"
181 include "COMMON.VMCPAR"
182 integer n,chunk,iprot,i,j,ii,remainder
183 integer kolor,key,ierror,errcode
186 C No secondary structure constraints.
192 c-------------------------------------------------------------------------------
193 subroutine work_partition(lprint)
194 c Split the conformations between processors
197 include "DIMENSIONS.ZSCOPT"
199 include "COMMON.CLASSES"
200 include "COMMON.IOUNITS"
202 include "COMMON.VMCPAR"
203 integer n,chunk,iprot,i,j,ii,remainder
204 integer kolor,key,ierror,errcode
207 C Divide conformations between processors; for each proteins the first and
208 C the last conformation to handle by ith processor is stored in
209 C indstart(i,iprot) and indend(i,iprot), respectively.
211 C First try to assign equal number of conformations to each processor.
215 write (iout,*) "Protein",iprot," n=",n
218 scount(0,iprot) = chunk
219 c print *,"i",0," indstart",indstart(0,iprot)," scount",
222 indstart(i,iprot)=chunk+indstart(i-1,iprot)
223 scount(i,iprot)=scount(i-1,iprot)
224 c print *,"i",i," indstart",indstart(i,iprot)," scount",
228 C Determine how many conformations remained yet unassigned.
230 remainder=N-(indstart(nprocs1-1,iprot)
231 & +scount(nprocs1-1,iprot)-1)
232 c print *,"remainder",remainder
234 C Assign the remainder conformations to consecutive processors, starting
235 C from the lowest rank; this continues until the list is exhausted.
237 if (remainder .gt. 0) then
239 scount(i-1,iprot) = scount(i-1,iprot) + 1
240 indstart(i,iprot) = indstart(i,iprot) + i
242 do i=remainder+1,nprocs1-1
243 indstart(i,iprot) = indstart(i,iprot) + remainder
247 indstart(nprocs1,iprot)=N+1
248 scount(nprocs1,iprot)=0
251 indend(i,iprot)=indstart(i,iprot)+scount(i,iprot)-1
252 idispl(i,iprot)=indstart(i,iprot)-1
257 N=N+indend(i,iprot)-indstart(i,iprot)+1
260 c print *,"N",n," NTOT",ntot_work(iprot)
261 if (N.ne.ntot_work(iprot)) then
262 write (iout,*) "!!! Checksum error on processor",me
264 call MPI_Abort( WHAM_COMM, Ierror, Errcode )
268 do i=1,ntot_work(iprot)
269 if (i.ge.indstart(me1,iprot) .and. i.le.indend(me1,iprot))
276 c write (iout,*) "i",i," iprot",iprot," i2ii",i2ii(i,iprot)
281 write (iout,*) "Partition of work between processors"
283 write (iout,*) "Protein",iprot
285 write (iout,*) "The i2ii array"
286 do j=1,ntot_work(iprot)
287 write (iout,*) j,i2ii(j,iprot)
291 write (iout,'(a,i5,a,i7,a,i7,a,i7)')
292 & "Processor",i," indstart",indstart(i,iprot),
293 & " indend",indend(i,iprot)," count",scount(i,iprot)
299 c------------------------------------------------------------------------------
300 subroutine jebadelko(nvarr)
303 include "DIMENSIONS.ZSCOPT"
305 include "COMMON.IOUNITS"
307 include "COMMON.VMCPAR"
308 include "COMMON.CLASSES"
309 include "COMMON.OPTIM"
310 include "COMMON.WEIGHTS"
311 include "COMMON.WEIGHTDER"
312 include "COMMON.ENERGIES"
313 include "COMMON.TIME1"
314 include "COMMON.PROTNAME"
315 include "COMMON.PROTFILES"
316 include "COMMON.TORSION"
317 include "COMMON.COMPAR"
318 integer What, TAG, IERROR, status(MPI_STATUS_SIZE), istop, iprot,
319 & nvarr, nf, errcode, ider
321 double precision x(max_paropt), g(max_paropt), viol
325 double precision rdum,rdif,maxlik_pdb
326 double precision tcpu,t1,t1w,t1_ini,t1w_ini
330 write(iout,*) "Processor",me,me1," called JEBADELKO"
332 if (me.eq.Master) then
334 call func1(nvarr,istop,x)
337 write (iout,*) "ELOWEST at slave starting JEBADELKO"
339 do ibatch=1,natlike(iprot)+2
340 do ib=1,nbeta(ibatch,iprot)
341 write (iout,*) "iprot",iprot," ibatch",ibatch," ib",ib,
342 & " elowest",elowest(ib,ibatch,iprot)
348 t1w_ini = MPI_WTIME()
350 do while (istop.ne.0)
352 write (iout,*) "ELOWEST at slave calling FUNC1 from JBADELKO"
354 do ibatch=1,natlike(iprot)+2
355 do ib=1,nbeta(ibatch,iprot)
356 write (iout,*) "iprot",iprot," ibatch",ibatch," ib",ib,
357 & " elowest",elowest(ib,ibatch,iprot)
362 call func1(nvarr,istop,x)
363 c write (iout,*) "slave: after func1"
367 if (torsion_pmf.or.turn_pmf.or.eello_pmf.or.angle_PMF)
368 & rdum = rdif(nvarr,x,g,ider)
369 if (pdbpmf) rdum = maxlik_pdb(nvarr,x,g,ider)
370 c write (iout,*) "slave: after rdif"
375 t1w = mpi_wtime() - t1w_ini
378 write (iout,*) "CPU time",t1," wall clock time",t1w
383 write (iout,*) "Energies of processor",me
386 write (iout,*) "Protein ",protname(iprot)
388 if (i.ge.indstart(me1,j).and.i.le.indend(me1,j)) then
389 write(iout,*)i,e_total(i,j),rmstb(i,j),iscore(i,0,j)
395 write (iout,*) "Deleting scratchfile",bprotfiles(iprot)
396 inquire (file=bprotfiles(iprot),number=iun,opened=op)
397 write (iout,*) "unit",iun," icbase",icbase
399 open (icbase,file=bprotfiles(iprot),status="old",
400 & form="unformatted",access="direct",recl=lenrec(iprot))
401 close(icbase,status="delete")
403 close(iun,status="delete")
406 if (.not.mod_other_params) then
407 write (iout,*) "Deleting scratchfile",benefiles(iprot)
408 inquire (file=benefiles(iprot),number=iun,opened=op)
409 write (iout,*) "unit",iun," ientout",icbase
411 open (ientout,file=benefiles(iprot),status="old",
412 & form="unformatted",access="direct",recl=lenrec_ene(iprot))
413 close(ientout,status="delete")
415 close (iun,status="delete")
420 write (iout,*) "Processor",me,"leaves JEBADELKO"