Line data Source code
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 : #include "BoundingBoxNodeSetGenerator.h" 11 : #include "MooseMeshUtils.h" 12 : #include "CastUniquePointer.h" 13 : #include "MooseUtils.h" 14 : 15 : #include "libmesh/node.h" 16 : 17 : registerMooseObject("MooseApp", BoundingBoxNodeSetGenerator); 18 : 19 : InputParameters 20 14409 : BoundingBoxNodeSetGenerator::validParams() 21 : { 22 14409 : InputParameters params = MeshGenerator::validParams(); 23 14409 : MooseEnum location("INSIDE OUTSIDE", "INSIDE"); 24 : 25 14409 : params.addRequiredParam<MeshGeneratorName>("input", "The mesh we want to modify"); 26 14409 : params.addClassDescription( 27 : "Assigns all of the nodes either inside or outside of a bounding box to a new nodeset."); 28 14409 : params.addRequiredParam<std::vector<BoundaryName>>("new_boundary", 29 : "The name of the nodeset to create"); 30 14409 : params.addRequiredParam<RealVectorValue>( 31 : "bottom_left", 32 : "The bottom left point (in x,y,z with spaces in-between) of the box to select the nodes."); 33 14409 : params.addRequiredParam<RealVectorValue>( 34 : "top_right", 35 : "The bottom left point (in x,y,z with spaces in-between) of the box to select the nodes."); 36 14409 : params.addParam<MooseEnum>("location", location, "Control of where the nodeset is to be set"); 37 : 38 28818 : return params; 39 14409 : } 40 : 41 72 : BoundingBoxNodeSetGenerator::BoundingBoxNodeSetGenerator(const InputParameters & parameters) 42 : : MeshGenerator(parameters), 43 72 : _input(getMesh("input")), 44 72 : _location(getParam<MooseEnum>("location")), 45 72 : _bounding_box(MooseUtils::buildBoundingBox(getParam<RealVectorValue>("bottom_left"), 46 216 : getParam<RealVectorValue>("top_right"))) 47 : { 48 72 : } 49 : 50 : std::unique_ptr<MeshBase> 51 71 : BoundingBoxNodeSetGenerator::generate() 52 : { 53 71 : std::unique_ptr<MeshBase> mesh = std::move(_input); 54 : 55 : // Get the BoundaryIDs from the mesh 56 71 : std::vector<BoundaryName> boundary_names = getParam<std::vector<BoundaryName>>("new_boundary"); 57 : std::vector<BoundaryID> boundary_ids = 58 71 : MooseMeshUtils::getBoundaryIDs(*mesh, boundary_names, true); 59 71 : if (boundary_ids.size() != 1) 60 4 : 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 67 : BoundaryInfo & boundary_info = mesh->get_boundary_info(); 64 : 65 67 : bool found_node = false; 66 67 : const bool inside = (_location == "INSIDE"); 67 : 68 : // Loop over the elements and assign node set id to nodes within the bounding box 69 3013 : for (auto & node : as_range(mesh->active_nodes_begin(), mesh->active_nodes_end())) 70 1473 : if (_bounding_box.contains_point(*node) == inside) 71 : { 72 464 : boundary_info.add_node(node, boundary_ids[0]); 73 464 : found_node = true; 74 67 : } 75 : 76 : // Unless at least one processor found a node in the bounding box, 77 : // the user probably specified it incorrectly. 78 67 : this->comm().max(found_node); 79 : 80 67 : if (!found_node) 81 4 : mooseError("No nodes found within the bounding box"); 82 : 83 63 : boundary_info.nodeset_name(boundary_ids[0]) = boundary_names[0]; 84 : 85 63 : mesh->set_isnt_prepared(); 86 126 : return dynamic_pointer_cast<MeshBase>(mesh); 87 63 : }