www.mooseframework.org
BoundingBoxNodeSetGenerator.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 
11 #include "MooseMeshUtils.h"
12 #include "CastUniquePointer.h"
13 #include "MooseUtils.h"
14 
15 #include "libmesh/node.h"
16 
18 
21 {
23  MooseEnum location("INSIDE OUTSIDE", "INSIDE");
24 
25  params.addRequiredParam<MeshGeneratorName>("input", "The mesh we want to modify");
26  params.addClassDescription(
27  "Assigns all of the nodes either inside or outside of a bounding box to a new nodeset.");
28  params.addRequiredParam<std::vector<BoundaryName>>("new_boundary",
29  "The name of the nodeset to create");
31  "bottom_left",
32  "The bottom left point (in x,y,z with spaces in-between) of the box to select the nodes.");
34  "top_right",
35  "The bottom left point (in x,y,z with spaces in-between) of the box to select the nodes.");
36  params.addParam<MooseEnum>("location", location, "Control of where the nodeset is to be set");
37 
38  return params;
39 }
40 
42  : MeshGenerator(parameters),
43  _input(getMesh("input")),
44  _location(getParam<MooseEnum>("location")),
45  _bounding_box(MooseUtils::buildBoundingBox(getParam<RealVectorValue>("bottom_left"),
46  getParam<RealVectorValue>("top_right")))
47 {
48 }
49 
50 std::unique_ptr<MeshBase>
52 {
53  std::unique_ptr<MeshBase> mesh = std::move(_input);
54 
55  // Get the BoundaryIDs from the mesh
56  std::vector<BoundaryName> boundary_names = getParam<std::vector<BoundaryName>>("new_boundary");
57  std::vector<BoundaryID> boundary_ids =
58  MooseMeshUtils::getBoundaryIDs(*mesh, boundary_names, true);
59  if (boundary_ids.size() != 1)
60  mooseError("Only one boundary ID can be assigned to a nodeset using a bounding box!");
61 
62  // Get a reference to our BoundaryInfo object
63  BoundaryInfo & boundary_info = mesh->get_boundary_info();
64 
65  bool found_node = false;
66  const bool inside = (_location == "INSIDE");
67 
68  // Loop over the elements and assign node set id to nodes within the bounding box
69  for (auto & node : as_range(mesh->active_nodes_begin(), mesh->active_nodes_end()))
70  if (_bounding_box.contains_point(*node) == inside)
71  {
72  boundary_info.add_node(node, boundary_ids[0]);
73  found_node = true;
74  }
75 
76  // Unless at least one processor found a node in the bounding box,
77  // the user probably specified it incorrectly.
78  this->comm().max(found_node);
79 
80  if (!found_node)
81  mooseError("No nodes found within the bounding box");
82 
83  boundary_info.nodeset_name(boundary_ids[0]) = boundary_names[0];
84 
85  mesh->set_isnt_prepared();
86  return dynamic_pointer_cast<MeshBase>(mesh);
87 }
MeshBase & mesh
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
std::unique_ptr< MeshBase > generate() override
Generate / modify the mesh.
const Parallel::Communicator & comm() const
Selects a set of nodes and assigns a nodeset name to them based on the bounding box specified...
BoundingBoxNodeSetGenerator(const InputParameters &parameters)
std::unique_ptr< T_DEST, T_DELETER > dynamic_pointer_cast(std::unique_ptr< T_SRC, T_DELETER > &src)
These are reworked from https://stackoverflow.com/a/11003103.
registerMooseObject("MooseApp", BoundingBoxNodeSetGenerator)
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...
MooseEnum _location
Select nodes on the &#39;inside&#39; or the &#39;outside&#39; of the bounding box.
std::unique_ptr< MeshBase > & _input
SimpleRange< IndexType > as_range(const std::pair< IndexType, IndexType > &p)
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:31
std::vector< BoundaryID > getBoundaryIDs(const libMesh::MeshBase &mesh, const std::vector< BoundaryName > &boundary_name, bool generate_unknown, const std::set< BoundaryID > &mesh_boundary_ids)
Gets the boundary IDs with their names.
static InputParameters validParams()
Definition: MeshGenerator.C:23
BoundingBox _bounding_box
Bounding box for testing element centroids against. Note that.
void max(const T &r, T &o, Request &req) const
BoundingBox buildBoundingBox(const Point &p1, const Point &p2)
Construct a valid bounding box from 2 arbitrary points.
Definition: MooseUtils.C:1223
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
void addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump...
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an option parameter and a documentation string to the InputParameters object...
MeshGenerators are objects that can modify or add to an existing mesh.
Definition: MeshGenerator.h:32
static InputParameters validParams()