LCOV - code coverage report
Current view: top level - src/meshgenerators - SideSetExtruderGenerator.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 44 45 97.8 %
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 "SideSetExtruderGenerator.h"
      11             : #include "CastUniquePointer.h"
      12             : 
      13             : registerMooseObject("MooseApp", SideSetExtruderGenerator);
      14             : 
      15             : InputParameters
      16       14313 : SideSetExtruderGenerator::validParams()
      17             : {
      18       14313 :   InputParameters params = MeshGenerator::validParams();
      19             : 
      20       14313 :   params.addClassDescription("Takes a 1D or 2D mesh and extrudes a selected sideset along the "
      21             :                              "specified axis.");
      22             : 
      23       14313 :   params.addRequiredParam<MeshGeneratorName>("input", "The mesh we want to modify");
      24       14313 :   params.addRequiredParam<RealVectorValue>("extrusion_vector",
      25             :                                            "The direction and length of the extrusion as a vector");
      26       14313 :   params.addParam<unsigned int>("num_layers", 1, "The number of layers in the extruded mesh");
      27       14313 :   params.addRequiredParam<BoundaryName>("sideset", "The sideset (boundary) that will be extruded");
      28             : 
      29       14313 :   return params;
      30           0 : }
      31             : 
      32          24 : SideSetExtruderGenerator::SideSetExtruderGenerator(const InputParameters & parameters)
      33             :   : MeshGenerator(parameters),
      34          24 :     _original_input(getParam<MeshGeneratorName>("input")),
      35          24 :     _extrusion_vector(getParam<RealVectorValue>("extrusion_vector")),
      36          24 :     _num_layers(getParam<unsigned int>("num_layers")),
      37          48 :     _sideset_name(getParam<BoundaryName>("sideset"))
      38             : {
      39             :   // The input "input" is used by the first sub generator; this allows us to declare
      40             :   // that this dependency is not a dependency of SideSetExtruderGenerator but instead
      41             :   // the LowerDBlockFromSidesetGenerator below
      42          24 :   declareMeshForSub("input");
      43             : 
      44          24 :   const SubdomainName extruded_block_name = "extruded_block_" + name();
      45          24 :   const BoundaryName sideset_to_stitch = "to_be_stitched_" + name();
      46             : 
      47             :   // sub generators
      48             :   {
      49          24 :     auto params = _app.getFactory().getValidParams("LowerDBlockFromSidesetGenerator");
      50             : 
      51          24 :     params.set<MeshGeneratorName>("input") = _original_input;
      52          24 :     params.set<SubdomainName>("new_block_name") = extruded_block_name;
      53          48 :     params.set<std::vector<BoundaryName>>("sidesets") = {_sideset_name};
      54             : 
      55             :     // generate lower dimensional mesh from the given sideset
      56          24 :     addMeshSubgenerator("LowerDBlockFromSidesetGenerator", name() + "_lowerDgeneration", params);
      57          24 :   }
      58             : 
      59             :   {
      60          24 :     auto params = _app.getFactory().getValidParams("BlockToMeshConverterGenerator");
      61             : 
      62          24 :     params.set<MeshGeneratorName>("input") = name() + "_lowerDgeneration";
      63          48 :     params.set<std::vector<SubdomainName>>("target_blocks") = {extruded_block_name};
      64             : 
      65             :     // convert lower dimensional block to a separate mesh
      66          24 :     addMeshSubgenerator("BlockToMeshConverterGenerator", name() + "_blockToMesh", params);
      67          24 :   }
      68             : 
      69             :   {
      70          24 :     auto params = _app.getFactory().getValidParams("MeshExtruderGenerator");
      71             : 
      72          24 :     params.set<MeshGeneratorName>("input") = name() + "_blockToMesh";
      73          24 :     params.set<RealVectorValue>("extrusion_vector") = _extrusion_vector;
      74          24 :     params.set<unsigned int>("num_layers") = _num_layers;
      75          48 :     params.set<std::vector<BoundaryName>>("bottom_sideset") = {sideset_to_stitch};
      76             : 
      77             :     // extrude the new, separate mesh into a higher dimension
      78          24 :     addMeshSubgenerator("MeshExtruderGenerator", name() + "_extruder", params);
      79          24 :   }
      80             : 
      81             :   {
      82          24 :     auto params = _app.getFactory().getValidParams("StitchedMeshGenerator");
      83             : 
      84             :     // order of vector elements matters for this generator
      85             :     // here order by: original mesh first, our custom mesh second
      86          96 :     params.set<std::vector<MeshGeneratorName>>("inputs") = {_original_input, name() + "_extruder"};
      87             : 
      88          48 :     params.set<std::vector<std::vector<std::string>>>("stitch_boundaries_pairs") = {
      89         120 :         {_sideset_name, sideset_to_stitch}};
      90             : 
      91             :     // stitch the newly made high-dimensional mesh back to the original mesh
      92          24 :     addMeshSubgenerator("StitchedMeshGenerator", name() + "_stitched", params);
      93          24 :     _build_mesh = &getMeshByName(name() + "_stitched");
      94          24 :   }
      95         240 : }
      96             : 
      97             : std::unique_ptr<MeshBase>
      98          24 : SideSetExtruderGenerator::generate()
      99             : {
     100          24 :   return std::move(*_build_mesh);
     101             : }

Generated by: LCOV version 1.14