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 "ElementGenerator.h" 11 : #include "CastUniquePointer.h" 12 : 13 : #include "libmesh/replicated_mesh.h" 14 : #include "libmesh/string_to_enum.h" 15 : 16 : #include "MooseEnum.h" 17 : 18 : registerMooseObject("MooseApp", ElementGenerator); 19 : 20 : InputParameters 21 15555 : ElementGenerator::validParams() 22 : { 23 15555 : InputParameters params = MeshGenerator::validParams(); 24 : 25 15555 : MooseEnum elem_types(LIST_GEOM_ELEM); // no default 26 : 27 15555 : params.addParam<MeshGeneratorName>("input", "Optional input mesh to add the elements to"); 28 : 29 : // Element shape and location 30 15555 : params.addRequiredParam<std::vector<Point>>("nodal_positions", 31 : "The x,y,z positions of the nodes"); 32 15555 : params.addRequiredParam<std::vector<dof_id_type>>("element_connectivity", 33 : "List of nodes to use for each element"); 34 15555 : params.addRequiredParam<MooseEnum>( 35 : "elem_type", elem_types, "The type of element from libMesh to generate"); 36 : 37 : // Subdomain 38 15555 : params.addParam<SubdomainName>("subdomain_name", "Subdomain name"); 39 15555 : params.addParam<SubdomainID>("subdomain_id", 0, "Subdomain id"); 40 : // Sidesets 41 46665 : params.addParam<bool>("create_sidesets", 42 31110 : false, 43 : "Create separate sidesets for each side. " 44 : "The side index is used as the boundary ID for each sideset."); 45 : 46 15555 : params.addClassDescription("Generates individual elements given a list of nodal positions."); 47 : 48 31110 : return params; 49 15555 : } 50 : 51 640 : ElementGenerator::ElementGenerator(const InputParameters & parameters) 52 : : MeshGenerator(parameters), 53 640 : _input(getMesh("input", /* allow_invalid = */ true)), 54 640 : _nodal_positions(getParam<std::vector<Point>>("nodal_positions")), 55 640 : _element_connectivity(getParam<std::vector<dof_id_type>>("element_connectivity")), 56 1280 : _elem_type(getParam<MooseEnum>("elem_type")) 57 : { 58 640 : } 59 : 60 : Elem * 61 526 : ElementGenerator::getElemType(const std::string & type) 62 : { 63 526 : return Elem::build(Utility::string_to_enum<ElemType>(type)).release(); 64 : } 65 : 66 : std::unique_ptr<MeshBase> 67 526 : ElementGenerator::generate() 68 : { 69 526 : std::unique_ptr<MeshBase> mesh = std::move(_input); 70 : 71 : // If there was no input mesh then let's just make a new one 72 526 : if (!mesh) 73 512 : mesh = buildMeshBaseObject(); 74 : 75 526 : MooseEnum elem_type_enum = getParam<MooseEnum>("elem_type"); 76 526 : auto elem = getElemType(elem_type_enum); 77 526 : elem->subdomain_id() = getParam<SubdomainID>("subdomain_id"); 78 526 : if (isParamValid("subdomain_name")) 79 40 : mesh->subdomain_name(getParam<SubdomainID>("subdomain_id")) = 80 60 : getParam<SubdomainName>("subdomain_name"); 81 : 82 526 : mesh->set_mesh_dimension(std::max((unsigned int)elem->dim(), mesh->mesh_dimension())); 83 : 84 526 : std::vector<Node *> nodes; 85 : 86 526 : nodes.reserve(_nodal_positions.size()); 87 : 88 : // Add all the nodes 89 3487 : for (auto & point : _nodal_positions) 90 2961 : nodes.push_back(mesh->add_point(point)); 91 : 92 526 : mesh->add_elem(elem); 93 : 94 526 : auto n = elem->n_nodes(); 95 : 96 1052 : for (dof_id_type i = 0; i < _element_connectivity.size(); i += n) 97 : { 98 3487 : for (unsigned int j = 0; j < n; j++) 99 : { 100 2961 : elem->set_node(j, nodes[_element_connectivity[j + i]]); 101 : } 102 : } 103 : 104 : // We just added an element 105 526 : mesh->set_isnt_prepared(); 106 : 107 526 : if (getParam<bool>("create_sidesets")) 108 1864 : for (const auto i_side : make_range(elem->n_sides())) 109 1582 : mesh->get_boundary_info().add_side(elem, i_side, i_side); 110 : 111 1052 : return dynamic_pointer_cast<MeshBase>(mesh); 112 526 : }