LCOV - code coverage report
Current view: top level - src/meshgenerators - ElementGenerator.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 48 48 100.0 %
Date: 2025-07-17 01:28:37 Functions: 4 4 100.0 %
Legend: Lines: hit not hit

          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 : }

Generated by: LCOV version 1.14