======== MPIutils ======== ``mpiutils`` is a submodule of ``SHIFT`` that enables ``MPI`` parallelisation in python. To use this functionality you will need to install ``mpi4py`` (`link `_). Since correct installation requires careful linking of the Message Passing Interface to ``mpi4py`` we leave the installation to the user and have choosen not to explicitly include ``mpi4py`` as a dependency to ``SHIFT``. In this way the MPI functionality will remain an optional extra. To install ``mpi4py`` please follow the instructions `here `_. Once ``mpi4py`` is installed the ``MPI`` utility class can be loaded simply by writing: .. code-block:: python import shift MPI = shift.mpiutils.MPI() To ensure python and ``numpy`` specifically do not carry out hidden parallelised processed in the background we should first set the threads to ``1`` by including this at the top of every script: .. code-block:: python import sys from os import environ # Set thread environment variables FIRST N_THREADS = '1' environ['OMP_NUM_THREADS'] = N_THREADS environ['OPENBLAS_NUM_THREADS'] = N_THREADS environ['MKL_NUM_THREADS'] = N_THREADS environ['VECLIB_MAXIMUM_THREADS'] = N_THREADS environ['NUMEXPR_NUM_THREADS'] = N_THREADS The ``MPI`` object can now be used in any of the MPI enabled routines. For example to construct a 3D grid split across several processes we can use the ``shift.cart.mpi_grid3D`` function which we will write to a script called ``example_grid3D.py``. .. code-block:: python import sys from os import environ # Set thread environment variables FIRST N_THREADS = '1' environ['OMP_NUM_THREADS'] = N_THREADS environ['OPENBLAS_NUM_THREADS'] = N_THREADS environ['MKL_NUM_THREADS'] = N_THREADS environ['VECLIB_MAXIMUM_THREADS'] = N_THREADS environ['NUMEXPR_NUM_THREADS'] = N_THREADS import shift MPI = shift.mpiutils.MPI() boxsize = 100. ngrid = 512 x3d, y3d, z3d = shift.cart.mpi_grid3D(boxsize, ngrid, MPI) To run, simply do: .. code-block:: bash mpirun -n 4 python example_grid3D.py where in this specific example the process is distributed across `4` processors. .. Note:: ``mpirun`` should be replaced with the correct mpi executable, for instance on some HPCs this should be ``srun``.