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
11 include "DIMENSIONS.ZSCOPT"
14 integer IERROR,ERRCODE,kolor,key
17 include "COMMON.IOUNITS"
18 include "COMMON.OPTIM"
20 double precision rr,x(max_paropt)
23 c print *,"Starting..."
25 c print *,"Initializing MPI..."
26 call MPI_Init( IERROR )
27 call MPI_Comm_rank( MPI_COMM_WORLD, me, IERROR )
28 call MPI_Comm_size( MPI_COMM_WORLD, nprocs, IERROR )
29 c print *,"Finished initializing MPI..."
32 c print *,"Me",me," Master",master," Ierror",ierror
34 write(iout,*) "SEVERE ERROR - Can't initialize MPI."
35 call mpi_finalize(ierror)
50 c print *,"calling openunits"
52 c print *,"openunits called"
53 call read_general_data(*10)
54 write (iout,'(80(1h-)/10x,
55 & "Maximum likelihood optimization of UNRES energy function",
56 & " v. 05/10/16"/80(1h-))')
60 write (iout,*) "Finished READ_GENERAL_DATA"
63 call parmread(iparm,*10)
65 call read_pmf_data(*10)
66 write (iout,*) "Finished parmread"
68 call read_optim_parm(*10)
69 call print_general_data(*10)
70 call read_protein_data(*10)
71 write (iout,*) "Finished READ_PROTEIN_DATA"
73 call read_database(*10)
74 write (iout,*) "Finished READ_DATABASE"
77 c write (iout,*) Me,' calling PROC_GROUPS'
79 c write (iout,*) Me,' calling WORK_PARTITION_MAP'
80 c call work_partition_map(nvarr)
84 write (iout,*) "Exit pmfread"
87 c write (iout,*) "calling proc_data"
89 call proc_data(nvarr,x,*10)
90 c write (iout,*) "exit proc_data"
94 if (me.eq.Master) then
96 call maxlikopt(nvarr,x)
100 call jebadelko(nvarr)
103 call MPI_Finalize( IERROR )
108 10 write (iout,*) "Error termination of the program"
109 call MPI_Finalize( IERROR )
112 c------------------------------------------------------------------------------
116 parameter (ntasks=11)
117 include "DIMENSIONS.ZSCOPT"
122 double precision ttask_all(ntasks)
123 integer nctask_all(ntasks)
125 include "COMMON.IOUNITS"
127 double precision ttask
129 common /timing/ ttask(ntasks),nctask(ntasks)
130 character*16 tname(ntasks) /"function","gradient",9*''/
133 write (iout,'(80(1h-))')
135 write (iout,*) "Routine call info from the processor ",me," ..."
137 write (iout,*) "Routine call info ..."
140 write (iout,'(65(1h-))')
141 write (iout,100) "task"," # calls"," total time",
143 write (iout,'(65(1h-))')
145 write (iout,200) tname(i),nctask(i),ttask(i),
146 & ttask(i)/(nctask(i)+1.0d-10)
150 call MPI_Reduce(ttask(1),ttask_all(1),ntasks,
151 & MPI_DOUBLE_PRECISION, MPI_SUM, Master, WHAM_COMM,IERROR)
152 call MPI_Reduce(nctask(1),nctask_all(1),ntasks,
153 & MPI_INTEGER, MPI_SUM, Master, WHAM_COMM,IERROR)
154 if (Me.eq.Master) then
155 write (iout,'(80(1h-))')
156 write (iout,*) "Routine call info from all processors ..."
158 write (iout,'(65(1h-))')
159 write (iout,100) "task"," # calls"," total time",
161 write (iout,'(65(1h-))')
163 write (iout,200) tname(i),nctask_all(i),ttask_all(i),
164 & ttask_all(i)/(nctask_all(i)+1.0d-10)
170 100 format(a,t21,a,t31,a,t46,a)
171 200 format(a,t21,i10,f15.2,f15.8)
173 c------------------------------------------------------------------------------
175 subroutine proc_groups
176 C Split the processors into the Master and Workers group, if needed.
179 include "DIMENSIONS.ZSCOPT"
181 include "COMMON.IOUNITS"
183 include "COMMON.VMCPAR"
184 integer n,chunk,iprot,i,j,ii,remainder
185 integer kolor,key,ierror,errcode
188 C No secondary structure constraints.
194 c-------------------------------------------------------------------------------
195 subroutine work_partition(lprint)
196 c Split the conformations between processors
199 include "DIMENSIONS.ZSCOPT"
201 include "COMMON.CLASSES"
202 include "COMMON.IOUNITS"
204 include "COMMON.VMCPAR"
205 integer n,chunk,iprot,i,j,ii,remainder
206 integer kolor,key,ierror,errcode
209 C Divide conformations between processors; for each proteins the first and
210 C the last conformation to handle by ith processor is stored in
211 C indstart(i,iprot) and indend(i,iprot), respectively.
213 C First try to assign equal number of conformations to each processor.
217 write (iout,*) "Protein",iprot," n=",n
220 scount(0,iprot) = chunk
221 c print *,"i",0," indstart",indstart(0,iprot)," scount",
224 indstart(i,iprot)=chunk+indstart(i-1,iprot)
225 scount(i,iprot)=scount(i-1,iprot)
226 c print *,"i",i," indstart",indstart(i,iprot)," scount",
230 C Determine how many conformations remained yet unassigned.
232 remainder=N-(indstart(nprocs1-1,iprot)
233 & +scount(nprocs1-1,iprot)-1)
234 c print *,"remainder",remainder
236 C Assign the remainder conformations to consecutive processors, starting
237 C from the lowest rank; this continues until the list is exhausted.
239 if (remainder .gt. 0) then
241 scount(i-1,iprot) = scount(i-1,iprot) + 1
242 indstart(i,iprot) = indstart(i,iprot) + i
244 do i=remainder+1,nprocs1-1
245 indstart(i,iprot) = indstart(i,iprot) + remainder
249 indstart(nprocs1,iprot)=N+1
250 scount(nprocs1,iprot)=0
253 indend(i,iprot)=indstart(i,iprot)+scount(i,iprot)-1
254 idispl(i,iprot)=indstart(i,iprot)-1
259 N=N+indend(i,iprot)-indstart(i,iprot)+1
262 c print *,"N",n," NTOT",ntot_work(iprot)
263 if (N.ne.ntot_work(iprot)) then
264 write (iout,*) "!!! Checksum error on processor",me
266 call MPI_Abort( WHAM_COMM, Ierror, Errcode )
270 do i=1,ntot_work(iprot)
271 if (i.ge.indstart(me1,iprot) .and. i.le.indend(me1,iprot))
278 c write (iout,*) "i",i," iprot",iprot," i2ii",i2ii(i,iprot)
283 write (iout,*) "Partition of work between processors"
285 write (iout,*) "Protein",iprot
287 write (iout,*) "The i2ii array"
288 do j=1,ntot_work(iprot)
289 write (iout,*) j,i2ii(j,iprot)
293 write (iout,'(a,i5,a,i7,a,i7,a,i7)')
294 & "Processor",i," indstart",indstart(i,iprot),
295 & " indend",indend(i,iprot)," count",scount(i,iprot)
301 c------------------------------------------------------------------------------
302 subroutine jebadelko(nvarr)
305 include "DIMENSIONS.ZSCOPT"
307 include "COMMON.IOUNITS"
309 include "COMMON.VMCPAR"
310 include "COMMON.CLASSES"
311 include "COMMON.OPTIM"
312 include "COMMON.WEIGHTS"
313 include "COMMON.WEIGHTDER"
314 include "COMMON.ENERGIES"
315 include "COMMON.TIME1"
316 include "COMMON.PROTNAME"
317 include "COMMON.PROTFILES"
318 include "COMMON.TORSION"
319 include "COMMON.COMPAR"
320 integer What, TAG, IERROR, status(MPI_STATUS_SIZE), istop, iprot,
321 & nvarr, nf, errcode, ider
323 double precision x(max_paropt), g(max_paropt), viol
327 double precision rdum,rdif,chisquare_force
328 double precision tcpu,t1,t1w,t1_ini,t1w_ini
333 write(iout,*) "Processor",me,me1," called JEBADELKO"
335 if (me.eq.Master) then
337 call func1(nvarr,istop,x)
340 write (iout,*) "ELOWEST at slave starting JEBADELKO"
342 do ibatch=1,natlike(iprot)+2
343 do ib=1,nbeta(ibatch,iprot)
344 write (iout,*) "iprot",iprot," ibatch",ibatch," ib",ib,
345 & " elowest",elowest(ib,ibatch,iprot)
351 t1w_ini = MPI_WTIME()
353 do while (istop.ne.0)
355 write (iout,*) "ELOWEST at slave calling FUNC1 from JBADELKO"
357 do ibatch=1,natlike(iprot)+2
358 do ib=1,nbeta(ibatch,iprot)
359 write (iout,*) "iprot",iprot," ibatch",ibatch," ib",ib,
360 & " elowest",elowest(ib,ibatch,iprot)
365 call func1(nvarr,istop,x)
366 c write (iout,*) "slave: after func1"
369 if (istop.eq.1 .and. mod_fourier(nloctyp).gt.0) then
370 rdum = rdif(nvarr,x,g,ider)
371 c write (iout,*) "slave: after rdif"
375 if (istop.eq.1 .or. istop.eq.2 .or. istop.eq.3) then
376 c write (iout,*) "slave: calling chisquare_force"
377 rdum = chisquare_force(nvarr,x,g,ider)
378 c write (iout,*) "slave: after chisquare_force"
383 t1w = mpi_wtime() - t1w_ini
386 write (iout,*) "CPU time",t1," wall clock time",t1w
391 write (iout,*) "Energies of processor",me
394 write (iout,*) "Protein ",protname(iprot)
396 if (i.ge.indstart(me1,j).and.i.le.indend(me1,j)) then
397 write(iout,*)i,e_total(i,j),rmstb(i,j),iscore(i,0,j)
403 if (maxlik(iprot)) then
404 write (iout,*) "Deleting scratchfile",bprotfiles(iprot)
405 inquire (file=bprotfiles(iprot),number=iun,opened=op)
406 write (iout,*) "unit",iun," icbase",icbase
408 open (icbase,file=bprotfiles(iprot),status="old",
409 & form="unformatted",access="direct",recl=lenrec(iprot))
410 close(icbase,status="delete")
412 close(iun,status="delete")
415 if (.not.mod_other_params) then
416 write (iout,*) "Deleting scratchfile",benefiles(iprot)
417 inquire (file=benefiles(iprot),number=iun,opened=op)
418 write (iout,*) "unit",iun," ientout",icbase
420 open (ientout,file=benefiles(iprot),status="old",
421 & form="unformatted",access="direct",recl=lenrec_ene(iprot))
422 close(ientout,status="delete")
424 close (iun,status="delete")
429 if (fmatch(iprot)) then
430 write (iout,*) "Deleting scratchfile",bprotfiles_MD(iprot)
431 inquire (file=bprotfiles_MD(iprot),number=iun,opened=op)
432 write (iout,*) "unit",iun," icbase",icbase
434 open (icbase,file=bprotfiles_MD(iprot),status="old",
435 & form="unformatted",access="direct",recl=lenrec_MD(iprot))
436 close(icbase,status="delete")
438 close(iun,status="delete")
441 if (.not.mod_other_params) then
442 write (iout,*) "Deleting scratchfile",bforcefiles(iprot)
443 inquire (file=bforcefiles(iprot),number=iun,opened=op)
444 write (iout,*) "unit",iun," ientout",icbase
446 open (ientout,file=bforcefiles(iprot),status="old",
447 & form="unformatted",access="direct",recl=lenrec_forces(iprot))
448 close(ientout,status="delete")
450 close (iun,status="delete")
456 write (iout,*) "Processor",me,"leaves JEBADELKO"