MOOSE Newsletter (March 2025)

MOOSE International Workshop 2025

Figure 1: Attendees of the MOOSE International Workshop 2025 in front of the INL Meeting Center.

The inaugural MOOSE International Workshop was held at the INL Meeting Center in Idaho Falls, Idaho on March 10-13, 2025, and the theme of this year's meeting was "Multiphysics for Energy & Environmental Applications". Technical tracks covered a wide range of applications and development in MOOSE, including MOOSE for Nuclear Energy, Fusion, Geosystems, Renewable Energy, MOOSE framework and framework development, and MOOSE physics modules. There were 169 registered attendees (see Figure 1), representing stakeholders across the MOOSE community:

  • 70 attendees from five (5) United States (U.S.) National Laboratories

  • 2 attendees from two (2) U.S. Government agencies (Nuclear Regulatory Commission and Department of Energy)

  • 49 attendees from 23 U.S. universities

  • 15 attendees from 7 U.S. industry partners

  • 14 attendees from two (2) foreign government organizations (United Kingdom Atomic Energy Authority and the Commonwealth Scientific and Industrial Research Organisation, Australia)

  • 4 attendees from two (2) foreign industry partners

  • 15 attendees from seven (7) foreign universities

The event was a resounding success, allowing attendees to share research successes, learn new skills, and develop ideas for future MOOSE development.

Figure 2: The current MOOSE framework development team alongside Steve Bajorek from the U.S. Nuclear Regulatory Commission (middle row, second from left). Not pictured: Alex Lindsay.

On behalf of the MOOSE development team (Figure 2), a big "Thank You" to our community for their continued support of MOOSE and MOOSE-based simulation tools!

MOOSE Improvements

New SolutionInvalidity Summary Output

Introduced a new transient summary table to the SolutionInvalidity capability. Users now have access to the time history of the solution invalidity object at the end of the simulation if they use flagSolutionWarning to mark invalid solutions. It also supports customization of the time interval by creating a sub-block in [Outputs] and changing the "solution_invalidity_timestep_interval". Additionally, users can disable the summary table by adding solution_invalidity_history = false in [Outputs].


Solution Invalid Warnings History:
-----------------------------------------------------------------------------------------
|                   Object                    | Time | Stepinterval Count | Total Count |
-----------------------------------------------------------------------------------------
| NonsafeMaterial : Solution invalid warning! | 0-1  |                  0 |           0 |
| NonsafeMaterial : Solution invalid warning! | 1-2  |                 48 |          48 |
| NonsafeMaterial : Solution invalid warning! | 2-3  |                 48 |          96 |
-----------------------------------------------------------------------------------------

New Automatic Differentiation (AD) Curl Methods

Automatic differentiation capability has been extended to curl operations in the form of adCurlSln(). In addition, coupling the curl of vector field variables can be called by using adCoupledCurl and new base classes labeled KernelCurl, ADKernelCurl, and GenericKernelCurl have been created to facilitate the templating of future curl based kernel objects. When an object inherits from GenericKernelCurl, it gains access to the following new variables:

  • _curl_u: Holds the solution curl at the current quadrature points

  • _curl_test: Curl of the test function

  • _curl_phi: Curl of the shape function

New ActionComponents interfaces

Three interfaces were added to be used on ActionComponents as need:

Restart capability improvements

Simulations using p-refinement can now be restarted using a Checkpoint. MOOSE will also no longer attempt to repartition after loading a checkpoint file

Framework-level, user-facing API for loading and evaluating torchscript objects

The ability to load torch script models into MOOSE facilitates the use of UQ/ML using libtorch directly in simulations. We also want to ensure that these models are loadable on the fly at different execute_on options.

The TorchScriptUserObject stores the torchscript object.

A script is available for converting current test specification options to capabilities at scripts/convert_to_capabilities.py. Run the script from the root of your repository, for example:


moose/scripts/convert_to_capabilites.py .

when MOOSE is located within the moose directory of your application repository.

MOOSE Modules Changes

New Subchannel module

The formerly closed-source Subchannel application was recently merged into MOOSE as the Subchannel module (SCM). SCM is a subchannel physics module for performing reactor core, single-phase thermal-hydraulic subchannel simulations for bare pin, square lattice bundles or wire-wrapped/bare pin, triangular lattice bundles. It can model water-cooled or metal-cooled (lead, sodium, LBE) bundles.

The subchannel documentation may be found at this link.

For porous media flow, pressure drops from contraction/expansion of the flow area may now be specified on sidesets inside the flow domain. The pressure drops are computed by the BernoulliPressureVariable.

The SIMPLEC method was added to the SIMPLE executioner for the linear finite volume discretization of the Navier Stokes equations.

Heat transfer

Convective boundary conditions were added to support finite-element finite-volume coupling at an interface. For example, heat conduction in the solution may be solved using finite elements, while fluid dynamics may be solved using the finite volume discretizations available in the Navier Stokes module.

libMesh-level Changes

2025.03.06 Update

  • Quadrature API changes. A few virtual QBase methods have had changed signatures, and some methods have been deprecated in favor of newer versions, requiring Elem inputs rather than mere ElemType inputs, to enable support for elements like arbitrary polygons and polyhedra where a single class can take on different topologies at run time.

  • FE and FEInterface API changes. Some methods have been deprecated in favor of newer versions, either in Elem or taking an Elem rather than an ElemType argument, also for runtime-topology compatibility.

  • Add APIs to control System name prefixing from C++, not just from the command line. This will enable fixes for a MOOSE bug with independent preconditioning of multiple nonlinear systems, affecting the optimization module.

  • Added an integrate_slits option to JumpErrorEstimator-based estimators

  • Added an OverlapCoupling ghosting functor, useful for integrating on slit meshes or between manifolds of overlapping meshes.

  • Bug fix: DistributedMesh::add_point now operates correctly when given a node id that was recently deleted from the mesh but has not yet been cleaned from the internal node container.

  • Bug fix: Prism6::build_side_ptr() now sets subdomain_id(); this fixes a failure in adaptive mesh refinement of Prism6 elements with subdomain-restricted variables.

  • Bug fix: methods which elevated mesh element order no longer renumber nodes and elements while doing so. This fixes potential iterator invalidations in some use cases, and it's more efficient.

  • Bug fix: when copying nodes and elements from a source mesh into a target DistributedMesh that is too small to use all its processors, the target mesh was left in an invalid state. This fixes errors triggered by certain mesh stitching operations.

  • Bug fix for range estimation bug in FParser optimizer

  • Minor FE code refactoring for more simplicity and readability

  • Minor optimization to some hash (and thus unordered_map) use cases

  • Cleaned up and commented code with high-precision floating-point constants

PETSc-level Changes

Bug Fixes and Minor Enhancements

  • Minor optimizations were made to the assembly class when using automatic differentiation (AD). An AD Diffusion case showed about 5% improvement in computation time.

  • The ComboMarker now supports block restriction of each component marker that is used in evaluating the refinement/coarsening decision.

  • MOOSE syntax can now be de-registered if application developers consider the syntax incompatible with their application.

  • The use of MULTIAPP_FIXED_POINT_BEGIN for a child application along with fixed point iterations was fixed to avoid excessive restoring of the simulation state.

  • The element conversion generator will now consistently preserve sidesets of elements when increasing their order.

  • The LinearInterpolation utility will now properly catch input NaNs.

  • make clobber will no longer remove compiled contribs such as wasp or exodiff.

  • FunctorAux will now error when relying on a postprocessor functor that is not executed before auxkernels.

  • MOOSE will now error when using both Mesh/file= and mesh generators. The previous behavior was intended to allow the former syntax to override mesh generators.

  • ExtremeValueBase-derived postprocessors can now compute the maximum of the absolute value of a variable.

  • The XYDelaunayGenerator can now assign subdomain IDs to the elements it creates.

  • The BoundaryDeletionGenerator can now be set to only keep specified sidesets in the mesh rather than delete specified sidesets.

  • Schur complement selection and split-preconditioning setups were improved.

  • The show_mesh_generators option was added to the [Debug] block to see mesh generation execution order as they execute.

  • Unused parameters will now cause an error in the --mesh-only mode. This facilitates debugging meshing input files.

  • The BatchMeshGeneratorAction was created to create multiple mesh generators with simple modifications of the input parameters between each generator created. Both cartesian product and component-wise selections of parameters were implemented.

  • Integrated boundary conditions may now be skipped when their variable is not defined along the boundary. This situation arises when the element subdomains are modified, but the boundary is not. This situation can be avoided either by disabling the boundary conditions using Controls or by making sure the MeshModifiers also modify the boundary as they modify the mesh.

Conda Package Changes