from common import *
import sys
defserialize():
''' Execute body of for loop for each rank in order. Hopefully
printing will also be segregated and in order
'''for r inrange(nhost):
pc.barrier()
if r == rank:
yield r
sys.stdout.flush()
pc.barrier()
defgroup_serialize(ngroup=nhost):
''' Execute body of for loop for ngroups of contiguous ranks.
The ranks in each group is sequentially executed. Within each barrier,
one rank in every group is executed in parallel.
'''for r inrange(ngroup):
pc.barrier()
if r == rank%ngroup:
yield (rank/ngroup, r)
sys.stdout.flush()
pc.barrier()
deffinish():
''' proper way to quit '''if nhost > 0:
pc.runworker()
pc.done()
print'total elapsed time ', h.startsw()-startsw
h.quit()
elapsedtime=h.startsw()
defelapsed(message):
''' Rank 0 prints message and walltime elapsed since
previous call to this function.
'''global elapsedtime
if rank == 0:
print"%s elapsedtime %g"% (message, h.startsw() - elapsedtime)
elapsedtime = h.startsw()
defprogress(pinvl, swlast):
sw = h.startsw()
print"t=%g wall interval %g"% (h.t, sw-swlast)
h.cvode.event(h.t+pinvl, (progress, (pinvl , sw)))
defshow_progress(invl):
global fih
if rank == 0:
fih = h.FInitializeHandler(2, (progress, (invl, h.startsw())))
if __name__ == '__main__':
h.tstop = 1000
show_progress(200)
h.run()