10#ifdef MOOSE_MFEM_ENABLED
27#include "libmesh/string_to_enum.h"
39std::vector<MFEMSolverName>
42 std::vector<MFEMSolverName> dependencies;
44 for (
const auto & [param_name, _] : parameters)
49 if (
auto * name = parameters.
queryParam<MFEMSolverName>(param_name))
50 dependencies.push_back(*name);
51 else if (
auto * names = parameters.
queryParam<std::vector<MFEMSolverName>>(param_name))
52 dependencies.insert(dependencies.end(), names->begin(), names->end());
63 params.
addClassDescription(
"Problem type for building and solving the finite element problem "
64 "using the MFEM finite element library.");
65 MooseEnum numeric_types(
"real complex",
"real");
66 params.
addParam<
MooseEnum>(
"numeric_type", numeric_types,
"Number type used for the problem");
73 _num_type{static_cast<
int>(getParam<
MooseEnum>(
"numeric_type"))},
74 _solution_state_data(declareRestartableDataWithContext<
Moose::MFEM::SolutionState>(
75 "mfem_solution_state", &_problem_data))
81#ifdef LIBMESH_HAVE_OPENMP
82 omp_set_num_threads(1);
92 std::vector<MFEMExecutedObject *> objects;
96 .condition<AttribThread>(0)
98 for (
auto *
const object : objects)
99 object->initialSetup();
123 const std::string & name,
126 auto estimator = addObject<MFEMIndicator>(indicator_type,
name,
parameters).front();
129 estimator->createEstimator();
134 const std::string & name,
142 const std::string & name,
151 const std::string & name,
167 const auto dependencies = getMFEMSolverDependencies(*definition.parameters);
168 if (dependencies.empty())
171 for (
const auto & dependency_name : dependencies)
177 "' references MFEM solver '",
179 "', but no solver with that name was provided in the [Solvers] block.");
181 dependency_it->second.referenced =
true;
182 resolver.
addEdge(dependency_name, solver_name);
186 const std::vector<std::string> * sorted_solver_names =
nullptr;
193 mooseError(
"Cyclic MFEM solver dependency detected: ",
198 mooseAssert(!problem_data.jacobian_solver,
"MFEM linear solver driver already assigned");
199 mooseAssert(!problem_data.nonlinear_solver,
"MFEM nonlinear solver driver already assigned");
201 for (
const auto & solver_name : *sorted_solver_names)
205 addObject<Moose::MFEM::SolverBase>(definition.type, solver_name, *definition.parameters)
208 if (definition.referenced)
211 if (
auto lin_solver = std::dynamic_pointer_cast<Moose::MFEM::LinearSolverBase>(solver))
213 if (problem_data.jacobian_solver)
214 mooseError(
"Multiple MFEM linear solver drivers provided. '",
215 problem_data.jacobian_solver->name(),
218 "' are not referenced by another MFEM solver.");
219 problem_data.jacobian_solver = lin_solver;
221 else if (
auto nonlinear_solver =
222 std::dynamic_pointer_cast<Moose::MFEM::NonlinearSolverBase>(solver);
225 if (problem_data.nonlinear_solver)
226 mooseError(
"Multiple MFEM nonlinear solver drivers provided. '",
227 problem_data.nonlinear_solver->name(),
229 nonlinear_solver->name(),
230 "' are not referenced by another MFEM solver.");
231 problem_data.nonlinear_solver = nonlinear_solver;
234 mooseError(
"Unsupported MFEM solver object type '",
246 const std::string & name,
249 auto bc = addObject<MFEMBoundaryCondition>(bc_name,
name,
parameters).front();
250 const auto & mfem_bc = *bc;
254 auto integrated_bc = std::dynamic_pointer_cast<MFEMIntegratedBC>(bc);
256 std::dynamic_pointer_cast<Moose::MFEM::EquationSystem>(
getProblemData().eqn_system);
258 eqsys->AddIntegratedBC(std::move(integrated_bc));
261 "' because there is no corresponding equation system.");
265 auto integrated_bc = std::dynamic_pointer_cast<MFEMComplexIntegratedBC>(bc);
267 std::dynamic_pointer_cast<Moose::MFEM::ComplexEquationSystem>(
getProblemData().eqn_system);
269 eqsys->AddComplexIntegratedBC(std::move(integrated_bc));
271 mooseError(
"Cannot add complex integrated BC with name '" +
name +
272 "' because there is no corresponding equation system.");
276 auto essential_bc = std::dynamic_pointer_cast<MFEMComplexEssentialBC>(bc);
278 std::dynamic_pointer_cast<Moose::MFEM::ComplexEquationSystem>(
getProblemData().eqn_system);
280 eqsys->AddComplexEssentialBCs(std::move(essential_bc));
283 "' because there is no corresponding equation system.");
287 auto essential_bc = std::dynamic_pointer_cast<MFEMEssentialBC>(bc);
289 std::dynamic_pointer_cast<Moose::MFEM::EquationSystem>(
getProblemData().eqn_system);
291 eqsys->AddEssentialBC(std::move(essential_bc));
294 "' because there is no corresponding equation system.");
298 mooseError(
"Unsupported bc of type '", bc_name,
"' and name '",
name,
"' detected.");
306 "MFEM materials must be added through the 'FunctorMaterials' block and not 'Materials'");
311 const std::string & name,
319 const std::string & name,
325 "': an MFEMFESpaceHierarchy with the same name already exists. "
326 "FESpaces and FESpaceHierarchies share the fespaces namespace.");
337 const std::string & name,
341 mooseError(
"Cannot add MFEMFESpaceHierarchy '",
343 "': a FESpace with the same name already exists. "
344 "FESpaces and FESpaceHierarchies share the fespaces namespace.");
347 auto hierarchy_shared = hierarchy_obj->getHierarchyShared();
353 auto finest = std::shared_ptr<mfem::ParFiniteElementSpace>(
354 hierarchy_shared, &hierarchy_obj->getHierarchy().GetFinestFESpace());
360 const std::string & var_name)
const
362 const bool variable_is_complex = var_type ==
"MFEMComplexVariable";
364 if (variable_is_complex != problem_is_complex)
366 "The problem numeric type does not match primary MFEM variable '",
369 variable_is_complex ?
"complex." :
"real.");
374 const std::string & var_name,
384 const auto time_derivative_var_name =
385 getMFEMObject<MFEMVariable>(
"MooseVariableBase", var_name).getTimeDerivativeName();
387 time_derivative_var_name);
394 const std::string & var_name,
398 if (var_type ==
"MFEMVariable" || var_type ==
"MFEMComplexVariable")
401 if (var_type ==
"MFEMComplexVariable")
402 addObject<MFEMComplexVariable>(var_type, var_name,
parameters);
404 addObject<MFEMVariable>(var_type, var_name,
parameters);
413 addObject<MFEMVariable>(
"MFEMVariable", var_name, mfem_variable_params);
417 if (var_type ==
"MFEMComplexVariable")
420 getMFEMObject<MFEMComplexVariable>(
"MooseVariableBase", var_name);
426 MFEMVariable & mfem_variable = getMFEMObject<MFEMVariable>(
"MooseVariableBase", var_name);
434 const std::string & var_name,
444 const std::string & name,
452 const std::string & name,
455 auto kernel = addObject<MFEMKernel>(kernel_name,
name,
parameters).front();
456 const auto & kernel_object = *kernel;
460 auto complex_kernel = std::dynamic_pointer_cast<MFEMComplexKernel>(kernel);
462 std::dynamic_pointer_cast<Moose::MFEM::ComplexEquationSystem>(
getProblemData().eqn_system);
464 eqsys->AddComplexKernel(std::move(complex_kernel));
467 "' because there is no corresponding equation system.");
472 std::dynamic_pointer_cast<Moose::MFEM::EquationSystem>(
getProblemData().eqn_system);
474 eqsys->AddKernel(std::move(kernel));
477 "' because there is no corresponding equation system.");
483 const std::string & name,
486 auto parent_ptr = std::dynamic_pointer_cast<MFEMComplexKernel>(
488 parameters.
set<VariableName>(
"variable") = parent_ptr->getParam<VariableName>(
"variable");
489 auto kernel_ptr = addObject<MFEMKernel>(kernel_name,
name +
"_real",
parameters).front();
490 parent_ptr->setRealKernel(kernel_ptr);
495 const std::string & name,
498 auto parent_ptr = std::dynamic_pointer_cast<MFEMComplexKernel>(
500 parameters.
set<VariableName>(
"variable") = parent_ptr->getParam<VariableName>(
"variable");
501 auto kernel_ptr = addObject<MFEMKernel>(kernel_name,
name +
"_imag",
parameters).front();
502 parent_ptr->setImagKernel(kernel_ptr);
507 const std::string & name,
510 auto parent_ptr = std::dynamic_pointer_cast<MFEMComplexIntegratedBC>(
511 getMFEMObject<MFEMComplexIntegratedBC>(
"BoundaryCondition",
name).
getSharedPtr());
512 parameters.
set<VariableName>(
"variable") = parent_ptr->getParam<VariableName>(
"variable");
514 parent_ptr->getParam<std::vector<BoundaryName>>(
"boundary");
515 auto bc_ptr = std::dynamic_pointer_cast<MFEMIntegratedBC>(
516 addObject<MFEMBoundaryCondition>(kernel_name,
name +
"_real",
parameters).front());
517 parent_ptr->setRealBC(bc_ptr);
522 const std::string & name,
525 auto parent_ptr = std::dynamic_pointer_cast<MFEMComplexIntegratedBC>(
526 getMFEMObject<MFEMComplexIntegratedBC>(
"BoundaryCondition",
name).
getSharedPtr());
527 parameters.
set<VariableName>(
"variable") = parent_ptr->getParam<VariableName>(
"variable");
529 parent_ptr->getParam<std::vector<BoundaryName>>(
"boundary");
530 auto bc_ptr = std::dynamic_pointer_cast<MFEMIntegratedBC>(
531 addObject<MFEMBoundaryCondition>(kernel_name,
name +
"_imag",
parameters).front());
532 parent_ptr->setImagBC(bc_ptr);
540 if (parameters.
isParamSetByUser(
"expression_y") || type ==
"LevelSetOlssonVortex")
548const std::vector<std::string>
SCALAR_FUNCS = {
"Axisymmetric2D3DSolutionFunction",
549 "BicubicSplineFunction",
550 "CoarsenedPiecewiseLinear",
555 "ParsedGradFunction",
559 "PiecewiseConstantFromCSV",
561 "PiecewiseLinearFromVectorPostprocessor",
562 "PiecewiseMultiInterpolation",
563 "PiecewiseMulticonstant",
567 "LevelSetOlssonBubble",
568 "LevelSetOlssonPlane",
569 "NearestReporterCoordinatesFunction",
570 "ParameterMeshFunction",
571 "ParsedOptimizationFunction",
574 "MultiControlDrumFunction",
575 "Grad2ParsedFunction",
576 "GradParsedFunction",
577 "ScaledAbsDifferenceDRLRewardFunction",
578 "CircularAreaHydraulicDiameterFunction",
579 "CosineHumpFunction",
580 "CosineTransitionFunction",
581 "CubicTransitionFunction",
582 "GeneralizedCircumference",
587 "MFEMCoordinateTransformations",
588 "MFEMScalarQuadratureFunction",
589 "MFEMVectorQuadratureFunction"};
593 const std::string & name,
604 [&func](
const mfem::Vector & p, mfem::real_t t) -> mfem::real_t
613 [&func,
dim](
const mfem::Vector & p, mfem::real_t t, mfem::Vector & u)
617 for (
int i = 0; i <
dim; i++)
619 u[i] = vector_value(i);
627 mooseWarning(
"Could not identify function ",
type,
"; no MFEM coefficient object created.");
632 const std::string & name,
641 name, [&val](
const mfem::Vector &) -> mfem::real_t {
return val; });
649 const std::string & name,
677 case FEFamily::LAGRANGE:
680 case FEFamily::NEDELEC_ONE:
683 case FEFamily::RAVIART_THOMAS:
687 case FEFamily::MONOMIAL:
688 case FEFamily::L2_LAGRANGE:
691 case FEFamily::LAGRANGE_VEC:
695 case FEFamily::MONOMIAL_VEC:
696 case FEFamily::L2_LAGRANGE_VEC:
701 mooseError(
"Unable to set MFEM FESpace for MOOSE variable");
708 const auto fec_name = space +
"_" + std::to_string(
dim) +
"D_P" + std::to_string(order);
709 const auto fes_name = fec_name +
"_X" + std::to_string(vdim);
712 fespace_params.
set<std::string>(
"fec_name") = fec_name;
713 fespace_params.
set<
int>(
"vdim") = vdim;
716 addFESpace(
"MFEMGenericFESpace", fes_name, fespace_params);
718 variable_params.
set<MFEMFESpaceName>(
"fespace") = fes_name;
720 return variable_params;
727 if (
mesh().shouldDisplace())
734std::optional<std::reference_wrapper<mfem::ParGridFunction const>>
739 if (displacement_variable)
752 if (pmesh.Nonconforming())
764 fe_space_pair.second->Update();
771 gridfunction_pair.second->Update();
774std::vector<VariableName>
784 mooseAssert(mfem_mesh,
785 "The mesh for an MFEMProblem must be MFEMFileMesh or MFEMMeshGeneratorMesh.");
797 const std::string & var_name,
800 auto & mfem_submesh = *addObject<MFEMSubMesh>(var_type, var_name,
parameters).front();
807 const std::string & name,
818 const std::string & name,
827 std::vector<MFEMExecutedObject *> objects;
831 .condition<AttribExecOns>(exec_type)
835 std::map<std::string, const MFEMExecutedObject *> suppliers;
836 for (
auto *
const object : objects)
837 for (
const auto & item :
object->getSuppliedItems())
839 const auto [it, inserted] = suppliers.emplace(item,
object);
840 if (!inserted && it->second !=
object)
841 mooseError(
"MFEM executed-object dependency ambiguity on ",
852 for (
auto *
const object : objects)
854 object->initialize();
858 if (
auto *
const pp =
dynamic_cast<const Postprocessor *
>(
object))
872 mooseAssert(solver_sys_num == 0,
"No support for multi-system with MFEM right now");
874 std::vector<std::string> solvers;
882 if (
const auto * prec =
getProblemData().jacobian_solver->GetPreconditioner())
892 std::vector<MooseObject *> objs;
896 .condition<AttribThread>(0)
899 return !objs.empty();
const std::vector< std::string > SCALAR_FUNCS
int vectorFunctionDim(const std::string &type, const InputParameters ¶meters)
const std::vector< std::string > MFEM_FUNCS
registerMooseObject("MooseApp", MFEMProblem)
const std::vector< std::string > VECTOR_FUNCS
void mooseWarning(Args &&... args)
Emit a warning message with the given stringified, concatenated args.
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Real PostprocessorValue
various MOOSE typedefs
void ErrorVector unsigned int
const std::vector< T > & getCyclicDependencies() const
Class that represents the dependecy as a graph.
void addNode(const T &a)
Add a node 'a' to the graph.
const std::vector< T > & getSortedValues()
This function also returns dependency resolved values but with a simpler single vector interface.
void addEdge(const T &a, const T &b)
Add an edge between nodes 'a' and 'b'.
static InputParameters validParams()
ReporterData _reporter_data
virtual const SystemBase & systemBaseAuxiliary() const override
Return the auxiliary system object as a base class reference.
const PostprocessorValue & getPostprocessorValueByName(const PostprocessorName &name, std::size_t t_index=0) const
Get a read-only reference to the value associated with a Postprocessor that exists.
virtual void addVariable(const std::string &var_type, const std::string &var_name, InputParameters ¶ms)
Canonical method for adding a non-linear variable.
virtual void addFunction(const std::string &type, const std::string &name, InputParameters ¶meters)
virtual void addTransfer(const std::string &transfer_name, const std::string &name, InputParameters ¶meters)
Add a Transfer to the problem.
void checkUserObjectNameCollision(const std::string &name, const std::string &type) const
Check for name collision between different user objects.
virtual void addVectorPostprocessor(const std::string &pp_name, const std::string &name, InputParameters ¶meters)
virtual void addPostprocessor(const std::string &pp_name, const std::string &name, InputParameters ¶meters)
void setPostprocessorValueByName(const PostprocessorName &name, const PostprocessorValue &value, std::size_t t_index=0)
Set the value of a PostprocessorValue.
void setCurrentExecuteOnFlag(const ExecFlagType &)
virtual void execute(const ExecFlagType &exec_type)
Convenience function for performing execution of MOOSE systems.
TheWarehouse & theWarehouse() const
virtual bool isTransient() const override
virtual Function & getFunction(const std::string &name, const THREAD_ID tid=0)
void initialSetup() override
InputParameters getValidParams(const std::string &name) const
Get valid parameters for the object.
Constructs and stores an mfem::ParComplexGridFunction object.
void declareCoefficients()
std::shared_ptr< mfem::ParComplexGridFunction > getComplexGridFunction() const
Returns a shared pointer to the constructed gridfunction.
Abstract MooseMesh base for all MFEM-backed mesh types (MFEMFileMesh, MFEMMeshGeneratorMesh).
std::optional< std::reference_wrapper< std::string const > > getMeshDisplacementVariable() const
Returns an optional reference to displacement variable name.
unsigned int dimension() const override
Returns MeshBase::mesh_dimension(), (not MeshBase::spatial_dimension()!) of the underlying libMesh me...
std::shared_ptr< mfem::ParMesh > getMFEMParMeshPtr()
Copy a shared_ptr to the mfem::ParMesh object.
void displace(mfem::GridFunction const &displacement)
Displace the nodes of the mesh by the given displacement.
virtual std::vector< VariableName > getAuxVariableNames()
Returns all the variable names from the auxiliary system base.
std::shared_ptr< MFEMProblemComposer > _problem_composer
The problem operator builders for this mfem problem.
void addPostprocessor(const std::string &type, const std::string &name, InputParameters ¶meters) override
Override of ExternalProblem::addPostprocessor.
virtual MFEMMesh & mesh() override
Overwritten mesh() method from base MooseMesh to retrieve the correct mesh type, in this case MFEMMes...
void addFESpace(const std::string &type, const std::string &name, InputParameters ¶meters)
Add an MFEM FESpace to the problem.
void addMarker(const std::string &type, const std::string &name, InputParameters ¶meters) override
Override of FEProblemBase::addMarker.
void addFESpaceHierarchy(const std::string &type, const std::string &name, InputParameters ¶meters)
Add an MFEMFESpaceHierarchy to the problem.
virtual void addMFEMSolver(const std::string &user_object_name, const std::string &name, InputParameters ¶meters)
Method called in AddMFEMSolverAction which records a solver for later dependency-ordered construction...
Moose::MFEM::CoefficientManager & getCoefficients()
Method to get the PropertyManager object for storing material properties and converting them to MFEM ...
std::string solverTypeString(unsigned int solver_sys_num) override
Return solver type as a human readable string.
bool hasMFEMObject(const std::string &system, const std::string &name) const
Determine whether an MFEM object with the supplied system and name exists.
MFEMProblemData & getProblemData()
Method to get the current MFEMProblemData object storing the current data specifying the FE problem.
void updateFESpaces()
Calls Update() on all FE spaces.
void addIndicator(const std::string &type, const std::string &name, InputParameters ¶meters) override
Override of FEProblemBase::addIndicator.
void rebalanceMesh(mfem::ParMesh &pmesh)
Rebalance the (necessarily nonconforming) mesh.
void addVectorPostprocessor(const std::string &type, const std::string &name, InputParameters ¶meters) override
Add a vector postprocessor and register its vectors with the MFEM execution system.
void addAuxKernel(const std::string &kernel_name, const std::string &name, InputParameters ¶meters) override
Override of ExternalProblem::addAuxKernel.
void addMaterial(const std::string &material_name, const std::string &name, InputParameters ¶meters) override
void addSubMesh(const std::string &type, const std::string &name, InputParameters ¶meters)
Add an MFEM SubMesh to the problem.
void validateVariableNumericType(const std::string &var_type, const std::string &var_name) const
Verify that a primary variable's numeric type matches the problem's equation system.
void addInitialCondition(const std::string &ic_name, const std::string &name, InputParameters ¶meters) override
Add an MFEM initial condition to the problem.
static InputParameters validParams()
Return the input parameters used to construct an MFEM problem.
void setMesh()
Set the mesh used by MFEM.
void addKernel(const std::string &kernel_name, const std::string &name, InputParameters ¶meters) override
Override of ExternalProblem::addKernel.
virtual void addVariable(const std::string &var_type, const std::string &var_name, InputParameters ¶meters) override
Override of ExternalProblem::addVariable.
void updateGridFunctions()
Calls Update() on all gridfunctions.
void addRealComponentToKernel(const std::string &kernel_name, const std::string &name, InputParameters ¶meters)
Adds a real component kernel to the parent MFEMComplexKernel.
MFEMProblemData _problem_data
Aggregated MFEM-side state for meshes, spaces, variables, coefficients, and solvers.
void addRealComponentToBC(const std::string &kernel_name, const std::string &name, InputParameters ¶meters)
Adds a real component BC to the parent MFEMComplexIntegratedBC.
void addMFEMProblemComposer(const std::string &user_object_name, const std::string &name, InputParameters ¶meters)
Method called in AddMFEMProblemComposerAction which will create the problem composer.
void addFunction(const std::string &type, const std::string &name, InputParameters ¶meters) override
Override of ExternalProblem::addFunction.
InputParameters addMFEMFESpaceFromMOOSEVariable(InputParameters &moosevar_params)
Method used to get an mfem FEC depending on the variable family specified in the input file.
void addGridFunction(const std::string &var_type, const std::string &var_name, InputParameters ¶meters)
Adds one MFEM GridFunction to be used in the MFEM solve.
std::optional< std::reference_wrapper< mfem::ParGridFunction const > > getMeshDisplacementGridFunction()
Returns optional reference to the displacement GridFunction to apply to nodes.
void addTransfer(const std::string &transfer_name, const std::string &name, InputParameters ¶meters) override
Add transfers between MultiApps and/or MFEM SubMeshes.
void displaceMesh()
Displace the mesh, if mesh displacement is enabled.
void addBoundaryCondition(const std::string &bc_name, const std::string &name, InputParameters ¶meters) override
virtual void execute(const ExecFlagType &exec_type) override
Convenience function for performing execution of MOOSE systems.
NumericType _num_type
The numeric representation currently active for this problem.
void addImagComponentToBC(const std::string &kernel_name, const std::string &name, InputParameters ¶meters)
Adds an imaginary component BC to the parent MFEMComplexIntegratedBC.
void executeMFEMObjects(const ExecFlagType &exec_type)
Execute MFEM executed objects scheduled on the supplied execute flag.
MFEMProblem(const InputParameters ¶ms)
Construct an MFEM problem from the supplied parameters.
std::map< std::string, MFEMSolverDefinition > _mfem_solver_definitions
Solver definitions recorded by AddMFEMSolverAction before the dependency resolver constructs them.
void addAuxVariable(const std::string &var_type, const std::string &var_name, InputParameters ¶meters) override
Override of ExternalProblem::addAuxVariable.
virtual void resolveMFEMSolvers()
Construct recorded MFEM solvers in dependency order and select the problem driver solver(s).
void addFunctorMaterial(const std::string &material_name, const std::string &name, InputParameters ¶meters) override
void addImagComponentToKernel(const std::string &kernel_name, const std::string &name, InputParameters ¶meters)
Adds an imaginary component kernel to the parent MFEMComplexKernel.
virtual void initialSetup() override
Constructs and stores an mfem::ParGridFunction object.
std::shared_ptr< mfem::ParGridFunction > getGridFunction() const
Returns a shared pointer to the constructed gridfunction.
void declareCoefficients()
Declare default coefficients associated with this gridfunction.
const InputParameters & parameters() const
Get the parameters of the object.
const std::string & type() const
Get the type of this class.
const std::string & name() const
Get the name of the class.
void paramError(const std::string ¶m, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
Class for containing MooseEnum item information.
const std::string & name() const
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
std::shared_ptr< MooseObject > getSharedPtr()
Get another shared pointer to this object that has the same ownership group.
mfem::Coefficient & declareScalar(const std::string &name, const std::string &existing_or_literal)
Declare an alias to an existing scalar coefficient or, if it does not exist, try interpreting the nam...
mfem::VectorCoefficient & declareVector(const std::string &name, const std::string &existing_or_literal)
Declare an alias to an existing vector coefficientor or, if it does not exist, try interpreting the n...
void Register(const std::string &field_name, FieldArgs &&... args)
Construct new field with name field_name and register.
T * Get(const std::string &field_name) const
Returns a non-owning pointer to the field. This is guaranteed to return a non-null pointer.
void addTimeDerivativeAssociation(const std::string &var_name, const std::string &time_derivative_var_name)
Base class for all Postprocessors.
void finalize(const std::string &object_name)
Helper function for performing post calculation actions via the ReporterContext objects.
Factory & _factory
The Factory for building objects.
const std::vector< VariableName > & getVariableNames() const
QueryCache & condition(Args &&... args)
Adds a new condition to the query.
Query query()
query creates and returns an initialized a query object for querying objects from the warehouse.
Base class for Postprocessors that produce a vector of values.
std::string prettyCppType(const std::string &cpp_type)
std::string stringJoin(const std::vector< std::string > &values, const std::string &separator=" ")
Concatenates value into a single string separated by separator.
libMesh::Point libMeshPointFromMFEMVector(const mfem::Vector &vec)
Convert an MFEM position vector to a libMesh::Point.
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
Moose::MFEM::FESpaces fespaces
Moose::MFEM::SubMeshes submeshes
Moose::MFEM::TimeDerivativeMap time_derivative_map
Moose::MFEM::ComplexGridFunctions cmplx_gridfunctions
std::shared_ptr< MFEMRefinementMarker > refiner
Moose::MFEM::FECollections fecs
std::shared_ptr< mfem::ParMesh > pmesh
Moose::MFEM::GridFunctions gridfunctions
Moose::MFEM::FESpaceHierarchies fespace_hierarchies