From b809d9648940f266f4ebbc0df7258f77af37ad57 Mon Sep 17 00:00:00 2001 From: Alex Lindsay Date: Fri, 24 Apr 2026 12:54:28 -0700 Subject: [PATCH] Add MFEM-native mesh generator infrastructure Introduces MFEMMeshGenerator (abstract base + carrier pipeline), MFEMGeneratedMeshGenerator (structured Cartesian meshes in 1D/2D/3D with named boundary sets), and refactors the existing MFEM mesh hierarchy so MFEMMesh is the abstract base and MFEMFileMesh is the concrete file-reading subclass. Updates MFEMProblem::mesh() to accept any MFEMMesh subclass, bulk-renames test input files from MFEMMesh to MFEMFileMesh, and adds doc pages for MFEMGeneratedMeshGenerator, MFEMFileMesh, and MFEMElementAverageValue. Closes #32827 Co-Authored-By: Claude Sonnet 4.6 --- .../content/source/mfem/mesh/MFEMFileMesh.md | 28 +++++ .../doc/content/source/mfem/mesh/MFEMMesh.md | 29 ----- .../MFEMGeneratedMeshGenerator.md | 37 ++++++ .../postprocessors/MFEMElementAverageValue.md | 29 +++++ framework/include/mfem/mesh/MFEMFileMesh.h | 35 ++++++ framework/include/mfem/mesh/MFEMMesh.h | 65 +++------- framework/include/mfem/mesh/MFEMMeshCarrier.h | 39 ++++++ .../include/mfem/mesh/MFEMMeshGeneratorMesh.h | 39 ++++++ .../MFEMGeneratedMeshGenerator.h | 41 +++++++ .../mfem/meshgenerators/MFEMMeshGenerator.h | 57 +++++++++ .../postprocessors/MFEMElementAverageValue.h | 40 +++++++ framework/include/mfem/problem/MFEMProblem.h | 4 +- framework/src/actions/SetupMeshAction.C | 21 +++- framework/src/mfem/mesh/MFEMFileMesh.C | 42 +++++++ framework/src/mfem/mesh/MFEMMesh.C | 66 +++------- framework/src/mfem/mesh/MFEMMeshCarrier.C | 16 +++ .../src/mfem/mesh/MFEMMeshGeneratorMesh.C | 64 ++++++++++ .../MFEMGeneratedMeshGenerator.C | 113 ++++++++++++++++++ .../mfem/meshgenerators/MFEMMeshGenerator.C | 53 ++++++++ .../postprocessors/MFEMElementAverageValue.C | 64 ++++++++++ framework/src/mfem/problem/MFEMProblem.C | 7 +- test/tests/mfem/auxkernels/crossproduct.i | 2 +- test/tests/mfem/auxkernels/projection.i | 2 +- test/tests/mfem/complex/complex.i | 2 +- test/tests/mfem/complex/complex_waveguide.i | 2 +- .../mfem/functions/parsed_function_source.i | 2 +- test/tests/mfem/ics/scalar_ic.i | 2 +- test/tests/mfem/ics/transient_scalar_ic.i | 2 +- test/tests/mfem/ics/vector_ic.i | 2 +- test/tests/mfem/kernels/curlcurl.i | 2 +- test/tests/mfem/kernels/darcy.i | 2 +- test/tests/mfem/kernels/diffusion.i | 2 +- test/tests/mfem/kernels/diffusion_amr.i | 2 +- test/tests/mfem/kernels/graddiv.i | 2 +- test/tests/mfem/kernels/gravity.i | 2 +- test/tests/mfem/kernels/heattransfer.i | 2 +- test/tests/mfem/kernels/irrotational.i | 2 +- test/tests/mfem/kernels/linearelasticity.i | 2 +- test/tests/mfem/kernels/mixed_heattransfer.i | 2 +- test/tests/mfem/kernels/nl_heatconduction.i | 2 +- test/tests/mfem/kernels/nl_heattransfer.i | 2 +- test/tests/mfem/kernels/nldiffusion.i | 2 +- .../meshgenerators/generated/gold/oned.csv | 2 + .../meshgenerators/generated/gold/threed.csv | 1 + .../meshgenerators/generated/gold/twod.csv | 1 + .../mfem/meshgenerators/generated/test.i | 81 +++++++++++++ .../tests/mfem/meshgenerators/generated/tests | 28 +++++ test/tests/mfem/multiapps/dt_from_parent.i | 2 +- .../tests/mfem/multiapps/dt_from_parent_sub.i | 2 +- test/tests/mfem/multiapps/full_solve_parent.i | 2 +- test/tests/mfem/multiapps/full_solve_sub.i | 2 +- .../tests/mfem/multiapps/sub_cycling_parent.i | 2 +- test/tests/mfem/multiapps/sub_cycling_sub.i | 2 +- test/tests/mfem/submeshes/av_magnetostatic.i | 2 +- test/tests/mfem/submeshes/boundary_submesh.i | 2 +- test/tests/mfem/submeshes/cut_closed_coil.i | 2 +- test/tests/mfem/submeshes/domain_submesh.i | 2 +- .../mfem/submeshes/domain_submesh_transfer.i | 2 +- .../mfem/submeshes/hphi_magnetodynamic.i | 2 +- .../tests/mfem/submeshes/hphi_magnetostatic.i | 2 +- test/tests/mfem/submeshes/magnetostatic.i | 2 +- test/tests/mfem/submeshes/open_coil_source.i | 2 +- .../mfem_multiple_timesequences.i | 2 +- .../timesteppers/mfem_multiple_timesteppers.i | 2 +- .../h1_mfem_parent_mfem_sub/parent.i | 2 +- .../h1_mfem_parent_mfem_sub/parent_complex.i | 2 +- .../transfers/h1_mfem_parent_mfem_sub/sub.i | 2 +- .../h1_mfem_parent_mfem_sub/sub_complex.i | 2 +- .../transfers/h1_mfem_sub_mfem_sub/parent.i | 2 +- .../transfers/h1_mfem_sub_mfem_sub/sub_recv.i | 2 +- .../transfers/h1_mfem_sub_mfem_sub/sub_send.i | 2 +- .../variables/mfem_variables_from_moose.i | 2 +- .../line_value_sampler_curlcurl.i | 2 +- .../line_value_sampler_diffusion.i | 2 +- .../point_value_sampler_curlcurl.i | 2 +- .../point_value_sampler_diffusion.i | 2 +- 76 files changed, 920 insertions(+), 182 deletions(-) create mode 100644 framework/doc/content/source/mfem/mesh/MFEMFileMesh.md delete mode 100644 framework/doc/content/source/mfem/mesh/MFEMMesh.md create mode 100644 framework/doc/content/source/mfem/meshgenerators/MFEMGeneratedMeshGenerator.md create mode 100644 framework/doc/content/source/mfem/postprocessors/MFEMElementAverageValue.md create mode 100644 framework/include/mfem/mesh/MFEMFileMesh.h create mode 100644 framework/include/mfem/mesh/MFEMMeshCarrier.h create mode 100644 framework/include/mfem/mesh/MFEMMeshGeneratorMesh.h create mode 100644 framework/include/mfem/meshgenerators/MFEMGeneratedMeshGenerator.h create mode 100644 framework/include/mfem/meshgenerators/MFEMMeshGenerator.h create mode 100644 framework/include/mfem/postprocessors/MFEMElementAverageValue.h create mode 100644 framework/src/mfem/mesh/MFEMFileMesh.C create mode 100644 framework/src/mfem/mesh/MFEMMeshCarrier.C create mode 100644 framework/src/mfem/mesh/MFEMMeshGeneratorMesh.C create mode 100644 framework/src/mfem/meshgenerators/MFEMGeneratedMeshGenerator.C create mode 100644 framework/src/mfem/meshgenerators/MFEMMeshGenerator.C create mode 100644 framework/src/mfem/postprocessors/MFEMElementAverageValue.C create mode 100644 test/tests/mfem/meshgenerators/generated/gold/oned.csv create mode 120000 test/tests/mfem/meshgenerators/generated/gold/threed.csv create mode 120000 test/tests/mfem/meshgenerators/generated/gold/twod.csv create mode 100644 test/tests/mfem/meshgenerators/generated/test.i create mode 100644 test/tests/mfem/meshgenerators/generated/tests diff --git a/framework/doc/content/source/mfem/mesh/MFEMFileMesh.md b/framework/doc/content/source/mfem/mesh/MFEMFileMesh.md new file mode 100644 index 000000000000..66161be3c87a --- /dev/null +++ b/framework/doc/content/source/mfem/mesh/MFEMFileMesh.md @@ -0,0 +1,28 @@ +# MFEMFileMesh + +!if! function=hasCapability('mfem') + +## Overview + +`MFEMFileMesh` reads an `mfem::ParMesh` from file for use in an `MFEMProblem`. Exodus files are +supported, along with other mesh formats listed [here](https://mfem.org/mesh-formats/). + +As MOOSE checks for the existence of a `libMesh` MOOSE mesh at various points during setup, +`MFEMFileMesh` builds a dummy MOOSE mesh of a single point alongside the MFEM mesh. This dummy +mesh should not be used in an `MFEMProblem`; all MFEM objects should access the `mfem::ParMesh` via +the `getMFEMParMesh()` accessor as needed. + +## Example Input File Syntax + +!listing test/tests/mfem/kernels/diffusion.i block=Problem Mesh + +!syntax parameters /Mesh/MFEMFileMesh + +!syntax inputs /Mesh/MFEMFileMesh + +!syntax children /Mesh/MFEMFileMesh + +!if-end! + +!else +!include mfem/mfem_warning.md diff --git a/framework/doc/content/source/mfem/mesh/MFEMMesh.md b/framework/doc/content/source/mfem/mesh/MFEMMesh.md deleted file mode 100644 index 7ee894583b10..000000000000 --- a/framework/doc/content/source/mfem/mesh/MFEMMesh.md +++ /dev/null @@ -1,29 +0,0 @@ -# MFEMMesh - -!if! function=hasCapability('mfem') - -## Overview - -`MFEMMesh` is responsible for building an `mfem::ParMesh` object from the provided mesh input file -for use in an `MFEMProblem`. Exodus files are supported, along with other mesh formats listed - [here](https://mfem.org/mesh-formats/). - -As MOOSE checks for the existence of a `libMesh` MOOSE mesh at various points during setup, -`MFEMMesh` currently builds a dummy MOOSE mesh of a single point alongside the MFEM mesh. This dummy -mesh should not be used in an `MFEMProblem`; all MFEM objects should access the `mfem::ParMesh` via -the `getMFEMParMesh()` accessor as needed. - -## Example Input File Syntax - -!listing test/tests/mfem/kernels/diffusion.i block=Problem Mesh - -!syntax parameters /Mesh/MFEMMesh - -!syntax inputs /Mesh/MFEMMesh - -!syntax children /Mesh/MFEMMesh - -!if-end! - -!else -!include mfem/mfem_warning.md diff --git a/framework/doc/content/source/mfem/meshgenerators/MFEMGeneratedMeshGenerator.md b/framework/doc/content/source/mfem/meshgenerators/MFEMGeneratedMeshGenerator.md new file mode 100644 index 000000000000..fde039e58a69 --- /dev/null +++ b/framework/doc/content/source/mfem/meshgenerators/MFEMGeneratedMeshGenerator.md @@ -0,0 +1,37 @@ +# MFEMGeneratedMeshGenerator + +!if! function=hasCapability('mfem') + +## Overview + +`MFEMGeneratedMeshGenerator` generates a structured Cartesian MFEM mesh for use in an +`MFEMProblem`. It produces a line (1D), rectangle (2D), or box (3D) with uniformly spaced +elements, and is the MFEM analog of [GeneratedMeshGenerator.md]. + +The [!param](/Mesh/MFEMGeneratedMeshGenerator/dim) parameter is required and selects the spatial +dimension. Element type defaults to `QUAD` for 2D and `HEX` for 3D; `TRI` and `TET` are also +supported via [!param](/Mesh/MFEMGeneratedMeshGenerator/elem_type). + +Named boundary sets are assigned automatically so boundaries can be referenced by name in +`[BCs]` blocks: + +| Dimension | Boundary names | +|-----------|----------------| +| 1D | `left`, `right` | +| 2D | `bottom`, `right`, `top`, `left` | +| 3D | `bottom`, `front`, `right`, `back`, `left`, `top` | + +## Example Input File Syntax + +!listing test/tests/mfem/meshgenerators/generated/test.i block=Mesh BCs + +!syntax parameters /Mesh/MFEMGeneratedMeshGenerator + +!syntax inputs /Mesh/MFEMGeneratedMeshGenerator + +!syntax children /Mesh/MFEMGeneratedMeshGenerator + +!if-end! + +!else +!include mfem/mfem_warning.md diff --git a/framework/doc/content/source/mfem/postprocessors/MFEMElementAverageValue.md b/framework/doc/content/source/mfem/postprocessors/MFEMElementAverageValue.md new file mode 100644 index 000000000000..f64b0caea237 --- /dev/null +++ b/framework/doc/content/source/mfem/postprocessors/MFEMElementAverageValue.md @@ -0,0 +1,29 @@ +# MFEMElementAverageValue + +!if! function=hasCapability('mfem') + +## Overview + +Computes the volumetric average of a scalar MFEM variable over the mesh or a block-restricted +subset of subdomains: + +!equation +\bar{u} = \frac{\int_\Omega u \, \mathrm{d}V}{\int_\Omega \mathrm{d}V} + +where $\Omega$ is the full mesh domain, or the union of subdomains specified by +[!param](/Postprocessors/MFEMElementAverageValue/block). + +## Example Input File Syntax + +!listing test/tests/mfem/meshgenerators/generated/test.i block=Postprocessors + +!syntax parameters /Postprocessors/MFEMElementAverageValue + +!syntax inputs /Postprocessors/MFEMElementAverageValue + +!syntax children /Postprocessors/MFEMElementAverageValue + +!if-end! + +!else +!include mfem/mfem_warning.md diff --git a/framework/include/mfem/mesh/MFEMFileMesh.h b/framework/include/mfem/mesh/MFEMFileMesh.h new file mode 100644 index 000000000000..f30331c6491d --- /dev/null +++ b/framework/include/mfem/mesh/MFEMFileMesh.h @@ -0,0 +1,35 @@ +//* This file is part of the MOOSE framework +//* https://mooseframework.inl.gov +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#ifdef MOOSE_MFEM_ENABLED + +#pragma once + +#include "MFEMMesh.h" + +/** + * Reads an mfem::ParMesh from a file. All shared MFEM mesh plumbing lives in + * MFEMMesh; this class only adds the file parameter and implements + * buildSerialMFEMMesh() to load the mesh from disk. + */ +class MFEMFileMesh : public MFEMMesh +{ +public: + static InputParameters validParams(); + + MFEMFileMesh(const InputParameters & parameters); + virtual ~MFEMFileMesh(); + + std::unique_ptr safeClone() const override; + +protected: + mfem::Mesh buildSerialMFEMMesh() override; +}; + +#endif diff --git a/framework/include/mfem/mesh/MFEMMesh.h b/framework/include/mfem/mesh/MFEMMesh.h index e43d977309dd..54c03506bde1 100644 --- a/framework/include/mfem/mesh/MFEMMesh.h +++ b/framework/include/mfem/mesh/MFEMMesh.h @@ -11,61 +11,34 @@ #pragma once -#include "FileMesh.h" +#include "MooseMesh.h" /** - * MFEMMesh inherits a MOOSE mesh class which allows us to work with - * other MOOSE objects. It contains a pointer to the parallel MFEM mesh. + * Abstract MooseMesh base for all MFEM-backed mesh types (MFEMFileMesh, + * MFEMMeshGeneratorMesh). Holds the mfem::ParMesh and owns the shared + * MFEM mesh interface. Subclasses implement buildSerialMFEMMesh() to + * supply the serial mesh; buildMesh() handles the common post-processing + * (refinement, reordering, partitioning) using the template-method pattern. */ -class MFEMMesh : public FileMesh +class MFEMMesh : public MooseMesh { public: static InputParameters validParams(); MFEMMesh(const InputParameters & parameters); - virtual ~MFEMMesh(); - - /** - * Accessors for the _mfem_par_mesh object. If the mesh has - * not been build, the methods will call the appropriate protected methods to - * build them. - */ mfem::ParMesh & getMFEMParMesh() { return *_mfem_par_mesh; } const mfem::ParMesh & getMFEMParMesh() const; - /** - * Copy a shared_ptr to the mfem::ParMesh object. - */ std::shared_ptr getMFEMParMeshPtr() { return _mfem_par_mesh; } - /** - * Build MFEM ParMesh and a placeholder MOOSE mesh. - */ - void buildMesh() override; - - /** - * Clones the mesh. - */ - std::unique_ptr safeClone() const override; - - /** - * Returns true if mesh displacement is required. - */ bool shouldDisplace() const { return _mesh_displacement_variable.has_value(); } - /** - * Returns an optional reference to displacement variable name. - */ std::optional> getMeshDisplacementVariable() const { return _mesh_displacement_variable; } - /** - * Displace the nodes of the mesh by the given displacement. - * Does not update FE spaces for variables. - */ void displace(mfem::GridFunction const & displacement); bool isDistributedMesh() const override { return true; } @@ -75,26 +48,22 @@ class MFEMMesh : public FileMesh dof_id_type nActiveElem() const override { return _mfem_par_mesh->GetGlobalNE(); } dof_id_type nActiveLocalElem() const override { return _mfem_par_mesh->GetNE(); } -private: + void buildMesh() override; + +protected: /** - * Builds a placeholder mesh when no MOOSE mesh is required. + * Build and return the serial mfem::Mesh for this object. Also responsible + * for setting up the libMesh dummy placeholder (via buildDummyMooseMesh()). */ + virtual mfem::Mesh buildSerialMFEMMesh() = 0; + + /// Replaces the underlying libMesh mesh with a single-point placeholder. void buildDummyMooseMesh(); - /** - * Performs a uniform refinement on the chosen mesh nref times. - */ - void uniformRefinement(mfem::Mesh & mesh, const unsigned int nref) const; + /// Applies uniform refinement to mesh nref times. + void uniformRefinement(mfem::Mesh & mesh, unsigned int nref) const; - /** - * Holds name of variable used for mesh displacement, if set. - */ std::optional _mesh_displacement_variable; - - /** - * Smart pointers to mfem::ParMesh object. Do not access directly. - * Use the accessors instead. - */ std::shared_ptr _mfem_par_mesh{nullptr}; }; diff --git a/framework/include/mfem/mesh/MFEMMeshCarrier.h b/framework/include/mfem/mesh/MFEMMeshCarrier.h new file mode 100644 index 000000000000..a1380412e535 --- /dev/null +++ b/framework/include/mfem/mesh/MFEMMeshCarrier.h @@ -0,0 +1,39 @@ +//* This file is part of the MOOSE framework +//* https://mooseframework.inl.gov +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#ifdef MOOSE_MFEM_ENABLED + +#pragma once + +#include "libmesh/replicated_mesh.h" + +/** + * A thin libMesh::ReplicatedMesh subclass that carries an mfem::Mesh through the + * MeshGenerator pipeline. The libMesh side is always empty; it exists only to satisfy + * the std::unique_ptr return type of MeshGenerator::generate(). MFEM mesh + * generators wrap their output in this carrier and unwrap their inputs from it. + */ +class MFEMMeshCarrier : public libMesh::ReplicatedMesh +{ +public: + explicit MFEMMeshCarrier(const Parallel::Communicator & comm); + + void setMFEMMesh(mfem::Mesh mesh) { _mfem_mesh = std::move(mesh); } + + mfem::Mesh & getMFEMMesh() { return _mfem_mesh; } + const mfem::Mesh & getMFEMMesh() const { return _mfem_mesh; } + + /// Move the held mfem::Mesh out; leaves the carrier with a default-constructed (empty) mesh. + mfem::Mesh releaseMFEMMesh() { return std::move(_mfem_mesh); } + +private: + mfem::Mesh _mfem_mesh; +}; + +#endif diff --git a/framework/include/mfem/mesh/MFEMMeshGeneratorMesh.h b/framework/include/mfem/mesh/MFEMMeshGeneratorMesh.h new file mode 100644 index 000000000000..cae48bf5cb1f --- /dev/null +++ b/framework/include/mfem/mesh/MFEMMeshGeneratorMesh.h @@ -0,0 +1,39 @@ +//* This file is part of the MOOSE framework +//* https://mooseframework.inl.gov +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#ifdef MOOSE_MFEM_ENABLED + +#pragma once + +#include "MFEMMesh.h" + +/** + * MooseMesh subclass that consumes the MeshGenerator pipeline to build an + * mfem::ParMesh. It is the MFEM analog of MeshGeneratorMesh: use it as the + * [Mesh] type (or let SetupMeshAction auto-select it) whenever one or more + * MFEMMeshGenerator objects are present. + * + * All shared MFEM mesh plumbing lives in MFEMMesh; this class implements + * buildSerialMFEMMesh() to extract the mfem::Mesh from the MFEMMeshCarrier + * produced by the generator pipeline. + */ +class MFEMMeshGeneratorMesh : public MFEMMesh +{ +public: + static InputParameters validParams(); + + MFEMMeshGeneratorMesh(const InputParameters & parameters); + + std::unique_ptr safeClone() const override; + +protected: + mfem::Mesh buildSerialMFEMMesh() override; +}; + +#endif diff --git a/framework/include/mfem/meshgenerators/MFEMGeneratedMeshGenerator.h b/framework/include/mfem/meshgenerators/MFEMGeneratedMeshGenerator.h new file mode 100644 index 000000000000..1440f08baf2b --- /dev/null +++ b/framework/include/mfem/meshgenerators/MFEMGeneratedMeshGenerator.h @@ -0,0 +1,41 @@ +//* This file is part of the MOOSE framework +//* https://mooseframework.inl.gov +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#ifdef MOOSE_MFEM_ENABLED + +#pragma once + +#include "MFEMMeshGenerator.h" + +/** + * Generates a structured Cartesian MFEM mesh: a line (1D), rectangle (2D), or + * box (3D) with uniformly spaced elements. Analogous to GeneratedMeshGenerator + * for the MFEM mesh pipeline. + */ +class MFEMGeneratedMeshGenerator : public MFEMMeshGenerator +{ +public: + static InputParameters validParams(); + + MFEMGeneratedMeshGenerator(const InputParameters & parameters); + +protected: + mfem::Mesh generateMFEMMesh() override; + +private: + const unsigned int _dim; + const unsigned int _nx; + const unsigned int _ny; + const unsigned int _nz; + const Real _xmax; + const Real _ymax; + const Real _zmax; +}; + +#endif diff --git a/framework/include/mfem/meshgenerators/MFEMMeshGenerator.h b/framework/include/mfem/meshgenerators/MFEMMeshGenerator.h new file mode 100644 index 000000000000..71a09b6f5b19 --- /dev/null +++ b/framework/include/mfem/meshgenerators/MFEMMeshGenerator.h @@ -0,0 +1,57 @@ +//* This file is part of the MOOSE framework +//* https://mooseframework.inl.gov +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#ifdef MOOSE_MFEM_ENABLED + +#pragma once + +#include "MeshGenerator.h" + +/** + * Abstract base class for MFEM-native mesh generators. Sits inside the standard + * MeshGenerator hierarchy so MFEM generators register, chain, and compose like any + * other mesh generator. + * + * Subclasses implement generateMFEMMesh() instead of generate(). The base class + * wraps the returned mfem::Mesh in an MFEMMeshCarrier so it can travel through the + * libMesh-typed pipeline. Inputs from upstream generators are unwrapped via + * getMFEMInputMesh(). + * + * generate() is marked final so subclasses cannot accidentally bypass the carrier + * wrapping. + */ +class MFEMMeshGenerator : public MeshGenerator +{ +public: + static InputParameters validParams(); + + MFEMMeshGenerator(const InputParameters & parameters); + + /// Sealed. Calls generateMFEMMesh() and wraps the result in an MFEMMeshCarrier. + std::unique_ptr generate() final override; + +protected: + /// Implement this to produce the mfem::Mesh for this generator. + virtual mfem::Mesh generateMFEMMesh() = 0; + + /** + * Retrieve and unwrap the mfem::Mesh from an upstream generator's MFEMMeshCarrier. + * + * @param mesh_ref A reference to the unique_ptr obtained by calling getMesh() + * in the subclass constructor. The pointer is moved out (nulled) here, + * satisfying the pipeline's requirement that all requested meshes are + * released after generate(). + * + * Throws a clear error if the upstream output is not an MFEMMeshCarrier (e.g. if + * a libMesh generator was accidentally wired into an MFEM chain). + */ + mfem::Mesh getMFEMInputMesh(std::unique_ptr & mesh_ref); +}; + +#endif diff --git a/framework/include/mfem/postprocessors/MFEMElementAverageValue.h b/framework/include/mfem/postprocessors/MFEMElementAverageValue.h new file mode 100644 index 000000000000..95fa4dc05002 --- /dev/null +++ b/framework/include/mfem/postprocessors/MFEMElementAverageValue.h @@ -0,0 +1,40 @@ +//* This file is part of the MOOSE framework +//* https://mooseframework.inl.gov +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#ifdef MOOSE_MFEM_ENABLED + +#pragma once + +#include "MFEMPostprocessor.h" +#include "MFEMBlockRestrictable.h" + +/** + * Computes the volumetric average of a scalar MFEM variable over the mesh or + * a subset of subdomains. + */ +class MFEMElementAverageValue : public MFEMPostprocessor, public MFEMBlockRestrictable +{ +public: + static InputParameters validParams(); + + MFEMElementAverageValue(const InputParameters & parameters); + + void initialize() override {} + void execute() override; + + PostprocessorValue getValue() const override final; + +private: + mfem::ParGridFunction & _var; + mfem::ConstantCoefficient _one; + mfem::ParLinearForm _lf; + mfem::real_t _value{0}; +}; + +#endif diff --git a/framework/include/mfem/problem/MFEMProblem.h b/framework/include/mfem/problem/MFEMProblem.h index bfa67e0f1200..902570f41f83 100644 --- a/framework/include/mfem/problem/MFEMProblem.h +++ b/framework/include/mfem/problem/MFEMProblem.h @@ -42,8 +42,8 @@ class MFEMProblem : public ExternalProblem virtual void syncSolutions(Direction) override {} /** - * Overwritten mesh() method from base MooseMesh to retrieve the correct mesh type, in this case - * MFEMMesh. + * Overwritten mesh() method to retrieve the MFEM mesh interface, accepting + * both MFEMMesh (file-based) and MFEMMeshGeneratorMesh (generator-based). */ virtual MFEMMesh & mesh() override; virtual const MFEMMesh & mesh() const override; diff --git a/framework/src/actions/SetupMeshAction.C b/framework/src/actions/SetupMeshAction.C index 869379788092..91269ad41604 100644 --- a/framework/src/actions/SetupMeshAction.C +++ b/framework/src/actions/SetupMeshAction.C @@ -268,9 +268,26 @@ SetupMeshAction::act() // been provided if (!_pars.isParamSetByUser("type") && !_moose_object_pars.isParamValid("file")) { - _type = "MeshGeneratorMesh"; + // Auto-select MFEMMeshGeneratorMesh when any generator carries the MFEM flag. + // Guarded at compile time so non-MFEM builds incur zero overhead. + bool has_mfem_generator = false; +#ifdef MOOSE_MFEM_ENABLED + for (const auto & gen_action_ptr : generator_actions) + { + const auto * gen_action = dynamic_cast(gen_action_ptr); + if (gen_action && + gen_action->getObjectParams().have_parameter("_mfem_mesh_generator") && + gen_action->getObjectParams().get("_mfem_mesh_generator")) + { + has_mfem_generator = true; + break; + } + } +#endif + + _type = has_mfem_generator ? "MFEMMeshGeneratorMesh" : "MeshGeneratorMesh"; auto original_params = _moose_object_pars; - _moose_object_pars = _factory.getValidParams("MeshGeneratorMesh"); + _moose_object_pars = _factory.getValidParams(_type); // Since we changing the type on the fly, we'll have to manually extract parameters again // from the input file object. diff --git a/framework/src/mfem/mesh/MFEMFileMesh.C b/framework/src/mfem/mesh/MFEMFileMesh.C new file mode 100644 index 000000000000..73c8964a8a55 --- /dev/null +++ b/framework/src/mfem/mesh/MFEMFileMesh.C @@ -0,0 +1,42 @@ +//* This file is part of the MOOSE framework +//* https://mooseframework.inl.gov +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#ifdef MOOSE_MFEM_ENABLED + +#include "MFEMFileMesh.h" + +registerMooseObject("MooseApp", MFEMFileMesh); + +InputParameters +MFEMFileMesh::validParams() +{ + InputParameters params = MFEMMesh::validParams(); + params.addRequiredParam("file", "The name of the mesh file to read."); + params.addClassDescription("Reads an mfem::ParMesh from a file."); + return params; +} + +MFEMFileMesh::MFEMFileMesh(const InputParameters & parameters) : MFEMMesh(parameters) {} + +MFEMFileMesh::~MFEMFileMesh() {} + +mfem::Mesh +MFEMFileMesh::buildSerialMFEMMesh() +{ + buildDummyMooseMesh(); + return mfem::Mesh(getParam("file").c_str()); +} + +std::unique_ptr +MFEMFileMesh::safeClone() const +{ + return _app.getFactory().copyConstruct(*this); +} + +#endif diff --git a/framework/src/mfem/mesh/MFEMMesh.C b/framework/src/mfem/mesh/MFEMMesh.C index db0a8d3e21ed..b954000ed306 100644 --- a/framework/src/mfem/mesh/MFEMMesh.C +++ b/framework/src/mfem/mesh/MFEMMesh.C @@ -12,12 +12,10 @@ #include "MFEMMesh.h" #include "libmesh/mesh_generation.h" -registerMooseObject("MooseApp", MFEMMesh); - InputParameters MFEMMesh::validParams() { - InputParameters params = FileMesh::validParams(); + InputParameters params = MooseMesh::validParams(); params.addParam( "serial_refine", 0, @@ -25,70 +23,50 @@ MFEMMesh::validParams() params.addParam( "uniform_refine", 0, - "Number of serial refinements to perform on the mesh. Equivalent to serial_refine"); + "Number of serial refinements to perform on the mesh. Equivalent to serial_refine."); params.addParam( - "parallel_refine", 0, "Number of parallel refinements to perform on the mesh."); - params.addParam("displacement", "Optional variable to use for mesh displacement."); + "parallel_refine", 0, "Number of parallel refinements to perform after partitioning."); params.addParam("nonconforming", false, "Ensures the mesh is non-conforming: necessary for refining quad/hex " "meshes and load (re)balancing."); params.addParam("reorder_mesh", false, - "Determines whether we reorder the mesh to improve dynamic partitioning. " - "Only Hilbert sorting is supported at present."); - - params.addClassDescription("Class to read in and store an mfem::ParMesh from file."); - + "Reorder elements with Hilbert space-filling curve ordering before " + "partitioning, to improve dynamic load balancing."); + params.addParam("displacement", + "Optional variable name to use for mesh displacement."); return params; } -MFEMMesh::MFEMMesh(const InputParameters & parameters) : FileMesh(parameters) {} - -MFEMMesh::~MFEMMesh() {} +MFEMMesh::MFEMMesh(const InputParameters & parameters) : MooseMesh(parameters) {} void MFEMMesh::buildMesh() { - TIME_SECTION("buildMesh", 2, "Reading Mesh"); - - // Build a dummy MOOSE mesh to enable this class to work with other MOOSE classes. - buildDummyMooseMesh(); + TIME_SECTION("buildMesh", 2, "Building MFEM Mesh"); - // Build the MFEM ParMesh from a serial MFEM mesh - mfem::Mesh mfem_ser_mesh(getFileName()); + mfem::Mesh ser_mesh = buildSerialMFEMMesh(); if (isParamSetByUser("serial_refine") && isParamSetByUser("uniform_refine")) - paramError( - "Cannot define serial_refine and uniform_refine to be nonzero at the same time (they " - "are the same variable). Please choose one.\n"); + paramError("serial_refine", + "Cannot set both serial_refine and uniform_refine at the same time."); - uniformRefinement(mfem_ser_mesh, + uniformRefinement(ser_mesh, isParamSetByUser("serial_refine") ? getParam("serial_refine") : getParam("uniform_refine")); - // MFEM supports load balancing of parallel non-conforming meshes - // with a space-filling curve partitioning, and we can improve it - // by re-ordering the mesh. For now, we only support the Hilbert - // ordering, although there is one other option. if (getParam("reorder_mesh")) { mfem::Array ordering; - mfem_ser_mesh.GetHilbertElementOrdering(ordering); - mfem_ser_mesh.ReorderElements(ordering); + ser_mesh.GetHilbertElementOrdering(ordering); + ser_mesh.ReorderElements(ordering); } - // Make sure mesh is in non-conforming mode to enable local refinement of - // quadrilaterals/hexahedra (c.f. MFEM example 6p). The argument (true/false) - // determines whether a simplex mesh is considered to be non-conforming. if (getParam("nonconforming")) - mfem_ser_mesh.EnsureNCMesh(true); + ser_mesh.EnsureNCMesh(true); - // multi app should take the mpi comm from moose so is split correctly?? - auto comm = this->comm().get(); - _mfem_par_mesh = std::make_shared(comm, mfem_ser_mesh); - - // Perform parallel refinements + _mfem_par_mesh = std::make_shared(this->comm().get(), ser_mesh); uniformRefinement(*_mfem_par_mesh, getParam("parallel_refine")); if (isParamSetByUser("displacement")) @@ -99,9 +77,7 @@ void MFEMMesh::displace(mfem::GridFunction const & displacement) { _mfem_par_mesh->EnsureNodes(); - mfem::GridFunction * nodes = _mfem_par_mesh->GetNodes(); - - *nodes += displacement; + *_mfem_par_mesh->GetNodes() += displacement; } void @@ -117,10 +93,4 @@ MFEMMesh::uniformRefinement(mfem::Mesh & mesh, const unsigned int nref) const mesh.UniformRefinement(); } -std::unique_ptr -MFEMMesh::safeClone() const -{ - return _app.getFactory().copyConstruct(*this); -} - #endif diff --git a/framework/src/mfem/mesh/MFEMMeshCarrier.C b/framework/src/mfem/mesh/MFEMMeshCarrier.C new file mode 100644 index 000000000000..6d9dcc8905ca --- /dev/null +++ b/framework/src/mfem/mesh/MFEMMeshCarrier.C @@ -0,0 +1,16 @@ +//* This file is part of the MOOSE framework +//* https://mooseframework.inl.gov +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#ifdef MOOSE_MFEM_ENABLED + +#include "MFEMMeshCarrier.h" + +MFEMMeshCarrier::MFEMMeshCarrier(const Parallel::Communicator & comm) : ReplicatedMesh(comm) {} + +#endif diff --git a/framework/src/mfem/mesh/MFEMMeshGeneratorMesh.C b/framework/src/mfem/mesh/MFEMMeshGeneratorMesh.C new file mode 100644 index 000000000000..2b09e88203bf --- /dev/null +++ b/framework/src/mfem/mesh/MFEMMeshGeneratorMesh.C @@ -0,0 +1,64 @@ +//* This file is part of the MOOSE framework +//* https://mooseframework.inl.gov +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#ifdef MOOSE_MFEM_ENABLED + +#include "MFEMMeshGeneratorMesh.h" +#include "MFEMMeshCarrier.h" +#include "libmesh/mesh_generation.h" + +registerMooseObject("MooseApp", MFEMMeshGeneratorMesh); + +InputParameters +MFEMMeshGeneratorMesh::validParams() +{ + InputParameters params = MFEMMesh::validParams(); + + // Mark this as a mesh-generator-based mesh so SetupMeshAction routes the + // pipeline output to us via setMeshBase() before buildMesh() is called. + params.set("_mesh_generator_mesh") = true; + + params.addClassDescription( + "Mesh type for building an mfem::ParMesh from a chain of MFEMMeshGenerator objects."); + + return params; +} + +MFEMMeshGeneratorMesh::MFEMMeshGeneratorMesh(const InputParameters & parameters) + : MFEMMesh(parameters) +{ +} + +std::unique_ptr +MFEMMeshGeneratorMesh::safeClone() const +{ + return _app.getFactory().copyConstruct(*this); +} + +mfem::Mesh +MFEMMeshGeneratorMesh::buildSerialMFEMMesh() +{ + if (!hasMeshBase()) + mooseError("MFEMMeshGeneratorMesh: the mesh base has not been set. " + "Ensure MFEM mesh generators are present in the input file."); + + auto * carrier = dynamic_cast(&getMesh()); + if (!carrier) + mooseError("MFEMMeshGeneratorMesh requires the final mesh generator to produce an MFEM mesh. " + "If you are using libMesh generators, use MeshGeneratorMesh instead."); + + mfem::Mesh ser_mesh = carrier->releaseMFEMMesh(); + + // Re-build the libMesh dummy after releasing the MFEM mesh from the carrier. + buildDummyMooseMesh(); + + return ser_mesh; +} + +#endif diff --git a/framework/src/mfem/meshgenerators/MFEMGeneratedMeshGenerator.C b/framework/src/mfem/meshgenerators/MFEMGeneratedMeshGenerator.C new file mode 100644 index 000000000000..55ca9e388b17 --- /dev/null +++ b/framework/src/mfem/meshgenerators/MFEMGeneratedMeshGenerator.C @@ -0,0 +1,113 @@ +//* This file is part of the MOOSE framework +//* https://mooseframework.inl.gov +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#ifdef MOOSE_MFEM_ENABLED + +#include "MFEMGeneratedMeshGenerator.h" + +registerMooseObject("MooseApp", MFEMGeneratedMeshGenerator); + +InputParameters +MFEMGeneratedMeshGenerator::validParams() +{ + InputParameters params = MFEMMeshGenerator::validParams(); + + MooseEnum dims("1=1 2=2 3=3"); + params.addRequiredParam("dim", dims, "Spatial dimension of the mesh (1, 2, or 3)."); + + params.addParam("nx", 1, "Number of elements in the x direction."); + params.addParam("ny", 1, "Number of elements in the y direction."); + params.addParam("nz", 1, "Number of elements in the z direction."); + + params.addParam("xmax", 1.0, "Upper bound of the domain in the x direction."); + params.addParam("ymax", 1.0, "Upper bound of the domain in the y direction."); + params.addParam("zmax", 1.0, "Upper bound of the domain in the z direction."); + + // 2D default is QUAD; 3D default is HEX. The valid set covers all four options so + // the same parameter works for any dimension, with validation deferred to generateMFEMMesh(). + MooseEnum elem_types("QUAD=0 TRI=1 HEX=2 TET=3", "QUAD"); + params.addParam( + "elem_type", + elem_types, + "Element type. Use QUAD or TRI for 2D meshes, HEX or TET for 3D meshes."); + + params.addClassDescription("Generates a structured Cartesian MFEM mesh (line, rectangle, or box) " + "with uniformly spaced elements."); + + return params; +} + +MFEMGeneratedMeshGenerator::MFEMGeneratedMeshGenerator(const InputParameters & parameters) + : MFEMMeshGenerator(parameters), + _dim(getParam("dim")), + _nx(getParam("nx")), + _ny(getParam("ny")), + _nz(getParam("nz")), + _xmax(getParam("xmax")), + _ymax(getParam("ymax")), + _zmax(getParam("zmax")) +{ +} + +namespace +{ +void +addBdrSet(mfem::Mesh & mesh, int attr, const std::string & name) +{ + mfem::Array a; + a.Append(attr); + mesh.bdr_attribute_sets.SetAttributeSet(name, a); +} +} // namespace + +mfem::Mesh +MFEMGeneratedMeshGenerator::generateMFEMMesh() +{ + if (_dim == 1) + { + auto mesh = mfem::Mesh::MakeCartesian1D(_nx, _xmax); + addBdrSet(mesh, 1, "left"); + addBdrSet(mesh, 2, "right"); + return mesh; + } + + const MooseEnum & elem_type_param = getParam("elem_type"); + + if (_dim == 2) + { + if (elem_type_param == "HEX" || elem_type_param == "TET") + paramError("elem_type", "Use QUAD or TRI for 2D meshes."); + + const auto elem_type = + (elem_type_param == "TRI") ? mfem::Element::TRIANGLE : mfem::Element::QUADRILATERAL; + auto mesh = mfem::Mesh::MakeCartesian2D(_nx, _ny, elem_type, true, _xmax, _ymax); + addBdrSet(mesh, 1, "bottom"); + addBdrSet(mesh, 2, "right"); + addBdrSet(mesh, 3, "top"); + addBdrSet(mesh, 4, "left"); + return mesh; + } + + // dim == 3 + if (elem_type_param == "QUAD" || elem_type_param == "TRI") + paramError("elem_type", "Use HEX or TET for 3D meshes."); + + const auto elem_type = + (elem_type_param == "TET") ? mfem::Element::TETRAHEDRON : mfem::Element::HEXAHEDRON; + auto mesh = mfem::Mesh::MakeCartesian3D(_nx, _ny, _nz, elem_type, _xmax, _ymax, _zmax); + addBdrSet(mesh, 1, "bottom"); + addBdrSet(mesh, 2, "front"); + addBdrSet(mesh, 3, "right"); + addBdrSet(mesh, 4, "back"); + addBdrSet(mesh, 5, "left"); + addBdrSet(mesh, 6, "top"); + return mesh; +} + +#endif diff --git a/framework/src/mfem/meshgenerators/MFEMMeshGenerator.C b/framework/src/mfem/meshgenerators/MFEMMeshGenerator.C new file mode 100644 index 000000000000..5d98344c6a6b --- /dev/null +++ b/framework/src/mfem/meshgenerators/MFEMMeshGenerator.C @@ -0,0 +1,53 @@ +//* This file is part of the MOOSE framework +//* https://mooseframework.inl.gov +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#ifdef MOOSE_MFEM_ENABLED + +#include "MFEMMeshGenerator.h" +#include "MFEMMeshCarrier.h" +#include "libmesh/mesh_generation.h" + +InputParameters +MFEMMeshGenerator::validParams() +{ + InputParameters params = MeshGenerator::validParams(); + // Private flag checked by SetupMeshAction to auto-select MFEMMeshGeneratorMesh + // when no [Mesh] type is specified by the user. + params.addPrivateParam("_mfem_mesh_generator", true); + return params; +} + +MFEMMeshGenerator::MFEMMeshGenerator(const InputParameters & parameters) : MeshGenerator(parameters) +{ +} + +std::unique_ptr +MFEMMeshGenerator::generate() +{ + auto carrier = std::make_unique(comm()); + carrier->setMFEMMesh(generateMFEMMesh()); + // Give the libMesh side a valid dummy so Assembly can read a sane mesh dimension + // regardless of which MooseMesh type consumes the pipeline output. + MeshTools::Generation::build_point(*carrier); + return carrier; +} + +mfem::Mesh +MFEMMeshGenerator::getMFEMInputMesh(std::unique_ptr & mesh_ref) +{ + // Move ownership out, which also nulls mesh_ref for the pipeline's release validation. + auto owned = std::move(mesh_ref); + auto * carrier = dynamic_cast(owned.get()); + if (!carrier) + mooseError("An input mesh is not an MFEM mesh. MFEM mesh generators can only accept " + "inputs from other MFEM mesh generators."); + return carrier->releaseMFEMMesh(); +} + +#endif diff --git a/framework/src/mfem/postprocessors/MFEMElementAverageValue.C b/framework/src/mfem/postprocessors/MFEMElementAverageValue.C new file mode 100644 index 000000000000..091f7d3c6fab --- /dev/null +++ b/framework/src/mfem/postprocessors/MFEMElementAverageValue.C @@ -0,0 +1,64 @@ +//* This file is part of the MOOSE framework +//* https://mooseframework.inl.gov +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#ifdef MOOSE_MFEM_ENABLED + +#include "MFEMElementAverageValue.h" +#include "MFEMProblem.h" + +registerMooseObject("MooseApp", MFEMElementAverageValue); + +InputParameters +MFEMElementAverageValue::validParams() +{ + InputParameters params = MFEMPostprocessor::validParams(); + params += MFEMBlockRestrictable::validParams(); + MFEMExecutedObject::addRequiredDependencyParam( + params, "variable", "Name of the scalar variable to average."); + params.addClassDescription("Computes the volumetric average of a scalar MFEM variable."); + return params; +} + +MFEMElementAverageValue::MFEMElementAverageValue(const InputParameters & parameters) + : MFEMPostprocessor(parameters), + MFEMBlockRestrictable(parameters, + getMFEMProblem().getMFEMVariableMesh(getParam("variable"))), + _var(*getMFEMProblem().getGridFunction(getParam("variable"))), + _one(1.0), + _lf(_var.ParFESpace()) +{ + if (isSubdomainRestricted()) + _lf.AddDomainIntegrator(new mfem::DomainLFIntegrator(_one), getSubdomainMarkers()); + else + _lf.AddDomainIntegrator(new mfem::DomainLFIntegrator(_one)); +} + +void +MFEMElementAverageValue::execute() +{ + _lf.Assemble(); + + const mfem::real_t integral = _lf(_var); + + // Compute the volume of the domain (or restricted subdomains) by integrating + // the constant 1 projected onto the variable's FE space. + mfem::ParGridFunction ones(_var.ParFESpace()); + ones.ProjectCoefficient(_one); + const mfem::real_t volume = _lf(ones); + + _value = integral / volume; +} + +PostprocessorValue +MFEMElementAverageValue::getValue() const +{ + return _value; +} + +#endif diff --git a/framework/src/mfem/problem/MFEMProblem.C b/framework/src/mfem/problem/MFEMProblem.C index 4aba26e4f44a..e85a1a0c5302 100644 --- a/framework/src/mfem/problem/MFEMProblem.C +++ b/framework/src/mfem/problem/MFEMProblem.C @@ -664,9 +664,10 @@ MFEMProblem::getAuxVariableNames() MFEMMesh & MFEMProblem::mesh() { - mooseAssert(ExternalProblem::mesh().type() == "MFEMMesh", - "Please choose the MFEMMesh mesh type for an MFEMProblem\n"); - return static_cast(_mesh); + auto * mfem_mesh = dynamic_cast(&_mesh); + mooseAssert(mfem_mesh, + "The mesh for an MFEMProblem must be MFEMFileMesh or MFEMMeshGeneratorMesh."); + return *mfem_mesh; } const MFEMMesh & diff --git a/test/tests/mfem/auxkernels/crossproduct.i b/test/tests/mfem/auxkernels/crossproduct.i index c0ca0e04bb96..ee1cfa776a5e 100644 --- a/test/tests/mfem/auxkernels/crossproduct.i +++ b/test/tests/mfem/auxkernels/crossproduct.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/ref-cube.mesh [] diff --git a/test/tests/mfem/auxkernels/projection.i b/test/tests/mfem/auxkernels/projection.i index bd819cff58ec..698b69aa60f0 100644 --- a/test/tests/mfem/auxkernels/projection.i +++ b/test/tests/mfem/auxkernels/projection.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/hinomaru.e dim = 2 [] diff --git a/test/tests/mfem/complex/complex.i b/test/tests/mfem/complex/complex.i index 97617dcb24fa..35badb876bc2 100644 --- a/test/tests/mfem/complex/complex.i +++ b/test/tests/mfem/complex/complex.i @@ -6,7 +6,7 @@ kappa_r = 12.7201964951406889525742371916 kappa_i = -7.86151377757423297509831172647 [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/inline-quad.mesh dim = 2 [] diff --git a/test/tests/mfem/complex/complex_waveguide.i b/test/tests/mfem/complex/complex_waveguide.i index 7286a21d98ae..b457cc08e7f3 100644 --- a/test/tests/mfem/complex/complex_waveguide.i +++ b/test/tests/mfem/complex/complex_waveguide.i @@ -7,7 +7,7 @@ elec_cond_mouse = 0.97 elec_cond_air = 1e-323 [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/waveguide.g dim = 3 [] diff --git a/test/tests/mfem/functions/parsed_function_source.i b/test/tests/mfem/functions/parsed_function_source.i index 05cb7bca796c..05fd1d9b9a67 100644 --- a/test/tests/mfem/functions/parsed_function_source.i +++ b/test/tests/mfem/functions/parsed_function_source.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/hinomaru.e [] diff --git a/test/tests/mfem/ics/scalar_ic.i b/test/tests/mfem/ics/scalar_ic.i index f6a2a3ce2df4..c202061985a0 100644 --- a/test/tests/mfem/ics/scalar_ic.i +++ b/test/tests/mfem/ics/scalar_ic.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/cylinder-hex-q2.gen [] diff --git a/test/tests/mfem/ics/transient_scalar_ic.i b/test/tests/mfem/ics/transient_scalar_ic.i index c8fb6d78bbdb..8f0d8bb1b74f 100644 --- a/test/tests/mfem/ics/transient_scalar_ic.i +++ b/test/tests/mfem/ics/transient_scalar_ic.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/cylinder-hex-q2.gen [] diff --git a/test/tests/mfem/ics/vector_ic.i b/test/tests/mfem/ics/vector_ic.i index b80c72f859b5..b46bac807ae9 100644 --- a/test/tests/mfem/ics/vector_ic.i +++ b/test/tests/mfem/ics/vector_ic.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/cylinder-hex-q2.gen [] diff --git a/test/tests/mfem/kernels/curlcurl.i b/test/tests/mfem/kernels/curlcurl.i index 338be5438819..3c8d52c08c77 100644 --- a/test/tests/mfem/kernels/curlcurl.i +++ b/test/tests/mfem/kernels/curlcurl.i @@ -2,7 +2,7 @@ # based on MFEM Example 3. [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/small_fichera.mesh dim = 3 [] diff --git a/test/tests/mfem/kernels/darcy.i b/test/tests/mfem/kernels/darcy.i index bc9082bb51c4..1c4f6d1be1a7 100644 --- a/test/tests/mfem/kernels/darcy.i +++ b/test/tests/mfem/kernels/darcy.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/star.mesh uniform_refine = 2 [] diff --git a/test/tests/mfem/kernels/diffusion.i b/test/tests/mfem/kernels/diffusion.i index f6812f16b199..4befe2bc1ee7 100644 --- a/test/tests/mfem/kernels/diffusion.i +++ b/test/tests/mfem/kernels/diffusion.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/mug.e dim = 3 [] diff --git a/test/tests/mfem/kernels/diffusion_amr.i b/test/tests/mfem/kernels/diffusion_amr.i index c04afbb29742..5b5645664867 100644 --- a/test/tests/mfem/kernels/diffusion_amr.i +++ b/test/tests/mfem/kernels/diffusion_amr.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/square.msh nonconforming = true [] diff --git a/test/tests/mfem/kernels/graddiv.i b/test/tests/mfem/kernels/graddiv.i index 7722e09e4b50..39f52b58b041 100644 --- a/test/tests/mfem/kernels/graddiv.i +++ b/test/tests/mfem/kernels/graddiv.i @@ -2,7 +2,7 @@ # based on MFEM Example 4. [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/beam-tet.mesh dim = 3 uniform_refine = 1 diff --git a/test/tests/mfem/kernels/gravity.i b/test/tests/mfem/kernels/gravity.i index da00dc85cbe2..03e06dc49979 100644 --- a/test/tests/mfem/kernels/gravity.i +++ b/test/tests/mfem/kernels/gravity.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/beam-tet.mesh dim = 3 uniform_refine = 2 diff --git a/test/tests/mfem/kernels/heattransfer.i b/test/tests/mfem/kernels/heattransfer.i index 6fc34c746d1c..35bc9cddc1b4 100644 --- a/test/tests/mfem/kernels/heattransfer.i +++ b/test/tests/mfem/kernels/heattransfer.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/mug.e dim = 3 [] diff --git a/test/tests/mfem/kernels/irrotational.i b/test/tests/mfem/kernels/irrotational.i index 90c8f710c88a..f763740a4eaa 100644 --- a/test/tests/mfem/kernels/irrotational.i +++ b/test/tests/mfem/kernels/irrotational.i @@ -4,7 +4,7 @@ centre_x = -0.75 centre_y = 0.1 [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/vortex.msh dim = 2 [] diff --git a/test/tests/mfem/kernels/linearelasticity.i b/test/tests/mfem/kernels/linearelasticity.i index 9dc669936041..a8500533bdb2 100644 --- a/test/tests/mfem/kernels/linearelasticity.i +++ b/test/tests/mfem/kernels/linearelasticity.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/beam-tet.mesh dim = 3 uniform_refine = 2 diff --git a/test/tests/mfem/kernels/mixed_heattransfer.i b/test/tests/mfem/kernels/mixed_heattransfer.i index e2c9e6782941..c097c62c4d4e 100644 --- a/test/tests/mfem/kernels/mixed_heattransfer.i +++ b/test/tests/mfem/kernels/mixed_heattransfer.i @@ -3,7 +3,7 @@ # https://www.firedrakeproject.org/Irksome/demos/demo_mixed_heat.py.html [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/square.e [] diff --git a/test/tests/mfem/kernels/nl_heatconduction.i b/test/tests/mfem/kernels/nl_heatconduction.i index f50e4ba08cb9..2c180003cb53 100644 --- a/test/tests/mfem/kernels/nl_heatconduction.i +++ b/test/tests/mfem/kernels/nl_heatconduction.i @@ -6,7 +6,7 @@ kappa = 0.5 alpha = 1e-2 [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/star.mesh uniform_refine = 1 [] diff --git a/test/tests/mfem/kernels/nl_heattransfer.i b/test/tests/mfem/kernels/nl_heattransfer.i index c63ba11e8332..59d4858017b8 100644 --- a/test/tests/mfem/kernels/nl_heattransfer.i +++ b/test/tests/mfem/kernels/nl_heattransfer.i @@ -3,7 +3,7 @@ [] [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/stacked_hexes.e [] diff --git a/test/tests/mfem/kernels/nldiffusion.i b/test/tests/mfem/kernels/nldiffusion.i index 157488c68d2a..8b52f7674fca 100644 --- a/test/tests/mfem/kernels/nldiffusion.i +++ b/test/tests/mfem/kernels/nldiffusion.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/square.e [] diff --git a/test/tests/mfem/meshgenerators/generated/gold/oned.csv b/test/tests/mfem/meshgenerators/generated/gold/oned.csv new file mode 100644 index 000000000000..e0b2bcda1a2a --- /dev/null +++ b/test/tests/mfem/meshgenerators/generated/gold/oned.csv @@ -0,0 +1,2 @@ +time,avg +1,0.5 diff --git a/test/tests/mfem/meshgenerators/generated/gold/threed.csv b/test/tests/mfem/meshgenerators/generated/gold/threed.csv new file mode 120000 index 000000000000..829d0de26457 --- /dev/null +++ b/test/tests/mfem/meshgenerators/generated/gold/threed.csv @@ -0,0 +1 @@ +oned.csv \ No newline at end of file diff --git a/test/tests/mfem/meshgenerators/generated/gold/twod.csv b/test/tests/mfem/meshgenerators/generated/gold/twod.csv new file mode 120000 index 000000000000..829d0de26457 --- /dev/null +++ b/test/tests/mfem/meshgenerators/generated/gold/twod.csv @@ -0,0 +1 @@ +oned.csv \ No newline at end of file diff --git a/test/tests/mfem/meshgenerators/generated/test.i b/test/tests/mfem/meshgenerators/generated/test.i new file mode 100644 index 000000000000..7edecc004c60 --- /dev/null +++ b/test/tests/mfem/meshgenerators/generated/test.i @@ -0,0 +1,81 @@ +[Mesh] + [gen] + type = MFEMGeneratedMeshGenerator + dim = 1 + nx = 5 + [] +[] + +[Problem] + type = MFEMProblem +[] + +[FESpaces] + [h1] + type = MFEMScalarFESpace + fec_type = H1 + fec_order = FIRST + [] +[] + +[Variables] + [u] + type = MFEMVariable + fespace = h1 + [] +[] + +[Kernels] + [diff] + type = MFEMDiffusionKernel + variable = u + [] +[] + +[BCs] + [left] + type = MFEMScalarDirichletBC + variable = u + boundary = 'left' + coefficient = 0 + [] + [right] + type = MFEMScalarDirichletBC + variable = u + boundary = 'right' + coefficient = 1 + [] +[] + +[Preconditioner] + [boomeramg] + type = MFEMHypreBoomerAMG + [] +[] + +[Solver] + type = MFEMHypreGMRES + preconditioner = boomeramg + l_tol = 1e-12 + l_max_its = 100 +[] + +[Executioner] + type = MFEMSteady + device = cpu +[] + +[Postprocessors] + [avg] + type = MFEMElementAverageValue + variable = u + execute_on = 'TIMESTEP_END' + [] +[] + +[Outputs] + [out] + type = CSV + execute_on = 'TIMESTEP_END' + [] +[] diff --git a/test/tests/mfem/meshgenerators/generated/tests b/test/tests/mfem/meshgenerators/generated/tests new file mode 100644 index 000000000000..7d257b0d3096 --- /dev/null +++ b/test/tests/mfem/meshgenerators/generated/tests @@ -0,0 +1,28 @@ +[Tests] + design = 'MFEMGeneratedMeshGenerator.md MFEMElementAverageValue.md' + issues = '#32827' + [test] + requirement = 'The system shall be able to natively generate an MFEM mesh that is a' + [1d] + type = CSVDiff + csvdiff = 'oned.csv' + input = 'test.i' + detail = 'one dimensional line,' + cli_args = 'Outputs/out/file_base=oned' + [] + [2d] + type = CSVDiff + csvdiff = 'twod.csv' + input = 'test.i' + detail = 'two dimensional rectangle, or' + cli_args = 'Outputs/out/file_base=twod Mesh/gen/dim=2 Mesh/gen/ny=5' + [] + [3d] + type = CSVDiff + csvdiff = 'threed.csv' + input = 'test.i' + detail = 'three dimensional box.' + cli_args = 'Outputs/out/file_base=threed Mesh/gen/dim=3 Mesh/gen/nx=2 Mesh/gen/ny=2 Mesh/gen/nz=2 Mesh/gen/elem_type=HEX' + [] + [] +[] diff --git a/test/tests/mfem/multiapps/dt_from_parent.i b/test/tests/mfem/multiapps/dt_from_parent.i index 1b1f0b0cdc3d..f2bc1997d325 100644 --- a/test/tests/mfem/multiapps/dt_from_parent.i +++ b/test/tests/mfem/multiapps/dt_from_parent.i @@ -3,7 +3,7 @@ [] [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/square.e [] diff --git a/test/tests/mfem/multiapps/dt_from_parent_sub.i b/test/tests/mfem/multiapps/dt_from_parent_sub.i index c135631076d0..8c1ad7ccc306 100644 --- a/test/tests/mfem/multiapps/dt_from_parent_sub.i +++ b/test/tests/mfem/multiapps/dt_from_parent_sub.i @@ -3,7 +3,7 @@ [] [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/square.e [] diff --git a/test/tests/mfem/multiapps/full_solve_parent.i b/test/tests/mfem/multiapps/full_solve_parent.i index e3492f39a361..9965b3983080 100644 --- a/test/tests/mfem/multiapps/full_solve_parent.i +++ b/test/tests/mfem/multiapps/full_solve_parent.i @@ -4,7 +4,7 @@ [] [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/square.e [] diff --git a/test/tests/mfem/multiapps/full_solve_sub.i b/test/tests/mfem/multiapps/full_solve_sub.i index 942c81ebf04b..f25ae79f30bf 100644 --- a/test/tests/mfem/multiapps/full_solve_sub.i +++ b/test/tests/mfem/multiapps/full_solve_sub.i @@ -4,7 +4,7 @@ [] [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/square.e [] diff --git a/test/tests/mfem/multiapps/sub_cycling_parent.i b/test/tests/mfem/multiapps/sub_cycling_parent.i index 3f46261e7263..a7807906d4ed 100644 --- a/test/tests/mfem/multiapps/sub_cycling_parent.i +++ b/test/tests/mfem/multiapps/sub_cycling_parent.i @@ -4,7 +4,7 @@ [] [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/square.e [] diff --git a/test/tests/mfem/multiapps/sub_cycling_sub.i b/test/tests/mfem/multiapps/sub_cycling_sub.i index 2385f84b10e2..bf2d0eac00e4 100644 --- a/test/tests/mfem/multiapps/sub_cycling_sub.i +++ b/test/tests/mfem/multiapps/sub_cycling_sub.i @@ -3,7 +3,7 @@ [] [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/square.e [] diff --git a/test/tests/mfem/submeshes/av_magnetostatic.i b/test/tests/mfem/submeshes/av_magnetostatic.i index e0f7caaef8be..4a66a05a7235 100644 --- a/test/tests/mfem/submeshes/av_magnetostatic.i +++ b/test/tests/mfem/submeshes/av_magnetostatic.i @@ -2,7 +2,7 @@ # global loop voltage constraint. [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/embedded_concentric_torus.e [] diff --git a/test/tests/mfem/submeshes/boundary_submesh.i b/test/tests/mfem/submeshes/boundary_submesh.i index bc6077a2066d..fe72a816675c 100644 --- a/test/tests/mfem/submeshes/boundary_submesh.i +++ b/test/tests/mfem/submeshes/boundary_submesh.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/cylinder-hex-q2.gen uniform_refine = 1 [] diff --git a/test/tests/mfem/submeshes/cut_closed_coil.i b/test/tests/mfem/submeshes/cut_closed_coil.i index b075fb7efdd4..99b3622e8dc3 100644 --- a/test/tests/mfem/submeshes/cut_closed_coil.i +++ b/test/tests/mfem/submeshes/cut_closed_coil.i @@ -11,7 +11,7 @@ coil_conductivity = 1.0 [] [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/embedded_concentric_torus.e [] diff --git a/test/tests/mfem/submeshes/domain_submesh.i b/test/tests/mfem/submeshes/domain_submesh.i index ee12b45b328f..14022952379c 100644 --- a/test/tests/mfem/submeshes/domain_submesh.i +++ b/test/tests/mfem/submeshes/domain_submesh.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/cylinder-hex-q2.gen [] diff --git a/test/tests/mfem/submeshes/domain_submesh_transfer.i b/test/tests/mfem/submeshes/domain_submesh_transfer.i index 9115c50914aa..fcea6b94d784 100644 --- a/test/tests/mfem/submeshes/domain_submesh_transfer.i +++ b/test/tests/mfem/submeshes/domain_submesh_transfer.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/cylinder-hex-q2.gen [] diff --git a/test/tests/mfem/submeshes/hphi_magnetodynamic.i b/test/tests/mfem/submeshes/hphi_magnetodynamic.i index 990a7835ed61..5896775de2fb 100644 --- a/test/tests/mfem/submeshes/hphi_magnetodynamic.i +++ b/test/tests/mfem/submeshes/hphi_magnetodynamic.i @@ -10,7 +10,7 @@ vacuum_permeability = 1.0 [] [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/split_embedded_concentric_torus.e [] diff --git a/test/tests/mfem/submeshes/hphi_magnetostatic.i b/test/tests/mfem/submeshes/hphi_magnetostatic.i index 4498a18faf30..46c91181a621 100644 --- a/test/tests/mfem/submeshes/hphi_magnetostatic.i +++ b/test/tests/mfem/submeshes/hphi_magnetostatic.i @@ -11,7 +11,7 @@ vacuum_permeability = 1.0 [] [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/split_embedded_concentric_torus.e [] diff --git a/test/tests/mfem/submeshes/magnetostatic.i b/test/tests/mfem/submeshes/magnetostatic.i index e16f49ee3428..d437cc6ef78e 100644 --- a/test/tests/mfem/submeshes/magnetostatic.i +++ b/test/tests/mfem/submeshes/magnetostatic.i @@ -2,7 +2,7 @@ # based on MFEM Example 3. [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/cylinder-hex-q2.gen [] diff --git a/test/tests/mfem/submeshes/open_coil_source.i b/test/tests/mfem/submeshes/open_coil_source.i index fa9aa4eebb7f..bcc3d320c7e9 100644 --- a/test/tests/mfem/submeshes/open_coil_source.i +++ b/test/tests/mfem/submeshes/open_coil_source.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/cylinder-hex-q2.gen [] diff --git a/test/tests/mfem/timesteppers/mfem_multiple_timesequences.i b/test/tests/mfem/timesteppers/mfem_multiple_timesequences.i index a7686ba893bf..2ff13203d435 100644 --- a/test/tests/mfem/timesteppers/mfem_multiple_timesequences.i +++ b/test/tests/mfem/timesteppers/mfem_multiple_timesequences.i @@ -3,7 +3,7 @@ [] [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/square.e [] diff --git a/test/tests/mfem/timesteppers/mfem_multiple_timesteppers.i b/test/tests/mfem/timesteppers/mfem_multiple_timesteppers.i index 34ccad955e14..b9a9f05179f0 100644 --- a/test/tests/mfem/timesteppers/mfem_multiple_timesteppers.i +++ b/test/tests/mfem/timesteppers/mfem_multiple_timesteppers.i @@ -3,7 +3,7 @@ [] [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/square.e [] diff --git a/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/parent.i b/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/parent.i index bc87c2e5365a..d3b0d17d4614 100644 --- a/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/parent.i +++ b/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/parent.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../../mesh/square.msh [] diff --git a/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/parent_complex.i b/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/parent_complex.i index f186ff70dd75..c7735bc53732 100644 --- a/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/parent_complex.i +++ b/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/parent_complex.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../../mesh/square.msh [] diff --git a/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/sub.i b/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/sub.i index e5b5eacbdaf2..3ac3d2a0b676 100644 --- a/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/sub.i +++ b/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/sub.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../../mesh/square.msh [] diff --git a/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/sub_complex.i b/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/sub_complex.i index 7221d958beab..4953686fcdeb 100644 --- a/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/sub_complex.i +++ b/test/tests/mfem/transfers/h1_mfem_parent_mfem_sub/sub_complex.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../../mesh/square.msh [] diff --git a/test/tests/mfem/transfers/h1_mfem_sub_mfem_sub/parent.i b/test/tests/mfem/transfers/h1_mfem_sub_mfem_sub/parent.i index 6245d2d5e236..83bd1c662d79 100644 --- a/test/tests/mfem/transfers/h1_mfem_sub_mfem_sub/parent.i +++ b/test/tests/mfem/transfers/h1_mfem_sub_mfem_sub/parent.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../../mesh/square.msh [] diff --git a/test/tests/mfem/transfers/h1_mfem_sub_mfem_sub/sub_recv.i b/test/tests/mfem/transfers/h1_mfem_sub_mfem_sub/sub_recv.i index 50635ebd6354..dbbe96b11614 100644 --- a/test/tests/mfem/transfers/h1_mfem_sub_mfem_sub/sub_recv.i +++ b/test/tests/mfem/transfers/h1_mfem_sub_mfem_sub/sub_recv.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../../mesh/square.msh [] diff --git a/test/tests/mfem/transfers/h1_mfem_sub_mfem_sub/sub_send.i b/test/tests/mfem/transfers/h1_mfem_sub_mfem_sub/sub_send.i index 3a5d2571c952..3f9d722c8252 100644 --- a/test/tests/mfem/transfers/h1_mfem_sub_mfem_sub/sub_send.i +++ b/test/tests/mfem/transfers/h1_mfem_sub_mfem_sub/sub_send.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../../mesh/square.msh [] diff --git a/test/tests/mfem/variables/mfem_variables_from_moose.i b/test/tests/mfem/variables/mfem_variables_from_moose.i index 81bda1df19d6..0b2de2143848 100644 --- a/test/tests/mfem/variables/mfem_variables_from_moose.i +++ b/test/tests/mfem/variables/mfem_variables_from_moose.i @@ -1,5 +1,5 @@ [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../mesh/mug.e dim = 3 [] diff --git a/test/tests/mfem/vectorpostprocessors/line_value_sampler/line_value_sampler_curlcurl.i b/test/tests/mfem/vectorpostprocessors/line_value_sampler/line_value_sampler_curlcurl.i index e0fbbcab1fc6..1dbf3b91aeaf 100644 --- a/test/tests/mfem/vectorpostprocessors/line_value_sampler/line_value_sampler_curlcurl.i +++ b/test/tests/mfem/vectorpostprocessors/line_value_sampler/line_value_sampler_curlcurl.i @@ -2,7 +2,7 @@ # based on MFEM Example 3. Sampled with MFEMLineValueSampler. [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../../mesh/small_fichera.mesh [] diff --git a/test/tests/mfem/vectorpostprocessors/line_value_sampler/line_value_sampler_diffusion.i b/test/tests/mfem/vectorpostprocessors/line_value_sampler/line_value_sampler_diffusion.i index 7cc4bf7d7079..b7ff5aa53778 100644 --- a/test/tests/mfem/vectorpostprocessors/line_value_sampler/line_value_sampler_diffusion.i +++ b/test/tests/mfem/vectorpostprocessors/line_value_sampler/line_value_sampler_diffusion.i @@ -1,7 +1,7 @@ # MFEM diffusion problem sampled with MFEMLineValueSampler. [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../../mesh/mug.e [] diff --git a/test/tests/mfem/vectorpostprocessors/point_value_sampler/point_value_sampler_curlcurl.i b/test/tests/mfem/vectorpostprocessors/point_value_sampler/point_value_sampler_curlcurl.i index 1697fd4af9e7..a89eb5889016 100644 --- a/test/tests/mfem/vectorpostprocessors/point_value_sampler/point_value_sampler_curlcurl.i +++ b/test/tests/mfem/vectorpostprocessors/point_value_sampler/point_value_sampler_curlcurl.i @@ -2,7 +2,7 @@ # based on MFEM Example 3. Sampled with MFEMPointValueSampler. [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../../mesh/small_fichera.mesh [] diff --git a/test/tests/mfem/vectorpostprocessors/point_value_sampler/point_value_sampler_diffusion.i b/test/tests/mfem/vectorpostprocessors/point_value_sampler/point_value_sampler_diffusion.i index 6278e1c5ea03..64b3ac3dac25 100644 --- a/test/tests/mfem/vectorpostprocessors/point_value_sampler/point_value_sampler_diffusion.i +++ b/test/tests/mfem/vectorpostprocessors/point_value_sampler/point_value_sampler_diffusion.i @@ -1,7 +1,7 @@ # MFEM diffusion problem sampled with MFEMPointValueSampler. [Mesh] - type = MFEMMesh + type = MFEMFileMesh file = ../../mesh/mug.e []