Finite Element Analysis Toolbox
gridgen.m File Reference

Description

GRIDGEN Grid and mesh generation for geometry objects.

[ GRID, STATS ] = GRIDGEN( SIN, VARARGIN ) Generates a grid/mesh for the geometry defined by the objects in SIN by calling an external grid generation algorithm. SIN can be either a valid fea problem struct with geometry defined in SIN.geom.objects, a cell array of multiple geometry objects, or a single geometry object. Accepts the following property/value pairs are available with the default grid generation algorithm.

Property    Value/{Default}           Description
-----------------------------------------------------------------------------------
gridgen     string {default}          Grid generation algorithm: default, gmsh,
                                         robust (3D), gridgen2d, or triangle (2D)
dprim       logical    {true}         Structrured meshing of primitives
hmax        scalar/arr {0.1}          Target grid size for subdomains
hmaxb       scalar/arr {[]}           Target grid size for boundaries
hmaxe       scalar/arr {[]}           Target grid size for edges (3D)
grading     scalar     0.3            Mesh grading/growth rate
eledge      scalar     1              Elements per edge
quad        logical    {false}        Use quad meshing (2D)
intb        logical    {true}         Output interior/internal boundaries
waitbar     scalar     {0}            Show/hide waitbar
fid         scalar     {1}            File identifier for output ([]=no output)

GRIDGEN specifies which grid generation algorithm to use and calls the corresponding grid generation code (default, gmsh, robust (3D), gridgen2d (2D), or triangle (2D)). Enabling DPRIM with the default grid generator enables structured meshing of single geometry object primitives (and no differing boundary/edge mesh sizing).

HMAX indicates target grid cell diameters, and is either a numeric scalar prescribing the grid size for the entire geometry, or an array with HMAX values corresponding to individual subdomains. Positive HMAX values uses the minimum mesh size for shared boundaries, while negative applys the mean value.

HMAXB is analogous to HMAX but related to boundaries (edges/faces). HMAXB can be a single scalar applicable to all boundaries, a numeric array with entries corresponding to individual boundaries.

HMAXE is analogous to HMAXB but related to 3D edges (only applicable to default grid generator for 3D geometries).

GRADING specifies the rate at which smaller cells will grow to larger (0 - 1), and ELEDGE optionally prescribes the minimum elements per edge.

INTB toggels interior/internal boundaries on (default) or off.

The following additional property/value pairs are available with and specific to the GMSH mesh generator.

Property    Value/{Default}            Description
-----------------------------------------------------------------------------------
hmaxp       scal/arr {[]}              Target grid size for vertices
nref        scalar   {0}               Number of uniform grid refinements
algo2       scalar   {2}               2D mesh algorithm (1=MeshAdapt, 2=Automatic,
                                       5=Delaunay, 6=Frontal, 7=BAMG, 8=DelQuad)
algo3       scalar   {1}               3D mesh algorithm (1=Del, 2=New Del, 4=Front
                                       5=Front Del, 6=Front Hex, 7=MMG3D, 9=R-tree)
blayer      struct   {[]}              Data struct for Gmsh 2D boundary layers
quad        logical  {false}           Use quad meshing (for 2D)
intb        logical  {true}            Output interior/internal boundaries
avhb        logical  {true}            Average hmax to boundaries
nsm         scalar   {3}               Number of (post) grid smoothing steps
palign      scalar   {eps}             Distance tolerance to align point objects
tol         scalar   {eps*1e3}         Deduplication tolerance
compound    logical  {true}            Use Gmsh compound boundaries
mshopt      cell     {}                Cell array of additional Gmsh options
mshall      logical  {true}            Output/save all meshed entities
mshver      integer  {2}               Gmsh msh file version (1/2/4)
verbosity   integer  {5}               Gmsh verbosity/output level
syscmd      string   {'default'}       Gmsh system call command
                                       (default 'gmsh fdir/fname.geo -')
fname       string   {'featool_gmsh_UID'}  Gmsh imp/exp file name (root)
fdir        string   {tempdir}         Directory to write help files
clean       logical  {true}            Delete (clean) Gmsh help files

NREF (default 0) the number of post uniform grid refinement steps.

ALGO2 and ALGO3 the Gmsh 2D and 3D mesh generation algorithms.

QUAD (default 0) toggles Blossom-Quad conversion for 2D geometries.

The BLAYER flag enables boundary layers for boundaries. May optionally given as array of structs where each entry corresponds to a boundary layer field entry.

The AVHB logical flag toggles if internal boundaries inheriting HMAX values (when HMAXB is unspecified) should be assigned the smallest HMAX value from neighbouring subdomains, or the mean value (default).

NSM (default 3) the number of GRIDSMOOTH smoothing steps to perform.

PALIGN sets a minimum distance over which to re-align mesh vertices to point objects.

Additional Gmsh options can be provided with the cell array MSHOPT. For example to set the "CharacteristicLengthMax" and "AnisoMax" Gmsh options, MSHOPT could be given as

{{'Mesh', 'CharacteristicLengthMax', '1'}, {'Mesh', 'AnisoMax', '10'}}

The following additional property/value pairs are available with and specific to the ROBUST mesh generator designed to mesh 3D geometries from faceted formats (STL/OBJ).

Property    Value/{Default}            Description
-----------------------------------------------------------------------------------
q           scalar   {0.5}             Target quality
coarsen     boolean  {false}           Coarsen output as much as possible
angle       scalar   {0}               Boundary reparametrization angle (degrees)
smoothb     boolean  {false}           Smooth open boundaries
manifold    boolean  {false}           Force manifold output
stope       scalar   {10}              Stop energy (3-inf)
formula     string   {}                CSG formula

Q (default 0.5) specifies a mesh quality target [0 < q < 1.0], and with the COARSEN flag tries to create as coarse output grid as possible.

SMOOTHB enables smoothing of open boundaries, while MANIFOLD enforces closing of open boundaries (for input meshes that are not perfectly closed/manifold). STOPE specifies a limit when to stop mesh optimization.

FORMULA can be used to specify an optional CSG formula for inputs with >= 2 geometry objects. The FORMULA is specified as a string containing combinations of geometry object tags and operations (+ union/join, - subtract, & intersect), for example "S1-C2".

The following additional property/value pairs are available with and specific to the GRIDGEN2D mesh generator.

Property    Value/{Default}            Description
-----------------------------------------------------------------------------------
q           scalar   {0.65}            Target quality
blayer      logical  {false}           Enable boundary layers
avhb        logical  {true}            Average hmax to boundaries
nsm         scalar   {3}               Number of (post) grid smoothing steps
palign      scalar   {eps}             Distance tolerance to align point objects

Q (default 0.65) specifies a quality target [0 < q < 1.0].

The BLAYER flag enables boundary layers for internal boundaries (holes). May optionally given as a vector where the 1st entry specifies relative thickness of stretched layer.

PALIGN sets a minimum distance over which to re-align mesh vertices to point objects.

The following additional property/value pairs are available with and specific to the TRIANGLE mesh generator.

Property    Value/{Default}            Description
-----------------------------------------------------------------------------------
q           scalar   {28}              Minimum target angle (quality)
syscmd      string   {'default'}       Triangle system call command (default
                                       'triangle -I -q%f -j -e -a -A %s.poly')
fname       string   {'featool_tri_UID'}  Triangle imp/exp file name (root)
fdir        string   {tempdir}         Directory to write help files
clean       logical  {true}            Delete (clean) Triangle help files

Q (default 28 degrees) specifies a minimum target angle (values less than 33 are generally acceptable, while higher values might prevent Triangle convergence).

Examples
  1) Unit circle with uniform global grid size set to 0.1.

  grid = gridgen( gobj_cone, 'hmax', 0.1 );
  plotgrid( grid )

  2) Unit square with a finer grid along the top boundary (using Triangle).

  grid = gridgen( gobj_rectangle, 'hmax', 0.5, ...
                  'hmaxb', [0.5 0.5 0.01 0.5], 'gridgen', 'triangle' );
  plotgrid( grid )

  3) Domain with curved boundaries meshed with quadrilaterals (using Gmsh).

  geom.objects = {gobj_rectangle() gobj_circle([0 0],.6) gobj_circle([1 1],.3,'C2')};
  geom = geom_apply_formula( geom, 'R1-C1-C2' );
  grid = gridgen( geom, 'hmax', 0.1, 'gridgen', 'gmsh', 'quad', true, 'verbosity', 3 );
  plotgrid( grid )

  4) Two connected subdomains with a shared boundary (using Gridgen2D).

  geom.objects = { gobj_polygon([-2e-3 -8e-3;0 -8e-3;0 -6e-3;0 6e-3;0 8e-3;-2e-3 8e-3]), ...
  gobj_polygon([0 -6e-3;2e-3 -5e-3;2e-3 4e-3;0 6e-3]) };
  hmax  = 5e-4;
  hmaxb = hmax*ones(1,4);
  hmaxb(9) = hmax/5;
  grid  = gridgen( geom, 'hmax', hmax, 'hmaxb', hmaxb, 'gridgen', 'gridgen2d' );
  plotgrid( grid )

  5) Composite component with two subdomains (using Gridgen2D).

  r1 = gobj_rectangle( 0, 0.11, 0, 0.12,  'R1' );
  c1 = gobj_circle( [ 0.065 0 ],   0.015, 'C1' );
  c2 = gobj_circle( [ 0.11 0.12 ], 0.035, 'C2' );
  c3 = gobj_circle( [ 0 0.06 ],    0.025, 'C3' );
  r2 = gobj_rectangle( 0.065, 0.16, 0.05, 0.07, 'R2' );
  c4 = gobj_circle( [ 0.065 0.06 ], 0.01, 'C4' );
  geom.objects = { r1 c1 c2 c3 r2 c4 };
  geom = geom_apply_formula( geom, 'R1-C1-C2-C3' );
  geom = geom_apply_formula( geom, 'R2+C4' );

  grid  = gridgen( geom, 'hmax', [0.0025 0.01 0.0025], 'gridgen', 'gridgen2d' );
  plotgrid( grid )

  6) Complex geometry with several holes and subdomains (using Gridgen2D).

  w = 10e-4; L = 3*w; H = 5*w;
  p1  = gobj_polygon( [w/10 0;(L-w/4)/2 0;(L-w/4)/2 H;0 H;0 H/3], 'P1' );
  p2  = gobj_polygon( [(L+w/4)/2 0;L 0;L H-H/3;L H;(L+w/4)/2 H], 'P2' );
  r1  = gobj_rectangle( (L-w/4)/2, (L+w/4)/2, 0, H, 'R1' );
  c1  = gobj_circle( [2*w/3 3*w], w/3, 'C1' );
  c2  = gobj_circle( [2*w/3 2*w], w/3, 'C2' );
  c3  = gobj_circle( [2*w/3 1*w], w/3, 'C3' );
  c4  = gobj_circle( [L-w/2 4.5*w], w/8, 'C4' );
  c5  = gobj_circle( [L-w   4.5*w], w/8, 'C5' );
  c6  = gobj_circle( [L-w/2 4*w], w/8, 'C6' );
  c7  = gobj_circle( [L-w   4*w], w/8, 'C7' );
  c8  = gobj_circle( [L-w/2 3.5*w], w/8, 'C8' );
  c9  = gobj_circle( [L-w   3.5*w], w/8, 'C9' );
  c10 = gobj_circle( [L-w/2 3*w], w/8, 'C10' );
  c11 = gobj_circle( [L-w   3*w], w/8, 'C11' );

  geom.objects = { p1 p2 r1 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 };
  geom = geom_apply_formula( geom, 'P1-C1-C2-C3' );
  geom = geom_apply_formula( geom, 'P2-C4-C5-C6-C7-C8-C9-C10-C11' );

  hmax = w./[5 5 20];     % Set finer mesh size in subdomain 3.
  hmaxb = zeros(1,21);
  hmaxb([6 21]) = w/50;   % Set finer mesh size on the in and outlets, boundaries 6 and 21.
  grid = gridgen( geom, 'hmax', hmax, 'hmaxb', hmaxb, 'gridgen', 'gridgen2d' );
  plotgrid( grid )

  7) Cone showing the interior y>0 and z<0 (using Gmsh).

  grid = gridgen( gobj_cone, 'hmax', 0.25, 'gridgen', 'gmsh' );
  plotgrid( grid, 'facecolor', 'none', 'edgecolor', [.7 .7 .7] )
  plotgrid( grid, 'selcells', '(y>0)&(z<0)' )