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.
Files changed (129) hide show
  1. bin/__init__.py +10 -0
  2. bin/concrt140.dll +0 -0
  3. bin/mmg.dll +0 -0
  4. bin/mmg2d.dll +0 -0
  5. bin/mmg2d_O3.exe +0 -0
  6. bin/mmg3d.dll +0 -0
  7. bin/mmg3d_O3.exe +0 -0
  8. bin/mmgs.dll +0 -0
  9. bin/mmgs_O3.exe +0 -0
  10. bin/msvcp140.dll +0 -0
  11. bin/msvcp140_1.dll +0 -0
  12. bin/msvcp140_2.dll +0 -0
  13. bin/msvcp140_atomic_wait.dll +0 -0
  14. bin/msvcp140_codecvt_ids.dll +0 -0
  15. bin/vcruntime140.dll +0 -0
  16. bin/vcruntime140_1.dll +0 -0
  17. include/__init__.py +10 -0
  18. include/mmg/common/libmmgtypes.h +687 -0
  19. include/mmg/common/libmmgtypesf.h +762 -0
  20. include/mmg/common/mmg_export.h +47 -0
  21. include/mmg/common/mmgcmakedefines.h +46 -0
  22. include/mmg/common/mmgcmakedefinesf.h +29 -0
  23. include/mmg/common/mmgversion.h +54 -0
  24. include/mmg/libmmg.h +67 -0
  25. include/mmg/libmmgf.h +42 -0
  26. include/mmg/mmg2d/libmmg2d.h +2761 -0
  27. include/mmg/mmg2d/libmmg2df.h +3263 -0
  28. include/mmg/mmg2d/mmg2d_export.h +34 -0
  29. include/mmg/mmg3d/libmmg3d.h +3444 -0
  30. include/mmg/mmg3d/libmmg3df.h +4041 -0
  31. include/mmg/mmg3d/mmg3d_export.h +34 -0
  32. include/mmg/mmgs/libmmgs.h +2560 -0
  33. include/mmg/mmgs/libmmgsf.h +3028 -0
  34. include/mmg/mmgs/mmgs_export.h +34 -0
  35. lib/__init__.py +10 -0
  36. lib/cmake/mmg/FindElas.cmake +57 -0
  37. lib/cmake/mmg/FindSCOTCH.cmake +373 -0
  38. lib/cmake/mmg/MmgTargets-release.cmake +53 -0
  39. lib/cmake/mmg/MmgTargets.cmake +127 -0
  40. lib/cmake/mmg/mmgConfig.cmake +43 -0
  41. lib/mmg.lib +0 -0
  42. lib/mmg2d.lib +0 -0
  43. lib/mmg3d.lib +0 -0
  44. lib/mmgs.lib +0 -0
  45. mmgpy/__init__.py +888 -0
  46. mmgpy/_logging.py +86 -0
  47. mmgpy/_mmgpy.cp310-win_amd64.pyd +0 -0
  48. mmgpy/_mmgpy.pyi +650 -0
  49. mmgpy/_options.py +304 -0
  50. mmgpy/_progress.py +539 -0
  51. mmgpy/_pyvista.py +423 -0
  52. mmgpy/_version.py +3 -0
  53. mmgpy/_version.py.in +3 -0
  54. mmgpy/lagrangian.py +394 -0
  55. mmgpy/metrics.py +595 -0
  56. mmgpy/mmg2d.dll +0 -0
  57. mmgpy/mmg2d.lib +0 -0
  58. mmgpy/mmg3d.dll +0 -0
  59. mmgpy/mmg3d.lib +0 -0
  60. mmgpy/mmgs.dll +0 -0
  61. mmgpy/mmgs.lib +0 -0
  62. mmgpy/progress.py +57 -0
  63. mmgpy/py.typed +0 -0
  64. mmgpy/sizing.py +370 -0
  65. mmgpy-0.2.0.dist-info/DELVEWHEEL +2 -0
  66. mmgpy-0.2.0.dist-info/METADATA +75 -0
  67. mmgpy-0.2.0.dist-info/RECORD +129 -0
  68. mmgpy-0.2.0.dist-info/WHEEL +5 -0
  69. mmgpy-0.2.0.dist-info/entry_points.txt +6 -0
  70. mmgpy-0.2.0.dist-info/licenses/LICENSE +38 -0
  71. mmgpy.libs/vtkCommonColor-9.4-799ae0f43eb3a04510b0ed500c05e895.dll +0 -0
  72. mmgpy.libs/vtkCommonComputationalGeometry-9.4-e1ee47e9ca84c220e3fda21c864610e9.dll +0 -0
  73. mmgpy.libs/vtkCommonCore-9.4.dll +0 -0
  74. mmgpy.libs/vtkCommonDataModel-9.4.dll +0 -0
  75. mmgpy.libs/vtkCommonExecutionModel-9.4-5fea279cddbd0dd8e39907cbfb423d2c.dll +0 -0
  76. mmgpy.libs/vtkCommonMath-9.4-70aba6f1b0ad06008b5990b6843ff4e9.dll +0 -0
  77. mmgpy.libs/vtkCommonMisc-9.4-96697cc413673520510a54c05fa0ef99.dll +0 -0
  78. mmgpy.libs/vtkCommonSystem-9.4-a748ca3c31712678e4e0f2ff3b09785b.dll +0 -0
  79. mmgpy.libs/vtkCommonTransforms-9.4-11e72e99aca2003a38a3ff9bcfb90d92.dll +0 -0
  80. mmgpy.libs/vtkDICOMParser-9.4-6f27d14c12768aac52622cbd28ca0b3a.dll +0 -0
  81. mmgpy.libs/vtkFiltersCellGrid-9.4-5675f4c4a8440bd5f5981149f99315e8.dll +0 -0
  82. mmgpy.libs/vtkFiltersCore-9.4-ef29a82b399f8ffeec5dfa8c7e010901.dll +0 -0
  83. mmgpy.libs/vtkFiltersExtraction-9.4-6a452db7095d68b3af501d1b39a05670.dll +0 -0
  84. mmgpy.libs/vtkFiltersGeneral-9.4-b9b071ef41cba7c6468dd7e0a9f5d4bf.dll +0 -0
  85. mmgpy.libs/vtkFiltersGeometry-9.4-757f3c8b9a1fd9774cce83aec0c94c55.dll +0 -0
  86. mmgpy.libs/vtkFiltersHybrid-9.4-6b343077b9da30bb95fc4492762b9bed.dll +0 -0
  87. mmgpy.libs/vtkFiltersHyperTree-9.4-831d7e88dd11a3faec876929089d21e8.dll +0 -0
  88. mmgpy.libs/vtkFiltersModeling-9.4-a3fc680a4836e8913376390217ceae1e.dll +0 -0
  89. mmgpy.libs/vtkFiltersParallel-9.4-5307d8b619459bb2aeb13c2872cebc2b.dll +0 -0
  90. mmgpy.libs/vtkFiltersReduction-9.4-f7abe86bfcde726b6e7daec4773a089f.dll +0 -0
  91. mmgpy.libs/vtkFiltersSources-9.4-d38546a5e2bfd83ea0a70f5be4fa7fdc.dll +0 -0
  92. mmgpy.libs/vtkFiltersStatistics-9.4-d2abec2372ab98574cdbd0461c73d459.dll +0 -0
  93. mmgpy.libs/vtkFiltersTexture-9.4-a374b3cfe75e10483976a6a6780ca1ca.dll +0 -0
  94. mmgpy.libs/vtkFiltersVerdict-9.4-a6a276b6e0d3ac6d042f192842c9382a.dll +0 -0
  95. mmgpy.libs/vtkIOCellGrid-9.4-0df3bee5d56b2062dad430b53f81f06a.dll +0 -0
  96. mmgpy.libs/vtkIOCore-9.4.dll +0 -0
  97. mmgpy.libs/vtkIOGeometry-9.4-13e2301d83eea31e8df955a8dd196eb1.dll +0 -0
  98. mmgpy.libs/vtkIOImage-9.4-666beab0c43da6c4b2c59fba464bb6b1.dll +0 -0
  99. mmgpy.libs/vtkIOLegacy-9.4.dll +0 -0
  100. mmgpy.libs/vtkIOParallel-9.4.dll +0 -0
  101. mmgpy.libs/vtkIOParallelXML-9.4.dll +0 -0
  102. mmgpy.libs/vtkIOXML-9.4.dll +0 -0
  103. mmgpy.libs/vtkIOXMLParser-9.4-f4144aed6a73ee50eefeae75a78fd71b.dll +0 -0
  104. mmgpy.libs/vtkImagingCore-9.4-ecc92d2d09d8ac4e8f3b199a917f96fd.dll +0 -0
  105. mmgpy.libs/vtkImagingSources-9.4-944fcaf71940d51ed5dc1b5c8eba2571.dll +0 -0
  106. mmgpy.libs/vtkParallelCore-9.4-114ce4e5a12302a9f3c3485ab88d5a39.dll +0 -0
  107. mmgpy.libs/vtkParallelDIY-9.4-7add130df7f5139505a17ee72afefa41.dll +0 -0
  108. mmgpy.libs/vtkRenderingCore-9.4-ec5612bc182f43047add4c6a55050be4.dll +0 -0
  109. mmgpy.libs/vtkdoubleconversion-9.4-676429e05704a1fd81323494aba16669.dll +0 -0
  110. mmgpy.libs/vtkexpat-9.4-58e3b6d3064cf0e02659e3a57f60f779.dll +0 -0
  111. mmgpy.libs/vtkfmt-9.4-fd2ae0aaa19f2f735b93d4feb613d558.dll +0 -0
  112. mmgpy.libs/vtkjpeg-9.4-2fd58669e746a0d571706ff3f4c1896f.dll +0 -0
  113. mmgpy.libs/vtkjsoncpp-9.4-c2076501decec6ce45be5280d480c02d.dll +0 -0
  114. mmgpy.libs/vtkkissfft-9.4-874ed77ec96808d2e395a6caeb69abbe.dll +0 -0
  115. mmgpy.libs/vtkloguru-9.4-1038f41dd2d3acc7d894c1d57b428cc6.dll +0 -0
  116. mmgpy.libs/vtklz4-9.4-9982d6f8f47ac19965668cd3c2926473.dll +0 -0
  117. mmgpy.libs/vtklzma-9.4-a473d065be12f766957c699a0aefac38.dll +0 -0
  118. mmgpy.libs/vtkmetaio-9.4-aa48920e94a28f23d08054f5e82867f4.dll +0 -0
  119. mmgpy.libs/vtkpng-9.4-cbefdfbef5c0d4dd7ae43b9d526e881a.dll +0 -0
  120. mmgpy.libs/vtkpugixml-9.4-9c7652d9a42fd99e62753e7d3fd87ee9.dll +0 -0
  121. mmgpy.libs/vtksys-9.4.dll +0 -0
  122. mmgpy.libs/vtktiff-9.4-9822dcf52447c045cf9a70960d45a9bd.dll +0 -0
  123. mmgpy.libs/vtktoken-9.4-471c14923651cbbd86067852f347807b.dll +0 -0
  124. mmgpy.libs/vtkverdict-9.4-c549882a3b8671666be1366008f27f7e.dll +0 -0
  125. mmgpy.libs/vtkzlib-9.4-3b9ffa51c80ccd91bb22a4c3ca11a8d7.dll +0 -0
  126. share/__init__.py +10 -0
  127. share/man/man1/mmg2d.1.gz +0 -0
  128. share/man/man1/mmg3d.1.gz +0 -0
  129. share/man/man1/mmgs.1.gz +0 -0
mmgpy/_mmgpy.pyi ADDED
@@ -0,0 +1,650 @@
1
+ from collections.abc import Sequence
2
+ from pathlib import Path
3
+ from typing import overload
4
+
5
+ import numpy as np
6
+ import pyvista as pv
7
+ from numpy.typing import NDArray
8
+
9
+ from ._options import Mmg2DOptions, Mmg3DOptions, MmgSOptions
10
+
11
+ class mmg3d: # noqa: N801
12
+ @staticmethod
13
+ def remesh(
14
+ input_mesh: str | Path,
15
+ input_sol: str | Path | None = None,
16
+ output_mesh: str | Path | None = None,
17
+ output_sol: str | Path | None = None,
18
+ options: dict[str, float | int] = ...,
19
+ ) -> bool: ...
20
+
21
+ class mmg2d: # noqa: N801
22
+ @staticmethod
23
+ def remesh(
24
+ input_mesh: str | Path,
25
+ input_sol: str | Path | None = None,
26
+ output_mesh: str | Path | None = None,
27
+ output_sol: str | Path | None = None,
28
+ options: dict[str, float | int] = ...,
29
+ ) -> bool: ...
30
+
31
+ class mmgs: # noqa: N801
32
+ @staticmethod
33
+ def remesh(
34
+ input_mesh: str | Path,
35
+ input_sol: str | Path | None = None,
36
+ output_mesh: str | Path | None = None,
37
+ output_sol: str | Path | None = None,
38
+ options: dict[str, float | int] = ...,
39
+ ) -> bool: ...
40
+
41
+ class MmgMesh3D:
42
+ @overload
43
+ def __init__(self) -> None: ...
44
+ @overload
45
+ def __init__(
46
+ self,
47
+ vertices: NDArray[np.float64],
48
+ elements: NDArray[np.int32],
49
+ ) -> None: ...
50
+ @overload
51
+ def __init__(
52
+ self,
53
+ filename: str | Path,
54
+ ) -> None: ...
55
+ def set_vertices_and_elements(
56
+ self,
57
+ vertices: NDArray[np.float64],
58
+ elements: NDArray[np.int32],
59
+ ) -> None: ...
60
+ def get_vertices(self) -> NDArray[np.float64]: ...
61
+ def get_elements(self) -> NDArray[np.int32]: ...
62
+
63
+ # Low-level mesh construction API (Phase 1 of Issue #50)
64
+ def set_mesh_size(
65
+ self,
66
+ vertices: int = 0,
67
+ tetrahedra: int = 0,
68
+ prisms: int = 0,
69
+ triangles: int = 0,
70
+ quadrilaterals: int = 0,
71
+ edges: int = 0,
72
+ ) -> None: ...
73
+ def get_mesh_size(
74
+ self,
75
+ ) -> tuple[int, int, int, int, int, int]: ...
76
+ def set_vertices(
77
+ self,
78
+ vertices: NDArray[np.float64],
79
+ refs: NDArray[np.int64] | None = None,
80
+ ) -> None: ...
81
+ def set_tetrahedra(
82
+ self,
83
+ tetrahedra: NDArray[np.int32],
84
+ refs: NDArray[np.int64] | None = None,
85
+ ) -> None: ...
86
+ def set_triangles(
87
+ self,
88
+ triangles: NDArray[np.int32],
89
+ refs: NDArray[np.int64] | None = None,
90
+ ) -> None: ...
91
+ def set_edges(
92
+ self,
93
+ edges: NDArray[np.int32],
94
+ refs: NDArray[np.int64] | None = None,
95
+ ) -> None: ...
96
+ def get_vertices_with_refs(
97
+ self,
98
+ ) -> tuple[NDArray[np.float64], NDArray[np.int64]]: ...
99
+ def get_triangles(self) -> NDArray[np.int32]: ...
100
+ def get_triangles_with_refs(
101
+ self,
102
+ ) -> tuple[NDArray[np.int32], NDArray[np.int64]]: ...
103
+ def get_elements_with_refs(
104
+ self,
105
+ ) -> tuple[NDArray[np.int32], NDArray[np.int64]]: ...
106
+ def get_edges(self) -> NDArray[np.int32]: ...
107
+ def get_edges_with_refs(
108
+ self,
109
+ ) -> tuple[NDArray[np.int32], NDArray[np.int64]]: ...
110
+
111
+ # Phase 2: Single element operations
112
+ def set_vertex(
113
+ self,
114
+ x: float,
115
+ y: float,
116
+ z: float,
117
+ ref: int,
118
+ idx: int,
119
+ ) -> None: ...
120
+ def set_tetrahedron(
121
+ self,
122
+ v0: int,
123
+ v1: int,
124
+ v2: int,
125
+ v3: int,
126
+ ref: int,
127
+ idx: int,
128
+ ) -> None: ...
129
+ def set_triangle(
130
+ self,
131
+ v0: int,
132
+ v1: int,
133
+ v2: int,
134
+ ref: int,
135
+ idx: int,
136
+ ) -> None: ...
137
+ def set_edge(self, v0: int, v1: int, ref: int, idx: int) -> None: ...
138
+ def get_vertex(self, idx: int) -> tuple[float, float, float, int]: ...
139
+ def get_tetrahedron(
140
+ self,
141
+ idx: int,
142
+ ) -> tuple[int, int, int, int, int]: ...
143
+ def get_triangle(self, idx: int) -> tuple[int, int, int, int]: ...
144
+ def get_edge(self, idx: int) -> tuple[int, int, int]: ...
145
+
146
+ # Element attributes
147
+ def set_corners(self, vertex_indices: NDArray[np.int32]) -> None: ...
148
+ def set_required_vertices(self, vertex_indices: NDArray[np.int32]) -> None: ...
149
+ def set_ridge_edges(self, edge_indices: NDArray[np.int32]) -> None: ...
150
+
151
+ # Topology queries
152
+ def get_adjacent_elements(self, idx: int) -> NDArray[np.int32]: ...
153
+ def get_vertex_neighbors(self, idx: int) -> NDArray[np.int32]: ...
154
+ def get_element_quality(self, idx: int) -> float: ...
155
+ def get_element_qualities(self) -> NDArray[np.float64]: ...
156
+
157
+ # Phase 3: Advanced element types (prisms and quadrilaterals)
158
+ def set_prism(
159
+ self,
160
+ v0: int,
161
+ v1: int,
162
+ v2: int,
163
+ v3: int,
164
+ v4: int,
165
+ v5: int,
166
+ ref: int,
167
+ idx: int,
168
+ ) -> None: ...
169
+ def set_quadrilateral(
170
+ self,
171
+ v0: int,
172
+ v1: int,
173
+ v2: int,
174
+ v3: int,
175
+ ref: int,
176
+ idx: int,
177
+ ) -> None: ...
178
+ def set_prisms(
179
+ self,
180
+ prisms: NDArray[np.int32],
181
+ refs: NDArray[np.int64] | None = None,
182
+ ) -> None: ...
183
+ def set_quadrilaterals(
184
+ self,
185
+ quads: NDArray[np.int32],
186
+ refs: NDArray[np.int64] | None = None,
187
+ ) -> None: ...
188
+ def get_prism(self, idx: int) -> tuple[int, int, int, int, int, int, int]: ...
189
+ def get_quadrilateral(self, idx: int) -> tuple[int, int, int, int, int]: ...
190
+ def get_prisms(self) -> NDArray[np.int32]: ...
191
+ def get_prisms_with_refs(
192
+ self,
193
+ ) -> tuple[NDArray[np.int32], NDArray[np.int64]]: ...
194
+ def get_quadrilaterals(self) -> NDArray[np.int32]: ...
195
+ def get_quadrilaterals_with_refs(
196
+ self,
197
+ ) -> tuple[NDArray[np.int32], NDArray[np.int64]]: ...
198
+ def get_tetrahedra(self) -> NDArray[np.int32]: ...
199
+ def get_tetrahedra_with_refs(
200
+ self,
201
+ ) -> tuple[NDArray[np.int32], NDArray[np.int64]]: ...
202
+ def set_field(self, key: str, value: NDArray[np.float64]) -> None: ...
203
+ def get_field(self, key: str) -> NDArray[np.float64]: ...
204
+ def __setitem__(self, key: str, value: NDArray[np.float64]) -> None: ...
205
+ def __getitem__(self, key: str) -> NDArray[np.float64]: ...
206
+ def save(self, filename: str | Path) -> None: ...
207
+ def remesh(
208
+ self,
209
+ options: Mmg3DOptions | None = None,
210
+ *,
211
+ hmin: float | None = None,
212
+ hmax: float | None = None,
213
+ hsiz: float | None = None,
214
+ hausd: float | None = None,
215
+ hgrad: float | None = None,
216
+ verbose: bool | int | None = None,
217
+ optim: int | None = None,
218
+ noinsert: int | None = None,
219
+ noswap: int | None = None,
220
+ nomove: int | None = None,
221
+ nosurf: int | None = None,
222
+ **kwargs: float,
223
+ ) -> None: ...
224
+ def remesh_lagrangian(
225
+ self,
226
+ displacement: NDArray[np.float64],
227
+ *,
228
+ hmin: float | None = None,
229
+ hmax: float | None = None,
230
+ hsiz: float | None = None,
231
+ hausd: float | None = None,
232
+ hgrad: float | None = None,
233
+ verbose: bool | int | None = None,
234
+ lag: int | None = None,
235
+ **kwargs: float,
236
+ ) -> None: ...
237
+ def remesh_levelset(
238
+ self,
239
+ levelset: NDArray[np.float64],
240
+ *,
241
+ ls: float | None = None,
242
+ hmin: float | None = None,
243
+ hmax: float | None = None,
244
+ hsiz: float | None = None,
245
+ hausd: float | None = None,
246
+ hgrad: float | None = None,
247
+ verbose: bool | int | None = None,
248
+ iso: int | None = None,
249
+ **kwargs: float,
250
+ ) -> None: ...
251
+ # PyVista integration (added by mmgpy._pyvista.add_pyvista_methods)
252
+ @classmethod
253
+ def from_pyvista(
254
+ cls,
255
+ mesh: pv.UnstructuredGrid | pv.PolyData,
256
+ ) -> MmgMesh3D: ...
257
+ def to_pyvista(
258
+ self,
259
+ *,
260
+ include_refs: bool = True,
261
+ ) -> pv.UnstructuredGrid: ...
262
+ # Convenience methods (added by mmgpy._add_convenience_methods)
263
+ def remesh_optimize(self, *, verbose: int | None = None) -> None: ...
264
+ def remesh_uniform(self, size: float, *, verbose: int | None = None) -> None: ...
265
+ # Local sizing methods (added by mmgpy._add_sizing_methods)
266
+ def set_size_sphere(
267
+ self,
268
+ center: Sequence[float] | NDArray[np.float64],
269
+ radius: float,
270
+ size: float,
271
+ ) -> None: ...
272
+ def set_size_box(
273
+ self,
274
+ bounds: Sequence[Sequence[float]] | NDArray[np.float64],
275
+ size: float,
276
+ ) -> None: ...
277
+ def set_size_cylinder(
278
+ self,
279
+ point1: Sequence[float] | NDArray[np.float64],
280
+ point2: Sequence[float] | NDArray[np.float64],
281
+ radius: float,
282
+ size: float,
283
+ ) -> None: ...
284
+ def set_size_from_point(
285
+ self,
286
+ point: Sequence[float] | NDArray[np.float64],
287
+ near_size: float,
288
+ far_size: float,
289
+ influence_radius: float,
290
+ ) -> None: ...
291
+ def clear_local_sizing(self) -> None: ...
292
+ def get_local_sizing_count(self) -> int: ...
293
+ def apply_local_sizing(self) -> None: ...
294
+
295
+ # Phase 4: 2D planar mesh class (MMG2D)
296
+ class MmgMesh2D:
297
+ @overload
298
+ def __init__(self) -> None: ...
299
+ @overload
300
+ def __init__(
301
+ self,
302
+ vertices: NDArray[np.float64],
303
+ triangles: NDArray[np.int32],
304
+ ) -> None: ...
305
+ @overload
306
+ def __init__(
307
+ self,
308
+ filename: str | Path,
309
+ ) -> None: ...
310
+
311
+ # Mesh sizing
312
+ def set_mesh_size(
313
+ self,
314
+ vertices: int = 0,
315
+ triangles: int = 0,
316
+ quadrilaterals: int = 0,
317
+ edges: int = 0,
318
+ ) -> None: ...
319
+ def get_mesh_size(self) -> tuple[int, int, int, int]: ...
320
+
321
+ # Bulk setters
322
+ def set_vertices(
323
+ self,
324
+ vertices: NDArray[np.float64],
325
+ refs: NDArray[np.int64] | None = None,
326
+ ) -> None: ...
327
+ def set_triangles(
328
+ self,
329
+ triangles: NDArray[np.int32],
330
+ refs: NDArray[np.int64] | None = None,
331
+ ) -> None: ...
332
+ def set_quadrilaterals(
333
+ self,
334
+ quads: NDArray[np.int32],
335
+ refs: NDArray[np.int64] | None = None,
336
+ ) -> None: ...
337
+ def set_edges(
338
+ self,
339
+ edges: NDArray[np.int32],
340
+ refs: NDArray[np.int64] | None = None,
341
+ ) -> None: ...
342
+
343
+ # Bulk getters
344
+ def get_vertices(self) -> NDArray[np.float64]: ...
345
+ def get_vertices_with_refs(
346
+ self,
347
+ ) -> tuple[NDArray[np.float64], NDArray[np.int64]]: ...
348
+ def get_triangles(self) -> NDArray[np.int32]: ...
349
+ def get_triangles_with_refs(
350
+ self,
351
+ ) -> tuple[NDArray[np.int32], NDArray[np.int64]]: ...
352
+ def get_quadrilaterals(self) -> NDArray[np.int32]: ...
353
+ def get_quadrilaterals_with_refs(
354
+ self,
355
+ ) -> tuple[NDArray[np.int32], NDArray[np.int64]]: ...
356
+ def get_edges(self) -> NDArray[np.int32]: ...
357
+ def get_edges_with_refs(
358
+ self,
359
+ ) -> tuple[NDArray[np.int32], NDArray[np.int64]]: ...
360
+
361
+ # Single element setters
362
+ def set_vertex(self, x: float, y: float, ref: int, idx: int) -> None: ...
363
+ def set_triangle(
364
+ self,
365
+ v0: int,
366
+ v1: int,
367
+ v2: int,
368
+ ref: int,
369
+ idx: int,
370
+ ) -> None: ...
371
+ def set_quadrilateral(
372
+ self,
373
+ v0: int,
374
+ v1: int,
375
+ v2: int,
376
+ v3: int,
377
+ ref: int,
378
+ idx: int,
379
+ ) -> None: ...
380
+ def set_edge(self, v0: int, v1: int, ref: int, idx: int) -> None: ...
381
+
382
+ # Single element getters
383
+ def get_vertex(self, idx: int) -> tuple[float, float, int]: ...
384
+ def get_triangle(self, idx: int) -> tuple[int, int, int, int]: ...
385
+ def get_quadrilateral(self, idx: int) -> tuple[int, int, int, int, int]: ...
386
+ def get_edge(self, idx: int) -> tuple[int, int, int]: ...
387
+
388
+ # Element attributes
389
+ def set_corners(self, vertex_indices: NDArray[np.int32]) -> None: ...
390
+ def set_required_vertices(self, vertex_indices: NDArray[np.int32]) -> None: ...
391
+ def set_required_edges(self, edge_indices: NDArray[np.int32]) -> None: ...
392
+
393
+ # Topology queries
394
+ def get_adjacent_elements(self, idx: int) -> NDArray[np.int32]: ...
395
+ def get_vertex_neighbors(self, idx: int) -> NDArray[np.int32]: ...
396
+ def get_element_quality(self, idx: int) -> float: ...
397
+ def get_element_qualities(self) -> NDArray[np.float64]: ...
398
+
399
+ # Solution fields
400
+ def set_field(self, key: str, value: NDArray[np.float64]) -> None: ...
401
+ def get_field(self, key: str) -> NDArray[np.float64]: ...
402
+ def __setitem__(self, key: str, value: NDArray[np.float64]) -> None: ...
403
+ def __getitem__(self, key: str) -> NDArray[np.float64]: ...
404
+
405
+ # File I/O
406
+ def save(self, filename: str | Path) -> None: ...
407
+ def remesh(
408
+ self,
409
+ options: Mmg2DOptions | None = None,
410
+ *,
411
+ hmin: float | None = None,
412
+ hmax: float | None = None,
413
+ hsiz: float | None = None,
414
+ hausd: float | None = None,
415
+ hgrad: float | None = None,
416
+ verbose: bool | int | None = None,
417
+ optim: int | None = None,
418
+ noinsert: int | None = None,
419
+ noswap: int | None = None,
420
+ nomove: int | None = None,
421
+ **kwargs: float,
422
+ ) -> None: ...
423
+ def remesh_lagrangian(
424
+ self,
425
+ displacement: NDArray[np.float64],
426
+ *,
427
+ hmin: float | None = None,
428
+ hmax: float | None = None,
429
+ hsiz: float | None = None,
430
+ hausd: float | None = None,
431
+ hgrad: float | None = None,
432
+ verbose: bool | int | None = None,
433
+ lag: int | None = None,
434
+ **kwargs: float,
435
+ ) -> None: ...
436
+ def remesh_levelset(
437
+ self,
438
+ levelset: NDArray[np.float64],
439
+ *,
440
+ ls: float | None = None,
441
+ hmin: float | None = None,
442
+ hmax: float | None = None,
443
+ hsiz: float | None = None,
444
+ hausd: float | None = None,
445
+ hgrad: float | None = None,
446
+ verbose: bool | int | None = None,
447
+ iso: int | None = None,
448
+ **kwargs: float,
449
+ ) -> None: ...
450
+ # PyVista integration (added by mmgpy._pyvista.add_pyvista_methods)
451
+ @classmethod
452
+ def from_pyvista(
453
+ cls,
454
+ mesh: pv.UnstructuredGrid | pv.PolyData,
455
+ ) -> MmgMesh2D: ...
456
+ def to_pyvista(self, *, include_refs: bool = True) -> pv.PolyData: ...
457
+ # Convenience methods (added by mmgpy._add_convenience_methods)
458
+ def remesh_optimize(self, *, verbose: int | None = None) -> None: ...
459
+ def remesh_uniform(self, size: float, *, verbose: int | None = None) -> None: ...
460
+ # Local sizing methods (added by mmgpy._add_sizing_methods)
461
+ def set_size_sphere(
462
+ self,
463
+ center: Sequence[float] | NDArray[np.float64],
464
+ radius: float,
465
+ size: float,
466
+ ) -> None: ...
467
+ def set_size_box(
468
+ self,
469
+ bounds: Sequence[Sequence[float]] | NDArray[np.float64],
470
+ size: float,
471
+ ) -> None: ...
472
+ def set_size_from_point(
473
+ self,
474
+ point: Sequence[float] | NDArray[np.float64],
475
+ near_size: float,
476
+ far_size: float,
477
+ influence_radius: float,
478
+ ) -> None: ...
479
+ def clear_local_sizing(self) -> None: ...
480
+ def get_local_sizing_count(self) -> int: ...
481
+ def apply_local_sizing(self) -> None: ...
482
+
483
+ # Phase 4: Surface mesh class (MMGS)
484
+ class MmgMeshS:
485
+ @overload
486
+ def __init__(self) -> None: ...
487
+ @overload
488
+ def __init__(
489
+ self,
490
+ vertices: NDArray[np.float64],
491
+ triangles: NDArray[np.int32],
492
+ ) -> None: ...
493
+ @overload
494
+ def __init__(
495
+ self,
496
+ filename: str | Path,
497
+ ) -> None: ...
498
+
499
+ # Mesh sizing
500
+ def set_mesh_size(
501
+ self,
502
+ vertices: int = 0,
503
+ triangles: int = 0,
504
+ edges: int = 0,
505
+ ) -> None: ...
506
+ def get_mesh_size(self) -> tuple[int, int, int]: ...
507
+
508
+ # Bulk setters
509
+ def set_vertices(
510
+ self,
511
+ vertices: NDArray[np.float64],
512
+ refs: NDArray[np.int64] | None = None,
513
+ ) -> None: ...
514
+ def set_triangles(
515
+ self,
516
+ triangles: NDArray[np.int32],
517
+ refs: NDArray[np.int64] | None = None,
518
+ ) -> None: ...
519
+ def set_edges(
520
+ self,
521
+ edges: NDArray[np.int32],
522
+ refs: NDArray[np.int64] | None = None,
523
+ ) -> None: ...
524
+
525
+ # Bulk getters
526
+ def get_vertices(self) -> NDArray[np.float64]: ...
527
+ def get_vertices_with_refs(
528
+ self,
529
+ ) -> tuple[NDArray[np.float64], NDArray[np.int64]]: ...
530
+ def get_triangles(self) -> NDArray[np.int32]: ...
531
+ def get_triangles_with_refs(
532
+ self,
533
+ ) -> tuple[NDArray[np.int32], NDArray[np.int64]]: ...
534
+ def get_edges(self) -> NDArray[np.int32]: ...
535
+ def get_edges_with_refs(
536
+ self,
537
+ ) -> tuple[NDArray[np.int32], NDArray[np.int64]]: ...
538
+
539
+ # Single element setters
540
+ def set_vertex(
541
+ self,
542
+ x: float,
543
+ y: float,
544
+ z: float,
545
+ ref: int,
546
+ idx: int,
547
+ ) -> None: ...
548
+ def set_triangle(
549
+ self,
550
+ v0: int,
551
+ v1: int,
552
+ v2: int,
553
+ ref: int,
554
+ idx: int,
555
+ ) -> None: ...
556
+ def set_edge(self, v0: int, v1: int, ref: int, idx: int) -> None: ...
557
+
558
+ # Single element getters
559
+ def get_vertex(self, idx: int) -> tuple[float, float, float, int]: ...
560
+ def get_triangle(self, idx: int) -> tuple[int, int, int, int]: ...
561
+ def get_edge(self, idx: int) -> tuple[int, int, int]: ...
562
+
563
+ # Element attributes
564
+ def set_corners(self, vertex_indices: NDArray[np.int32]) -> None: ...
565
+ def set_required_vertices(self, vertex_indices: NDArray[np.int32]) -> None: ...
566
+ def set_ridge_edges(self, edge_indices: NDArray[np.int32]) -> None: ...
567
+
568
+ # Topology queries
569
+ def get_adjacent_elements(self, idx: int) -> NDArray[np.int32]: ...
570
+ def get_vertex_neighbors(self, idx: int) -> NDArray[np.int32]: ...
571
+ def get_element_quality(self, idx: int) -> float: ...
572
+ def get_element_qualities(self) -> NDArray[np.float64]: ...
573
+
574
+ # Solution fields
575
+ def set_field(self, key: str, value: NDArray[np.float64]) -> None: ...
576
+ def get_field(self, key: str) -> NDArray[np.float64]: ...
577
+ def __setitem__(self, key: str, value: NDArray[np.float64]) -> None: ...
578
+ def __getitem__(self, key: str) -> NDArray[np.float64]: ...
579
+
580
+ # File I/O
581
+ def save(self, filename: str | Path) -> None: ...
582
+ def remesh(
583
+ self,
584
+ options: MmgSOptions | None = None,
585
+ *,
586
+ hmin: float | None = None,
587
+ hmax: float | None = None,
588
+ hsiz: float | None = None,
589
+ hausd: float | None = None,
590
+ hgrad: float | None = None,
591
+ verbose: bool | int | None = None,
592
+ optim: int | None = None,
593
+ noinsert: int | None = None,
594
+ noswap: int | None = None,
595
+ nomove: int | None = None,
596
+ **kwargs: float,
597
+ ) -> None: ...
598
+ def remesh_levelset(
599
+ self,
600
+ levelset: NDArray[np.float64],
601
+ *,
602
+ ls: float | None = None,
603
+ hmin: float | None = None,
604
+ hmax: float | None = None,
605
+ hsiz: float | None = None,
606
+ hausd: float | None = None,
607
+ hgrad: float | None = None,
608
+ verbose: bool | int | None = None,
609
+ iso: int | None = None,
610
+ **kwargs: float,
611
+ ) -> None: ...
612
+ # PyVista integration (added by mmgpy._pyvista.add_pyvista_methods)
613
+ @classmethod
614
+ def from_pyvista(
615
+ cls,
616
+ mesh: pv.UnstructuredGrid | pv.PolyData,
617
+ ) -> MmgMeshS: ...
618
+ def to_pyvista(self, *, include_refs: bool = True) -> pv.PolyData: ...
619
+ # Convenience methods (added by mmgpy._add_convenience_methods)
620
+ def remesh_optimize(self, *, verbose: int | None = None) -> None: ...
621
+ def remesh_uniform(self, size: float, *, verbose: int | None = None) -> None: ...
622
+ # Local sizing methods (added by mmgpy._add_sizing_methods)
623
+ def set_size_sphere(
624
+ self,
625
+ center: Sequence[float] | NDArray[np.float64],
626
+ radius: float,
627
+ size: float,
628
+ ) -> None: ...
629
+ def set_size_box(
630
+ self,
631
+ bounds: Sequence[Sequence[float]] | NDArray[np.float64],
632
+ size: float,
633
+ ) -> None: ...
634
+ def set_size_cylinder(
635
+ self,
636
+ point1: Sequence[float] | NDArray[np.float64],
637
+ point2: Sequence[float] | NDArray[np.float64],
638
+ radius: float,
639
+ size: float,
640
+ ) -> None: ...
641
+ def set_size_from_point(
642
+ self,
643
+ point: Sequence[float] | NDArray[np.float64],
644
+ near_size: float,
645
+ far_size: float,
646
+ influence_radius: float,
647
+ ) -> None: ...
648
+ def clear_local_sizing(self) -> None: ...
649
+ def get_local_sizing_count(self) -> int: ...
650
+ def apply_local_sizing(self) -> None: ...