https://mooseframework.inl.gov
MFEMBlockRestrictable.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 
12 #include "MFEMBlockRestrictable.h"
13 
16 {
17  // Create InputParameters object that will be appended to the parameters for the inheriting object
19  // Create user-facing 'boundary' input for restricting inheriting object to boundaries
20  // MFEM uses the boundary -1 to signify every sideset
21  params.addParam<std::vector<SubdomainName>>("block",
22  {},
23  "The list of subdomains (names or ids) that this "
24  "object will be restricted to. Leave empty to apply "
25  "to all subdomains.");
26  return params;
27 }
28 
30  const mfem::ParMesh & mfem_mesh)
31  : _mfem_mesh(mfem_mesh),
32  _subdomain_names(parameters.get<std::vector<SubdomainName>>("block")),
33  _subdomain_attributes(subdomainsToAttributes())
34 {
35  if (!_subdomain_attributes.IsEmpty())
36  mfem::common::AttrToMarker(
38 }
39 
40 mfem::Array<int>
42 {
43  mfem::Array<int> attributes;
44  auto & mesh = getMesh();
45 
46  for (const SubdomainName & subdomain_name : _subdomain_names)
47  {
48  try
49  {
50  // Is this a block ID?
51  const int attribute_id = std::stoi(subdomain_name);
52  attributes.Append(attribute_id);
53  }
54  catch (...)
55  {
56  // It was not
57  auto & subdomain_ids = mesh.attribute_sets.GetAttributeSet(subdomain_name);
58  for (const auto & subdomain_id : subdomain_ids)
59  attributes.Append(subdomain_id);
60  }
61  }
62  return attributes;
63 }
64 
65 std::vector<std::string>
67 {
68  const auto & attrs = _subdomain_attributes;
69  std::vector<std::string> strs(attrs.Size());
70  std::transform(attrs.begin(), attrs.end(), strs.begin(), [](int n) { return std::to_string(n); });
71  return strs;
72 }
73 
74 #endif
const mfem::ParMesh & _mfem_mesh
Stores the names of the subdomains.
MeshBase & mesh
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
InputParameters emptyInputParameters()
std::vector< SubdomainName > _subdomain_names
Stores the names of the subdomains.
mfem::Array< int > subdomainsToAttributes()
mfem::Array< int > _subdomain_markers
Boolean array indicating which subdomains are active in this object.
std::vector< std::string > subdomainsToStrings()
mfem::Array< int > _subdomain_attributes
Array storing subdomain attribute IDs for this object.
static InputParameters validParams()
MFEMBlockRestrictable(const InputParameters &parameters, const mfem::ParMesh &mfem_mesh)
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...
const mfem::ParMesh & getMesh() const
const Elem & get(const ElemType type_in)