Running MOOSE Simulations

The multifid-th repository consumes MOOSE outputs but does not ship a MOOSE runtime. The ETL pipeline (src/cases/moose_grid/, src/cases/alpha_d/etl/) expects Exodus .e files plus CSV probes that already exist on disk; producing them is a separate, out-of-band step that needs its own toolchain (OpenMPI, libMesh, PETSc, the MOOSE framework itself).

The canonical multifid-th containers (multifid-th-cpu.sif, multifid-th-gpu.sif, etc., described in Getting Started) provide the Python / PhysicsNeMo stack used for training and evaluation. They are deliberately MOOSE-free to keep image size manageable and the two stacks decoupled.

For authoritative MOOSE installation guidance always defer to the official documentation at https://mooseframework.inl.gov/getting_started/installation/index.html. The rest of this page documents only the container path that the multifid-th project tests against on HPC.

INL Apptainer container (preferred on INL HPC)

MOOSE’s INL build pipeline publishes pre-built Apptainer images to mooseharbor.hpc.inl.gov. This is the fastest way to get a working MOOSE on a Linux HPC node and is what the multifid-th ETL pipeline is exercised against.

Obtain the SIF

The project’s reference recipe is /data/lim2/containers/moose-dev-openmpi-x86_64.def (committed locally, not in this repo). It bootstraps from the INL ORAS registry:

BootStrap: oras
From: mooseharbor.hpc.inl.gov/moose-dev/moose-dev-openmpi-x86_64:next-2026.01.27

Build it once:

apptainer build moose-dev-openmpi-x86_64.sif \
    /data/lim2/containers/moose-dev-openmpi-x86_64.def

The first build pulls the base image from mooseharbor.hpc.inl.gov, which requires INL-NCRC credentials (MOOSE-NCRC SIF signing key, fingerprint 0CFFCAB55E806363601C442D211817B01E0911DB). Non-INL users should pick one of the other install paths below.

The recipe also installs pyfmi from conda-forge and shrinks the image via conda clean -a -y. A pyfmi-augmented variant is also available locally as /data/lim2/containers/moose-dev-openmpi-x86_64_pyfmi.sif.

Run a MOOSE input file

# Bind the project so the container can see inputs / outputs:
apptainer exec \
    --bind /path/to/project:/path/to/project \
    /data/lim2/containers/moose-dev-openmpi-x86_64.sif \
    moose-opt -i path/to/input.i

moose-opt is the standard launcher for a built MOOSE application inside the container; for parallel runs prefix with mpiexec:

apptainer exec --bind /path/to/project:/path/to/project \
    /data/lim2/containers/moose-dev-openmpi-x86_64.sif \
    mpiexec -n 8 moose-opt -i path/to/input.i

If you are running a downstream app rather than core MOOSE (e.g. a custom executable built against MOOSE), invoke that binary instead — the container provides the libMesh / PETSc / OpenMPI runtime it links against. See MOOSE’s HPC install guide for app-build patterns inside containers.

Verify the container

apptainer exec /data/lim2/containers/moose-dev-openmpi-x86_64.sif \
    bash -lc 'which moose-opt && moose-opt --version'

Alternative install paths

The multifid-th pipeline does not care how you produced the Exodus files, only that they exist on disk in the layout the ETL configs expect. Any of MOOSE’s officially supported install methods is fine:

Path

When to use

Official guide

Conda (Linux/macOS)

Local development on a workstation; no admin needed

https://mooseframework.inl.gov/getting_started/installation/conda.html

Conda pre-built MOOSE binary

Training / quick onboarding; no compilation

https://mooseframework.inl.gov/getting_started/installation/moose_conda_binary.html

Docker

Reproducible local builds; cross-platform

https://mooseframework.inl.gov/getting_started/installation/docker.html

WSL

Windows host

https://mooseframework.inl.gov/getting_started/installation/windows.html

Build from source (GCC)

Custom compiler flags, downstream-app development

https://mooseframework.inl.gov/getting_started/installation/manual_installation_gcc.html

Build from source (LLVM)

LLVM/Clang toolchains

https://mooseframework.inl.gov/getting_started/installation/manual_installation_llvm.html

Offline / air-gapped

No internet on target machine

https://mooseframework.inl.gov/getting_started/installation/offline_installation.html

For a quick local conda install on Linux, the official commands are:

curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
bash Miniforge3-Linux-x86_64.sh -b -p ~/miniforge
export PATH=$HOME/miniforge/bin:$PATH
conda init --all
# Restart shell, then:
conda update --all --yes
conda config --add channels https://conda.software.inl.gov/public
conda create -n moose moose-dev=2026.05.08=mpich
conda activate moose

MOOSE’s stated minimum requirements: a POSIX-compliant Unix-like OS (Linux or macOS), 8 GB RAM (16 GB for debug builds), 30 GB disk, a supported GCC (9.0.0–13.3.1) or LLVM/Clang (14.0.6–19), and Python 3.10–3.13. ARM (Apple Silicon) is supported for the conda path.

Handing MOOSE outputs to the multifid-th ETL

After your MOOSE run produces .e files (plus optional CSV probes), exit the moose-dev container and switch to the multifid-th ETL flow, which lives in a separate container:

# Run the ETL inside the PhysicsNeMo-flavoured multifid-th container:
apptainer exec --bind /path/to/project:/path/to/project \
    multifid-th-cpu.sif \
    bash -lc 'cd /path/to/project/src && python cases/moose_grid/run_etl.py'

The ETL config (src/cases/moose_grid/configs/etl.yaml for the lid-driven flow, or src/cases/alpha_d/configs/etl.yaml for the alpha-D case) controls where the ETL reads the .e / CSV files from and where it writes the Zarr stores the training pipeline consumes. See ETL pipeline for the data-source / transform / sink layout and Getting Started for the multifid-th container options.

The two containers are deliberately kept separate because MOOSE wants its own conda toolchain (libMesh + PETSc + custom-compiled OpenMPI) while PhysicsNeMo wants a clean PyTorch wheel-based environment. Merging them would either bloat the image or break one of the stacks.