https://mooseframework.inl.gov
MFEMMesh.h
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 MFEM_ENABLED
11 
12 //* This file is part of the MOOSE framework
13 //* https://mooseframework.inl.gov
14 //*
15 //* All rights reserved, see COPYRIGHT for full restrictions
16 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
17 //*
18 //* Licensed under LGPL 2.1, please see LICENSE for details
19 //* https://www.gnu.org/licenses/lgpl-2.1.html
20 
21 #pragma once
22 #include "FileMesh.h"
23 #include "libmesh/ignore_warnings.h"
24 #include <mfem.hpp>
25 #include "libmesh/restore_warnings.h"
26 
33 class MFEMMesh : public FileMesh
34 {
35 public:
37 
39 
40  virtual ~MFEMMesh();
41 
47  mfem::ParMesh & getMFEMParMesh() { return *_mfem_par_mesh; }
48  const mfem::ParMesh & getMFEMParMesh() const;
49 
53  std::shared_ptr<mfem::ParMesh> getMFEMParMeshPtr() { return _mfem_par_mesh; }
54 
58  void buildMesh() override;
59 
63  std::unique_ptr<MooseMesh> safeClone() const override;
64 
68  bool shouldDisplace() const { return _mesh_displacement_variable.has_value(); }
69 
73  std::optional<std::reference_wrapper<std::string const>> getMeshDisplacementVariable() const
74  {
76  }
77 
82  void displace(mfem::GridFunction const & displacement);
83 
84  bool isDistributedMesh() const override { return true; }
85  unsigned int dimension() const override { return _mfem_par_mesh->Dimension(); }
86  unsigned int spatialDimension() const override { return _mfem_par_mesh->SpaceDimension(); }
87  SubdomainID nSubdomains() const override { return _mfem_par_mesh->attributes.Size(); }
88  dof_id_type nActiveElem() const override { return _mfem_par_mesh->GetGlobalNE(); }
89  dof_id_type nActiveLocalElem() const override { return _mfem_par_mesh->GetNE(); }
90 
91 private:
95  void buildDummyMooseMesh();
96 
100  void uniformRefinement(mfem::Mesh & mesh, const unsigned int nref) const;
101 
105  std::optional<std::string> _mesh_displacement_variable;
106 
111  std::shared_ptr<mfem::ParMesh> _mfem_par_mesh{nullptr};
112 };
113 
114 inline const mfem::ParMesh &
116 {
117  return const_cast<MFEMMesh *>(this)->getMFEMParMesh();
118 }
119 
120 #endif
unsigned int dimension() const override
Returns MeshBase::mesh_dimension(), (not MeshBase::spatial_dimension()!) of the underlying libMesh me...
Definition: MFEMMesh.h:85
bool isDistributedMesh() const override
Returns the final Mesh distribution type.
Definition: MFEMMesh.h:84
bool shouldDisplace() const
Returns true if mesh displacement is required.
Definition: MFEMMesh.h:68
std::optional< std::reference_wrapper< std::string const > > getMeshDisplacementVariable() const
Returns an optional reference to displacement variable name.
Definition: MFEMMesh.h:73
void uniformRefinement(mfem::Mesh &mesh, const unsigned int nref) const
Performs a uniform refinement on the chosen mesh nref times.
Definition: MFEMMesh.C:100
virtual ~MFEMMesh()
Definition: MFEMMesh.C:49
unsigned int spatialDimension() const override
Returns MeshBase::spatial_dimension.
Definition: MFEMMesh.h:86
std::optional< std::string > _mesh_displacement_variable
Holds name of variable used for mesh displacement, if set.
Definition: MFEMMesh.h:105
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
static InputParameters validParams()
Definition: MFEMMesh.C:27
void buildDummyMooseMesh()
Builds a placeholder mesh when no MOOSE mesh is required.
Definition: MFEMMesh.C:94
dof_id_type nActiveLocalElem() const override
Definition: MFEMMesh.h:89
void buildMesh() override
Build MFEM ParMesh and a placeholder MOOSE mesh.
Definition: MFEMMesh.C:52
std::unique_ptr< MooseMesh > safeClone() const override
Clones the mesh.
Definition: MFEMMesh.C:107
std::shared_ptr< mfem::ParMesh > getMFEMParMeshPtr()
Copy a shared_ptr to the mfem::ParMesh object.
Definition: MFEMMesh.h:53
SubdomainID nSubdomains() const override
Definition: MFEMMesh.h:87
MFEMMesh(const InputParameters &parameters)
Definition: MFEMMesh.C:47
std::shared_ptr< mfem::ParMesh > _mfem_par_mesh
Smart pointers to mfem::ParMesh object.
Definition: MFEMMesh.h:111
mfem::ParMesh & getMFEMParMesh()
Accessors for the _mfem_par_mesh object.
Definition: MFEMMesh.h:47
void displace(mfem::GridFunction const &displacement)
Displace the nodes of the mesh by the given displacement.
Definition: MFEMMesh.C:85
MFEMMesh.
Definition: MFEMMesh.h:33
const InputParameters & parameters() const
Get the parameters of the object.
dof_id_type nActiveElem() const override
Definition: MFEMMesh.h:88
uint8_t dof_id_type