-
Notifications
You must be signed in to change notification settings - Fork 83
/
Copy pathgridgen.m
256 lines (255 loc) · 12.8 KB
/
gridgen.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
%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)' )
% Copyright 2013-2024 Precise Simulation, Ltd.