2 RECURSIVE SUBROUTINE wclock_on (ng, model, region, line, routine)
42 integer,
intent(in) :: ng, model, region, line
44 character (len=*),
intent(in) :: routine
48 integer :: iregion, mymodel, nsub
54 integer :: mycomm, npets, petrank
57 integer,
parameter :: pspv = 0
58 integer,
allocatable :: pids(:)
61 real(r8),
dimension(2) :: wtime
70 WRITE (
stdout,
'(a,a)')
'==> Entering ', trim(routine)
79 mycomm=full_comm_world
103 IF ((region.eq.0).and.(
proc(1,mymodel,ng).eq.0))
THEN
105 cend(iregion,mymodel,ng)=0.0_r8
106 csum(iregion,mymodel,ng)=0.0_r8
116 IF (.not.
allocated(pids))
THEN
117 allocate ( pids(npets) )
120 pids(petrank+1)=
proc(0,mymodel,ng)
121 CALL mp_collect (ng, model, npets, pspv, pids, mycomm)
124 WRITE (
stdout,10)
' Node #', node-1, &
125 &
' (pid=',pids(node),
') is active.'
128 IF (
allocated(pids))
deallocate (pids)
130 WRITE (
stdout,10)
' Node #', petrank, &
131 &
' (pid=',
proc(0,mymodel,ng),
') is active.'
136 &
' (pid=',
proc(0,mymodel,ng),
') is active.'
139 10
FORMAT (a,i5,a,i8,a)
147 RECURSIVE SUBROUTINE wclock_off (ng, model, region, line, routine)
180 integer,
intent(in) :: ng, model, region, line
182 character (len=*),
intent(in) :: routine
186 integer :: ig, imodel, iregion, mymodel, nsub
188 integer :: mycomm, npets, petrank
195 real(r8) :: percent, sumcpu, sumper, sumsum, total
197 real(r8),
dimension(2) :: wtime
202 real(r8) :: tendmin, tendmax
204 real(r8),
parameter :: tspv = 0.0_r8
205 real(r8),
allocatable :: tend(:)
206 real(r8),
dimension(0:Nregion) :: rbuffer
208 character (len= 3),
dimension(0:Nregion) :: op_handle
210 character (len=14),
dimension(4) :: label
218 WRITE (
stdout,
'(a,a)')
'<== Exiting ', trim(routine)
227 mycomm=full_comm_world
248 IF (region.ne.0)
THEN
249 cend(region,mymodel,ng)=
cend(region,mymodel,ng)+ &
251 &
cstr(region,mymodel,ng))
259 IF ((region.eq.0).and.(
proc(1,mymodel,ng).eq.1))
THEN
265 cend(region,mymodel,ng)=
cend(region,mymodel,ng)+ &
267 &
cstr(region,mymodel,ng))
280 IF (.not.
allocated(tend))
THEN
281 allocate ( tend(npets) )
284 tend(petrank+1)=
cend(region,mymodel,ng)
285 CALL mp_collect (ng, model, npets, tspv, tend, mycomm)
291 WRITE (
stdout,10)
' Node #', node-1, &
292 &
' CPU:', tend(node)
296 WRITE (
stdout,10)
' Node #', petrank, &
297 &
' CPU:', tend(petrank+1)
302 &
cend(region,mymodel,ng)
304 10
FORMAT (a,i5,a,f12.3)
312 csum(iregion,imodel,ng)=
csum(iregion,imodel,ng)+ &
313 &
cend(iregion,imodel,ng)
325 rbuffer(iregion)=
csum(iregion,imodel,ng)
328 & op_handle(0:), mycomm)
330 csum(iregion,imodel,ng)=rbuffer(iregion)
342 &
csum(iregion,imodel,ng)
347 20
FORMAT (a,t18,f14.3)
351 WRITE (
stdout,20)
' Minimum:', tendmin
352 WRITE (
stdout,20)
' Maximum:', tendmax
359 IF (
allocated(tend))
deallocate (tend)
366 label(
inlm)=
'Nonlinear '
367 label(
itlm)=
'Tangent linear'
368 label(
irpm)=
'Representer '
369 label(
iadm)=
'Adjoint '
372 WRITE (
stdout,30) trim(label(imodel)), &
373 &
'model elapsed CPU time profile, Grid:',&
375 30
FORMAT (/,1x,a,1x,a,1x,i2.2/)
380 IF (
master.and.(
csum(iregion,imodel,ng).gt.0.0_r8))
THEN
383 &
csum(iregion,imodel,ng), percent
384 sumcpu=sumcpu+
csum(iregion,imodel,ng)
385 sumper=sumper+percent
389 40
FORMAT (2x,a,t53,f14.3,2x,
'(',f7.4,
' %)')
391 WRITE (
stdout,50) sumcpu, sumper
392 50
FORMAT (t47,
'Total:',f14.3,2x,f8.4,
' %')
406 &
'Unique kernel(s) regions profiled ................',&
407 & f14.3,2x,f8.4,
' %'/,2x, &
408 &
'Residual, non-profiled code ......................',&
409 & f14.3,2x,f8.4,
' %'/)
411 70
FORMAT (/,
' All percentages are with respect to', &
412 &
' total time =',5x,f12.3,/)
422 total=total+
csum(iregion,imodel,ng)
425 IF (
master.and.(total.gt.0.0_r8))
THEN
426 WRITE (
stdout,30)
'Variational', &
427 &
'data assimilation profile, Grid:', ng
429 IF (total.gt.0.0_r8)
THEN
435 sumcpu=sumcpu+
csum(iregion,imodel,ng)
437 IF (
master.and.(sumcpu.gt.0.0_r8))
THEN
441 sumper=sumper+percent
444 IF (
master.and.(total.gt.0.0_r8))
THEN
446 80
FORMAT (t47,
'Total:',f14.3)
456 total=total+
csum(iregion,imodel,ng)
459 IF (
master.and.(total.gt.0.0_r8))
THEN
462 IF (total.gt.0.0_r8)
THEN
468 sumcpu=sumcpu+
csum(iregion,imodel,ng)
470 IF (
master.and.(sumcpu.gt.0.0_r8))
THEN
474 sumper=sumper+percent
477 IF (
master.and.(total.gt.0.0_r8))
THEN
478 WRITE (
stdout,50) sumsum, sumper
489 total=total+
csum(iregion,imodel,ng)
492 IF (
master.and.(total.gt.0.0_r8))
THEN
494 &
'communications profile, Grid:', ng
496 IF (total.gt.0.0_r8)
THEN
502 sumcpu=sumcpu+
csum(iregion,imodel,ng)
504 IF (
master.and.(sumcpu.gt.0.0_r8))
THEN
508 sumper=sumper+percent
511 IF (
master.and.(total.gt.0.0_r8))
THEN
512 WRITE (
stdout,50) sumsum, sumper
526 total=total+
csum(iregion,imodel,ig)
530 IF (
master.and.(total.gt.0.0_r8))
THEN
532 &
'communications profile over all nested grids:'
533 90
FORMAT (/,1x,a,1x,a,/)
535 IF (total.gt.0.0_r8)
THEN
542 sumcpu=sumcpu+
csum(iregion,imodel,ig)
545 IF (
master.and.(sumcpu.gt.0.0_r8))
THEN
549 sumper=sumper+percent
552 IF (
master.and.(total.gt.0.0_r8))
THEN
553 WRITE (
stdout,50) sumsum, sumper