LCOV - code coverage report
Current view: top level - src/meshgenerators - SubdomainBoundingBoxGenerator.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 55 57 96.5 %
Date: 2025-07-17 01:28:37 Functions: 3 3 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 "SubdomainBoundingBoxGenerator.h"
      11             : #include "Conversion.h"
      12             : #include "CastUniquePointer.h"
      13             : #include "MooseUtils.h"
      14             : #include "MooseMeshUtils.h"
      15             : 
      16             : #include "libmesh/elem.h"
      17             : 
      18             : registerMooseObject("MooseApp", SubdomainBoundingBoxGenerator);
      19             : 
      20             : InputParameters
      21       25491 : SubdomainBoundingBoxGenerator::validParams()
      22             : {
      23       25491 :   MooseEnum location("INSIDE OUTSIDE", "INSIDE");
      24             : 
      25       25491 :   InputParameters params = MeshGenerator::validParams();
      26             : 
      27       25491 :   params.addRequiredParam<MeshGeneratorName>("input", "The mesh we want to modify");
      28       25491 :   params.addClassDescription("Changes the subdomain ID of elements either (XOR) inside or outside "
      29             :                              "the specified box to the specified ID.");
      30       25491 :   params.addRequiredParam<RealVectorValue>(
      31             :       "bottom_left", "The bottom left point (in x,y,z with spaces in-between).");
      32       25491 :   params.addRequiredParam<RealVectorValue>(
      33             :       "top_right", "The bottom left point (in x,y,z with spaces in-between).");
      34       25491 :   params.addRequiredParam<subdomain_id_type>(
      35             :       "block_id", "Subdomain id to set for inside/outside the bounding box");
      36       25491 :   params.addParam<SubdomainName>(
      37             :       "block_name", "Subdomain name to set for inside/outside the bounding box (optional)");
      38       25491 :   params.addParam<MooseEnum>(
      39             :       "location", location, "Control of where the subdomain id is to be set");
      40       25491 :   params.addParam<std::vector<SubdomainName>>(
      41             :       "restricted_subdomains",
      42             :       "Only reset subdomain ID for given subdomains within the bounding box");
      43             : 
      44       25491 :   params.addParam<std::string>("integer_name",
      45             :                                "Element integer to be assigned (default to subdomain ID)");
      46       50982 :   return params;
      47       25491 : }
      48             : 
      49        5609 : SubdomainBoundingBoxGenerator::SubdomainBoundingBoxGenerator(const InputParameters & parameters)
      50             :   : MeshGenerator(parameters),
      51        5609 :     _input(getMesh("input")),
      52        5609 :     _location(parameters.get<MooseEnum>("location")),
      53        5609 :     _block_id(parameters.get<subdomain_id_type>("block_id")),
      54        5609 :     _has_restriction(isParamValid("restricted_subdomains")),
      55        5609 :     _bounding_box(MooseUtils::buildBoundingBox(parameters.get<RealVectorValue>("bottom_left"),
      56       11218 :                                                parameters.get<RealVectorValue>("top_right")))
      57             : {
      58        5609 : }
      59             : 
      60             : std::unique_ptr<MeshBase>
      61        5314 : SubdomainBoundingBoxGenerator::generate()
      62             : {
      63        5314 :   std::unique_ptr<MeshBase> mesh = std::move(_input);
      64             : 
      65        5314 :   std::set<SubdomainID> restricted_ids;
      66        5314 :   if (_has_restriction)
      67             :   {
      68          12 :     auto names = getParam<std::vector<SubdomainName>>("restricted_subdomains");
      69          20 :     for (auto & name : names)
      70             :     {
      71             :       // check that the subdomain exists in the mesh
      72          12 :       if (!MooseMeshUtils::hasSubdomainName(*mesh, name))
      73           4 :         paramError("restricted_subdomains", "The block '", name, "' was not found in the mesh");
      74             : 
      75           8 :       restricted_ids.insert(MooseMeshUtils::getSubdomainID(name, *mesh));
      76             :     }
      77           8 :   }
      78             : 
      79        5310 :   if (isParamValid("integer_name"))
      80             :   {
      81         649 :     std::string integer_name = getParam<std::string>("integer_name");
      82             : 
      83         649 :     if (!mesh->has_elem_integer(integer_name))
      84           0 :       mooseError("Mesh does not have an element integer names as ", integer_name);
      85             : 
      86         649 :     unsigned int id = mesh->get_elem_integer_index(integer_name);
      87             : 
      88             :     // Loop over the elements
      89      114169 :     for (const auto & elem : mesh->active_element_ptr_range())
      90             :     {
      91       56760 :       if (_has_restriction && restricted_ids.count(elem->subdomain_id()) == 0)
      92           0 :         continue;
      93             : 
      94       56760 :       bool contains = _bounding_box.contains_point(elem->vertex_average());
      95       56760 :       if ((contains && _location == "INSIDE") || (!contains && _location == "OUTSIDE"))
      96       20430 :         elem->set_extra_integer(id, _block_id);
      97         649 :     }
      98         649 :   }
      99             :   else
     100             :   {
     101             :     // Loop over the elements
     102      929325 :     for (const auto & elem : mesh->element_ptr_range())
     103             :     {
     104      462332 :       if (_has_restriction && restricted_ids.count(elem->subdomain_id()) == 0)
     105         512 :         continue;
     106             : 
     107      461820 :       bool contains = _bounding_box.contains_point(elem->vertex_average());
     108      461820 :       if ((contains && _location == "INSIDE") || (!contains && _location == "OUTSIDE"))
     109      172641 :         elem->subdomain_id() = _block_id;
     110        4661 :     }
     111             : 
     112             :     // Assign block name, if provided
     113        4661 :     if (isParamValid("block_name"))
     114         242 :       mesh->subdomain_name(_block_id) = getParam<SubdomainName>("block_name");
     115             :   }
     116             : 
     117        5310 :   mesh->set_isnt_prepared();
     118       10620 :   return dynamic_pointer_cast<MeshBase>(mesh);
     119        5310 : }

Generated by: LCOV version 1.14