Building MFIX-Exa ================== This page gives the generic instructions for building MFIX-Exa using gmake and cmake. For HPC cluser specific instructions, please refer to :ref:`GettingStarted:HPC`. Building with gmake -------------------- If you want to use gmake to build MFIX_Exa, you will need to clone amrex and AMReX-Hydro into a local directories, and also clone mfix: .. code:: shell > git clone https://github.com/AMReX-Codes/amrex.git > git clone https://github.com/AMReX-Codes/AMReX-Hydro.git > git clone http://mfix.netl.doe.gov/gitlab/exa/mfix.git > cd mfix/exec Then, edit the GNUmakefile (or set an environment variable) to define AMREX_HOME and AMREX_HYDRO_HOME to be the path to the directories where you have put amrex and AMReX-Hydro. Note that the default locations of AMREX_HOME and AMREX_HYDRO_HOME are in the subprojects directory, which is where a cmake configuration may clone these repositories. Other options that you can set include +-----------------+----------------------------------+------------------+-------------+ | Option name | Description | Possible values | Default | | | | | value | +=================+==================================+==================+=============+ | COMP | Compiler (gnu or intel) | gnu / intel | gnu | +-----------------+----------------------------------+------------------+-------------+ | USE_MPI | Enable MPI | TRUE / FALSE | FALSE | +-----------------+----------------------------------+------------------+-------------+ | USE_OMP | Enable OpenMP | TRUE / FALSE | FALSE | +-----------------+----------------------------------+------------------+-------------+ | USE_CSG | Enable CSG geometry file support | TRUE / FALSE | FALSE | +-----------------+----------------------------------+------------------+-------------+ | USE_CUDA | Enable CUDA GPU support | TRUE / FALSE | FALSE | +-----------------+----------------------------------+------------------+-------------+ | USE_HIP | Enable HIP GPU support | TRUE / FALSE | FALSE | +-----------------+----------------------------------+------------------+-------------+ | USE_DPCPP | Enable DPCPP GPU support | TRUE / FALSE | FALSE | +-----------------+----------------------------------+------------------+-------------+ | USE_HYPRE | Enable HYPRE support | TRUE / FALSE | FALSE | +-----------------+----------------------------------+------------------+-------------+ | DEBUG | Create a DEBUG executable | TRUE / FALSE | FALSE | +-----------------+----------------------------------+------------------+-------------+ | PROFILE | Include profiling info | TRUE / FALSE | FALSE | +-----------------+----------------------------------+------------------+-------------+ | TRACE_PROFILE | Include trace profiling info | TRUE / FALSE | FALSE | +-----------------+----------------------------------+------------------+-------------+ | COMM_PROFILE | Include comm profiling info | TRUE / FALSE | FALSE | +-----------------+----------------------------------+------------------+-------------+ | TINY_PROFILE | Include tiny profiling info | TRUE / FALSE | FALSE | +-----------------+----------------------------------+------------------+-------------+ | DIM | Dimensionality of problem | 2 / 3 | 3 | +-----------------+----------------------------------+------------------+-------------+ .. note:: **Do not set both USE_OMP and USE_CUDA/HIP/DPCPP to true.** Then type .. code:: shell > make -j An executable will appear; the executable name will reflect some of the build options above. Building with cmake -------------------- CMake build is a two-step process. First ``cmake`` is invoked to create configuration files and makefiles in a chosen directory (``builddir``). Next, the actual build is performed by invoking ``make`` from within ``builddir``. If you are new to CMake, `this short tutorial `_ from the HEP Software foundation is the perfect place to get started with it. The CMake build process for MFIX-Exa is summarized as follows: .. highlight:: console :: >> mkdir /path/to/builddir >> cd /path/to/builddir >> cmake [options] -DCMAKE_BUILD_TYPE=[Debug|Release|RelWithDebInfo|MinSizeRel] /path/to/mfix >> make In the above snippet, ``[options]`` indicates one or more options for the customization of the build, as described later in this section. If the option ``CMAKE_BUILD_TYPE`` is omitted, ``CMAKE_BUILD_TYPE=Release`` is assumed. There are two modes to build MFIX-Exa with cmake: o **SUPERBUILD (recommended):** The AMReX and AMReX-Hydro git repos are cloned and built as part of the MFIX-Exa build process and placed in the ``mfix/subprojects`` directory. Each of these repos can be manipulated like a regular git repo (you can change branches, hashes, add remotes, etc.) This method is strongly encouraged as it ensures that the configuration options for MFIX-Exa are compatible with the AMReX and AMReX-Hydro hashes that are checked out. o **STANDALONE:** MFIX-Exa source code is built separately and linked to existing AMReX and AMReX-Hydro repos. This is ideal for continuous integration severs (CI) and regression testing applications. AMReX and AMReX_Hydro library versions and configuration options must meet MFIX-Exa requirements. .. note:: **MFIX-Exa requires CMake 3.20 or higher.** .. _sec:build:superbuild: SUPERBUILD Instructions (recommended) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< By default MFIX-Exa CMake looks for an existing AMReX installation on the system. If none is found, it falls back to **SUPERBUILD** mode. In this mode, MFIX-Exa CMake inherents AMReX CMake targets and configuration options, that is, MFIX-Exa and AMReX are configured and built as a single entity Assuming no valid AMReX installation is present on the target system, and ``AMReX_ROOT`` is not set (see :ref:`sec:build:standalone`), the following code will build MFIX-Exa in **SUPERBUILD** mode: .. code:: shell > git clone http://mfix.netl.doe.gov/gitlab/exa/mfix.git > cd mfix > mkdir build > cd build > cmake [mfix options] [amrex options] -DCMAKE_BUILD_TYPE=[Debug|Release|RelWithDebInfo|MinSizeRel] .. > make -j ``[amrex options]`` in the snippet above is a list of any of the AMReX configuration options listed in the `AMReX user guide `_, while ``[mfix options]`` is any of the configuration options listed :ref:`here `. For example, to enable AMReX profiling capabilities in MFIX_Exa, configure as follows: .. code:: shell > cmake [mfix options] -DAMReX_TINY_PROFILE=yes -DCMAKE_BUILD_TYPE=[Debug|Release|RelWithDebInfo|MinSizeRel] .. Working with the AMReX submodule >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> **SUPERBUILD** mode relies on a git submodule to checkout the AMReX git repository. If the AMReX submodule is not initialized, **SUPERBUILD** mode will initialize it and checkout the AMReX commit the submodule is pointing to. Instead, if the AMReX submodule has already been manually initialized and a custom commit has been checked out, **SUPERBUILD** mode will use that commit. For MFIX-Exa development or testing, you may need to build with a different branch or release of AMReX. The ``subprojects/amrex`` directory is a Git repo, so use all standard Git commands. Either ``cd subprojects/amrex`` to run Git commands in the ``amrex`` directory, or use ``git -C subprojects/amrex`` in the MFIX-Exa repo. For instance, to build with the ``my-amrex-branch`` branch of the AMReX repo: .. code:: shell > cd /path/to/mfix > git -C subprojects/amrex checkout my-amrex-branch > git status ... modified: subprojects/amrex (new commits) The branch ``my-amrex-branch`` will then be used when building MFIX-Exa. To revert to the default version of the AMReX submodule, run ``git submodule update``: .. code:: shell > cd /path/to/mfix > git submodule update You can edit, commit, pull, and push AMReX changes from ``subprojects/amrex``. AMReX development is outside the scope of this document. Run ``git status`` in the top-level MFix-Exa repo to see whether the AMReX submodule has new commits, modified files, or untracked files. To update the AMReX submodule referenced by MFIX-Exa: .. code:: shell > git -C subprojects/amrex checkout UPDATED_AMREX_COMMIT_SHA1 > git add subprojects/amrex > git commit -m 'Updating AMReX version' This will only update the AMReX SHA-1 referenced by MFIX-Exa. Uncommitted AMReX changes and untracked AMReX files under ``subprojects/amrex`` are not added by ``git add subprojects/amrex``. (To commit to the AMReX repo, change directories to ``subprojects/amrex`` and run Git commands there, before ``git add subprojects/amrex``.) .. note:: Only update the AMReX submodule reference in coordination with the other MFIX-Exa developers! .. _sec:build:standalone: STANDALONE instructions <<<<<<<<<<<<<<<<<<<<<<< Building AMReX >>>>>>>>>>>>>> Clone AMReX from the official Git repository. Note that the only branch available is *development*: .. code:: shell > git clone https://github.com/AMReX-Codes/amrex.git Next, configure, build and install AMReX as follows: .. code:: shell > cd amrex > mkdir build > cd build > cmake -DCMAKE_BUILD_TYPE=[Debug|Release|RelWithDebInfo|MinSizeRel] -DAMReX_PARTICLES=yes -DAMReX_EB=yes -DAMReX_PLOTFILE_TOOLS=yes [other amrex options] -DCMAKE_INSTALL_PREFIX:PATH=/absolute_path_to_amrex_installdir .. > make install The options **AMReX\_PARTICLES=yes**, **AMReX\_EB=yes** and **AMReX\_PLOTFILE\_TOOLS=yes** are required by MFIX-Exa. ``[other amrex options]`` in the snippet above refers to any other AMReX configuration option in addition to the required ones. Please refer to the `AMReX user guide `_ for more details on building AMReX with CMake. Building MFIX-Exa >>>>>>>>>>>>>>>>> Clone and build MFIX-Exa: .. code:: shell > git clone http://mfix.netl.doe.gov/gitlab/exa/mfix.git > mkdir build > cd build > cmake -DCMAKE_BUILD_TYPE=[Debug|Release|RelWithDebInfo|MinSizeRel] [mfix options] -DAMReX_ROOT=/absolute/path/to/amrex/installdir .. > make -j Passing ``-DAMReX_ROOT=/absolute/path/to/amrex/installdir`` instructs CMake to search ``/absolute/path/to/amrex/installdir`` before searching system paths for an available AMReX installation. ``AMReX_ROOT`` can also be set as an environmental variable instead of passing it as a command line option. ``[mfix options]`` indicates any of the configuration option listed in the table below. .. _tab:mfixcmakeoptions: .. table:: MFIX-Exa configuration options +-----------------+------------------------------+------------------+-------------+ | Option name | Description | Possible values | Default | | | | | value | +=================+==============================+==================+=============+ | CMAKE\_CXX\ | User-defined C++ flags | valid C++ | None | | _FLAGS | | compiler flags | | +-----------------+------------------------------+------------------+-------------+ | CMAKE\_CUDA\ | User-defined CUDA flags | valid CUDA | None | | _FLAGS | | compiler flags | | +-----------------+------------------------------+------------------+-------------+ | MFIX\_MPI | Enable build with MPI | no/yes | yes | | | | | | +-----------------+------------------------------+------------------+-------------+ | MFIX\_OMP | Enable build with OpenMP | no/yes | no | | | | | | +-----------------+------------------------------+------------------+-------------+ | MFIX\_GPU\_ | On-node, accelerated GPU \ | NONE,SYSCL,\ | NONE | | BACKEND | backend | CUDA,HIP | | +-----------------+------------------------------+------------------+-------------+ | MFIX\_HYPRE | Enable HYPRE support | no/yes | no | | | | | | +-----------------+------------------------------+------------------+-------------+ | MFIX\_FPE | Build with Floating-Point | no/yes | no | | | Exceptions checks | | | +-----------------+------------------------------+------------------+-------------+ | MFIX\_CSG | Build with CSG support | no/yes | no | | | | | | +-----------------+------------------------------+------------------+-------------+ | MFIX\_MPI\_ | Concurrent MPI calls from | no/yes | no | | THREAD\_MULTIPLE| multiple threads | | | | | | | | | | | | | +-----------------+------------------------------+------------------+-------------+ Few more notes on building MFIX-Exa with cmake <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< The system defaults compilers can be overwritten as follows: .. code:: shell > cmake -DCMAKE_CXX_COMPILER= [options] .. When building on a platform that uses the ``module`` utility, use either the above command (with full path to the compilers) or the following: .. code:: shell > cmake -DCMAKE_CXX_COMPILER=CC [options] .. MFIX-Exa uses the same compiler flags used to build AMReX, unless ``CMAKE_CXX_FLAGS`` is explicitly provided, or the environmental variable ``CXXFLAGS`` is set. For GPU builds, MFIX-Exa relies on the `AMReX GPU build infrastructure `_ . The target architecture to build for can be specified via the AMReX configuration option ``-DAMReX_CUDA_ARCH=``, or by defining the *environmental variable* ``AMREX_CUDA_ARCH`` (all caps). If no GPU architecture is specified, CMake will try to determine which GPU is supported by the system.