from common import *
import sys
def serialize():
''' Execute body of for loop for each rank in order. Hopefully
printing will also be segregated and in order
'''
for r in range(nhost):
pc.barrier()
if r == rank:
yield r
sys.stdout.flush()
pc.barrier()
def group_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 in range(ngroup):
pc.barrier()
if r == rank%ngroup:
yield (rank/ngroup, r)
sys.stdout.flush()
pc.barrier()
def finish():
''' proper way to quit '''
if nhost > 0:
pc.runworker()
pc.done()
print 'total elapsed time ', h.startsw()-startsw
h.quit()
elapsedtime=h.startsw()
def elapsed(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()
def progress(pinvl, swlast):
sw = h.startsw()
print "t=%g wall interval %g"% (h.t, sw-swlast)
h.cvode.event(h.t+pinvl, (progress, (pinvl , sw)))
def show_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()