MOOSE Newsletter (May 2026)

MOOSE Improvements

MFEM Backend improvements

  • Eigenvalue problems are now supported by the MFEM backend via a dedicated equation system. The eigen-specific methods live in a new EigenproblemEquationSystem, the zeroth mode is distributed onto the base variable, and a mode separator option was added. (idaholab/moose#32301)

  • The MFEMVectorBoundaryFluxIntegralPostprocessor was added to compute the integral of the flux of a vector , , , or conforming source variable through a given boundary, including support for internal boundaries defined through an MFEMCutTransitionSubMesh. (idaholab/moose#32852)

  • Additional coefficients are now provided by default alongside an MFEMVariable where available: the gradient (and its magnitude) of scalar variables, and the curl (and its magnitude), divergence, and magnitude of vector variables. These coefficients can be written out to a MFEMParaViewDataCollection. (idaholab/moose#32973)

  • The MFEMNDtoRTAux auxiliary kernel was added to copy the degrees of freedom, in 2D, from a source variable on an Nédélec space into a target variable on an Raviart-Thomas space. In 2D, the two bases are related by a 90-degree rotation, which is useful in, e.g. magnetostatic postprocessing for obtaining the magnetic flux density from a rotated vector potential gradient. (idaholab/moose#32923)

  • Several cleanups were made to the MFEM backend code and its documentation. (idaholab/moose#32781, idaholab/moose#32884)

Kokkos Backend Improvements

  • Automatic differentiation (AD) support was added. Currently supported objects are ADKernel, ADIntegratedBC, and ADNodalBC. See this page for more details.

  • The residual object registration macros were unified. All residual objects (kernels, nodal kernels, and boundary conditions) should now be registered with registerKokkosResidualObject (registerKokkosADResidualObject for AD versions). Aliases like registerKokkosKernel are no longer supported.

  • MaterialBase::initialSetup() no longer performs any setup and is now an empty method. Users no longer have to call the base class method when overriding initialSetup() in their materials.

  • The signature of init() and join() of reducers was changed to be more consistent with other hook methods:


template <typename Derived>
KOKKOS_FUNCTION void join(Real * result, const Real * source) const;
template <typename Derived>
KOKKOS_FUNCTION void init(Real * result) const;

Array variable value volume histogram

The ArrayVariableValueVolumeHistogram vector postprocessor was added to tabulate, for each component of an array variable, the volumes of the domain in which the variable holds values within a set of bins. The bin range and count are controlled with the min_value, max_value, and bin_number parameters.

Manifold-based subdomain assignment

The ManifoldSubdomainGenerator was added to assign a subdomain ID based on whether an element's vertex-average point lies inside a closed (watertight) surface mesh, supplied through the mesh generator pipeline. Beyond tagging elements inside or outside an arbitrary surface, it can be used to "voxelize" a geometry defined by a surface mesh by removing elements of a structured grid that fall inside or outside the manifold, which is useful when exactly fitting to the boundary is not required.

Advanced extrusion along a curve and radial growth

The AdvancedExtruderGenerator can now extrude a mesh following a line mesh / curve rather than a fixed direction, with the extrusion direction computed locally at every curve node. The starting and ending directions can optionally be imposed. In addition, the radial extent of the extruded mesh can be progressively expanded or diminished throughout the extrusion by setting the end_radial_extent parameter.

Polygon mesh extrusion in parallel

The conversion of polygon meshes to tetrahedra and the extrusion of polygon meshes now work with distributed meshes, with unique ID and mid-node numbering made consistent in parallel. The optional PNG output was also made more robust and additional parameters were added to better select the area to plot.

Junction component

The ComponentJunction action component was added to create a contiguous junction between two components, either by stitching meshes that are already in contact or by extruding one boundary towards the other along a B-spline curve and stitching the extruded volume onto both surfaces. This enables, for example, closing a loop in a 1D component-based mesh.

Element Jacobian damper improvements

The ElementJacobianDamper can now perform backtracking to find a working damping factor, when the full update causes excessive deformation of elements and makes libMesh throw an exception, and an incorrect MPI reduction in the damper was fixed.

Per-block custom quadrature types

The quadrature setup now accepts a per-block custom_types parameter, so different element types can request different custom quadrature rules on different subdomains. A paramError is raised on a size mismatch.

Distributed 3D mortar segment meshes

The 3D mortar segment mesh can now be written out in parallel, using per-rank prefix-scan IDs for the segment mesh nodes and elements. A new MortarSegmentMeshReporter was added to output the mortar segment mesh.

Dirac kernel improvements

Dirac kernels no longer spuriously report a "point not found" warning in parallel simply because the point was not found on a MPI rank (it is usually being found on another rank when the mesh distributed), and the element selected when multiple candidates exist is now resolved deterministically. The point lookup was also made faster by removing two map lookups per Dirac kernel on distributed meshes, and the error message now provides context on the kernel involved.

Miscellaneous framework improvements

  • The Exodus output gained a max_output_name_length option, defaulting to the historical 32-character limit, and mesh generators no longer truncate Exodus names.

  • Mesh generators are now more robust when handling unprepared mesh inputs, with additional caching of element subdomain data and clearer comments on which operations invalidate a cached point locator.

  • The Console output behavior was rationalized, the checkpoint execute_on default is now encoded as user-set, and a dead override_default parameter was removed.

  • The automated wall-time checkpoint creation is now easier to disable, since users were unhappy about still creating walltime-based checkpoints when checkpoint=false.

  • dataStore/dataLoad support was added for RestartableDataReporter::Value.

  • A solution invalidity synchronization is now performed on the final execution step.

  • UserObjects and VectorPostprocessors whose getters are queried too early in the setup will now provide a clear error message to application developers

  • Array variables can now be reinitialized on all the nodal degrees of freedom of multiple nodes at once.

  • MooseDocs page breadcrumbs now link to the relevant system syntax page.

  • Removed the deprecated ADParsedFunction alias and the deprecated value parameter of ParsedFunction, the deprecated vars and vals parameters of MooseParsedFunctionBase and the deprecated value_{x,y,z} parameters of ParsedVectorFunction.

  • To prevent regressions in CSVDiff tests, in addition to disallowing NaN/Inf in gold .csv files, we now also disallow those values in test output files.

MOOSE Bug Fixes

  • The _pattern_pitch data member of PatternedHexMeshGenerator is now default-initialized to zero rather than left uninitialized.

  • A one-component array variable (declared with array = true) now correctly receives array-type initial conditions; previously AddVariableAction classified it as a standard variable based solely on its component count.

  • Element dampers now skip elements on which their variable has no degrees of freedom (for example a block-restricted variable), instead of attempting to evaluate the damper there. A check that the element damper variable is scalar was also added.

  • Closed parsed curve generation no longer creates a zero-distance node interval where the curve closes on itself; the spacing now uses the distance to a curve midpoint for the closing segment.

  • Fixed a number of eigenvalue problem tests failing in the absence of SLEPc and a failing stdlib assertion when lazily collating command line entries.

MOOSE Modules Changes

Stochastic Tools module

The Latin hypercube sampling was reworked to use a random permutation, encapsulated in the new MooseRandomPerturbation utility, and the MooseServer was extended to produce probability density function (PDF) and cumulative distribution function (CDF) plots for distributions.

Subchannel module

The mixing closures were extracted from the Problem classes and placed into the SCMClosures system. Classes derived from SCMMixingClosureBase can compute coefficients from turbulent and grid mixing of both momentum and enthalpy. The following classes are available:

Validity diagnostics were added for the mixing closures to check that the flow conditions and assembly geometry are appropriate.

Subchannel auxiliary variables can now be added directly by SCM when the [Subchannel] syntax is used. The geometry initial conditions are auto-populated, and the hydraulic geometry calculations were moved to the mesh. This simplifies the input files for subchannel calculations.

Fluid Properties module

The HeliumFluidProperties gained AD support for computing the specific enthalpy h from pressure and temperature, along with its derivatives.

The weakly-compressible Navier-Stokes Physics now automatically set the time derivatives of constant variables to zero, and a warning that was unfairly raised when using system_names and user objects for the pressure constraint was silenced.

Porous Flow module

The PorousFlowUnsaturated action now forwards the user-specified residual saturation s_res to the van Genuchten capillary pressure user object it creates. Previously that residual saturation was dropped, so the capillary pressure was always built with a residual saturation of zero.

Phase Field module

The InterfaceNormalCurvatures was added to compute the normal and mean curvatures of an interface. To allow compilation in opt mode with gcc 15 and 16, which crash with an internal compiler error (segmentation fault) on a number of class constructors, we are now explicitly preventing inlining of EBTerm's default constructor.

Reactor module

The Constructive Solid Geometry (CSG) support has been extended to the AssemblyMeshGenerator. Any mesh input that relies on PinMeshGenerator and AssemblyMeshGenerator can now be converted to an equivalent CSG definition by passing --csg-only. The axial extent of these regions is currently infinite; the CSG generation is not currently implemented for extruded 3D assemblies with multiple axial definitions. As part of this work, the system now checks for orphaned constructs (cells, universes) in CSGBase.

libMesh-level Changes

2026.05.06_aeab0b9 Update

  • Improved Kokkos configuration and compatibility in MetaPhysicL

  • Updated ThreadedBuildingBlocks compatibility for modern oneTBB

  • Enabled future fine-grained control of subvector type in create_subvector()

  • Added Netgen control for tetrahedralization multithreading; set Netgen thread count to match libMesh n_threads

  • More robust build system behavior when rebuilding after Netgen updates

  • More assertions in AnalyticFunction

  • Fix for compiler warning in libMesh from macOS 26.4

  • Fix for compiler warning in TIMPI

  • Clarification in TIMPI parallel sync documentation

  • IntRange (the output type of make_range) is now usable as a Threads:: range

  • NumericVector<T>::l2_norm_diff() is now multithreaded

  • When building with METHOD=oprof, app binaries with oprof settings are now also built

  • Added --enable-sigint command-line option, telling libMesh applications to handle SIGINT (the Ctrl+C signal). The usual termination handler can then print stack trace and any incomplete PerfLog output, which can make threading and profiling easier when investigating application cases which run very long or hang entirely.

PETSc-level Changes

PETSc has been updated from version 3.24.6 to 3.25.1. A summary comparison of the changes within this update can be found on the PETSc GitLab.

Conda Package Updates

moose-petsc 3.25.1 [mpich,openmpi]_0

moose-libmesh 2026.05.06_aeab0b9 [mpich,openmpi]_0

moose-dev 2026.05.08 [mpich,openmpi]

  • Use updated PETSc from moose-petsc 3.25.1 [mpich,openmpi]_0

  • Use updated libMesh from moose-libmesh 2026.05.06_aeab0b9 [mpich,openmpi]_0

Apptainer Package Updates

moose-petsc:3.25.1_0

  • Update petsc v3.24.6..v3.25.1

  • Workaround missing libnvidia-ml.so.1 by passing -DCMAKE_EXE_LINKER_FLAGS=-Wl,--as-needed to SLATE's CMake command to drop that library dependency

  • Override OpenBLAS build settings if using the oneAPI compilers by passing DYNAMIC_ARCH=1 NOFORTRAN=0 F_COMPILER=INTEL FEXTRALIB= to its make command

moose-libmesh:2026.05.06_aeab0b9_0

  • Use updated moose-petsc:3.25.1_0 container as base

  • Update libmesh 0185b8b..aeab0b9

  • Workaround missing libnvidia-ml.so.1 by passing -Wl,--as-needed to netCDF's configure command to drop that library dependency

moose-dev:2026.05.08

  • Use updated `moose-libmesh:2026.05.06_aeab0b9_0 ` container as base

  • Update mfem https://github.com/mfem/mfem/compare/64ef39bbe61ee5093a817026a2bb50314abafc25...e52948f9e5b28a5d8c6f6cf0645de392d0dd9424

  • Update conduit https://github.com/LLNL/conduit/compare/8543892a582737eb5941b1e90df068a75543df92...4ae5a69cce5ca51c63dbf86c8fff6c70b7d854ac

  • Workaround missing libnvidia-ml.so.1 by passing -DPETSC_EXECUTABLE_RUNS=YES to MFEM's CMake command to ignore failing PETSc tests

  • Remove extra bashrc source in code-server-start which is causing issues on INL HPC

  • Use more robust conda activation of moose environment that works in shell

  • Update code-server to 4.118.0

  • Update miniforge to 26.3.2-0