From f412f08b183f9d10652009f72f08870fade12c96 Mon Sep 17 00:00:00 2001 From: Roy Stogner Date: Mon, 22 Jul 2024 13:30:04 -0500 Subject: [PATCH 01/12] XYZDelaunayGenerator mesh generator Refs #28297 - this doesn't have as much functionality as XYDelaunay yet, but it's at least got the basics working. --- .../meshgenerators/XYZDelaunayGenerator.h | 52 +++ .../src/meshgenerators/XYZDelaunayGenerator.C | 405 ++++++++++++++++++ 2 files changed, 457 insertions(+) create mode 100644 framework/include/meshgenerators/XYZDelaunayGenerator.h create mode 100644 framework/src/meshgenerators/XYZDelaunayGenerator.C diff --git a/framework/include/meshgenerators/XYZDelaunayGenerator.h b/framework/include/meshgenerators/XYZDelaunayGenerator.h new file mode 100644 index 000000000000..222f63376746 --- /dev/null +++ b/framework/include/meshgenerators/XYZDelaunayGenerator.h @@ -0,0 +1,52 @@ +//* 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" + +/** + * Generates a tetrahedral mesh, based on an input mesh defining the + * outer boundary and an optional set of input meshes defining inner + * hole boundaries. + */ +class XYZDelaunayGenerator : public MeshGenerator +{ +public: + static InputParameters validParams(); + + XYZDelaunayGenerator(const InputParameters & parameters); + + std::unique_ptr generate() override; + +protected: + /// Input mesh defining the boundary to triangulate within + std::unique_ptr & _bdy_ptr; + + /// Desired volume of output tetrahedra + const Real _desired_volume; + + /// What subdomain_id to set on the generated tetrahedra + SubdomainID _output_subdomain_id; + + /// Whether to do Laplacian mesh smoothing on the generated triangles + const bool _smooth_tri; + + /// Holds pointers to the pointers to input meshes defining holes + const std::vector *> _hole_ptrs; + + /// Whether to stitch to the mesh defining each hole + const std::vector _stitch_holes; + + /// Type of algorithm used to find matching nodes (binary or exhaustive) + const MooseEnum _algorithm; + + /// Whether mesh stitching should have verbose output + const bool _verbose_stitching; +}; diff --git a/framework/src/meshgenerators/XYZDelaunayGenerator.C b/framework/src/meshgenerators/XYZDelaunayGenerator.C new file mode 100644 index 000000000000..a8245a0cc34c --- /dev/null +++ b/framework/src/meshgenerators/XYZDelaunayGenerator.C @@ -0,0 +1,405 @@ +//* 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 "XYZDelaunayGenerator.h" + +#include "CastUniquePointer.h" +#include "MooseMeshUtils.h" +#include "MooseUtils.h" + +#include "libmesh/elem.h" +#include "libmesh/int_range.h" +#include "libmesh/mesh_modification.h" +#include "libmesh/mesh_netgen_interface.h" +#include "libmesh/mesh_serializer.h" +#include "libmesh/parsed_function.h" +#include "libmesh/replicated_mesh.h" + +registerMooseObject("MooseApp", XYZDelaunayGenerator); + +namespace std +{ +template <> +struct hash> +{ + std::size_t operator()(const std::tuple & p) const + { + std::size_t seed = 0; + libMesh::boostcopy::hash_combine(seed, std::hash()(std::get<0>(p))); + libMesh::boostcopy::hash_combine(seed, std::hash()(std::get<1>(p))); + libMesh::boostcopy::hash_combine(seed, std::hash()(std::get<2>(p))); + return seed; + } +}; + +} // namespace std + +InputParameters +XYZDelaunayGenerator::validParams() +{ + InputParameters params = MeshGenerator::validParams(); + + MooseEnum algorithm("BINARY EXHAUSTIVE", "BINARY"); + + params.addRequiredParam( + "boundary", "The input MeshGenerator defining the output outer boundary"); + + params.addParam("output_subdomain_name", + "Subdomain name to set on new triangles."); + + params.addParam( + "output_boundary", + "Boundary name to set on new outer boundary. Default ID: 0 if no hole meshes are stitched; " + "or maximum boundary ID of all the stitched hole meshes + 1."); + params.addParam>( + "hole_boundaries", + "Boundary names to set on holes. Default IDs are numbered up from 1 if no hole meshes are " + "stitched; or from maximum boundary ID of all the stitched hole meshes + 2."); + + params.addParam("smooth_triangulation", + false, + "Whether to do Laplacian mesh smoothing on the generated triangles."); + params.addParam>( + "holes", std::vector(), "The MeshGenerators that define mesh holes."); + params.addParam>( + "stitch_holes", std::vector(), "Whether to stitch to the mesh defining each hole."); + + params.addRangeCheckedParam( + "desired_volume", + 0, + "desired_volume>=0", + "Desired (maximum) tetrahedral volume, or 0 to skip uniform refinement"); + + params.addParam( + "algorithm", + algorithm, + "Control the use of binary search for the nodes of the stitched surfaces."); + params.addParam( + "verbose_stitching", false, "Whether mesh stitching should have verbose output."); + + params.addClassDescription( + "Creates tetrahedral 3D meshes within boundaries defined by input meshes."); + + return params; +} + +XYZDelaunayGenerator::XYZDelaunayGenerator(const InputParameters & parameters) + : MeshGenerator(parameters), + _bdy_ptr(getMesh("boundary")), + _desired_volume(getParam("desired_volume")), + _output_subdomain_id(0), + _smooth_tri(getParam("smooth_triangulation")), + _hole_ptrs(getMeshes("holes")), + _stitch_holes(getParam>("stitch_holes")), + _algorithm(parameters.get("algorithm")), + _verbose_stitching(parameters.get("verbose_stitching")) +{ + if (!_stitch_holes.empty() && _stitch_holes.size() != _hole_ptrs.size()) + paramError("stitch_holes", "Need one stitch_holes entry per hole, if specified."); +} + +std::unique_ptr +XYZDelaunayGenerator::generate() +{ +#ifdef LIBMESH_HAVE_NETGEN + // Put the boundary mesh in a local pointer + std::unique_ptr mesh = + dynamic_pointer_cast(std::move(_bdy_ptr)); + + // Get ready to triangulate its boundary + NetGenMeshInterface ngint(*mesh); + + ngint.smooth_after_generating() = _smooth_tri; + + ngint.desired_volume() = _desired_volume; + + std::unique_ptr>> ngholes = + std::make_unique>>(); + + // The libMesh Netgen interface will modify hole meshes in-place, so + // we make copies to pass in. + for (std::unique_ptr * hole_ptr : _hole_ptrs) + { + // How did we never add a ReplicatedMesh(MeshBase&) constructor in + // libMesh? + const UnstructuredMesh & hole = dynamic_cast(**hole_ptr); + ngholes->push_back(std::make_unique(hole)); + } + + if (!_hole_ptrs.empty()) + ngint.attach_hole_list(std::move(ngholes)); + + ngint.triangulate(); + + if (isParamValid("output_subdomain_name")) + { + auto output_subdomain_name = getParam("output_subdomain_name"); + _output_subdomain_id = MooseMeshUtils::getSubdomainID(output_subdomain_name, *mesh); + + if (_output_subdomain_id == Elem::invalid_subdomain_id) + { + // We'll probably need to make a new ID, then + _output_subdomain_id = MooseMeshUtils::getNextFreeSubdomainID(*mesh); + + // But check the hole meshes for our output subdomain name too + for (auto & hole_ptr : _hole_ptrs) + { + auto possible_sbdid = MooseMeshUtils::getSubdomainID(output_subdomain_name, **hole_ptr); + // Huh, it was in one of them + if (possible_sbdid != Elem::invalid_subdomain_id) + { + _output_subdomain_id = possible_sbdid; + break; + } + _output_subdomain_id = + std::max(_output_subdomain_id, MooseMeshUtils::getNextFreeSubdomainID(**hole_ptr)); + } + + mesh->subdomain_name(_output_subdomain_id) = output_subdomain_name; + } + } + + if (_smooth_tri || _output_subdomain_id) + for (auto elem : mesh->element_ptr_range()) + { + elem->subdomain_id() = _output_subdomain_id; + + // I do not trust Laplacian mesh smoothing not to invert + // elements near reentrant corners. Eventually we'll add better + // smoothing options, but even those might have failure cases. + // Better to always do extra tests here than to ever let users + // try to run on a degenerate mesh. + if (elem->is_flipped()) + { + if (_smooth_tri) + mooseError("Inverted element found in triangulation.\n" + "Laplacian smoothing can create these at reentrant corners; disable it?"); + else + mooseError("Unexplained inverted element found in triangulation.\n"); + } + } + + // Assign new subdomain name, if provided + if (isParamValid("output_subdomain_name")) + mesh->subdomain_name(_output_subdomain_id) = getParam("output_subdomain_name"); + + const bool use_binary_search = (_algorithm == "BINARY"); + + // The hole meshes are specified by the user, so they could have any + // BCID or no BCID or any combination of BCIDs on their outer + // boundary, so we'll have to set our own BCID to use for stitching + // there. We'll need to check all the holes for used BCIDs, if we + // want to pick a new ID on hole N that doesn't conflict with any + // IDs on hole M < N (or with the IDs on the new triangulation) + + // The new triangulation by default assigns BCID i+1 to hole i ... + // but we can't even use this for mesh stitching, because we can't + // be sure it isn't also already in use on the hole's mesh and so we + // won't be able to safely clear it afterwards. + const boundary_id_type end_bcid = _hole_ptrs.size() + 1; + + // For the hole meshes that need to be stitched, we would like to make sure the hole boundary ids + // and output boundary id are not conflicting with the existing boundary ids of the hole meshes to + // be stitched. + BoundaryID free_boundary_id = 0; + if (_stitch_holes.size()) + { + for (auto hole_i : index_range(_hole_ptrs)) + { + if (_stitch_holes[hole_i]) + { + free_boundary_id = + std::max(free_boundary_id, MooseMeshUtils::getNextFreeBoundaryID(**_hole_ptrs[hole_i])); + (*_hole_ptrs[hole_i])->comm().max(free_boundary_id); + } + } + for (auto h : index_range(_hole_ptrs)) + libMesh::MeshTools::Modification::change_boundary_id(*mesh, h + 1, h + 1 + free_boundary_id); + } + boundary_id_type new_hole_bcid = end_bcid + free_boundary_id; + + // We might be overriding the default bcid numbers. We have to be + // careful about how we renumber, though. We pick unused temporary + // numbers because e.g. "0->2, 2->0" is impossible to do + // sequentially, but "0->N, 2->N+2, N->2, N+2->0" works. + libMesh::MeshTools::Modification::change_boundary_id( + *mesh, 0, (isParamValid("output_boundary") ? end_bcid : 0) + free_boundary_id); + + if (isParamValid("hole_boundaries")) + { + auto hole_boundaries = getParam>("hole_boundaries"); + auto hole_boundary_ids = MooseMeshUtils::getBoundaryIDs(*mesh, hole_boundaries, true); + + if (hole_boundary_ids.size() != _hole_ptrs.size()) + paramError("hole_boundary_ids", "Need one hole_boundary_ids entry per hole, if specified."); + + for (auto h : index_range(_hole_ptrs)) + libMesh::MeshTools::Modification::change_boundary_id( + *mesh, h + 1 + free_boundary_id, h + 1 + free_boundary_id + end_bcid); + + for (auto h : index_range(_hole_ptrs)) + { + libMesh::MeshTools::Modification::change_boundary_id( + *mesh, h + 1 + free_boundary_id + end_bcid, hole_boundary_ids[h]); + mesh->get_boundary_info().sideset_name(hole_boundary_ids[h]) = hole_boundaries[h]; + new_hole_bcid = std::max(new_hole_bcid, boundary_id_type(hole_boundary_ids[h] + 1)); + } + } + + if (isParamValid("output_boundary")) + { + const BoundaryName output_boundary = getParam("output_boundary"); + const std::vector output_boundary_id = + MooseMeshUtils::getBoundaryIDs(*mesh, {output_boundary}, true); + + libMesh::MeshTools::Modification::change_boundary_id( + *mesh, end_bcid + free_boundary_id, output_boundary_id[0]); + mesh->get_boundary_info().sideset_name(output_boundary_id[0]) = output_boundary; + + new_hole_bcid = std::max(new_hole_bcid, boundary_id_type(output_boundary_id[0] + 1)); + } + + bool doing_stitching = false; + + for (auto hole_i : index_range(_hole_ptrs)) + { + const MeshBase & hole_mesh = **_hole_ptrs[hole_i]; + auto & hole_boundary_info = hole_mesh.get_boundary_info(); + const std::set & local_hole_bcids = hole_boundary_info.get_boundary_ids(); + + if (!local_hole_bcids.empty()) + new_hole_bcid = std::max(new_hole_bcid, boundary_id_type(*local_hole_bcids.rbegin() + 1)); + hole_mesh.comm().max(new_hole_bcid); + + if (hole_i < _stitch_holes.size() && _stitch_holes[hole_i]) + doing_stitching = true; + } + + const boundary_id_type inner_bcid = new_hole_bcid + 1; + + // libMesh mesh stitching still requires a serialized mesh, and it's + // cheaper to do that once than to do it once-per-hole + MeshSerializer serial(*mesh, doing_stitching); + + // We'll be looking for any sides that match between hole meshes and + // the newly triangulated mesh, to apply bcids accordingly. We + // can't key on Elem::key() here, because that depends on node ids + // that differ from mesh to mesh. We can't use centroids here, + // because that depends on rounding error in order of operations + // that can differ from mesh to mesh. The node locations themselves + // should always match up exactly, though, so let's use (sorted!) + // tuples of those to map from nodes to elements and side numbers. + std::unordered_map, std::pair> mesh_faces; + + auto sorted_point_tuple = [](Elem & elem, unsigned int side) + { + std::vector nodes_on_side = elem.nodes_on_side(side); + libmesh_assert_equal_to(nodes_on_side.size(), 3); + std::vector p(3); + for (auto i : index_range(p)) + p[i] = elem.point(nodes_on_side[i]); + if (p[0] < p[1]) + { + if (p[1] < p[2]) + return std::make_tuple(p[0], p[1], p[2]); + else if (p[0] < p[2]) + return std::make_tuple(p[0], p[2], p[1]); + else + return std::make_tuple(p[2], p[0], p[1]); + } + else + { + if (p[0] < p[2]) + return std::make_tuple(p[1], p[0], p[2]); + else if (p[1] < p[2]) + return std::make_tuple(p[1], p[2], p[0]); + else + return std::make_tuple(p[2], p[1], p[0]); + } + }; + + if (!_hole_ptrs.empty()) + for (auto elem : mesh->element_ptr_range()) + for (auto s : make_range(elem->n_sides())) + if (!elem->neighbor_ptr(s)) + { + auto points = sorted_point_tuple(*elem, s); + libmesh_assert(!mesh_faces.count(points)); + mesh_faces.emplace(points, std::make_pair(elem, s)); + } + + auto & mesh_boundary_info = mesh->get_boundary_info(); + + // Define a reference map variable for subdomain map + auto & main_subdomain_map = mesh->set_subdomain_name_map(); + for (auto hole_i : index_range(_hole_ptrs)) + { + if (hole_i < _stitch_holes.size() && _stitch_holes[hole_i]) + { + UnstructuredMesh & hole_mesh = dynamic_cast(**_hole_ptrs[hole_i]); + auto & hole_boundary_info = hole_mesh.get_boundary_info(); + + // Our algorithm here requires a serialized Mesh. To avoid + // redundant serialization and deserialization (libMesh + // MeshedHole and stitch_meshes still also require + // serialization) we'll do the serialization up front. + MeshSerializer serial_hole(hole_mesh); + + // We'll look for any sides that match between the hole mesh and + // the newly triangulated mesh, and apply bcids accordingly. + for (auto elem : hole_mesh.element_ptr_range()) + for (auto s : make_range(elem->n_sides())) + if (!elem->neighbor_ptr(s)) + { + auto points = sorted_point_tuple(*elem, s); + auto it = mesh_faces.find(points); + + // I'd love to assert that we don't have any missing + // matches, but our holes might themselves have holes + if (it != mesh_faces.end()) + { + auto [main_elem, main_side] = it->second; + hole_boundary_info.add_side(elem, s, new_hole_bcid); + mesh_boundary_info.add_side(main_elem, main_side, inner_bcid); + } + } + + // Retrieve subdomain name map from the mesh to be stitched and insert it into the main + // subdomain map + const auto & increment_subdomain_map = hole_mesh.get_subdomain_name_map(); + main_subdomain_map.insert(increment_subdomain_map.begin(), increment_subdomain_map.end()); + + mesh->stitch_meshes(hole_mesh, + inner_bcid, + new_hole_bcid, + TOLERANCE, + /*clear_stitched_bcids*/ true, + _verbose_stitching, + use_binary_search); + } + } + // Check if one SubdomainName is shared by more than one subdomain ids + std::set main_subdomain_map_name_list; + for (auto const & id_name_pair : main_subdomain_map) + main_subdomain_map_name_list.emplace(id_name_pair.second); + if (main_subdomain_map.size() != main_subdomain_map_name_list.size()) + paramError("holes", "The hole meshes contain subdomain name maps with conflicts."); + + // We're done with the hole meshes now, and MeshGenerator doesn't + // want them anymore either. + for (auto & hole_ptr : _hole_ptrs) + hole_ptr->reset(); + + mesh->prepare_for_use(); + return mesh; +#else + mooseError("Cannot use XYZDelaunayGenerator without NetGen-enabled libMesh."); + return std::unique_ptr(); +#endif +} From a3408504b666fea09bf59f715fe953d26cdc3c1b Mon Sep 17 00:00:00 2001 From: Roy Stogner Date: Mon, 29 Jul 2024 16:48:57 -0500 Subject: [PATCH 02/12] Add XYZDelaunay regression tests These might not be robust enough on a wide variety of systems; if that happens we'll replace the exodiff tests with csvdiffs for invariants like mesh volume. --- .../gold/xyzdelaunay_mesh_generator_in.e | Bin 0 -> 4848 bytes .../gold/xyzdelaunay_nested_in.e | Bin 0 -> 13684 bytes .../gold/xyzdelaunay_smoothed_in.e | Bin 0 -> 13688 bytes .../gold/xyzdelaunay_stitching_in.e | Bin 0 -> 14632 bytes .../gold/xyzdelaunay_with_holes_in.e | Bin 0 -> 9004 bytes .../xyz_delaunay_generator/tests | 61 +++++++++++++++ .../xyzdelaunay_mesh_generator.i | 24 ++++++ .../xyzdelaunay_nested.i | 71 +++++++++++++++++ .../xyzdelaunay_smoothed.i | 74 ++++++++++++++++++ .../xyzdelaunay_stitching.i | 65 +++++++++++++++ .../xyzdelaunay_with_holes.i | 38 +++++++++ 11 files changed, 333 insertions(+) create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_mesh_generator_in.e create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_nested_in.e create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_smoothed_in.e create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_stitching_in.e create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_with_holes_in.e create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/tests create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/xyzdelaunay_mesh_generator.i create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/xyzdelaunay_nested.i create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/xyzdelaunay_smoothed.i create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/xyzdelaunay_stitching.i create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/xyzdelaunay_with_holes.i diff --git a/test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_mesh_generator_in.e b/test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_mesh_generator_in.e new file mode 100644 index 0000000000000000000000000000000000000000..e537bf5825982c4084abba2e47d1b593745d5d04 GIT binary patch literal 4848 zcmeHKy>1gh5WbMazH^*}1d0?$q@YIpgtR6iM4?3y4aIV{*Y=6Kz0=*A*b(9hkU~wB zBJ`BdMTiH02SAV#i6UQVgCe|jt>=G}Zp6ATX#r3^k1fam4dIXPyv12MT(IJQ&{5DI?y2oB*H#e?)7(? zGW5I3?~6!g9nqFbroN6-5vbb+IYYSX)GB6QY80L0|D)OAot%%5oSh(4aIA5Vg0 zV38*#%nOaE6w=2fe3Hfq3d&gI8~rJ}Kh2ycpRAL{`m#T^s;9D3<6%xrz%E&#q=~zP z&yNS}dE>GFTf&waF;%cyI?GayNFdmZidn9+%Puig7G+=bBI^P zStIb%M?PvjnnTp~7B!*;vzA7zlx%41C5(%I7JHM&_Ha%K-A`;}E z%z(we$&|-_Bqd|9B4Dw0rabn5l#IpU2kb00rabl=DH)4H5!g8f63=6QkqkQsd|YE2 zYJ`Hrf4X+~;l}&jo4;WM)sDtk$8+BJ+!^M=s_TBk-UJGofqJZUY_3qnOh6j6JGz)lH>=ihQsC7)PAFSNF2B=C zV^!z`6nghxF8(qD<_>(~u1h(=!-?M~cqibVoX0@MyAC?sk0Il(3?1aWKWvBvJKj6& z3l4w8hacM@qtEde2N`i7vyR8%IM73f#`EU5`T1i!_Jti-ym9b$!JCBbY{S@jJY@4O SAPx-Y0e*-Dnei;MPx&7}XbN)x literal 0 HcmV?d00001 diff --git a/test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_nested_in.e b/test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_nested_in.e new file mode 100644 index 0000000000000000000000000000000000000000..80b776aa6a386abdeb814c98b301423c2f184f20 GIT binary patch literal 13684 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 Date: Mon, 29 Jul 2024 17:45:11 -0500 Subject: [PATCH 03/12] Doc page for XYZDelaunay --- .../meshgenerators/XYZDelaunayGenerator.md | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md diff --git a/framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md b/framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md new file mode 100644 index 000000000000..897b6bff4162 --- /dev/null +++ b/framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md @@ -0,0 +1,42 @@ +# XYZDelaunayGenerator + +!syntax description /Mesh/XYZDelaunayGenerator + +An input mesh will be used to define the outer boundary of a +generated tetrahedral output mesh. Additional interior vertices can +be automatically generated by specifying a desired tetrahedral volume. +Additional interior boundary "holes" can be meshed by the mesh +generators specified in the [!param](/Mesh/XYZDelaunayGenerator/holes) +vector parameter. + +Each input mesh, as specified in the +[!param](/Mesh/XYZDelaunayGenerator/boundary) parameter and optionally +in the [!param](/Mesh/XYDelaunayGenerator/holes) parameter, +can define a closed manifold of boundary triangles either by including +Tri3 elements for each triangle or by including volume elements whose +external faces comprise the boundary manifold. + +If multiple disconnected manifolds exist in a boundary mesh, only the +manifold enclosing the rest of the mesh is considered to be "the" +boundary. Input meshes which are not connected, which therefore have +multiple outer boundary manifolds, are not yet supported. + +Nodes internal to the boundary mesh are currently ignored. Future +expansions of this class may allow such nodes to be retained as nodes +in the output tetrahedralization. + +Using stitching options, meshes used as "holes" can subsequently be +stitched into those portions of the output mesh. + +Interior vertices can be adjusted after mesh generation using the +[!param](/Mesh/XYZDelaunayGenerator/smooth_triangulation) parameter, +to produce a more "smooth" mesh, but currently the only mesh smoother +option is a simple Laplacian smoother; this can have unwanted +side-effects on meshes with concave boundaries or poor nodal valences, +and so it is disabled by default for robustness. + +The elements generated by `XYZDelaunayGenerator` can be refined according +to a given uniform element volume specified as +[!param](/Mesh/XYDelaunayGenerator/desired_volume). +This refinement is currently controlled by the third-party Netgen +code. From 679dd283f3d5761c81fadc00b9dec240de21ed21 Mon Sep 17 00:00:00 2001 From: Roy Stogner Date: Tue, 6 Aug 2024 09:25:39 -0500 Subject: [PATCH 04/12] Use CSVDiff not Exodiff in XYZDelaunay tests We should probably add some additional moments here to avoid false negatives, but at least this should be robust against false positives from different Netgen behavior on different systems. --- .../gold/xyzdelaunay_mesh_generator_in.e | Bin 4848 -> 0 bytes .../gold/xyzdelaunay_mesh_generator_out.csv | 3 ++ .../gold/xyzdelaunay_nested_in.e | Bin 13684 -> 0 bytes .../gold/xyzdelaunay_nested_out.csv | 3 ++ .../gold/xyzdelaunay_smoothed_in.e | Bin 13688 -> 0 bytes .../gold/xyzdelaunay_smoothed_out.csv | 3 ++ .../gold/xyzdelaunay_stitching_in.e | Bin 14632 -> 0 bytes .../gold/xyzdelaunay_stitching_out.csv | 3 ++ .../gold/xyzdelaunay_with_holes_in.e | Bin 9004 -> 0 bytes .../gold/xyzdelaunay_with_holes_out.csv | 3 ++ .../xyz_delaunay_generator/tests | 30 +++++++----------- .../xyzdelaunay_mesh_generator.i | 20 ++++++++++-- .../xyzdelaunay_nested.i | 18 +++++++++++ .../xyzdelaunay_smoothed.i | 18 +++++++++++ .../xyzdelaunay_stitching.i | 18 +++++++++++ .../xyzdelaunay_with_holes.i | 18 +++++++++++ 16 files changed, 117 insertions(+), 20 deletions(-) delete mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_mesh_generator_in.e create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_mesh_generator_out.csv delete mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_nested_in.e create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_nested_out.csv delete mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_smoothed_in.e create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_smoothed_out.csv delete mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_stitching_in.e create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_stitching_out.csv delete mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_with_holes_in.e create mode 100644 test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_with_holes_out.csv diff --git a/test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_mesh_generator_in.e b/test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_mesh_generator_in.e deleted file mode 100644 index e537bf5825982c4084abba2e47d1b593745d5d04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4848 zcmeHKy>1gh5WbMazH^*}1d0?$q@YIpgtR6iM4?3y4aIV{*Y=6Kz0=*A*b(9hkU~wB zBJ`BdMTiH02SAV#i6UQVgCe|jt>=G}Zp6ATX#r3^k1fam4dIXPyv12MT(IJQ&{5DI?y2oB*H#e?)7(? zGW5I3?~6!g9nqFbroN6-5vbb+IYYSX)GB6QY80L0|D)OAot%%5oSh(4aIA5Vg0 zV38*#%nOaE6w=2fe3Hfq3d&gI8~rJ}Kh2ycpRAL{`m#T^s;9D3<6%xrz%E&#q=~zP z&yNS}dE>GFTf&waF;%cyI?GayNFdmZidn9+%Puig7G+=bBI^P zStIb%M?PvjnnTp~7B!*;vzA7zlx%41C5(%I7JHM&_Ha%K-A`;}E z%z(we$&|-_Bqd|9B4Dw0rabn5l#IpU2kb00rabl=DH)4H5!g8f63=6QkqkQsd|YE2 zYJ`Hrf4X+~;l}&jo4;WM)sDtk$8+BJ+!^M=s_TBk-UJGofqJZUY_3qnOh6j6JGz)lH>=ihQsC7)PAFSNF2B=C zV^!z`6nghxF8(qD<_>(~u1h(=!-?M~cqibVoX0@MyAC?sk0Il(3?1aWKWvBvJKj6& z3l4w8hacM@qtEde2N`i7vyR8%IM73f#`EU5`T1i!_Jti-ym9b$!JCBbY{S@jJY@4O SAPx-Y0e*-Dnei;MPx&7}XbN)x diff --git a/test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_mesh_generator_out.csv b/test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_mesh_generator_out.csv new file mode 100644 index 000000000000..bf8020aac885 --- /dev/null +++ b/test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_mesh_generator_out.csv @@ -0,0 +1,3 @@ +time,volume +0,0 +1,1.1666666666667 diff --git a/test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_nested_in.e b/test/tests/meshgenerators/xyz_delaunay_generator/gold/xyzdelaunay_nested_in.e deleted file mode 100644 index 80b776aa6a386abdeb814c98b301423c2f184f20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13684 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 Date: Tue, 6 Aug 2024 15:39:57 -0500 Subject: [PATCH 05/12] Reference tetrahedralization issue in XYZ tests --- test/tests/meshgenerators/xyz_delaunay_generator/tests | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tests/meshgenerators/xyz_delaunay_generator/tests b/test/tests/meshgenerators/xyz_delaunay_generator/tests index 67b4fab6767c..06b6084695c8 100644 --- a/test/tests/meshgenerators/xyz_delaunay_generator/tests +++ b/test/tests/meshgenerators/xyz_delaunay_generator/tests @@ -1,6 +1,6 @@ [Tests] design = 'meshgenerators/XYZDelaunayGenerator.md' - issues = '' + issues = '#28297' [xyzdelaunay] requirement = "The system shall have the capability of tetrahedralizing a triangulated boundary" [basic] From 9d9d95fa70620f16c664046067661f8c76f0af44 Mon Sep 17 00:00:00 2001 From: Roy Stogner Date: Wed, 7 Aug 2024 18:03:18 -0500 Subject: [PATCH 06/12] Fix typo in XYZDelaunay docs --- .../doc/content/source/meshgenerators/XYZDelaunayGenerator.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md b/framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md index 897b6bff4162..900da34a38a8 100644 --- a/framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md +++ b/framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md @@ -11,7 +11,7 @@ vector parameter. Each input mesh, as specified in the [!param](/Mesh/XYZDelaunayGenerator/boundary) parameter and optionally -in the [!param](/Mesh/XYDelaunayGenerator/holes) parameter, +in the [!param](/Mesh/XYZDelaunayGenerator/holes) parameter, can define a closed manifold of boundary triangles either by including Tri3 elements for each triangle or by including volume elements whose external faces comprise the boundary manifold. @@ -37,6 +37,6 @@ and so it is disabled by default for robustness. The elements generated by `XYZDelaunayGenerator` can be refined according to a given uniform element volume specified as -[!param](/Mesh/XYDelaunayGenerator/desired_volume). +[!param](/Mesh/XYZDelaunayGenerator/desired_volume). This refinement is currently controlled by the third-party Netgen code. From 5d4c5185797415a152a3866904fb3561d4bac8b0 Mon Sep 17 00:00:00 2001 From: Roy Stogner Date: Fri, 13 Sep 2024 11:47:37 -0500 Subject: [PATCH 07/12] Add test for stitching failures to XYZDelaunay --- .../src/meshgenerators/XYZDelaunayGenerator.C | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/framework/src/meshgenerators/XYZDelaunayGenerator.C b/framework/src/meshgenerators/XYZDelaunayGenerator.C index a8245a0cc34c..87018b6691d6 100644 --- a/framework/src/meshgenerators/XYZDelaunayGenerator.C +++ b/framework/src/meshgenerators/XYZDelaunayGenerator.C @@ -375,13 +375,16 @@ XYZDelaunayGenerator::generate() const auto & increment_subdomain_map = hole_mesh.get_subdomain_name_map(); main_subdomain_map.insert(increment_subdomain_map.begin(), increment_subdomain_map.end()); - mesh->stitch_meshes(hole_mesh, - inner_bcid, - new_hole_bcid, - TOLERANCE, - /*clear_stitched_bcids*/ true, - _verbose_stitching, - use_binary_search); + std::size_t n_nodes_stitched = mesh->stitch_meshes(hole_mesh, + inner_bcid, + new_hole_bcid, + TOLERANCE, + /*clear_stitched_bcids*/ true, + _verbose_stitching, + use_binary_search); + + if (!n_nodes_stitched) + mooseError("Failed to stitch hole mesh ", hole_i, " to new tetrahedralization."); } } // Check if one SubdomainName is shared by more than one subdomain ids From 32957383bc24e35c151218d9528c7bf9bf1b6921 Mon Sep 17 00:00:00 2001 From: Roy Stogner Date: Mon, 16 Sep 2024 15:59:58 -0500 Subject: [PATCH 08/12] Remove redundant subdomain_name setter --- framework/src/meshgenerators/XYDelaunayGenerator.C | 4 ---- framework/src/meshgenerators/XYZDelaunayGenerator.C | 4 ---- 2 files changed, 8 deletions(-) diff --git a/framework/src/meshgenerators/XYDelaunayGenerator.C b/framework/src/meshgenerators/XYDelaunayGenerator.C index 4a569e65c459..407a32e5bae1 100644 --- a/framework/src/meshgenerators/XYDelaunayGenerator.C +++ b/framework/src/meshgenerators/XYDelaunayGenerator.C @@ -340,10 +340,6 @@ XYDelaunayGenerator::generate() } } - // Assign new subdomain name, if provided - if (isParamValid("output_subdomain_name")) - mesh->subdomain_name(_output_subdomain_id) = getParam("output_subdomain_name"); - const bool use_binary_search = (_algorithm == "BINARY"); // The hole meshes are specified by the user, so they could have any diff --git a/framework/src/meshgenerators/XYZDelaunayGenerator.C b/framework/src/meshgenerators/XYZDelaunayGenerator.C index 87018b6691d6..2bc8dfdd9a59 100644 --- a/framework/src/meshgenerators/XYZDelaunayGenerator.C +++ b/framework/src/meshgenerators/XYZDelaunayGenerator.C @@ -185,10 +185,6 @@ XYZDelaunayGenerator::generate() } } - // Assign new subdomain name, if provided - if (isParamValid("output_subdomain_name")) - mesh->subdomain_name(_output_subdomain_id) = getParam("output_subdomain_name"); - const bool use_binary_search = (_algorithm == "BINARY"); // The hole meshes are specified by the user, so they could have any From ecc9f03e17b602c353b0123e46e27065bc6a68a5 Mon Sep 17 00:00:00 2001 From: Roy Stogner Date: Mon, 16 Sep 2024 16:48:25 -0500 Subject: [PATCH 09/12] Fix paramError parameter, move to constructor --- framework/src/meshgenerators/XYDelaunayGenerator.C | 10 +++++++--- framework/src/meshgenerators/XYZDelaunayGenerator.C | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/framework/src/meshgenerators/XYDelaunayGenerator.C b/framework/src/meshgenerators/XYDelaunayGenerator.C index 407a32e5bae1..f4445d504023 100644 --- a/framework/src/meshgenerators/XYDelaunayGenerator.C +++ b/framework/src/meshgenerators/XYDelaunayGenerator.C @@ -167,6 +167,13 @@ XYDelaunayGenerator::XYDelaunayGenerator(const InputParameters & parameters) for (auto hole_i : index_range(_stitch_holes)) if (_stitch_holes[hole_i] && (hole_i >= _refine_holes.size() || _refine_holes[hole_i])) paramError("refine_holes", "Disable auto refine of any hole boundary to be stitched."); + + if (isParamValid("hole_boundaries")) + { + auto & hole_boundaries = getParam>("hole_boundaries"); + if (hole_boundaries.size() != _hole_ptrs.size()) + paramError("hole_boundaries", "Need one hole_boundaries entry per hole, if specified."); + } } std::unique_ptr @@ -387,9 +394,6 @@ XYDelaunayGenerator::generate() auto hole_boundaries = getParam>("hole_boundaries"); auto hole_boundary_ids = MooseMeshUtils::getBoundaryIDs(*mesh, hole_boundaries, true); - if (hole_boundary_ids.size() != hole_ptrs.size()) - paramError("hole_boundary_ids", "Need one hole_boundary_ids entry per hole, if specified."); - for (auto h : index_range(hole_ptrs)) libMesh::MeshTools::Modification::change_boundary_id( *mesh, h + 1 + free_boundary_id, h + 1 + free_boundary_id + end_bcid); diff --git a/framework/src/meshgenerators/XYZDelaunayGenerator.C b/framework/src/meshgenerators/XYZDelaunayGenerator.C index 2bc8dfdd9a59..d045190a7f68 100644 --- a/framework/src/meshgenerators/XYZDelaunayGenerator.C +++ b/framework/src/meshgenerators/XYZDelaunayGenerator.C @@ -102,6 +102,13 @@ XYZDelaunayGenerator::XYZDelaunayGenerator(const InputParameters & parameters) { if (!_stitch_holes.empty() && _stitch_holes.size() != _hole_ptrs.size()) paramError("stitch_holes", "Need one stitch_holes entry per hole, if specified."); + + if (isParamValid("hole_boundaries")) + { + auto & hole_boundaries = getParam>("hole_boundaries"); + if (hole_boundaries.size() != _hole_ptrs.size()) + paramError("hole_boundaries", "Need one hole_boundaries entry per hole, if specified."); + } } std::unique_ptr @@ -232,9 +239,6 @@ XYZDelaunayGenerator::generate() auto hole_boundaries = getParam>("hole_boundaries"); auto hole_boundary_ids = MooseMeshUtils::getBoundaryIDs(*mesh, hole_boundaries, true); - if (hole_boundary_ids.size() != _hole_ptrs.size()) - paramError("hole_boundary_ids", "Need one hole_boundary_ids entry per hole, if specified."); - for (auto h : index_range(_hole_ptrs)) libMesh::MeshTools::Modification::change_boundary_id( *mesh, h + 1 + free_boundary_id, h + 1 + free_boundary_id + end_bcid); From 6612333f20b2123ce688aa9b7ff89cd88911d859 Mon Sep 17 00:00:00 2001 From: Roy Stogner Date: Mon, 16 Sep 2024 17:18:47 -0500 Subject: [PATCH 10/12] Use `set_isnt_prepared()` after generation --- framework/src/meshgenerators/XYDelaunayGenerator.C | 2 +- framework/src/meshgenerators/XYZDelaunayGenerator.C | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/meshgenerators/XYDelaunayGenerator.C b/framework/src/meshgenerators/XYDelaunayGenerator.C index f4445d504023..9254ba3f0312 100644 --- a/framework/src/meshgenerators/XYDelaunayGenerator.C +++ b/framework/src/meshgenerators/XYDelaunayGenerator.C @@ -547,6 +547,6 @@ XYDelaunayGenerator::generate() if (main_subdomain_map.size() != main_subdomain_map_name_list.size()) paramError("holes", "The hole meshes contain subdomain name maps with conflicts."); - mesh->prepare_for_use(); + mesh->set_isnt_prepared(); return mesh; } diff --git a/framework/src/meshgenerators/XYZDelaunayGenerator.C b/framework/src/meshgenerators/XYZDelaunayGenerator.C index d045190a7f68..921d36e657ab 100644 --- a/framework/src/meshgenerators/XYZDelaunayGenerator.C +++ b/framework/src/meshgenerators/XYZDelaunayGenerator.C @@ -399,7 +399,7 @@ XYZDelaunayGenerator::generate() for (auto & hole_ptr : _hole_ptrs) hole_ptr->reset(); - mesh->prepare_for_use(); + mesh->set_isnt_prepared(); return mesh; #else mooseError("Cannot use XYZDelaunayGenerator without NetGen-enabled libMesh."); From c3a4d71fadc1daa505aedac28d65d720180ea0ea Mon Sep 17 00:00:00 2001 From: roystgnr Date: Mon, 16 Sep 2024 17:20:16 -0500 Subject: [PATCH 11/12] Apply suggestions from code review Co-authored-by: Guillaume Giudicelli --- .../content/source/meshgenerators/XYZDelaunayGenerator.md | 6 ++++++ framework/src/meshgenerators/XYZDelaunayGenerator.C | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md b/framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md index 900da34a38a8..ce3c9124b943 100644 --- a/framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md +++ b/framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md @@ -40,3 +40,9 @@ to a given uniform element volume specified as [!param](/Mesh/XYZDelaunayGenerator/desired_volume). This refinement is currently controlled by the third-party Netgen code. + +!syntax parameters /Mesh/XYZDelaunayGenerator + +!syntax inputs /Mesh/XYZDelaunayGenerator + + diff --git a/framework/src/meshgenerators/XYZDelaunayGenerator.C b/framework/src/meshgenerators/XYZDelaunayGenerator.C index 921d36e657ab..f0726eae9f4a 100644 --- a/framework/src/meshgenerators/XYZDelaunayGenerator.C +++ b/framework/src/meshgenerators/XYZDelaunayGenerator.C @@ -81,7 +81,7 @@ XYZDelaunayGenerator::validParams() algorithm, "Control the use of binary search for the nodes of the stitched surfaces."); params.addParam( - "verbose_stitching", false, "Whether mesh stitching should have verbose output."); + "verbose_stitching", false, "Whether mesh hole stitching should have verbose output."); params.addClassDescription( "Creates tetrahedral 3D meshes within boundaries defined by input meshes."); From 22fc62f265a3af649b24356721d7a0d2df26125e Mon Sep 17 00:00:00 2001 From: Roy Stogner Date: Mon, 16 Sep 2024 17:21:09 -0500 Subject: [PATCH 12/12] holes can be "meshed"->"specified" in docs --- .../doc/content/source/meshgenerators/XYDelaunayGenerator.md | 2 +- .../doc/content/source/meshgenerators/XYZDelaunayGenerator.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/doc/content/source/meshgenerators/XYDelaunayGenerator.md b/framework/doc/content/source/meshgenerators/XYDelaunayGenerator.md index d35d1cce2a37..d6e42bb1eb90 100644 --- a/framework/doc/content/source/meshgenerators/XYDelaunayGenerator.md +++ b/framework/doc/content/source/meshgenerators/XYDelaunayGenerator.md @@ -9,7 +9,7 @@ vertices. Additional interior vertices can be automatically generated by specifying a desired triangle area (either as a constant or as a function of triangle center location that can be specified or automatically generated). Additional interior boundary "holes" can -be meshed by the mesh generators specified in the [!param](/Mesh/XYDelaunayGenerator/holes) vector parameter. +be specified by the mesh generators specified in the [!param](/Mesh/XYDelaunayGenerator/holes) vector parameter. Each input mesh, as specified in the [!param](/Mesh/XYDelaunayGenerator/boundary) parameter and optionally diff --git a/framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md b/framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md index ce3c9124b943..ad2522c70e6e 100644 --- a/framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md +++ b/framework/doc/content/source/meshgenerators/XYZDelaunayGenerator.md @@ -5,7 +5,7 @@ An input mesh will be used to define the outer boundary of a generated tetrahedral output mesh. Additional interior vertices can be automatically generated by specifying a desired tetrahedral volume. -Additional interior boundary "holes" can be meshed by the mesh +Additional interior boundary "holes" can be specified by the mesh generators specified in the [!param](/Mesh/XYZDelaunayGenerator/holes) vector parameter.