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_blocks option 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, and SCALED_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_cast reference and pointer casts now use cast_ref and cast_ptr, respectively, checking cast validity in debug and devel builds. (idaholab/moose#33606, idaholab/moose#33618)

  • The obsolete app --error-override and TestHarness allow_override options 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_base now error on a resulting filename collision instead; and inform the user to set append_object_name=true or a distinct file_base to resolve it. (idaholab/moose#33660)

  • Mesh contraction can now be disallowed in derived Problem classes. (idaholab/moose#33675)

  • The [Adaptivity] block gained a controllable enable parameter so the Controls system can turn adaptivity on and off at run time; the older start_time/stop_time parameters 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::addParamNamesToGroup now errors only when a parameter is re-added to the same documentation group, rather than silently overwriting the group on every re-add; a new InputParameters::moveParamToGroup() method supports intentionally moving a parameter to a different group. (idaholab/moose#33663)

  • WebServerControl gained a port_file parameter, and its port parameter now accepts 0 to 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_media submodule 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's PenetrationLocator could re-project contact state from the discarded attempt rather than the accepted seed; PenetrationLocator and GeometricSearchData gained backup()/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 --restep idempotency; 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=2 restriction 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 (including NodalFrictionalConstraint and NodalStickConstraint) were reinitialized through the reference FEProblem instead of their own SubProblem, 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 so ContactSplit reports its own contact/uncontact restriction correctly. (idaholab/moose#33763)

  • A mooseDoOnce console warning that fired whenever secondary nodes found no penetration during Jacobian evaluation under a non-iteration patch_update_strategy was removed. (idaholab/moose#33808)

Checkpoint, restart, and MultiApp fixes

  • With use_constant_mass = true, ActuallyExplicitEuler's cached mass matrix is not checkpointed, so after --recover the 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_mesh could spuriously error with an "unused parameter" message for MeshGeneratorMesh-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 MultiAppDofCopyTransfer could segfault when a sub-app's processor count was restricted through MultiApp's max_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::setNodalValue could read or write out of bounds for vector-valued variables on a mesh of lower dimension than Moose::dim; the degree-of-freedom value vector is now explicitly resized before writing. (idaholab/moose#33248)

  • ParsedMaterial and other consumers of FunctionMaterialPropertyDescriptor could silently treat a missing, non-derivative coupled material property as optional (defaulting to zero) rather than required, depending on its position in material_property_names, because a copy constructor reset the _required flag; the flag is now preserved, and non-derivative properties are consistently required. (idaholab/moose#33760)

  • Builder::extractParams stopped at the first alias it found when a parameter was set locally under a deprecated name and in GlobalParams under the current name (or vice versa), so the GlobalParams value 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 NaN when the auxiliary system has no variables, from taking the maximum of an empty vector; it now defaults to 0 in 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 UserObject executed on TIMESTEP_END was not caught, so the solve did not stop cleanly; FEProblemBase now 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-ifem builds, 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=true unit test build could fail to link with an unresolved __gcov_exit symbol because libgtest.la's link recipe omitted the libMesh link flags carrying -lgcov. (idaholab/moose#33766)

MOOSE Modules Changes

  • 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)

  • LinearFVGradientInterface was renamed to LinearFVGradientManager and 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/dt nor d(cu)/dt under mesh or time refinement (implicit Euler and constant coefficients had masked the bug). The pairing is fixed, and a new conservative_form parameter 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_gravity parameters, targeting geothermal wells with strong thermal gradients. Its point_not_found_behavior default was also raised to ERROR, 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_scaling on 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 (NewtonInversionControl or SecantInversionControl) nested in the executioner's Picard loop, distinct from the module's whole-history Optimize inverse-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 by GeneralOptimization and 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 ObtainAvgContactAngle postprocessor 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)

  • LevelSetOlssonReinitialization could produce a NaN when the level-set gradient is exactly zero; this is now avoided. (idaholab/moose#33683)