mmgpy 0.2.0__cp310-cp310-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bin/__init__.py +10 -0
- bin/concrt140.dll +0 -0
- bin/mmg.dll +0 -0
- bin/mmg2d.dll +0 -0
- bin/mmg2d_O3.exe +0 -0
- bin/mmg3d.dll +0 -0
- bin/mmg3d_O3.exe +0 -0
- bin/mmgs.dll +0 -0
- bin/mmgs_O3.exe +0 -0
- bin/msvcp140.dll +0 -0
- bin/msvcp140_1.dll +0 -0
- bin/msvcp140_2.dll +0 -0
- bin/msvcp140_atomic_wait.dll +0 -0
- bin/msvcp140_codecvt_ids.dll +0 -0
- bin/vcruntime140.dll +0 -0
- bin/vcruntime140_1.dll +0 -0
- include/__init__.py +10 -0
- include/mmg/common/libmmgtypes.h +687 -0
- include/mmg/common/libmmgtypesf.h +762 -0
- include/mmg/common/mmg_export.h +47 -0
- include/mmg/common/mmgcmakedefines.h +46 -0
- include/mmg/common/mmgcmakedefinesf.h +29 -0
- include/mmg/common/mmgversion.h +54 -0
- include/mmg/libmmg.h +67 -0
- include/mmg/libmmgf.h +42 -0
- include/mmg/mmg2d/libmmg2d.h +2761 -0
- include/mmg/mmg2d/libmmg2df.h +3263 -0
- include/mmg/mmg2d/mmg2d_export.h +34 -0
- include/mmg/mmg3d/libmmg3d.h +3444 -0
- include/mmg/mmg3d/libmmg3df.h +4041 -0
- include/mmg/mmg3d/mmg3d_export.h +34 -0
- include/mmg/mmgs/libmmgs.h +2560 -0
- include/mmg/mmgs/libmmgsf.h +3028 -0
- include/mmg/mmgs/mmgs_export.h +34 -0
- lib/__init__.py +10 -0
- lib/cmake/mmg/FindElas.cmake +57 -0
- lib/cmake/mmg/FindSCOTCH.cmake +373 -0
- lib/cmake/mmg/MmgTargets-release.cmake +53 -0
- lib/cmake/mmg/MmgTargets.cmake +127 -0
- lib/cmake/mmg/mmgConfig.cmake +43 -0
- lib/mmg.lib +0 -0
- lib/mmg2d.lib +0 -0
- lib/mmg3d.lib +0 -0
- lib/mmgs.lib +0 -0
- mmgpy/__init__.py +888 -0
- mmgpy/_logging.py +86 -0
- mmgpy/_mmgpy.cp310-win_amd64.pyd +0 -0
- mmgpy/_mmgpy.pyi +650 -0
- mmgpy/_options.py +304 -0
- mmgpy/_progress.py +539 -0
- mmgpy/_pyvista.py +423 -0
- mmgpy/_version.py +3 -0
- mmgpy/_version.py.in +3 -0
- mmgpy/lagrangian.py +394 -0
- mmgpy/metrics.py +595 -0
- mmgpy/mmg2d.dll +0 -0
- mmgpy/mmg2d.lib +0 -0
- mmgpy/mmg3d.dll +0 -0
- mmgpy/mmg3d.lib +0 -0
- mmgpy/mmgs.dll +0 -0
- mmgpy/mmgs.lib +0 -0
- mmgpy/progress.py +57 -0
- mmgpy/py.typed +0 -0
- mmgpy/sizing.py +370 -0
- mmgpy-0.2.0.dist-info/DELVEWHEEL +2 -0
- mmgpy-0.2.0.dist-info/METADATA +75 -0
- mmgpy-0.2.0.dist-info/RECORD +129 -0
- mmgpy-0.2.0.dist-info/WHEEL +5 -0
- mmgpy-0.2.0.dist-info/entry_points.txt +6 -0
- mmgpy-0.2.0.dist-info/licenses/LICENSE +38 -0
- mmgpy.libs/vtkCommonColor-9.4-799ae0f43eb3a04510b0ed500c05e895.dll +0 -0
- mmgpy.libs/vtkCommonComputationalGeometry-9.4-e1ee47e9ca84c220e3fda21c864610e9.dll +0 -0
- mmgpy.libs/vtkCommonCore-9.4.dll +0 -0
- mmgpy.libs/vtkCommonDataModel-9.4.dll +0 -0
- mmgpy.libs/vtkCommonExecutionModel-9.4-5fea279cddbd0dd8e39907cbfb423d2c.dll +0 -0
- mmgpy.libs/vtkCommonMath-9.4-70aba6f1b0ad06008b5990b6843ff4e9.dll +0 -0
- mmgpy.libs/vtkCommonMisc-9.4-96697cc413673520510a54c05fa0ef99.dll +0 -0
- mmgpy.libs/vtkCommonSystem-9.4-a748ca3c31712678e4e0f2ff3b09785b.dll +0 -0
- mmgpy.libs/vtkCommonTransforms-9.4-11e72e99aca2003a38a3ff9bcfb90d92.dll +0 -0
- mmgpy.libs/vtkDICOMParser-9.4-6f27d14c12768aac52622cbd28ca0b3a.dll +0 -0
- mmgpy.libs/vtkFiltersCellGrid-9.4-5675f4c4a8440bd5f5981149f99315e8.dll +0 -0
- mmgpy.libs/vtkFiltersCore-9.4-ef29a82b399f8ffeec5dfa8c7e010901.dll +0 -0
- mmgpy.libs/vtkFiltersExtraction-9.4-6a452db7095d68b3af501d1b39a05670.dll +0 -0
- mmgpy.libs/vtkFiltersGeneral-9.4-b9b071ef41cba7c6468dd7e0a9f5d4bf.dll +0 -0
- mmgpy.libs/vtkFiltersGeometry-9.4-757f3c8b9a1fd9774cce83aec0c94c55.dll +0 -0
- mmgpy.libs/vtkFiltersHybrid-9.4-6b343077b9da30bb95fc4492762b9bed.dll +0 -0
- mmgpy.libs/vtkFiltersHyperTree-9.4-831d7e88dd11a3faec876929089d21e8.dll +0 -0
- mmgpy.libs/vtkFiltersModeling-9.4-a3fc680a4836e8913376390217ceae1e.dll +0 -0
- mmgpy.libs/vtkFiltersParallel-9.4-5307d8b619459bb2aeb13c2872cebc2b.dll +0 -0
- mmgpy.libs/vtkFiltersReduction-9.4-f7abe86bfcde726b6e7daec4773a089f.dll +0 -0
- mmgpy.libs/vtkFiltersSources-9.4-d38546a5e2bfd83ea0a70f5be4fa7fdc.dll +0 -0
- mmgpy.libs/vtkFiltersStatistics-9.4-d2abec2372ab98574cdbd0461c73d459.dll +0 -0
- mmgpy.libs/vtkFiltersTexture-9.4-a374b3cfe75e10483976a6a6780ca1ca.dll +0 -0
- mmgpy.libs/vtkFiltersVerdict-9.4-a6a276b6e0d3ac6d042f192842c9382a.dll +0 -0
- mmgpy.libs/vtkIOCellGrid-9.4-0df3bee5d56b2062dad430b53f81f06a.dll +0 -0
- mmgpy.libs/vtkIOCore-9.4.dll +0 -0
- mmgpy.libs/vtkIOGeometry-9.4-13e2301d83eea31e8df955a8dd196eb1.dll +0 -0
- mmgpy.libs/vtkIOImage-9.4-666beab0c43da6c4b2c59fba464bb6b1.dll +0 -0
- mmgpy.libs/vtkIOLegacy-9.4.dll +0 -0
- mmgpy.libs/vtkIOParallel-9.4.dll +0 -0
- mmgpy.libs/vtkIOParallelXML-9.4.dll +0 -0
- mmgpy.libs/vtkIOXML-9.4.dll +0 -0
- mmgpy.libs/vtkIOXMLParser-9.4-f4144aed6a73ee50eefeae75a78fd71b.dll +0 -0
- mmgpy.libs/vtkImagingCore-9.4-ecc92d2d09d8ac4e8f3b199a917f96fd.dll +0 -0
- mmgpy.libs/vtkImagingSources-9.4-944fcaf71940d51ed5dc1b5c8eba2571.dll +0 -0
- mmgpy.libs/vtkParallelCore-9.4-114ce4e5a12302a9f3c3485ab88d5a39.dll +0 -0
- mmgpy.libs/vtkParallelDIY-9.4-7add130df7f5139505a17ee72afefa41.dll +0 -0
- mmgpy.libs/vtkRenderingCore-9.4-ec5612bc182f43047add4c6a55050be4.dll +0 -0
- mmgpy.libs/vtkdoubleconversion-9.4-676429e05704a1fd81323494aba16669.dll +0 -0
- mmgpy.libs/vtkexpat-9.4-58e3b6d3064cf0e02659e3a57f60f779.dll +0 -0
- mmgpy.libs/vtkfmt-9.4-fd2ae0aaa19f2f735b93d4feb613d558.dll +0 -0
- mmgpy.libs/vtkjpeg-9.4-2fd58669e746a0d571706ff3f4c1896f.dll +0 -0
- mmgpy.libs/vtkjsoncpp-9.4-c2076501decec6ce45be5280d480c02d.dll +0 -0
- mmgpy.libs/vtkkissfft-9.4-874ed77ec96808d2e395a6caeb69abbe.dll +0 -0
- mmgpy.libs/vtkloguru-9.4-1038f41dd2d3acc7d894c1d57b428cc6.dll +0 -0
- mmgpy.libs/vtklz4-9.4-9982d6f8f47ac19965668cd3c2926473.dll +0 -0
- mmgpy.libs/vtklzma-9.4-a473d065be12f766957c699a0aefac38.dll +0 -0
- mmgpy.libs/vtkmetaio-9.4-aa48920e94a28f23d08054f5e82867f4.dll +0 -0
- mmgpy.libs/vtkpng-9.4-cbefdfbef5c0d4dd7ae43b9d526e881a.dll +0 -0
- mmgpy.libs/vtkpugixml-9.4-9c7652d9a42fd99e62753e7d3fd87ee9.dll +0 -0
- mmgpy.libs/vtksys-9.4.dll +0 -0
- mmgpy.libs/vtktiff-9.4-9822dcf52447c045cf9a70960d45a9bd.dll +0 -0
- mmgpy.libs/vtktoken-9.4-471c14923651cbbd86067852f347807b.dll +0 -0
- mmgpy.libs/vtkverdict-9.4-c549882a3b8671666be1366008f27f7e.dll +0 -0
- mmgpy.libs/vtkzlib-9.4-3b9ffa51c80ccd91bb22a4c3ca11a8d7.dll +0 -0
- share/__init__.py +10 -0
- share/man/man1/mmg2d.1.gz +0 -0
- share/man/man1/mmg3d.1.gz +0 -0
- share/man/man1/mmgs.1.gz +0 -0
mmgpy/_options.py
ADDED
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"""Typed options dataclasses for mmgpy remeshing operations.
|
|
2
|
+
|
|
3
|
+
This module provides structured configuration objects for mesh remeshing,
|
|
4
|
+
offering better IDE support, validation, and preset configurations.
|
|
5
|
+
|
|
6
|
+
Example:
|
|
7
|
+
-------
|
|
8
|
+
>>> from mmgpy import MmgMesh3D, Mmg3DOptions
|
|
9
|
+
>>>
|
|
10
|
+
>>> mesh = MmgMesh3D(vertices, elements)
|
|
11
|
+
>>>
|
|
12
|
+
>>> # Using options dataclass
|
|
13
|
+
>>> options = Mmg3DOptions(hmax=0.1, hausd=0.001)
|
|
14
|
+
>>> mesh.remesh(options)
|
|
15
|
+
>>>
|
|
16
|
+
>>> # Using factory presets
|
|
17
|
+
>>> mesh.remesh(Mmg3DOptions.fine(hmax=0.05))
|
|
18
|
+
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from dataclasses import dataclass, fields
|
|
24
|
+
from typing import TYPE_CHECKING
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from typing import Self
|
|
28
|
+
|
|
29
|
+
# Maximum angle value for ridge detection (degrees)
|
|
30
|
+
_MAX_ANGLE_DEGREES = 180
|
|
31
|
+
|
|
32
|
+
# Minimum gradation value
|
|
33
|
+
_MIN_GRADATION = 1.0
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _validate_common_options(opts: Mmg3DOptions | Mmg2DOptions | MmgSOptions) -> None:
|
|
37
|
+
"""Validate options common to all mesh types.
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
opts : Mmg3DOptions | Mmg2DOptions | MmgSOptions
|
|
42
|
+
Options object to validate.
|
|
43
|
+
|
|
44
|
+
Raises
|
|
45
|
+
------
|
|
46
|
+
ValueError
|
|
47
|
+
If any option value is invalid.
|
|
48
|
+
|
|
49
|
+
"""
|
|
50
|
+
if opts.hmin is not None and opts.hmin <= 0:
|
|
51
|
+
msg = "hmin must be positive"
|
|
52
|
+
raise ValueError(msg)
|
|
53
|
+
if opts.hmax is not None and opts.hmax <= 0:
|
|
54
|
+
msg = "hmax must be positive"
|
|
55
|
+
raise ValueError(msg)
|
|
56
|
+
if opts.hsiz is not None and opts.hsiz <= 0:
|
|
57
|
+
msg = "hsiz must be positive"
|
|
58
|
+
raise ValueError(msg)
|
|
59
|
+
if opts.hmin is not None and opts.hmax is not None and opts.hmin > opts.hmax:
|
|
60
|
+
msg = "hmin must be less than or equal to hmax"
|
|
61
|
+
raise ValueError(msg)
|
|
62
|
+
if opts.hausd is not None and opts.hausd <= 0:
|
|
63
|
+
msg = "hausd must be positive"
|
|
64
|
+
raise ValueError(msg)
|
|
65
|
+
if opts.hgrad is not None and opts.hgrad < _MIN_GRADATION:
|
|
66
|
+
msg = f"hgrad must be >= {_MIN_GRADATION}"
|
|
67
|
+
raise ValueError(msg)
|
|
68
|
+
# hgradreq can be -1 to disable, or >= 1.0 for gradation control
|
|
69
|
+
if (
|
|
70
|
+
opts.hgradreq is not None
|
|
71
|
+
and opts.hgradreq != -1
|
|
72
|
+
and opts.hgradreq < _MIN_GRADATION
|
|
73
|
+
):
|
|
74
|
+
msg = f"hgradreq must be >= {_MIN_GRADATION} or -1 to disable"
|
|
75
|
+
raise ValueError(msg)
|
|
76
|
+
if opts.ar is not None and (opts.ar < 0 or opts.ar > _MAX_ANGLE_DEGREES):
|
|
77
|
+
msg = f"ar (angle detection) must be between 0 and {_MAX_ANGLE_DEGREES} degrees"
|
|
78
|
+
raise ValueError(msg)
|
|
79
|
+
if opts.mem is not None and opts.mem <= 0:
|
|
80
|
+
msg = "mem must be positive"
|
|
81
|
+
raise ValueError(msg)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _options_to_dict(
|
|
85
|
+
opts: _MmgOptionsBase,
|
|
86
|
+
) -> dict[str, float | int]:
|
|
87
|
+
"""Convert options to dictionary for passing to remesh().
|
|
88
|
+
|
|
89
|
+
Parameters
|
|
90
|
+
----------
|
|
91
|
+
opts : _MmgOptionsBase
|
|
92
|
+
Options object to convert.
|
|
93
|
+
|
|
94
|
+
Returns
|
|
95
|
+
-------
|
|
96
|
+
dict[str, float | int]
|
|
97
|
+
Dictionary with non-None values, booleans converted to int.
|
|
98
|
+
|
|
99
|
+
"""
|
|
100
|
+
result: dict[str, float | int] = {}
|
|
101
|
+
for f in fields(opts):
|
|
102
|
+
value = getattr(opts, f.name)
|
|
103
|
+
if value is None:
|
|
104
|
+
continue
|
|
105
|
+
if isinstance(value, bool):
|
|
106
|
+
if value:
|
|
107
|
+
result[f.name] = 1
|
|
108
|
+
else:
|
|
109
|
+
result[f.name] = value
|
|
110
|
+
return result
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
@dataclass(slots=True, kw_only=True, frozen=True)
|
|
114
|
+
class _MmgOptionsBase:
|
|
115
|
+
"""Base class for MMG options with common parameters.
|
|
116
|
+
|
|
117
|
+
This class contains parameters shared by all MMG variants (2D, 3D, surface).
|
|
118
|
+
Do not instantiate directly - use the specific subclasses.
|
|
119
|
+
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
# Size control parameters
|
|
123
|
+
hmin: float | None = None
|
|
124
|
+
"""Minimum edge size."""
|
|
125
|
+
|
|
126
|
+
hmax: float | None = None
|
|
127
|
+
"""Maximum edge size."""
|
|
128
|
+
|
|
129
|
+
hsiz: float | None = None
|
|
130
|
+
"""Constant edge size (overrides hmin/hmax)."""
|
|
131
|
+
|
|
132
|
+
hausd: float | None = None
|
|
133
|
+
"""Hausdorff distance for geometry approximation."""
|
|
134
|
+
|
|
135
|
+
# Gradation parameters
|
|
136
|
+
hgrad: float | None = None
|
|
137
|
+
"""Gradation parameter (default ~1.3). Controls size transition between
|
|
138
|
+
adjacent elements. Must be >= 1.0."""
|
|
139
|
+
|
|
140
|
+
hgradreq: float | None = None
|
|
141
|
+
"""Gradation on required entities (advanced usage). Must be >= 1.0,
|
|
142
|
+
or -1 to disable gradation control on required entities."""
|
|
143
|
+
|
|
144
|
+
# Geometry detection
|
|
145
|
+
ar: float | None = None
|
|
146
|
+
"""Angle detection threshold in degrees (0-180). Edges with angles
|
|
147
|
+
sharper than this are preserved as ridges."""
|
|
148
|
+
|
|
149
|
+
# Runtime parameters
|
|
150
|
+
verbose: int | None = None
|
|
151
|
+
"""Verbosity level (-1=silent, 0=errors, 1=info, higher=debug)."""
|
|
152
|
+
|
|
153
|
+
mem: int | None = None
|
|
154
|
+
"""Maximum memory usage in MB."""
|
|
155
|
+
|
|
156
|
+
# Optimization flags
|
|
157
|
+
optim: bool = False
|
|
158
|
+
"""Enable mesh optimization mode."""
|
|
159
|
+
|
|
160
|
+
noinsert: bool = False
|
|
161
|
+
"""Disable point insertion."""
|
|
162
|
+
|
|
163
|
+
noswap: bool = False
|
|
164
|
+
"""Disable edge/face swapping."""
|
|
165
|
+
|
|
166
|
+
nomove: bool = False
|
|
167
|
+
"""Disable point relocation."""
|
|
168
|
+
|
|
169
|
+
def to_dict(self) -> dict[str, float | int]:
|
|
170
|
+
"""Convert options to dictionary for passing to remesh().
|
|
171
|
+
|
|
172
|
+
Returns
|
|
173
|
+
-------
|
|
174
|
+
dict[str, float | int]
|
|
175
|
+
Dictionary with non-None values, booleans converted to int.
|
|
176
|
+
|
|
177
|
+
"""
|
|
178
|
+
return _options_to_dict(self)
|
|
179
|
+
|
|
180
|
+
@classmethod
|
|
181
|
+
def fine(cls, *, hmax: float, hausd: float | None = None) -> Self:
|
|
182
|
+
"""Create options for fine mesh with tight quality control.
|
|
183
|
+
|
|
184
|
+
Parameters
|
|
185
|
+
----------
|
|
186
|
+
hmax : float
|
|
187
|
+
Maximum edge size.
|
|
188
|
+
hausd : float | None
|
|
189
|
+
Hausdorff distance. Defaults to hmax/10.
|
|
190
|
+
|
|
191
|
+
"""
|
|
192
|
+
return cls(
|
|
193
|
+
hmax=hmax,
|
|
194
|
+
hausd=hausd if hausd is not None else hmax / 10,
|
|
195
|
+
hgrad=1.2,
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
@classmethod
|
|
199
|
+
def coarse(cls, *, hmax: float) -> Self:
|
|
200
|
+
"""Create options for coarse mesh with relaxed constraints.
|
|
201
|
+
|
|
202
|
+
Parameters
|
|
203
|
+
----------
|
|
204
|
+
hmax : float
|
|
205
|
+
Maximum edge size.
|
|
206
|
+
|
|
207
|
+
"""
|
|
208
|
+
return cls(
|
|
209
|
+
hmax=hmax,
|
|
210
|
+
hgrad=1.5,
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
@classmethod
|
|
214
|
+
def optimize_only(cls, *, verbose: int | None = None) -> Self:
|
|
215
|
+
"""Create options for optimization without topology changes.
|
|
216
|
+
|
|
217
|
+
Only moves vertices to improve quality, no insertion/deletion.
|
|
218
|
+
|
|
219
|
+
"""
|
|
220
|
+
return cls(
|
|
221
|
+
optim=True,
|
|
222
|
+
noinsert=True,
|
|
223
|
+
verbose=verbose,
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
@dataclass(slots=True, kw_only=True, frozen=True)
|
|
228
|
+
class Mmg3DOptions(_MmgOptionsBase):
|
|
229
|
+
"""Options for 3D tetrahedral mesh remeshing (MMG3D).
|
|
230
|
+
|
|
231
|
+
All parameters are optional. When None, MMG uses its internal defaults.
|
|
232
|
+
Options are immutable after creation.
|
|
233
|
+
|
|
234
|
+
Inherits from _MmgOptionsBase:
|
|
235
|
+
hmin, hmax, hsiz, hausd, hgrad, hgradreq, ar, verbose, mem,
|
|
236
|
+
optim, noinsert, noswap, nomove
|
|
237
|
+
|
|
238
|
+
Additional Attributes
|
|
239
|
+
---------------------
|
|
240
|
+
nosurf : bool
|
|
241
|
+
Disable surface modifications (3D only).
|
|
242
|
+
|
|
243
|
+
Example:
|
|
244
|
+
-------
|
|
245
|
+
>>> opts = Mmg3DOptions(hmax=0.1, hausd=0.01)
|
|
246
|
+
>>> mesh.remesh(opts) # Pass options directly
|
|
247
|
+
|
|
248
|
+
"""
|
|
249
|
+
|
|
250
|
+
nosurf: bool = False
|
|
251
|
+
"""Disable surface modifications (3D only)."""
|
|
252
|
+
|
|
253
|
+
def __post_init__(self) -> None:
|
|
254
|
+
"""Validate options after initialization."""
|
|
255
|
+
_validate_common_options(self)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
@dataclass(slots=True, kw_only=True, frozen=True)
|
|
259
|
+
class Mmg2DOptions(_MmgOptionsBase):
|
|
260
|
+
"""Options for 2D triangular mesh remeshing (MMG2D).
|
|
261
|
+
|
|
262
|
+
All parameters are optional. When None, MMG uses its internal defaults.
|
|
263
|
+
Options are immutable after creation.
|
|
264
|
+
|
|
265
|
+
Inherits from _MmgOptionsBase:
|
|
266
|
+
hmin, hmax, hsiz, hausd, hgrad, hgradreq, ar, verbose, mem,
|
|
267
|
+
optim, noinsert, noswap, nomove
|
|
268
|
+
|
|
269
|
+
Additional Attributes
|
|
270
|
+
---------------------
|
|
271
|
+
nosurf : bool
|
|
272
|
+
Disable boundary modifications.
|
|
273
|
+
|
|
274
|
+
"""
|
|
275
|
+
|
|
276
|
+
nosurf: bool = False
|
|
277
|
+
"""Disable boundary modifications."""
|
|
278
|
+
|
|
279
|
+
def __post_init__(self) -> None:
|
|
280
|
+
"""Validate options after initialization."""
|
|
281
|
+
_validate_common_options(self)
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
@dataclass(slots=True, kw_only=True, frozen=True)
|
|
285
|
+
class MmgSOptions(_MmgOptionsBase):
|
|
286
|
+
"""Options for surface mesh remeshing (MMGS).
|
|
287
|
+
|
|
288
|
+
All parameters are optional. When None, MMG uses its internal defaults.
|
|
289
|
+
Options are immutable after creation.
|
|
290
|
+
|
|
291
|
+
Inherits from _MmgOptionsBase:
|
|
292
|
+
hmin, hmax, hsiz, hausd, hgrad, hgradreq, ar, verbose, mem,
|
|
293
|
+
optim, noinsert, noswap, nomove
|
|
294
|
+
|
|
295
|
+
Note: Surface remeshing (MMGS) does not have a nosurf option.
|
|
296
|
+
|
|
297
|
+
"""
|
|
298
|
+
|
|
299
|
+
def __post_init__(self) -> None:
|
|
300
|
+
"""Validate options after initialization."""
|
|
301
|
+
_validate_common_options(self)
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
__all__ = ["Mmg2DOptions", "Mmg3DOptions", "MmgSOptions"]
|