Skip to content

LLNL/ExaCA

Repository files navigation

ExaCA

An exascale-capable cellular automaton for nucleation and grain growth

ExaCA is a cellular automata (CA) code for grain growth under additive manufacturing conditions, created by ExaAM within the Exascale Computing Project.

Build

ExaCA uses Kokkos and MPI for parallelism and JSON for input files.

Dependencies

Dependency Version Required Details
CMake 3.11+ Yes Build system
Kokkos 4.0+ Yes Portable on-node parallelism
MPI GPU Aware if CUDA/HIP Enabled Yes Multi-node parallelism
json 3.10+ Yes Input parsing
GoogleTest 1.10+ No Unit test framework
CUDA 9+ No Programming model for NVIDIA GPUs
HIP 3.5+ No Programming model for AMD GPUs
Finch main No Heat transport model for coupled simulation

CMake must be available to build ExaCA and Kokkos. The underlying parallel programming models and MPI are available on most systems and can generally be found automatically by CMake. Note these dependencies must all be installed first, if not available. Kokkos is also available on many systems; if not, obtain the desired version:

git clone https://github.com/kokkos/kokkos.git --branch 4.0.00

Obtaining ExaCA

ExaCA is available on GitHub, by default starting from the current master branch:

git clone https://github.com/LLNL/ExaCA.git

Backend options

Note that ExaCA runs with the default enabled Kokkos backend (see https://github.com/kokkos/kokkos/wiki/Initialization).

ExaCA has been tested with the Serial, OpenMP, Threads, CUDA, and HIP backends.

Building Kokkos

Host build

If Kokkos is not already installed on your system, configure, build, and install Kokkos:

# Change this path to desired Kokkos installation location
export KOKKOS_INSTALL_DIR=`pwd`/install/kokkos
# Change this path to Kokkos source
cd ./kokkos
# Configure Kokkos
cmake \
  -B build \
  -D CMAKE_BUILD_TYPE="Release" \
  -D CMAKE_INSTALL_PREFIX=$KOKKOS_INSTALL_DIR \
  -D Kokkos_ENABLE_OPENMP=ON
# Build Kokkos
cmake --build build
# Install Kokkos
cmake --install build
cd ../

Note that there are other host backends available. Kokkos architecture flags can also be set to improve performance and must match the hardware you run on (e.g. -DKokkos_ARCH_POWER9=ON); see Kokkos architecture flag details.

CUDA build

Similar to the CPU build above, Kokkos can instead be configured and built for NVIDIA GPUs:

# Change this path to desired Kokkos installation location
export KOKKOS_INSTALL_DIR=`pwd`/install/kokkos
# Change this path to Kokkos source
cd ./kokkos
# Check the GPU architecture flag matches the hardware
# Configure Kokkos
cmake \
  -B build \
  -D CMAKE_BUILD_TYPE="Release" \
  -D CMAKE_INSTALL_PREFIX=$KOKKOS_INSTALL_DIR \
  -D Kokkos_ENABLE_CUDA=ON \
  -D Kokkos_ENABLE_CUDA_LAMBDA=ON \
  -D Kokkos_ARCH_VOLTA70=ON
# Build Kokkos
cmake --build build
# Install Kokkos
cmake --install build
cd ../

Note the two flags needed for the Kokkos::Cuda backend. The Kokkos architecture flag must match the hardware you run on. Kokkos will automatically redirect the (default) host compiler to nvcc in the example above. By default, the host will use Kokkos::Serial; other parallel host backends can also be used, e.g. by adding -D Kokkos_ENABLE_OPENMP as was done above.

HIP Build

To build Kokkos for HIP the hipcc compiler must be explicitly passed, along with architecture and backend flags analogous to the previous examples:

cd ./kokkos
# Configure Kokkos
cmake \
  -B build \
  -D CMAKE_BUILD_TYPE="Release" \
  -D CMAKE_CXX_COMPILER=hipcc \
  -D CMAKE_INSTALL_PREFIX=install \
  -D Kokkos_ENABLE_HIP=ON \
  -D Kokkos_ARCH_VEGA908=ON
# Build Kokkos
cmake --build build
# Install Kokkos
cmake --install build
cd ../

Build ExaCA

Once Kokkos and MPI are installed, ExaCA can be built:

# Change this path to desired ExaCA installation location
export EXACA_INSTALL_DIR=`pwd`/install/exaca
# Change this path to Kokkos installation location
export KOKKOS_INSTALL_DIR=`pwd`/install/kokkos

# Change this path to ExaCA source
# Configure ExaCA
cd ./ExaCA
cmake \
  -B build \
  -D CMAKE_BUILD_TYPE="Release" \
  -D CMAKE_PREFIX_PATH=$KOKKOS_INSTALL_DIR \
  -D CMAKE_INSTALL_PREFIX=$EXACA_INSTALL_DIR
# Build ExaCA
cmake --build build
# Install ExaCA
cmake --install build
cd ../

Kokkos will forward the compilation flags and details to ExaCA automatically.

Building with external JSON

By default, ExaCA will download the JSON library dependency used for input files. This automatic download does not work on all systems; a separate build of this library can be done instead. As with the dependencies described above, first obtain the source:

git clone https://github.com/nlohmann/json

And then build the json library (header only):

# Change this path to desired JSON installation location
export JSON_INSTALL_DIR=`pwd`/install/json

cd json
# Configure json
cmake \
  -B build \
  -D CMAKE_BUILD_TYPE="Release" \
  -D CMAKE_INSTALL_PREFIX=$JSON_INSTALL_DIR \
  -D JSON_BuildTests=OFF
# Build json
cmake --build build
# Install json
cmake --install build
cd ../

Then add this install path to the ExaCA configuration (example above) together with the path to Kokkos -D CMAKE_PREFIX_PATH="$KOKKOS_INSTALL_DIR;$JSON_INSTALL_DIR" and build ExaCA. Note that quotes are necessary for multiple paths.

Building with Finch

ExaCA can be compiled with Finch, a finite difference-based heat transport solver, for coupled heat transport and solidification simulation without the need to read time-temperature history data from file(s). The Finch source code and build instructions are available at https://github.com/ORNL-MDF/Finch. To compile ExaCA with Finch, include the path to the Finch install in the CMAKE_INSTALL_PREFIX. To require that ExaCA is compiled with Finch, add ExaCA_REQUIRE_FINCH=ON.

Testing ExaCA

Unit tests can be run if the ExaCA_ENABLE_TESTING CMake option is enabled in the build and if the GoogleTest framework is available on the system or built locally with the install path passed to ExaCA (see the previous section describing the JSON build and pointing ExaCA to the installation).

After building, tests can be run with cmake --build build --target test from the source directory (presuming build/ is the relative location of the build folder). Tests are automatically generated for all enabled Kokkos backend.

Running ExaCA

ExaCA runs using an input file, passed on the command line. Example problems are provided in the examples/ directory - a separate examples/README.md file goes into more detail on the problem types, the optional and required arguments needed for each problem type, and additional files used by ExaCA. The example input files present in this repository are:

  • Inp_DirSolidification.json: simulates grain growth from a surface with a fixed thermal gradient and cooling rate
  • Inp_SmallDirSolidification.json: a smaller and simpler version of the previous
  • Inp_SpotMelt.json: simulates overlapping spot melts with fixed a fixed thermal gradient and cooling rate
  • Inp_SmallSpotMelt.json: a smaller and simpler version of the previous

Example problems only possible with external data:

  • Inp_SingleLine.json: simulates melting and solidification of a single line of melt pool data
  • Inp_TwoLineTwoLayer.json: simulates two layers consisting of segments of two overlapping melt pools

Run by calling the created executable with an ExaCA input file:

mpiexec -n 1 ./build/install/bin/ExaCA examples/Inp_DirSolidification.json

Alternatively, the Finch-ExaCA executable can be used for coupled Finch-ExaCA simulations. Compilation with ExaCA_ENABLE_FINCH=ON is required for these examples with Finch in-memory coupling:

  • Inp_SmallFinch.json: simulates melting and solidification of a small melt pool segment at a coarse resolution
  • Inp_Finch.json: simulates melting and solidification of a small melt pool segment at a fine resolution, repeated for 3 layers

For coupled Finch-ExaCA runs, caution should be taken such that the cell size given in the CA input file matches that given in the Finch input file. Additionally, scan_path_file in the Finch input file (for Inp_Finch.json, this is examples/single_line/inputs_small_refined.json in the Finch repository and for Inp_SmallFinch.json, this is examples/single_line/inputs_small.json in the Finch repository) should be modified to represent a global path name. Run by calling the created executable with a Finch input file and an ExaCA input file on the command line, with the Finch input file listed first:

mpiexec -n 1 ./build/install/bin/Finch-ExaCA $PATH_TO_FINCH/examples/single_line/inputs_small.json examples/Inp_SmallFinch.json

Automated input file generation using Tasmanian (https://tasmanian.ornl.gov/)

Within the utilities directory, an example python script for the generation of an ensemble of input files is available. By running the example script TasmanianTest.py, 69 ExaCA input files are generated with a range of heterogeneous nucleation density, mean nucleation undercooling, and mean substrate grain size values, based on the ranges in python code (N0Min-N0Max, dTNMin-dTNMax, and S0Min-S0Max), respectively. Running the python script from the ExaCA source directory, via the command

python utilities/TasmanianTest.py PathToTemperatureFile1 PathToTemperatureFile2 ...

the script will generate an ensemble of input files in the examples directory, for a series of simulations that will use the thermal history or histories described in PathToTemperatureFile1(s) being repeated for a certain number of layers (56 in this example). If a simulation repeating multiple thermal histories is desired (for example, and even layer and an odd layer scan pattern), both paths to/file names of the thermal history data should be given on the command line. Running this code will generate N = 1 to 69 input files named examples/Inp_TasmanianTest_[N].json. Other CA inputs, such as the time step or cell size, must be adjusted manually inside of the python script. Separate instances of ExaCA can be run with each ensemble member to probe microstructure dependency on nucleation and substrate.

Output and post-processing analysis

If the "Print file of grain misorientations" option is turned on within an input file, ExaCA will output a scalar field "Angle_z" as a vtk file ending with "Misorientations.vtk". Angle_z corresponds to the orientation (in degrees) of a given grain relative to the positive Z direction in a simulation (the thermal gradient direction for directional solidification problems, the build/layer offset direction for other problems). Epitaxial grains (from the initial grain structure or powder layer) are assigned values between 0 and 62.7, while nucleated grains (not present in the initial grain structure) are assigned values between 100 and 162.7 (the offset of 100 is simply used to ensure the two types of grains are differentiated, but a nucleated grain with Angle_z = 135 actually has a misorientation of 35 degrees).

If the "Print Paraview vtk file" option is turned on within an input file, post-processing can be performed on the output data set. This functionality is a separate executable from ExaCA, located in the analysis/ directory and is linked to the ExaCA library for input utilities.

Specifying debug check options can be done to print various ExaCA data fields to files following simulation initialization. The "reduced" debug check will print "CritTimeStep" (the time step at which each cell goes below the liquidus for the final time), "LayerID" (the layer associated with each cell going below the liquidus for the final time, with layer 0 being the first layer, and -1 for all cells that did not undergo solidification) and "CellType" (integers corresponding to cell types specified in src/CAtypes.hpp). The "extensive" debug check will, in addition to the "reduced" data fields, also print "UndercoolingChange" (the rate at which a cell cools per time step after reaching its "CritTimeStep" value), "UndercoolingCurrent" (the initial undercooling of each cell), and "Melted" (1 for cells that are part of the melt pool, 0 for cells that are not).

ExaCA can optionally print the system state at intermediate time values as part of a series of vtk files that can be read by Paraview to make animations, if the "Print intermediate output frames" option is turned on. "Increment to separate frames" is the separation between intermediate output files in microseconds - if there is a long time period between solidification events (such as two overlapping melt pools formed via line scan with a long dwell time between them), setting "Intermediate output even if system is unchanged from previous state" to off will skip printing of those files.

Running ExaCA for the test problem Inp_DirSolidification.txt yields the output files TestProblemDirS.vtk (containing LayerID, GrainID, and Melted data) and TestProblemDirS.json (containing information regarding the simulation parameters used, simulation dimensions, and some timing data). To analyze this data, run ExaCA-GrainAnalysis (installed in the same location as ExaCA), with two command line arguments: the first being the path to/name of the analysis input file, and the second being the path to and filename (excluding extensions) of the .vtk and .json files associated with the data set of interest.

./build/install/bin/grain_analysis analysis/examples/AnalyzeDirS.json TestProblemDirS

Within the analysis/examples directory, there are example analysis input files. Note that the microstructure data files TestProblemDirS.vtk and TestProblemDirS.json must both be in the location given on the command line.

The analysis executable, in addition to outputting grain statistics, can also output files that can be further post-processing in Matlab using the MTEX toolbox to generate pole figures, inverse pole figures, and inverse pole figure-colored cross-sections. More details on this are provided in analysis/README.md

Citing ExaCA

If you use ExaCA in your work, please cite the following paper. In addition, cite the current release or version used from Zenodo.

Publications using ExaCA

In addition to the primary ExaCA citation, this list of articles use ExaCA in their work.

Contributing

We encourage you to contribute to ExaCA. Please check the contribution guidelines.

License

ExaCA is distributed under an MIT license.

Release

LLNL-CODE-821827