From 03f5fa0718a62f1a6b279b82103eaaecc7423aa0 Mon Sep 17 00:00:00 2001 From: Trent Savage Date: Thu, 2 Jun 2022 17:58:33 -0600 Subject: [PATCH] Add a SideSetExtruderGenerator and related documentation to the supporting sub-generators. ref #20880 --- .../meshgenerators/MeshExtruderGenerator.md | 4 + .../SideSetExtruderGenerator.md | 65 ++++++++++++ .../meshgenerators/StitchedMeshGenerator.md | 2 + .../meshgenerators/SideSetExtruderGenerator.h | 36 +++++++ .../meshgenerators/SideSetExtruderGenerator.C | 99 ++++++++++++++++++ .../meshgenerators/StitchedMeshGenerator.C | 2 +- large_media | 2 +- .../3d_serrated_multiblock.e | Bin 0 -> 13052 bytes .../external_generators.i | 32 ++++++ .../sideset_extruder_generator/extrude_cube.i | 13 +++ .../extrude_cube.i-e | 13 +++ .../extrude_multiblock.i | 13 +++ .../extrude_multiblock.i-e | 13 +++ .../extrude_square.i | 15 +++ .../extrude_square.i-e | 15 +++ .../sideset_extruder_generator/gen_extrude.i | 61 +++++++++++ .../gold/external_generators_in.e | Bin 0 -> 5336 bytes .../gold/extrude_cube_in.e | Bin 0 -> 6840 bytes .../gold/extrude_multiblock_in.e | Bin 0 -> 16840 bytes .../gold/extrude_square_in.e | Bin 0 -> 5336 bytes .../sideset_extruder_generator/tests | 48 +++++++++ 21 files changed, 431 insertions(+), 2 deletions(-) create mode 100644 framework/doc/content/source/meshgenerators/SideSetExtruderGenerator.md create mode 100644 framework/include/meshgenerators/SideSetExtruderGenerator.h create mode 100644 framework/src/meshgenerators/SideSetExtruderGenerator.C create mode 100644 test/tests/meshgenerators/sideset_extruder_generator/3d_serrated_multiblock.e create mode 100644 test/tests/meshgenerators/sideset_extruder_generator/external_generators.i create mode 100644 test/tests/meshgenerators/sideset_extruder_generator/extrude_cube.i create mode 100644 test/tests/meshgenerators/sideset_extruder_generator/extrude_cube.i-e create mode 100644 test/tests/meshgenerators/sideset_extruder_generator/extrude_multiblock.i create mode 100644 test/tests/meshgenerators/sideset_extruder_generator/extrude_multiblock.i-e create mode 100644 test/tests/meshgenerators/sideset_extruder_generator/extrude_square.i create mode 100644 test/tests/meshgenerators/sideset_extruder_generator/extrude_square.i-e create mode 100644 test/tests/meshgenerators/sideset_extruder_generator/gen_extrude.i create mode 100644 test/tests/meshgenerators/sideset_extruder_generator/gold/external_generators_in.e create mode 100644 test/tests/meshgenerators/sideset_extruder_generator/gold/extrude_cube_in.e create mode 100644 test/tests/meshgenerators/sideset_extruder_generator/gold/extrude_multiblock_in.e create mode 100644 test/tests/meshgenerators/sideset_extruder_generator/gold/extrude_square_in.e create mode 100644 test/tests/meshgenerators/sideset_extruder_generator/tests diff --git a/framework/doc/content/source/meshgenerators/MeshExtruderGenerator.md b/framework/doc/content/source/meshgenerators/MeshExtruderGenerator.md index 4b10ed9b9c53..f6b431c90c0a 100644 --- a/framework/doc/content/source/meshgenerators/MeshExtruderGenerator.md +++ b/framework/doc/content/source/meshgenerators/MeshExtruderGenerator.md @@ -8,6 +8,10 @@ The mesh extruder generator is a tool for increasing the dimensionality of a low to one or more copies of its corresponding higher dimensional element along the specified axis. The Mesh Extruder can also add in the extra sidesets resulting from increasing the dimensionality of the original mesh. Existing sidesets are extruded. +Through the `existing_subdomains`, `layers`, and `new_ids` options, it is possible to specify that an extruded block exists in some layers, + but not others. This allows for serrated patterns and gaps. Note that no error will be thrown if the resulting blocks overlap. These three + options must have the same number of values given to them. The extrusion vector may use decimal values. + ## Visual Example ### Input 2D Mesh diff --git a/framework/doc/content/source/meshgenerators/SideSetExtruderGenerator.md b/framework/doc/content/source/meshgenerators/SideSetExtruderGenerator.md new file mode 100644 index 000000000000..a59fc67ab9b9 --- /dev/null +++ b/framework/doc/content/source/meshgenerators/SideSetExtruderGenerator.md @@ -0,0 +1,65 @@ +# SideSetExtruderGenerator + +!syntax description /Mesh/SideSetExtruderGenerator + +## Overview + +The SideSetExtruder Generator is for "pulling" mesh in a direction. Given a sideset and a direction(vector), it adds to the mesh. SideSetExtruder differs from [MeshExtruderGenerator](MeshExtruderGenerator.md) in that the extrusion stays in the same dimension as the sideset it is pulling on (MeshExtruderGenerator is for pulling 2 dimensional shapes into 3 dimensions). + +SideSetExtruder will not throw any errors if you extrude a mesh through (collide with) another mesh. It will throw an error if the extrusion vector would create a mesh with a negative determinant (or rather, [MeshExtruderGenerator](MeshExtruderGenerator.md) throws the error). The extrusion vector is applied relative to the sideset given, not from the origin point of the mesh. The extrusion vector must be a 3D vector even if you are only extruding a 2D mesh; in such a case, let the z component be 0 (e.g., `extrusion_vector = '1 0.5 0'`) + +The output will have no sidesets, even the sideset you extruded from will be gone. The user is expected to use the other side-set generating generators on the output if sidesets are needed. + +## Visual Example + +### Input 2D Mesh + +!media large_media/framework/meshgenerators/sideset_extruder_before.png caption=Before: a square, with sidesets on each side. + +### Output of SideSetExtruderGenerator + +!media large_media/framework/meshgenerators/sideset_extruder_after.png caption=After, the right sideset has been extruded in the < 1, 0.5, 0> direction. + +SideSetExtruderGenerator is actually a mere wrapper of 4 other generators: [LowerDBlockFromSidesetGenerator](LowerDBlockFromSidesetGenerator.md), [BlockToMeshConverterGenerator](BlockToMeshConverterGenerator.md), [MeshExtruderGenerator](MeshExtruderGenerator.md), and [StitchedMeshGenerator](StitchedMeshGenerator.md). SideSetExtruderGenerator's output from the example above is exactly equivalent to the output of a recipe like this: + +``` +[Mesh] + [square] + type = GeneratedMeshGenerator + dim = 2 + [] + [lowerDblock] + type = LowerDBlockFromSidesetGenerator + input = square + new_block_name = "extrusions0" + sidesets = "right" + [] + [separateMesh] + type = BlockToMeshConverterGenerator + input = lowerDblock + target_blocks = extrusions0 + [] + [extrude] + type = MeshExtruderGenerator + input = separateMesh + num_layers = 3 + extrusion_vector = '1 0.5 0' + bottom_sideset = 'new_bottom' + top_sideset = 'new_top' + [] + [stitch] + type = StitchedMeshGenerator + inputs = 'square extrude' + stitch_boundaries_pairs = 'right new_bottom' + [] +[] + +``` + +If you are needing to tweak the output of SideSetExtruderGenerator, you may be better off manually running these operations instead. SideSetExtruderGenerator uses the defaults of these sub-generators. + +!syntax parameters /Mesh/SideSetExtruderGenerator + +!syntax inputs /Mesh/SideSetExtruderGenerator + +!syntax children /Mesh/SideSetExtruderGenerator diff --git a/framework/doc/content/source/meshgenerators/StitchedMeshGenerator.md b/framework/doc/content/source/meshgenerators/StitchedMeshGenerator.md index c3f9c6a9c197..31adf408260d 100644 --- a/framework/doc/content/source/meshgenerators/StitchedMeshGenerator.md +++ b/framework/doc/content/source/meshgenerators/StitchedMeshGenerator.md @@ -15,6 +15,8 @@ Consider the following three meshes. Using the `StitchedMeshGenerator` object from within the [Mesh](/Mesh/index.md) block of the input file, as shown in the input file snippet below, these three square meshes are joined into a single mesh as shown in Figure 4. +Note that the way that the meshes are merged gives precedence to the left-most mesh listed in terms of sidesets: the sidesets of the second, third, etc meshes will be subsumed into the sidesets of the first mesh. The names of the sidesets in the first mesh are what the names that will remain in the outputted mesh. + !listing test/tests/meshgenerators/stitched_mesh_generator/stitched_mesh_generator.i block=Mesh !media media/mesh/stitched_mesh_out.png caption=Fig. 4: Resulting "stitched" mesh from combination of three square meshes. diff --git a/framework/include/meshgenerators/SideSetExtruderGenerator.h b/framework/include/meshgenerators/SideSetExtruderGenerator.h new file mode 100644 index 000000000000..dff33c4e2b18 --- /dev/null +++ b/framework/include/meshgenerators/SideSetExtruderGenerator.h @@ -0,0 +1,36 @@ +//* This file is part of the MOOSE framework +//* https://www.mooseframework.org +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#pragma once + +#include "MeshGenerator.h" + +#include "libmesh/mesh_generation.h" + +/** + * Extrude a 1D, 2D, or 3D mesh outward within the same dimension + */ +class SideSetExtruderGenerator : public MeshGenerator +{ +public: + static InputParameters validParams(); + + SideSetExtruderGenerator(const InputParameters & parameters); + + std::unique_ptr generate() override; + +protected: + /// Mesh that comes from another generator + std::unique_ptr * _build_mesh; + + const MeshGeneratorName _original_input; + const RealVectorValue _extrusion_vector; + const unsigned int _num_layers; + const BoundaryName _sideset_name; +}; diff --git a/framework/src/meshgenerators/SideSetExtruderGenerator.C b/framework/src/meshgenerators/SideSetExtruderGenerator.C new file mode 100644 index 000000000000..29a36d382583 --- /dev/null +++ b/framework/src/meshgenerators/SideSetExtruderGenerator.C @@ -0,0 +1,99 @@ +//* This file is part of the MOOSE framework +//* https://www.mooseframework.org +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#include "SideSetExtruderGenerator.h" + +registerMooseObject("MooseApp", SideSetExtruderGenerator); + +InputParameters +SideSetExtruderGenerator::validParams() +{ + InputParameters params = MeshGenerator::validParams(); + + params.addClassDescription("Takes a 1D or 2D mesh and extrudes the entire structure along the " + "specified axis increasing the dimensionality of the mesh."); + + // list params + params.addRequiredParam("input", "The mesh we want to modify"); + params.addRequiredParam("extrusion_vector", + "The direction and length of the extrusion"); + params.addParam("num_layers", 1, "The number of layers in the extruded mesh"); + params.addRequiredParam("sideset", + "The side set (boundary) that will be extruded from"); + + return params; +} + +SideSetExtruderGenerator::SideSetExtruderGenerator(const InputParameters & parameters) + : MeshGenerator(parameters), + _original_input(getParam("input")), + _extrusion_vector(getParam("extrusion_vector")), + _num_layers(getParam("num_layers")), + _sideset_name(getParam("sideset")) +{ + // constants needed only temporarily + const BoundaryName _EXTRUDED_BLOCK_NAME = "extruded_block"; + const BoundaryName _SIDESET_TO_BE_STITCHED = "to_be_stitched"; + + // sub generators + { + auto params = _app.getFactory().getValidParams("LowerDBlockFromSidesetGenerator"); + + params.set("input") = _original_input; + params.set("new_block_name") = _EXTRUDED_BLOCK_NAME; + params.set>("sidesets") = {_sideset_name}; + + // generate lower dimensional mesh from the given sidesets + _build_mesh = &addMeshSubgenerator( + "LowerDBlockFromSidesetGenerator", name() + "_lowerDgeneration", params); + } + + { + auto params = _app.getFactory().getValidParams("BlockToMeshConverterGenerator"); + + params.set("input") = name() + "_lowerDgeneration"; + params.set>("target_blocks") = {_EXTRUDED_BLOCK_NAME}; + + // convert lower dimensional block to a separate mesh + _build_mesh = + &addMeshSubgenerator("BlockToMeshConverterGenerator", name() + "_blockToMesh", params); + } + + { + auto params = _app.getFactory().getValidParams("MeshExtruderGenerator"); + + params.set("input") = name() + "_blockToMesh"; + params.set("extrusion_vector") = _extrusion_vector; + params.set("num_layers") = _num_layers; + params.set>("bottom_sideset") = {_SIDESET_TO_BE_STITCHED}; + + // extrude the new, separate mesh into a higher dimension + _build_mesh = &addMeshSubgenerator("MeshExtruderGenerator", name() + "_extruder", params); + } + + { + auto params = _app.getFactory().getValidParams("StitchedMeshGenerator"); + + // order of vector elements matters for this generator + // here order by: original mesh first, our custom mesh second + params.set>("inputs") = {_original_input, name() + "_extruder"}; + + params.set>>("stitch_boundaries_pairs") = { + {_sideset_name, _SIDESET_TO_BE_STITCHED}}; + + // stitch the newly made high-dimensional mesh back to the original mesh + _build_mesh = &addMeshSubgenerator("StitchedMeshGenerator", name() + "_stitched", params); + } +} + +std::unique_ptr +SideSetExtruderGenerator::generate() +{ + return dynamic_pointer_cast(*_build_mesh); +} diff --git a/framework/src/meshgenerators/StitchedMeshGenerator.C b/framework/src/meshgenerators/StitchedMeshGenerator.C index a8b97554e399..8001680f5701 100644 --- a/framework/src/meshgenerators/StitchedMeshGenerator.C +++ b/framework/src/meshgenerators/StitchedMeshGenerator.C @@ -35,7 +35,7 @@ StitchedMeshGenerator::validParams() algorithm, "Control the use of binary search for the nodes of the stitched surfaces."); params.addClassDescription( - "Allows multiple mesh files to be stiched together to form a single mesh."); + "Allows multiple mesh files to be stitched together to form a single mesh."); return params; } diff --git a/large_media b/large_media index 3d3986e2fa3d..42c944f1e3d9 160000 --- a/large_media +++ b/large_media @@ -1 +1 @@ -Subproject commit 3d3986e2fa3dd32cd0bd17af98aad328ebfc544e +Subproject commit 42c944f1e3d97126bc519733f0f9cda93fa7042b diff --git a/test/tests/meshgenerators/sideset_extruder_generator/3d_serrated_multiblock.e b/test/tests/meshgenerators/sideset_extruder_generator/3d_serrated_multiblock.e new file mode 100644 index 0000000000000000000000000000000000000000..ff87de49503dc769dd6c820723dddd11a33e42fd GIT binary patch literal 13052 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 O#!UIavqqg~;`tkr?pELc literal 0 HcmV?d00001 diff --git a/test/tests/meshgenerators/sideset_extruder_generator/gold/extrude_multiblock_in.e b/test/tests/meshgenerators/sideset_extruder_generator/gold/extrude_multiblock_in.e new file mode 100644 index 0000000000000000000000000000000000000000..feeb2409807bd98f0caf369f258a8c1802f14648 GIT binary patch literal 16840 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 UX)!9H8e45uSFJ78Rcov6KTcK!asU7T literal 0 HcmV?d00001 diff --git a/test/tests/meshgenerators/sideset_extruder_generator/gold/extrude_square_in.e b/test/tests/meshgenerators/sideset_extruder_generator/gold/extrude_square_in.e new file mode 100644 index 0000000000000000000000000000000000000000..ea88f6c291b1fa8b3bf09231ccf6a025495e0a67 GIT binary patch literal 5336 zcmeHKJ#Q015WSGEJIDDTxS*hLNrePNhyuxph$85q2<>r+H_3_f-Qio4go=`mmV$zU z0s#dD1tmg4qNG8h5`Bt*q~yEkUz#B!)FBkkAhn>V|&b8GMQ)wNTel^U8w6hBdE zm_{Atd1IUjblg#4p;gY2mFcwC3EOdpBiaWXr&(JScAi{5bt+K=O`z25INV6?84$^5 z#V#zAE^Uc5`XX+_?*aW>$q}cdxoCKZpD%gBTy^2oOi*8^-trVw(x0E<#G5xb&EJlIX8(iwlend3EJr)`mVw$fX};GE@w?FV@$gVo6}~U<2P5Kv9@A=4dWm! z4*BDnM2KCm1AiH<54`J-*irt({uZ!7ao8X8LB#cU7fK&^*B`OR^~cY5YBNKY?4f64 zGH!ad;@Y_;i2n$c#qM)#;x`QY1@nwM!^`|&9>^KV+G^oioFsRmq-WB>VC39^mu}D` z7h>viN&Jt=RUW5TGhB$5%O$b>Pp&y~)fl@zo82e(N;xKyhkNiiNm~^ zvK7}L*bnTNyt20i3p2Hg{p?_6y{Cs@`OV8m%hoM4;g~tfe0Jy9r?_)Q(fVN;Pg*