MOOSE Newsletter (September 2026)
MOOSE Improvements
Complete removal of using-directives for namespace libMesh
Using-directives for namespace libMesh, i.e., using namespace libMesh;, have been entirely removed. Prefer using qualified names, e.g., libMesh::VectorValue for VectorValue. If you feel that practice becomes prohibitively verbose, cumbersome or hampers readability, leverage using-declarations for libMesh namespace members, e.g. using libMesh::VectorValue;. Unity builds will leak using-declarations across translation units within a folder, so be mindful. This is also the reason using-directives have been removed: they leak the entire namespace across translation units. This removal was carried out in stages across framework and module source files and headers. (idaholab/moose#33646, idaholab/moose#33671, idaholab/moose#33688)
Changes to the MooseDocs mergeresults command
The MooseDocs CIVET Extension mergeresults command now uses the current hash used to build the documentation, rather than using the most up-to-date commit information from the remote code repository. This allows documentation built from earlier versions of MOOSE-based code to have consistent CI links for their version. This change was made in idaholab/moose#29565.
All-quad and quad-dominant mesh generation
New mesh generators enable all-quadrilateral meshing from an arbitrary 2D boundary curve: XYFrontalDelaunayGenerator performs a frontal Delaunay triangulation that advances inward from all boundaries and holes simultaneously, TriToQuadConverter merges triangle pairs into quadrilaterals scored by a quality metric (with an all_quad option to force pure-quad output), and MoveBoundaryNodesToCurveGenerator snaps boundary nodes onto parsed curves. The convenience XYQuadrilateralMeshFromBoundaryCurve generator chains all three from a boundary curve and a set of holes. (idaholab/moose#33522)
Other mesh generation and diagnostics
CoarsenSurfaceMeshAlongSidesetGenerator coarsens a 2D triangular or quadrilateral surface mesh along a sideset by collapsing alternating boundary nodes, on internal sidesets (coarsening both sides while preserving the sideset) as well as external ones, with configurable criteria limiting the merged element's normal deviation, side length, and area. (idaholab/moose#33637)
FlattenRefinementGenerator removes the local h-refinement pattern from a refined block. (idaholab/moose#33729)
MeshDiagnosticsGenerator gained a
watertight_blocksoption that restricts the watertight sideset/nodeset check to the envelope of a block subset, letting users of flow solvers verify that sidesets fully cover a flow volume rather than the whole mesh; two bugs in the check's violation counting and boundary-id lookup were fixed at the same time. (idaholab/moose#33759)ElementQualityChecker can now compute five additional quality metrics from libMesh:
TWIST,EDGE_LENGTH_RATIO,MAX_DIHEDRAL_ANGLE,MIN_DIHEDRAL_ANGLE, andSCALED_JACOBIAN. (idaholab/moose#33745)MooseMesh::cacheInfo()'s element loops are now threaded, speeding up mesh setup on large models. (idaholab/moose#33712)
MultiApps and Transfers
MultiApps can now be run concurrently by setting "num_concurrent_multiapps" > 1. The MultiApps run concurrently within the same "execution_order_group". Each concurrent MultiApp is assigned a disjoint subset of MPI ranks before its sub-apps are created, and the group executes with a plain sequential loop; an error is now raised if there are not enough ranks to give every MultiApp its min_procs_per_app. Note that sub-apps of a single MultiApps were already executing concurrently. (idaholab/moose#32925)
Sibling MultiApp-to-MultiApp Transfers can now execute immediately after their source MultiApp within the same ordering group, instead of always running before all MultiApps, when the requested execution order allows it. (idaholab/moose#32899)
MFEM backend improvements
Custom problem composers and operators
A new MFEMProblemComposer base class (with MFEMWeakFormProblemComposer, MFEMComplexWeakFormProblemComposer, MFEMEigenWeakFormProblemComposer, and MFEMTimeDependentWeakFormProblemComposer specializations), together with ProblemOperatorBase and its steady/transient specializations, let users write custom MFEM problem composers and operators from an application, added through a new AddMFEMProblemComposerAction action. The MFEMSteady and MFEMTransient executioners were refactored to use these composers internally. (idaholab/moose#33355)
Native mesh generation
MFEM meshes no longer have to be read from a file: a new MFEMGeneratedMeshGenerator builds structured Cartesian meshes in 1D, 2D, or 3D with named boundary sets. The MFEM mesh class hierarchy was refactored so that MFEMMesh is now the abstract base, with the previous file-reading implementation renamed to MFEMFileMesh. (idaholab/moose#32834)
Solver options
MFEMHypreBoomerAMG gained a vector_treatment option (auto, scalar, by_component, rigid_body_modes) that replaces the solver's previous implicit behavior of enabling elasticity options whenever a finite element space was given, letting vector-valued and elasticity problems select hypre's per-component ("unknown") coarsening or its rigid-body-mode elasticity coarsening explicitly. (idaholab/moose#33749) MFEMNewtonNonlinearSolver gained a line_search option (none, backtracking): with backtracking enabled, the solver shortens its Newton update by damping_factor and further by contraction_factor per trial step, for up to line_search_max_its trial steps, until the residual norm satisfies an Armijo-style sufficient decrease condition, or reports non-convergence if no trial step does. (idaholab/moose#33717)
Vector postprocessors
MFEMComplexVariableLineValueSampler interpolates complex scalar and vector variables along a specified line, outputting the real and imaginary parts of each sampled component in separate columns. (idaholab/moose#33856)
Matrix coefficients
The MFEM CoefficientManager can now parse a literal constant matrix from input (semicolon separated rows, e.g., "1 0; 0 1"), and a new MFEMGenericFunctorMatrixMaterial declares constant matrix material properties from input. Eigenvalue problems can build anisotropic (matrix-coefficient) operators, exercised by a new anisotropic Maxwell eigenproblem test. (idaholab/moose#33260)
Other improvements
Most MFEM tests now compare CSV instead of ParaView outputs, removing the max_parallel restriction. (idaholab/moose#32580) Quadrature function definitions now use the existing [Functions] block syntax. (idaholab/moose#33544)
Kokkos backend
The Kokkos backend now supports meshes with p-refinement already applied before Kokkos setup: the mesh's element-type map is keyed on element type and p-level pairs, and reference elements and quadrature are built at the correct p-level rather than always at level 0. (idaholab/moose#33713) Kokkos also gained scalar variable support: scalar coupleable access, off-diagonal scalar Jacobian contributions, and block-restriction checking for scalar variables in Kokkos kernels, with follow-up fixes for finite-volume variables coupled into Kokkos finite-element objects and for scalar-variable DOF-index lookups on MPI ranks that own no elements. (idaholab/moose#33709, idaholab/moose#33661, idaholab/moose#33790)
AI-assisted development
Two new AI agent skills were added for MOOSE development: one to visualize ExodusII files with ParaView (rendering fields to PNG or stitching an animation), and one to help write MOOSE object documentation. (idaholab/moose#33061)
The project's own AGENTS.md contribution guidelines were updated to let a better overall design win over a minimal diff, rather than always favoring the smallest possible change. (idaholab/moose#33812)
Miscellaneous
static_castreference and pointer casts now usecast_refandcast_ptr, respectively, checking cast validity in debug and devel builds. (idaholab/moose#33606, idaholab/moose#33618)The obsolete app
--error-overrideand TestHarnessallow_overrideoptions were removed. (idaholab/moose#33830)Boundary-restricted material reinitialization is no longer applied to every active boundary material on every element face in a threaded element loop; it is now restricted to only the face/boundary materials actually depended on by the objects consuming them, avoiding redundant material computation in loops such as
ComputeUserObjectsThread. (idaholab/moose#33689)Two sub-blocks under Output System that both fall back to a common top-level
file_basenow error on a resulting filename collision instead; and inform the user to setappend_object_name=trueor a distinctfile_baseto resolve it. (idaholab/moose#33660)Mesh contraction can now be disallowed in derived
Problemclasses. (idaholab/moose#33675)The
[Adaptivity]block gained a controllableenableparameter so the Controls system can turn adaptivity on and off at run time; the olderstart_time/stop_timeparameters are deprecated in favor of it. (idaholab/moose#33710)A new MoveNodesByParsedExpressionModifier displaces nodes on a boundary, block, or the whole mesh according to parsed expressions for the x, y, and z displacement, evaluated relative to each node's original position so repeated execution does not drift. (idaholab/moose#33588)
InputParameters::addParamNamesToGroupnow errors only when a parameter is re-added to the same documentation group, rather than silently overwriting the group on every re-add; a newInputParameters::moveParamToGroup()method supports intentionally moving a parameter to a different group. (idaholab/moose#33663)WebServerControl gained a
port_fileparameter, and itsportparameter now accepts0to let the operating system choose a free port, with the bound port reported in the console output and in the port file; a failure to start the server is now reported as an error instead of leaving the control hanging. (idaholab/moose#32394)The MooseDocs
large_mediasubmodule dependency, used for embedding large images and videos in the documentation, can now be disabled programmatically by downstream applications rather than only through an environment variable read at import time. (idaholab/moose#33120)
Changes to the MooseDocs mergeresults command
The MooseDocs CIVET Extension mergeresults command now uses the current hash used to build the documentation, rather than using the most up-to-date commit information from the remote code repository. This allows documentation built from earlier versions of MOOSE-based code to have consistent CI links for their version. This change was made in idaholab/moose#29565.
MOOSE Bug Fixes
Contact and mortar robustness
Contact and mortar constraints received a broad set of correctness fixes this month:
A discarded and retried timestep (
--restep) restored solutions but not the geometric-search state, so a retried step'sPenetrationLocatorcould re-project contact state from the discarded attempt rather than the accepted seed;PenetrationLocatorandGeometricSearchDatagainedbackup()/restore()methods to fix it, along with a memory leak in the previous restore path. (idaholab/moose#33764)Dynamic mortar contact and penalty friction advanced their internal history once per solve attempt rather than once per accepted step, breaking
--restepidempotency; repeat-detection guards now ensure history only advances once per accepted step. (idaholab/moose#33731)A mortar interface that starts with zero covering segments and gains coverage mid-run (through relative motion) could give partition-count-dependent results, due to stale DOF ghosting and double-counted Jacobian/residual contributions for shared inactive Lagrange-multiplier nodes on partition boundaries; both bugs are fixed, and the
max_parallel=2restriction on the corresponding test was removed. (idaholab/moose#33659)Mortar segment-mesh Jacobian-of-transformation weights were not scaled by the coordinate transformation in RZ (axisymmetric) geometry along the dual-mortar "edge dropping" path, giving incorrect integration weights for RZ dual mortar contact. (idaholab/moose#33775)
A sign inconsistency in the normal-pressure augmentation used by three frictional mortar constraint classes let the Coulomb friction-ball radius grow incorrectly as the gap opened; fixed as part of consolidating the duplicated friction residual logic into a shared utility (see also the degree-one Alart-Curnier option below). (idaholab/moose#33408)
A bug in combined mortar residual assembly was fixed for frictionless mortar contact. (idaholab/moose#33781)
Displaced
NodalConstraints (includingNodalFrictionalConstraintandNodalStickConstraint) were reinitialized through the referenceFEProbleminstead of their ownSubProblem, so displaced degree-of-freedom vectors could stay empty and the constraint would silently contribute no residual or Jacobian; each constraint now reinitializes its own primary and secondary nodes directly, and a related ghosting issue that could assert or segfault on distributed, displaced, split meshes was fixed at the same time. (idaholab/moose#33565)Split::setup()now detects when two sibling sub-splits without a distinguishing block, side, or unside restriction claim the same variable, catching duplicate/omitted-variable configurations that the previous total-DOF-size check could miss;Split::restrictsRegion()is now virtual soContactSplitreports its own contact/uncontact restriction correctly. (idaholab/moose#33763)A
mooseDoOnceconsole warning that fired whenever secondary nodes found no penetration during Jacobian evaluation under a non-iterationpatch_update_strategywas removed. (idaholab/moose#33808)
Checkpoint, restart, and MultiApp fixes
With
use_constant_mass = true,ActuallyExplicitEuler's cached mass matrix is not checkpointed, so after--recoverthe guard used to recompute it on the first step only was no longer valid, and the linear solve ran with an unassembled matrix; the cached matrix is now recomputed once, on the first step after a recovery. (idaholab/moose#33758)MultiApp mesh checkpoints written during adaptivity-driven mesh changes were staged under a node-local temporary path broadcast from rank 0, which other compute nodes on a multi-node job could not see; the checkpoint directory is now derived deterministically from the app's output file base on every rank, with no broadcast required. (idaholab/moose#33718)
A MultiApp sub-app using
clone_parent_mesh/clone_master_meshcould spuriously error with an "unused parameter" message forMeshGeneratorMesh-only parameters in its own[Mesh]block, because the parameter-promotion logic that normally handles this only ran outside the mesh-cloning path. (idaholab/moose#33739)After a coordinate transform is applied to a positioned sub-app's mesh, the mesh's cached spatial dimension became stale; the mesh is now re-prepared after the transform. (idaholab/moose#33640)
Transfers derived from
MultiAppDofCopyTransfercould segfault when a sub-app's processor count was restricted through MultiApp'smax_procs_per_app, which breaks the assumption that the origin and target apps share the same parallel decomposition; this now raises a clear error instead. (idaholab/moose#33664)
Miscellaneous
The AD interface kernel base class now skips neighbor-side residual and Jacobian contributions when the variable and its neighbor variable belong to different nonlinear systems, fixing incorrect cross-system assembly for AD interface kernels coupling multiple nonlinear systems. (idaholab/moose#33391)
MooseVariableDataBase::setNodalValuecould read or write out of bounds for vector-valued variables on a mesh of lower dimension thanMoose::dim; the degree-of-freedom value vector is now explicitly resized before writing. (idaholab/moose#33248)ParsedMaterialand other consumers ofFunctionMaterialPropertyDescriptorcould silently treat a missing, non-derivative coupled material property as optional (defaulting to zero) rather than required, depending on its position inmaterial_property_names, because a copy constructor reset the_requiredflag; the flag is now preserved, and non-derivative properties are consistently required. (idaholab/moose#33760)Builder::extractParamsstopped at the first alias it found when a parameter was set locally under a deprecated name and inGlobalParamsunder the current name (or vice versa), so theGlobalParamsvalue could silently win with no warning; all aliases in both scopes are now scanned so a locally-set value always takes precedence, and setting two aliases of the same parameter within one scope is now a hard error. (idaholab/moose#33762)The "steady-state relative differential norm" reported by DefaultSteadyStateConvergence could be
NaNwhen the auxiliary system has no variables, from taking the maximum of an empty vector; it now defaults to0in that case. (idaholab/moose#33805)TimedSubdomainModifier silently skipped a subdomain change requested at the simulation's start time, because its time comparison required strictly greater than the previous time, which is never true on the very first execution. (idaholab/moose#33791)
An exception raised by a
UserObjectexecuted onTIMESTEP_ENDwas not caught, so the solve did not stop cleanly;FEProblemBasenow checks for and handles exceptions from user object execution at that point as well. (idaholab/moose#33687)Ambiguous policies for resolving multivalued imported solution data at coincident points (selecting by smallest or largest element ID) were removed from the
Solution*family of user objects in favor of explicit averaging, with a warning rather than silence when a discontinuous scalar field is queried without an explicit weighting policy. (idaholab/moose#33452)A crash in MooseDocs' CIVET test-results rendering, triggered by a documentation-build cache miss, was fixed, and the CIVET settings table no longer leaks the documentation build machine's home directory path. (idaholab/moose#29566)
A build regression affecting
--enable-ifembuilds, introduced by this month's using-directive removal, was fixed. (idaholab/moose#33750)CoarsenSurfaceMeshAlongSidesetGenerator's predecessor left dangling neighbor pointers to deleted elements after mesh coarsening; they are now unset, preemptively satisfying stricter libMesh-side internal verification. (idaholab/moose#33751)A
coverage=trueunit test build could fail to link with an unresolved__gcov_exitsymbol becauselibgtest.la's link recipe omitted the libMesh link flags carrying-lgcov. (idaholab/moose#33766)
MOOSE Modules Changes
Navier-Stokes
A new LinearFVGrayLambertBC implements gray-diffuse (Gray-Lambert) surface-to-surface radiative heat transfer as a LinearFV boundary condition, integrated with the segregated (SIMPLE) linear solver through field relaxation and a lagged boundary-condition state. (idaholab/moose#33642)
A new LinearFVPhaseChangeSource kernel adds a temperature-based phase-change source term to the LinearFV framework, with sharp and smooth formulation options, validated against a 1D Stefan problem and a gallium-melting case. (idaholab/moose#33636)
LinearFVGradientInterfacewas renamed toLinearFVGradientManagerand gained gradient history support: consumers can now request older gradient states, not just the current one, checkpointed through named system vectors and restored on timestep rejection. (idaholab/moose#33668)LinearFVTimeDerivative paired its multi-step time-integrator coefficients with the wrong solution-history state, assembling neither
c du/dtnord(cu)/dtunder mesh or time refinement (implicit Euler and constant coefficients had masked the bug). The pairing is fixed, and a newconservative_formparameter selects between the two valid operator forms, defaulting to the conservative one. (idaholab/moose#33730)
Heat Transfer
RadiationTransferAction now adds FunctionDirichletBCs for its fixed-temperature radiation boundaries, so the finite-element-solved temperature is consistent with the function used in the radiation calculation, rather than the two potentially diverging. (idaholab/moose#33734)
Porous Flow
PorousFlowPeacemanBorehole can now build its wellbore hydrostatic pressure profile from a temperature-dependent fluid density instead of a constant unit weight, through new
unit_weight_fp/unit_weight_temperature/unit_weight_gravityparameters, targeting geothermal wells with strong thermal gradients. Itspoint_not_found_behaviordefault was also raised toERROR, so an out-of-mesh sample point now aborts instead of silently zero-sampling temperature. (idaholab/moose#33703)Nodal
PorousFlowMaterials were sized by the current element's node count, while derived materials read coupled variables by their degree-of-freedom count; these differ whenever a first-order variable lives on a second-order mesh, causing out-of-bounds reads. Nodal materials are now sized consistently, and reading a non-nodal (elemental) variable from a nodal PorousFlow material, previously an out-of-bounds read, is now an explicit error. (idaholab/moose#33577)The Jacobian-column accumulator vectors in
PorousFlowDarcyBase's upwinding were sized by the number of nodes (a row/test-variable count) instead of the number of trial-variable shape functions, giving incorrect Jacobian entries for mixed-order elements where pressure and displacement variables have different node counts. (idaholab/moose#33528)Several PorousFlow tutorial and reference documentation pages, and their example input files, were corrected and expanded. (idaholab/moose#33684, idaholab/moose#33711, idaholab/moose#33861)
Contact
Dual-mortar contact with edge dropping (a secondary element only partially covered by the mortar interface) gained optional node-based Lagrange-multiplier scaling (
use_nodal_scalingon LMWeightedGapUserObject) to improve conditioning, along with fixes to a double-counted conditioning divisor and a basis-order bug on second-order meshes, and support for distributed meshes. (idaholab/moose#33572)Frictional mortar contact gained a degree-one Alart-Curnier friction residual option (
friction_projection_degree) as an alternative to the existing degree-two Hueber-Stadler-Wohlmuth residual, alongside a consolidation of the previously duplicated friction residual logic into a shared utility. (idaholab/moose#33408)
Optimization
A new
SingleParameterInverseSolveAction([SingleParameterInverseSolve]block) auto-generates a full fixed-point inverse-solve workflow, recovering a single time-dependent scalar parameter that makes a transient forward model match a target function of time through a per-time-step root find (NewtonInversionControlorSecantInversionControl) nested in the executioner's Picard loop, distinct from the module's whole-historyOptimizeinverse-solve machinery. (idaholab/moose#33206)AdjointSolve's raw transpose solve bypassed libMesh's constraint back-substitution, leaving hanging-node-constrained adjoint degrees of freedom at zero; the solve now back-substitutes constraints, fixing adjoint solves under mesh adaptivity. (idaholab/moose#33486)The deprecated
OptimizationReporter, superseded byGeneralOptimizationand past its removal date, was removed. (idaholab/moose#33543)
Reactor
The pin and duct "engineering unit" representations used by PinMeshGenerator and CoreMeshGenerator were split into dedicated Pin Cell Universe Engineering Unit and Ducted Pin Engineering Unit classes, representing pin and duct geometry as constructive-solid-geometry universes constrained by the actual pin boundary. (idaholab/moose#33582)
Subchannel
The Gnielinski correlation used by the subchannel (SCM) solver could flip sign or diverge near a denominator singularity at low Prandtl number, as seen with liquid sodium (Pr ~ 0.005); the denominator is now floored, with a solution warning when the floor is engaged. (idaholab/moose#33307)
Phase Field and Level Set
The
ObtainAvgContactAnglepostprocessor selected quadrature points by threshold and summed them without a measure or interface-localizing weight, making its reported contact angle mesh- and partition-dependent; it is now weighted by surface measure and the double-well factor, and several phase-field contact-angle test inputs were corrected to remove other sources of nondeterminism. (idaholab/moose#33767)LevelSetOlssonReinitializationcould produce aNaNwhen the level-set gradient is exactly zero; this is now avoided. (idaholab/moose#33683)