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 & force matching optimization",
56 & " of UNRES energy function",
57 & " v. 01/12/20"/80(1h-))')
61 write (iout,*) "Finished READ_GENERAL_DATA"
64 call parmread(iparm,*10)
66 call read_pmf_data(*10)
67 write (iout,*) "Finished parmread"
69 call read_optim_parm(*10)
70 call print_general_data(*10)
71 call read_protein_data(*10)
72 write (iout,*) "Finished READ_PROTEIN_DATA"
74 call read_database(*10)
75 write (iout,*) "Finished READ_DATABASE"
78 c write (iout,*) Me,' calling PROC_GROUPS'
80 c write (iout,*) Me,' calling WORK_PARTITION_MAP'
81 c call work_partition_map(nvarr)
85 write (iout,*) "Exit pmfread"
88 c write (iout,*) "calling proc_data"
90 call proc_data(nvarr,x,*10)
91 c write (iout,*) "exit proc_data"
95 if (me.eq.Master) then
97 call maxlikopt(nvarr,x)
101 call jebadelko(nvarr)
104 call MPI_Finalize( IERROR )
109 10 write (iout,*) "Error termination of the program"
110 call MPI_Finalize( IERROR )
113 c------------------------------------------------------------------------------
117 parameter (ntasks=11)
118 include "DIMENSIONS.ZSCOPT"
123 double precision ttask_all(ntasks)
124 integer nctask_all(ntasks)
126 include "COMMON.IOUNITS"
128 double precision ttask
130 common /timing/ ttask(ntasks),nctask(ntasks)
131 character*16 tname(ntasks) /"function","gradient",9*''/
134 write (iout,'(80(1h-))')
136 write (iout,*) "Routine call info from the processor ",me," ..."
138 write (iout,*) "Routine call info ..."
141 write (iout,'(65(1h-))')
142 write (iout,100) "task"," # calls"," total time",
144 write (iout,'(65(1h-))')
146 write (iout,200) tname(i),nctask(i),ttask(i),
147 & ttask(i)/(nctask(i)+1.0d-10)
151 call MPI_Reduce(ttask(1),ttask_all(1),ntasks,
152 & MPI_DOUBLE_PRECISION, MPI_SUM, Master, WHAM_COMM,IERROR)
153 call MPI_Reduce(nctask(1),nctask_all(1),ntasks,
154 & MPI_INTEGER, MPI_SUM, Master, WHAM_COMM,IERROR)
155 if (Me.eq.Master) then
156 write (iout,'(80(1h-))')
157 write (iout,*) "Routine call info from all processors ..."
159 write (iout,'(65(1h-))')
160 write (iout,100) "task"," # calls"," total time",
162 write (iout,'(65(1h-))')
164 write (iout,200) tname(i),nctask_all(i),ttask_all(i),
165 & ttask_all(i)/(nctask_all(i)+1.0d-10)
171 100 format(a,t21,a,t31,a,t46,a)
172 200 format(a,t21,i10,f15.2,f15.8)
174 c------------------------------------------------------------------------------
176 subroutine proc_groups
177 C Split the processors into the Master and Workers group, if needed.
180 include "DIMENSIONS.ZSCOPT"
182 include "COMMON.IOUNITS"
184 include "COMMON.VMCPAR"
185 integer n,chunk,iprot,i,j,ii,remainder
186 integer kolor,key,ierror,errcode
189 C No secondary structure constraints.
195 c-------------------------------------------------------------------------------
196 subroutine work_partition(lprint)
197 c Split the conformations between processors
200 include "DIMENSIONS.ZSCOPT"
202 include "COMMON.CLASSES"
203 include "COMMON.IOUNITS"
205 include "COMMON.VMCPAR"
206 integer n,chunk,iprot,i,j,ii,remainder
207 integer kolor,key,ierror,errcode
210 C Divide conformations between processors; for each proteins the first and
211 C the last conformation to handle by ith processor is stored in
212 C indstart(i,iprot) and indend(i,iprot), respectively.
214 C First try to assign equal number of conformations to each processor.
218 write (iout,*) "Protein",iprot," n=",n
221 scount(0,iprot) = chunk
222 c print *,"i",0," indstart",indstart(0,iprot)," scount",
225 indstart(i,iprot)=chunk+indstart(i-1,iprot)
226 scount(i,iprot)=scount(i-1,iprot)
227 c print *,"i",i," indstart",indstart(i,iprot)," scount",
231 C Determine how many conformations remained yet unassigned.
233 remainder=N-(indstart(nprocs1-1,iprot)
234 & +scount(nprocs1-1,iprot)-1)
235 c print *,"remainder",remainder
237 C Assign the remainder conformations to consecutive processors, starting
238 C from the lowest rank; this continues until the list is exhausted.
240 if (remainder .gt. 0) then
242 scount(i-1,iprot) = scount(i-1,iprot) + 1
243 indstart(i,iprot) = indstart(i,iprot) + i
245 do i=remainder+1,nprocs1-1
246 indstart(i,iprot) = indstart(i,iprot) + remainder
250 indstart(nprocs1,iprot)=N+1
251 scount(nprocs1,iprot)=0
254 indend(i,iprot)=indstart(i,iprot)+scount(i,iprot)-1
255 idispl(i,iprot)=indstart(i,iprot)-1
260 N=N+indend(i,iprot)-indstart(i,iprot)+1
263 c print *,"N",n," NTOT",ntot_work(iprot)
264 if (N.ne.ntot_work(iprot)) then
265 write (iout,*) "!!! Checksum error on processor",me
267 call MPI_Abort( WHAM_COMM, Ierror, Errcode )
271 do i=1,ntot_work(iprot)
272 if (i.ge.indstart(me1,iprot) .and. i.le.indend(me1,iprot))
279 c write (iout,*) "i",i," iprot",iprot," i2ii",i2ii(i,iprot)
284 write (iout,*) "Partition of work between processors"
286 write (iout,*) "Protein",iprot
288 write (iout,*) "The i2ii array"
289 do j=1,ntot_work(iprot)
290 write (iout,*) j,i2ii(j,iprot)
294 write (iout,'(a,i5,a,i7,a,i7,a,i7)')
295 & "Processor",i," indstart",indstart(i,iprot),
296 & " indend",indend(i,iprot)," count",scount(i,iprot)
302 c------------------------------------------------------------------------------
303 subroutine jebadelko(nvarr)
306 include "DIMENSIONS.ZSCOPT"
308 include "COMMON.IOUNITS"
310 include "COMMON.VMCPAR"
311 include "COMMON.CLASSES"
312 include "COMMON.OPTIM"
313 include "COMMON.WEIGHTS"
314 include "COMMON.WEIGHTDER"
315 include "COMMON.ENERGIES"
316 include "COMMON.TIME1"
317 include "COMMON.PROTNAME"
318 include "COMMON.PROTFILES"
319 include "COMMON.TORSION"
320 include "COMMON.COMPAR"
321 integer What, TAG, IERROR, status(MPI_STATUS_SIZE), istop, iprot,
322 & nvarr, nf, errcode, ider
324 double precision x(max_paropt), g(max_paropt), viol
328 double precision rdum,rdif,chisquare_force
329 double precision tcpu,t1,t1w,t1_ini,t1w_ini
334 write(iout,*) "Processor",me,me1," called JEBADELKO"
336 if (me.eq.Master) then
338 call func1(nvarr,istop,x)
341 write (iout,*) "ELOWEST at slave starting JEBADELKO"
343 do ibatch=1,natlike(iprot)+2
344 do ib=1,nbeta(ibatch,iprot)
345 write (iout,*) "iprot",iprot," ibatch",ibatch," ib",ib,
346 & " elowest",elowest(ib,ibatch,iprot)
352 t1w_ini = MPI_WTIME()
354 do while (istop.ne.0)
356 write (iout,*) "ELOWEST at slave calling FUNC1 from JBADELKO"
358 do ibatch=1,natlike(iprot)+2
359 do ib=1,nbeta(ibatch,iprot)
360 write (iout,*) "iprot",iprot," ibatch",ibatch," ib",ib,
361 & " elowest",elowest(ib,ibatch,iprot)
366 call func1(nvarr,istop,x)
367 c write (iout,*) "slave: after func1"
370 if (istop.eq.1 .and. mod_fourier(nloctyp).gt.0) then
371 rdum = rdif(nvarr,x,g,ider)
372 c write (iout,*) "slave: after rdif"
376 if (istop.eq.1 .or. istop.eq.2 .or. istop.eq.3) then
377 c write (iout,*) "slave: calling chisquare_force"
378 rdum = chisquare_force(nvarr,x,g,ider)
379 c write (iout,*) "slave: after chisquare_force"
384 t1w = mpi_wtime() - t1w_ini
387 write (iout,*) "CPU time",t1," wall clock time",t1w
392 write (iout,*) "Energies of processor",me
395 write (iout,*) "Protein ",protname(iprot)
397 if (i.ge.indstart(me1,j).and.i.le.indend(me1,j)) then
398 write(iout,*)i,e_total(i,j),rmstb(i,j),iscore(i,0,j)
404 if (maxlik(iprot)) then
405 write (iout,*) "Deleting scratchfile",bprotfiles(iprot)
406 inquire (file=bprotfiles(iprot),number=iun,opened=op)
407 write (iout,*) "unit",iun," icbase",icbase
409 open (icbase,file=bprotfiles(iprot),status="old",
410 & form="unformatted",access="direct",recl=lenrec(iprot))
411 close(icbase,status="delete")
413 close(iun,status="delete")
416 if (.not.mod_other_params) then
417 write (iout,*) "Deleting scratchfile",benefiles(iprot)
418 inquire (file=benefiles(iprot),number=iun,opened=op)
419 write (iout,*) "unit",iun," ientout",icbase
421 open (ientout,file=benefiles(iprot),status="old",
422 & form="unformatted",access="direct",recl=lenrec_ene(iprot))
423 close(ientout,status="delete")
425 close (iun,status="delete")
430 if (fmatch(iprot)) then
431 write (iout,*) "Deleting scratchfile",bprotfiles_MD(iprot)
432 inquire (file=bprotfiles_MD(iprot),number=iun,opened=op)
433 write (iout,*) "unit",iun," icbase",icbase
435 open (icbase,file=bprotfiles_MD(iprot),status="old",
436 & form="unformatted",access="direct",recl=lenrec_MD(iprot))
437 close(icbase,status="delete")
439 close(iun,status="delete")
442 if (.not.mod_other_params) then
443 write (iout,*) "Deleting scratchfile",bforcefiles(iprot)
444 inquire (file=bforcefiles(iprot),number=iun,opened=op)
445 write (iout,*) "unit",iun," ientout",icbase
447 open (ientout,file=bforcefiles(iprot),status="old",
448 & form="unformatted",access="direct",recl=lenrec_forces(iprot))
449 close(ientout,status="delete")
451 close (iun,status="delete")
457 write (iout,*) "Processor",me,"leaves JEBADELKO"