Advanced Meshing Tools
This section covers advanced meshing tools which are very useful for meshing geometries which are not regular Cartesian or hexagonal lattices.
ParsedCurveGenerator
The ParsedCurveGenerator object generates a 3D curve mesh composed of EDGE2 elements which connect the series of points given by , , . This is useful when the user wants to construct a non-standard boundary and mesh inside of it.

Figure 1: A 3D curve mesh connecting a series of points using ParsedCurveGenerator.
Listing 1: 3D curve mesh example.
[Mesh<<<{"href": "../../../syntax/Mesh/index.html"}>>>]
[pcg]
type = ParsedCurveGenerator<<<{"description": "This ParsedCurveGenerator object is designed to generate a mesh of a curve that consists of EDGE2, EDGE3, or EDGE4 elements.", "href": "../../../source/meshgenerators/ParsedCurveGenerator.html"}>>>
x_formula<<<{"description": "Function expression of x(t)"}>>> = 'cos(t)'
y_formula<<<{"description": "Function expression of y(t)"}>>> = 'sin(t)'
z_formula<<<{"description": "Function expression of z(t)"}>>> = 't'
section_bounding_t_values<<<{"description": "The 't' values that bound the sections of the curve. Start and end points must be included. The number of entries in 'nums_segments' should be equal to one less than the number of entries in this parameter."}>>> = '0 ${fparse 4*pi}'
nums_segments<<<{"description": "Numbers of segments (EDGE elements) of each section of the curve to be generated. The number of entries in this parameter should be equal to one less than the number of entries in 'section_bounding_t_values'"}>>> = 24
[]
[]
(test/tests/meshgenerators/parsed_curve_generator/parsed_curve_3d.i)FillBetweenCurvesGenerator, FillBetweenPointVectorsGenerator, and FillBetweenSidesetsGenerator
Several mesh generators are available to the user to generate a "transition layer" between two curves using linear triangle elements (TRI3). Behind the scenes, these mesh generators use MOOSE's FillBetweenPointVectorsTools capability to generate a "transition layer" between two given curves (in the form of two vectors of points).

Figure 2: A schematic drawing showing the fundamental functionality of connecting two curves with a transition layer.
FillBetweenCurvesGenerator
The FillBetweenCurvesGenerator object is designed to generate a transition layer to connect two boundaries of two input meshes. The user provides two 1D meshes (curves) which should be connected to each other with transition layers.

Figure 3: FillBetweenCurvesGenerator connects a logarithmic curve (top left) and circular curve (bottom right) with a transition layer.
FillBetweenSidesetsGenerator
The FillBetweenSidesetsGenerator object is designed to generate a transition layer to connect two boundaries of two input meshes. The user provides two 2D input meshes with sidesets. These sidesets specify which boundaries of each mesh should be connected to the other mesh with a transitional layer.

Figure 4: An illustration of FillBetweenSidesetsGenerator to connect two square meshes together by meshing the area between them.
FillBetweenPointVectorsGenerator
This FillBetweenPointVectorsGenerator object generates a transition layer between two point vectors with different numbers of nodes. The user should provide two vectors of points as well as the number of layers of elements to create between the two vectors.

Figure 5: An illustration of different transition layer meshes that can be generated between two arc boundaries using FillBetweenPointVectorsGenerator.
XYDelaunayGenerator
XYDelaunayGenerator creates an unstructured mesh consisting of TRI3 elements based on a given external boundary and, optionally, a series of internal hole meshes.

Figure 6: An example mesh generated by XYDelaunayGenerator using a quadrilateral external boundary and two square holes.
Listing 2: Example of XYDelaunayGenerator with holes.
[Mesh<<<{"href": "../../../syntax/Mesh/index.html"}>>>]
[outer_bdy]
type = PolyLineMeshGenerator<<<{"description": "Generates meshes from edges connecting a list of points.", "href": "../../../source/meshgenerators/PolyLineMeshGenerator.html"}>>>
points<<<{"description": "The points defining the polyline, in order"}>>> = '-1.0 0.0 0.0
0.0 -1.0 0.0
1.0 0.0 0.0
0.0 2.0 0.0'
loop<<<{"description": "Whether edges should form a closed loop"}>>> = true
[]
[hole_1]
type = PolyLineMeshGenerator<<<{"description": "Generates meshes from edges connecting a list of points.", "href": "../../../source/meshgenerators/PolyLineMeshGenerator.html"}>>>
points<<<{"description": "The points defining the polyline, in order"}>>> = '-0.5 -0.1 0.0
-0.3 -0.1 0.0
-0.3 0.1 0.0
-0.5 0.1 0.0'
loop<<<{"description": "Whether edges should form a closed loop"}>>> = true
[]
[hole_2]
type = PolyLineMeshGenerator<<<{"description": "Generates meshes from edges connecting a list of points.", "href": "../../../source/meshgenerators/PolyLineMeshGenerator.html"}>>>
points<<<{"description": "The points defining the polyline, in order"}>>> = '0.3 -0.1 0.0
0.5 -0.1 0.0
0.5 0.1 0.0
0.3 0.1 0.0'
loop<<<{"description": "Whether edges should form a closed loop"}>>> = true
[]
[triang]
type = XYDelaunayGenerator<<<{"description": "Triangulates meshes within boundaries defined by input meshes.", "href": "../../../source/meshgenerators/XYDelaunayGenerator.html"}>>>
boundary<<<{"description": "The input MeshGenerator defining the output outer boundary and required Steiner points."}>>> = 'outer_bdy'
holes<<<{"description": "The MeshGenerators that define mesh holes."}>>> = 'hole_1
hole_2'
add_nodes_per_boundary_segment<<<{"description": "How many more nodes to add in each outer boundary segment."}>>> = 3
refine_boundary<<<{"description": "Whether to allow automatically refining the outer boundary."}>>> = false
desired_area<<<{"description": "Desired (maximum) triangle area, or 0 to skip uniform refinement"}>>> = 0.05
[]
[]
(test/tests/meshgenerators/xy_delaunay_generator/xydelaunay_with_holes.i)XYDelaunayGenerator is extremely powerful when combined with ParsedCurveGenerator and other Reactor module objects already described, as it can mesh very irregularly shaped regions.