1from mpi4py import MPI
2import sys, os, optparse
3
4assert __name__ == '__main__'
5from os.path import split, splitext, dirname, realpath
6dirname = dirname(__file__)
7assert sys.path[0] == realpath(dirname)
8if split(__file__)[1] == '__main__.py':
9    if splitext(dirname)[0] == '.zip':
10        assert sys.argv[0] == dirname
11    else:
12        assert realpath(sys.argv[0]) == realpath(dirname)
13else:
14    assert sys.argv[0] == __file__
15
16parser = optparse.OptionParser()
17parser.add_option("--rank", action='store',
18                  type='int', dest="rank", default=0)
19parser.add_option("--sys-exit", action='store',
20                  type='int', dest="sys_exit", default=None)
21parser.add_option("--sys-exit-msg", action="store",
22                  type="string", dest="sys_exit", default=None)
23parser.add_option("--exception", action="store",
24                  type="string", dest="exception", default=None)
25(options, args) = parser.parse_args()
26assert not args
27
28comm = MPI.COMM_WORLD
29if comm.rank == options.rank:
30    if options.sys_exit:
31        sys.exit(options.sys_exit)
32    if options.exception:
33        raise RuntimeError(options.exception)
34
35comm.Barrier()
36if comm.rank > 0:
37    comm.Recv([None, 'B'], comm.rank - 1)
38print("Hello, World!")
39if comm.rank < comm.size - 1:
40    comm.Send([None, 'B'], comm.rank + 1)
41comm.Barrier()
42
43sys.exit()
44