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