https://mooseframework.inl.gov
Loading...
Searching...
No Matches
MFEMRefinementMarker.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#ifdef MOOSE_MFEM_ENABLED
11
13#include "MFEMProblem.h"
14
16
19{
21 params.registerBase("Marker");
22 params.registerSystemAttributeName("Marker");
23
24 params.addRequiredParam<std::string>("indicator", "Estimator to use");
25 params.addRangeCheckedParam<Real>("threshold",
26 0,
27 "threshold>=0 & threshold<=1",
28 "Elements above this percentage of the max error will "
29 "be refined. Must be between 0 and 1!");
30 params.addParam<bool>("rebalance", false, "Whether to rebalance the mesh after h-refinement");
31 params.addRangeCheckedParam<unsigned>(
32 "max_h_level", 0, "max_h_level>=0 & max_h_level<=10", "Max number of h-refinement steps");
33 params.addRangeCheckedParam<unsigned>(
34 "max_p_level", 0, "max_p_level>=0 & max_p_level<=10", "Max number of p-refinement steps");
35 return params;
36}
37
39 : MFEMObject(params),
40 _estimator_name(getParam<std::string>("indicator")),
41 _error_threshold(getParam<Real>("threshold")),
42 _rebalance(getParam<bool>("rebalance")),
43 _max_h_level(getParam<unsigned>("max_h_level")),
44 _max_p_level(getParam<unsigned>("max_p_level"))
45{
46 // fetch const ref to the estimator
48
49 // Check if p-refinement is supported by the fespace supplied with the variable
50 if (_max_p_level && !_estimator->getFESpace().PRefinementSupported())
51 {
52 mooseWarning("Specified p-refinement on an unsupported FESpace or geometry. Only H1 and L2 "
53 "spaces on quad/hex meshes are supported by mfem. Disabling p-refinement.");
55 }
56
57 // For now, we only allow one level of p-refinement exclusively.
59 {
60 mooseWarning("At present, only either a) h-refinement or b) one level of p-refinement is "
61 "supported. Disabling p-refinement.");
63 }
64
65 // We do not want to allow rebalancing if p-refinement is enabled, because that mesh-only
66 // operation has no notion of p-refinement and the computational imbalance that may result.
68 {
69 mooseWarning("Asked for rebalancing as well as p-refinement, which is not supported.");
70 _rebalance = false;
71 }
72
73 _threshold_refiner = std::make_unique<mfem::ThresholdRefiner>(*(_estimator->getEstimator()));
74 _threshold_refiner->SetTotalErrorFraction(_error_threshold);
75}
76
77bool
79{
80 // Nothing to do if we've reached the max level of refinement
82 return false;
83
84 mfem::Array<mfem::Refinement> refinements;
85 _threshold_refiner->MarkWithoutRefining(_estimator->getParMesh(), refinements);
86
87 const bool refined = _estimator->getParMesh().ReduceInt(refinements.Size()) != 0LL;
88
89 if (refined)
90 {
91 mfem::Array<mfem::pRefinement> prefinements(refinements.Size());
92 for (const auto i : make_range(refinements.Size()))
93 prefinements[i] = mfem::pRefinement(refinements[i].index, 1);
94
95 // Perform p-refinement
96 _estimator->getFESpace().PRefineAndUpdate(prefinements);
97 // Update all gridfunctions since the same fespace can be shared by multiple gridfunctions
99 }
100
101 // Return whether we actually refined and increase the counter if we did
102 return refined && ++_p_ref_counter;
103}
104
105bool
107{
108 // Nothing to do if we've reached the max level of refinement
110 return false;
111
112 // Perform h-refinement
114
115 const bool refined = !_threshold_refiner->Stop();
116
117 if (refined)
118 {
119 // Update all fespaces since the same mesh can be shared by multiple fespaces
121 // Update all gridfunctions now we have updated all fespaces
123 if (_rebalance)
125 }
126
127 // Return whether we actually refined and increase the counter if we did
128 return refined && ++_h_ref_counter;
129}
130
131#endif
registerMooseObject("MooseApp", MFEMRefinementMarker)
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
void registerSystemAttributeName(const std::string &value)
This method is used to define the MOOSE system name that is used by the TheWarehouse object for stori...
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object.
void addRequiredParam(const std::string &name, const std::string &doc_string)
This method adds a parameter and documentation string to the InputParameters object that will be extr...
void registerBase(const std::string &value)
This method must be called from every base "Moose System" to create linkage with the Action System.
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
mfem::ParFiniteElementSpace & getFESpace() const
Get reference to FE space using the name we store when setting up this class.
std::shared_ptr< mfem::ErrorEstimator > getEstimator() const
Method to fetch the error estimator after creation.
mfem::ParMesh & getParMesh() const
Get reference to the FE space's underlying mesh.
Thin base for MFEM objects backed directly by MooseObject instead of UserObject.
Definition MFEMObject.h:30
static InputParameters validParams()
Declare the common parameters required by MFEM MooseObject-backed classes.
Definition MFEMObject.C:17
MFEMProblem & getMFEMProblem()
Return the owning MFEM problem.
Definition MFEMObject.h:45
void updateFESpaces()
Calls Update() on all FE spaces.
void rebalanceMesh(mfem::ParMesh &pmesh)
Rebalance the (necessarily nonconforming) mesh.
T & getMFEMObject(const std::string &system, const std::string &name, const THREAD_ID tid=0) const
Retrieve an MFEM object from the warehouse by system and name.
void updateGridFunctions()
Calls Update() on all gridfunctions.
Class to construct threshold refiner.
const unsigned _max_p_level
The max no. of times h-refinement can be performed.
std::unique_ptr< mfem::ThresholdRefiner > _threshold_refiner
Unique pointer to underlying mfem::ThresholdRefiner object.
const std::string & _estimator_name
The estimator/indicator's name.
MFEMRefinementMarker(const InputParameters &params)
unsigned _p_ref_counter
The no. of times p-refinement has been performed.
const unsigned _max_h_level
The max no. of times h-refinement can be performed.
bool hRefine()
Applies h-refinement wherever the refiner sees fit.
const MFEMIndicator * _estimator
Pointer to the estimator/indicator.
const mfem::real_t _error_threshold
The error threshold determining which elements to refine.
static InputParameters validParams()
bool _rebalance
Whether to rebalance the mesh after h-refinement.
bool pRefine()
Applies p-refinement wherever the refiner sees fit.
unsigned _h_ref_counter
The no. of times h-refinement has been performed.
void mooseWarning(Args &&... args) const