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 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(_subdomain_names.size())
34 {
36  if (!_subdomain_attributes.IsEmpty())
37  mfem::common::AttrToMarker(
39 }
40 
41 mfem::Array<int>
42 MFEMBlockRestrictable::subdomainsToAttributes(const std::vector<SubdomainName> & subdomain_names)
43 {
44  mfem::Array<int> attributes(subdomain_names.size());
45  auto & mesh = getMesh();
46  std::transform(
47  subdomain_names.begin(),
48  subdomain_names.end(),
49  attributes.begin(),
50  [&mesh](const SubdomainName & subdomain) -> int
51  {
52  try
53  {
54  // Is this a block ID?
55  return std::stoi(subdomain);
56  }
57  catch (...)
58  {
59  // It was not
60  auto & subdomain_ids = mesh.attribute_sets.GetAttributeSet(subdomain);
61  if (subdomain_ids.Size() != 1)
62  mooseError(
63  "There should be a 1-to-1 correspondence between subdomain name and subdomain ID");
64  return subdomain_ids[0];
65  }
66  });
67  return attributes;
68 }
69 
70 std::vector<std::string>
71 MFEMBlockRestrictable::subdomainsToStrings(const std::vector<SubdomainName> & subdomain_names)
72 {
73  auto attributes = subdomainsToAttributes(subdomain_names);
74  std::vector<std::string> subdomain_attr_strings(subdomain_names.size());
75  for (const auto i : index_range(subdomain_names))
76  subdomain_attr_strings[i] = std::to_string(attributes[i]);
77  return subdomain_attr_strings;
78 }
79 
80 #endif
mfem::Array< int > subdomainsToAttributes(const std::vector< SubdomainName > &subdomain_names)
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:302
const mfem::ParMesh & _mfem_mesh
Stores the names of the subdomains.
T * get(const std::unique_ptr< T > &u)
The MooseUtils::get() specializations are used to support making forwards-compatible code changes fro...
Definition: MooseUtils.h:1155
MeshBase & mesh
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
InputParameters emptyInputParameters()
std::vector< std::string > subdomainsToStrings(const std::vector< SubdomainName > &subdomain_names)
std::vector< SubdomainName > _subdomain_names
Stores the names of the subdomains.
mfem::Array< int > _subdomain_markers
Boolean array indicating which subdomains are active in this object.
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
auto index_range(const T &sizable)