warp-lang 1.9.1__py3-none-manylinux_2_34_aarch64.whl → 1.10.0rc2__py3-none-manylinux_2_34_aarch64.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.

Potentially problematic release.


This version of warp-lang might be problematic. Click here for more details.

Files changed (346) hide show
  1. warp/__init__.py +301 -287
  2. warp/__init__.pyi +794 -305
  3. warp/_src/__init__.py +14 -0
  4. warp/_src/autograd.py +1075 -0
  5. warp/_src/build.py +618 -0
  6. warp/_src/build_dll.py +640 -0
  7. warp/{builtins.py → _src/builtins.py} +1382 -377
  8. warp/_src/codegen.py +4359 -0
  9. warp/{config.py → _src/config.py} +178 -169
  10. warp/_src/constants.py +57 -0
  11. warp/_src/context.py +8294 -0
  12. warp/_src/dlpack.py +462 -0
  13. warp/_src/fabric.py +355 -0
  14. warp/_src/fem/__init__.py +14 -0
  15. warp/_src/fem/adaptivity.py +508 -0
  16. warp/_src/fem/cache.py +687 -0
  17. warp/_src/fem/dirichlet.py +188 -0
  18. warp/{fem → _src/fem}/domain.py +40 -30
  19. warp/_src/fem/field/__init__.py +131 -0
  20. warp/_src/fem/field/field.py +701 -0
  21. warp/{fem → _src/fem}/field/nodal_field.py +30 -15
  22. warp/{fem → _src/fem}/field/restriction.py +1 -1
  23. warp/{fem → _src/fem}/field/virtual.py +53 -27
  24. warp/_src/fem/geometry/__init__.py +32 -0
  25. warp/{fem → _src/fem}/geometry/adaptive_nanogrid.py +77 -163
  26. warp/_src/fem/geometry/closest_point.py +97 -0
  27. warp/{fem → _src/fem}/geometry/deformed_geometry.py +14 -22
  28. warp/{fem → _src/fem}/geometry/element.py +32 -10
  29. warp/{fem → _src/fem}/geometry/geometry.py +48 -20
  30. warp/{fem → _src/fem}/geometry/grid_2d.py +12 -23
  31. warp/{fem → _src/fem}/geometry/grid_3d.py +12 -23
  32. warp/{fem → _src/fem}/geometry/hexmesh.py +40 -63
  33. warp/{fem → _src/fem}/geometry/nanogrid.py +255 -248
  34. warp/{fem → _src/fem}/geometry/partition.py +121 -63
  35. warp/{fem → _src/fem}/geometry/quadmesh.py +26 -45
  36. warp/{fem → _src/fem}/geometry/tetmesh.py +40 -63
  37. warp/{fem → _src/fem}/geometry/trimesh.py +26 -45
  38. warp/{fem → _src/fem}/integrate.py +164 -158
  39. warp/_src/fem/linalg.py +383 -0
  40. warp/_src/fem/operator.py +396 -0
  41. warp/_src/fem/polynomial.py +229 -0
  42. warp/{fem → _src/fem}/quadrature/pic_quadrature.py +15 -20
  43. warp/{fem → _src/fem}/quadrature/quadrature.py +95 -47
  44. warp/_src/fem/space/__init__.py +248 -0
  45. warp/{fem → _src/fem}/space/basis_function_space.py +20 -11
  46. warp/_src/fem/space/basis_space.py +679 -0
  47. warp/{fem → _src/fem}/space/dof_mapper.py +3 -3
  48. warp/{fem → _src/fem}/space/function_space.py +14 -13
  49. warp/{fem → _src/fem}/space/grid_2d_function_space.py +4 -7
  50. warp/{fem → _src/fem}/space/grid_3d_function_space.py +4 -4
  51. warp/{fem → _src/fem}/space/hexmesh_function_space.py +4 -10
  52. warp/{fem → _src/fem}/space/nanogrid_function_space.py +3 -9
  53. warp/{fem → _src/fem}/space/partition.py +117 -60
  54. warp/{fem → _src/fem}/space/quadmesh_function_space.py +4 -10
  55. warp/{fem → _src/fem}/space/restriction.py +66 -33
  56. warp/_src/fem/space/shape/__init__.py +152 -0
  57. warp/{fem → _src/fem}/space/shape/cube_shape_function.py +9 -9
  58. warp/{fem → _src/fem}/space/shape/shape_function.py +8 -9
  59. warp/{fem → _src/fem}/space/shape/square_shape_function.py +6 -6
  60. warp/{fem → _src/fem}/space/shape/tet_shape_function.py +3 -3
  61. warp/{fem → _src/fem}/space/shape/triangle_shape_function.py +3 -3
  62. warp/{fem → _src/fem}/space/tetmesh_function_space.py +3 -9
  63. warp/_src/fem/space/topology.py +459 -0
  64. warp/{fem → _src/fem}/space/trimesh_function_space.py +3 -9
  65. warp/_src/fem/types.py +112 -0
  66. warp/_src/fem/utils.py +486 -0
  67. warp/_src/jax.py +186 -0
  68. warp/_src/jax_experimental/__init__.py +14 -0
  69. warp/_src/jax_experimental/custom_call.py +387 -0
  70. warp/_src/jax_experimental/ffi.py +1284 -0
  71. warp/_src/jax_experimental/xla_ffi.py +656 -0
  72. warp/_src/marching_cubes.py +708 -0
  73. warp/_src/math.py +414 -0
  74. warp/_src/optim/__init__.py +14 -0
  75. warp/_src/optim/adam.py +163 -0
  76. warp/_src/optim/linear.py +1606 -0
  77. warp/_src/optim/sgd.py +112 -0
  78. warp/_src/paddle.py +406 -0
  79. warp/_src/render/__init__.py +14 -0
  80. warp/_src/render/imgui_manager.py +289 -0
  81. warp/_src/render/render_opengl.py +3636 -0
  82. warp/_src/render/render_usd.py +937 -0
  83. warp/_src/render/utils.py +160 -0
  84. warp/_src/sparse.py +2716 -0
  85. warp/_src/tape.py +1206 -0
  86. warp/{thirdparty → _src/thirdparty}/unittest_parallel.py +9 -2
  87. warp/_src/torch.py +391 -0
  88. warp/_src/types.py +5870 -0
  89. warp/_src/utils.py +1693 -0
  90. warp/autograd.py +12 -1054
  91. warp/bin/warp-clang.so +0 -0
  92. warp/bin/warp.so +0 -0
  93. warp/build.py +8 -588
  94. warp/build_dll.py +6 -721
  95. warp/codegen.py +6 -4251
  96. warp/constants.py +6 -39
  97. warp/context.py +12 -8062
  98. warp/dlpack.py +6 -444
  99. warp/examples/distributed/example_jacobi_mpi.py +4 -5
  100. warp/examples/fem/example_adaptive_grid.py +1 -1
  101. warp/examples/fem/example_apic_fluid.py +1 -1
  102. warp/examples/fem/example_burgers.py +8 -8
  103. warp/examples/fem/example_diffusion.py +1 -1
  104. warp/examples/fem/example_distortion_energy.py +1 -1
  105. warp/examples/fem/example_mixed_elasticity.py +2 -2
  106. warp/examples/fem/example_navier_stokes.py +1 -1
  107. warp/examples/fem/example_nonconforming_contact.py +7 -7
  108. warp/examples/fem/example_stokes.py +1 -1
  109. warp/examples/fem/example_stokes_transfer.py +1 -1
  110. warp/examples/fem/utils.py +2 -2
  111. warp/examples/interop/example_jax_callable.py +1 -1
  112. warp/examples/interop/example_jax_ffi_callback.py +1 -1
  113. warp/examples/interop/example_jax_kernel.py +1 -1
  114. warp/examples/tile/example_tile_mcgp.py +191 -0
  115. warp/fabric.py +6 -337
  116. warp/fem/__init__.py +159 -97
  117. warp/fem/adaptivity.py +7 -489
  118. warp/fem/cache.py +9 -648
  119. warp/fem/dirichlet.py +6 -184
  120. warp/fem/field/__init__.py +8 -109
  121. warp/fem/field/field.py +7 -652
  122. warp/fem/geometry/__init__.py +7 -18
  123. warp/fem/geometry/closest_point.py +11 -77
  124. warp/fem/linalg.py +18 -366
  125. warp/fem/operator.py +11 -369
  126. warp/fem/polynomial.py +9 -209
  127. warp/fem/space/__init__.py +5 -211
  128. warp/fem/space/basis_space.py +6 -662
  129. warp/fem/space/shape/__init__.py +41 -118
  130. warp/fem/space/topology.py +6 -437
  131. warp/fem/types.py +6 -81
  132. warp/fem/utils.py +11 -444
  133. warp/jax.py +8 -165
  134. warp/jax_experimental/__init__.py +14 -1
  135. warp/jax_experimental/custom_call.py +8 -365
  136. warp/jax_experimental/ffi.py +17 -873
  137. warp/jax_experimental/xla_ffi.py +5 -605
  138. warp/marching_cubes.py +5 -689
  139. warp/math.py +16 -393
  140. warp/native/array.h +385 -37
  141. warp/native/builtin.h +314 -37
  142. warp/native/bvh.cpp +43 -9
  143. warp/native/bvh.cu +62 -27
  144. warp/native/bvh.h +310 -309
  145. warp/native/clang/clang.cpp +102 -97
  146. warp/native/coloring.cpp +0 -1
  147. warp/native/crt.h +208 -0
  148. warp/native/exports.h +156 -0
  149. warp/native/hashgrid.cu +2 -0
  150. warp/native/intersect.h +24 -1
  151. warp/native/intersect_tri.h +44 -35
  152. warp/native/mat.h +1456 -276
  153. warp/native/mesh.cpp +4 -4
  154. warp/native/mesh.cu +4 -2
  155. warp/native/mesh.h +176 -61
  156. warp/native/quat.h +0 -52
  157. warp/native/scan.cu +2 -0
  158. warp/native/sparse.cu +7 -3
  159. warp/native/spatial.h +12 -0
  160. warp/native/tile.h +681 -89
  161. warp/native/tile_radix_sort.h +1 -1
  162. warp/native/tile_reduce.h +394 -46
  163. warp/native/tile_scan.h +4 -4
  164. warp/native/vec.h +469 -0
  165. warp/native/version.h +23 -0
  166. warp/native/volume.cpp +1 -1
  167. warp/native/volume.cu +1 -0
  168. warp/native/volume.h +1 -1
  169. warp/native/volume_builder.cu +2 -0
  170. warp/native/warp.cpp +57 -29
  171. warp/native/warp.cu +253 -171
  172. warp/native/warp.h +11 -8
  173. warp/optim/__init__.py +6 -3
  174. warp/optim/adam.py +6 -145
  175. warp/optim/linear.py +14 -1585
  176. warp/optim/sgd.py +6 -94
  177. warp/paddle.py +6 -388
  178. warp/render/__init__.py +8 -4
  179. warp/render/imgui_manager.py +7 -267
  180. warp/render/render_opengl.py +6 -3618
  181. warp/render/render_usd.py +6 -919
  182. warp/render/utils.py +6 -142
  183. warp/sparse.py +37 -2563
  184. warp/tape.py +6 -1188
  185. warp/tests/__main__.py +1 -1
  186. warp/tests/cuda/test_async.py +4 -4
  187. warp/tests/cuda/test_conditional_captures.py +1 -1
  188. warp/tests/cuda/test_multigpu.py +1 -1
  189. warp/tests/cuda/test_streams.py +58 -1
  190. warp/tests/geometry/test_bvh.py +157 -22
  191. warp/tests/geometry/test_marching_cubes.py +0 -1
  192. warp/tests/geometry/test_mesh.py +5 -3
  193. warp/tests/geometry/test_mesh_query_aabb.py +5 -12
  194. warp/tests/geometry/test_mesh_query_point.py +5 -2
  195. warp/tests/geometry/test_mesh_query_ray.py +15 -3
  196. warp/tests/geometry/test_volume_write.py +5 -5
  197. warp/tests/interop/test_dlpack.py +14 -14
  198. warp/tests/interop/test_jax.py +772 -49
  199. warp/tests/interop/test_paddle.py +1 -1
  200. warp/tests/test_adam.py +0 -1
  201. warp/tests/test_arithmetic.py +9 -9
  202. warp/tests/test_array.py +527 -100
  203. warp/tests/test_array_reduce.py +3 -3
  204. warp/tests/test_atomic.py +12 -8
  205. warp/tests/test_atomic_bitwise.py +209 -0
  206. warp/tests/test_atomic_cas.py +4 -4
  207. warp/tests/test_bool.py +2 -2
  208. warp/tests/test_builtins_resolution.py +5 -571
  209. warp/tests/test_codegen.py +33 -14
  210. warp/tests/test_conditional.py +1 -1
  211. warp/tests/test_context.py +6 -6
  212. warp/tests/test_copy.py +242 -161
  213. warp/tests/test_ctypes.py +3 -3
  214. warp/tests/test_devices.py +24 -2
  215. warp/tests/test_examples.py +16 -84
  216. warp/tests/test_fabricarray.py +35 -35
  217. warp/tests/test_fast_math.py +0 -2
  218. warp/tests/test_fem.py +56 -10
  219. warp/tests/test_fixedarray.py +3 -3
  220. warp/tests/test_func.py +8 -5
  221. warp/tests/test_generics.py +1 -1
  222. warp/tests/test_indexedarray.py +24 -24
  223. warp/tests/test_intersect.py +39 -9
  224. warp/tests/test_large.py +1 -1
  225. warp/tests/test_lerp.py +3 -1
  226. warp/tests/test_linear_solvers.py +1 -1
  227. warp/tests/test_map.py +35 -4
  228. warp/tests/test_mat.py +52 -62
  229. warp/tests/test_mat_constructors.py +4 -5
  230. warp/tests/test_mat_lite.py +1 -1
  231. warp/tests/test_mat_scalar_ops.py +121 -121
  232. warp/tests/test_math.py +34 -0
  233. warp/tests/test_module_aot.py +4 -4
  234. warp/tests/test_modules_lite.py +28 -2
  235. warp/tests/test_print.py +11 -11
  236. warp/tests/test_quat.py +93 -58
  237. warp/tests/test_runlength_encode.py +1 -1
  238. warp/tests/test_scalar_ops.py +38 -10
  239. warp/tests/test_smoothstep.py +1 -1
  240. warp/tests/test_sparse.py +126 -15
  241. warp/tests/test_spatial.py +105 -87
  242. warp/tests/test_special_values.py +6 -6
  243. warp/tests/test_static.py +7 -7
  244. warp/tests/test_struct.py +13 -2
  245. warp/tests/test_triangle_closest_point.py +48 -1
  246. warp/tests/test_types.py +27 -15
  247. warp/tests/test_utils.py +52 -52
  248. warp/tests/test_vec.py +29 -29
  249. warp/tests/test_vec_constructors.py +5 -5
  250. warp/tests/test_vec_scalar_ops.py +97 -97
  251. warp/tests/test_version.py +75 -0
  252. warp/tests/tile/test_tile.py +178 -0
  253. warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
  254. warp/tests/tile/test_tile_cholesky.py +7 -4
  255. warp/tests/tile/test_tile_load.py +26 -2
  256. warp/tests/tile/test_tile_mathdx.py +3 -3
  257. warp/tests/tile/test_tile_matmul.py +1 -1
  258. warp/tests/tile/test_tile_mlp.py +2 -4
  259. warp/tests/tile/test_tile_reduce.py +214 -13
  260. warp/tests/unittest_suites.py +6 -14
  261. warp/tests/unittest_utils.py +10 -9
  262. warp/tests/walkthrough_debug.py +3 -1
  263. warp/torch.py +6 -373
  264. warp/types.py +29 -5764
  265. warp/utils.py +10 -1659
  266. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/METADATA +46 -99
  267. warp_lang-1.10.0rc2.dist-info/RECORD +468 -0
  268. warp_lang-1.10.0rc2.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
  269. warp_lang-1.10.0rc2.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
  270. warp_lang-1.10.0rc2.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
  271. warp_lang-1.10.0rc2.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
  272. warp_lang-1.10.0rc2.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
  273. warp_lang-1.10.0rc2.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
  274. warp_lang-1.10.0rc2.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
  275. warp_lang-1.10.0rc2.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
  276. warp_lang-1.10.0rc2.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
  277. warp_lang-1.10.0rc2.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
  278. warp_lang-1.10.0rc2.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
  279. warp_lang-1.10.0rc2.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
  280. warp_lang-1.10.0rc2.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
  281. warp_lang-1.10.0rc2.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
  282. warp_lang-1.10.0rc2.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
  283. warp/examples/assets/cartpole.urdf +0 -110
  284. warp/examples/assets/crazyflie.usd +0 -0
  285. warp/examples/assets/nv_ant.xml +0 -92
  286. warp/examples/assets/nv_humanoid.xml +0 -183
  287. warp/examples/assets/quadruped.urdf +0 -268
  288. warp/examples/optim/example_bounce.py +0 -266
  289. warp/examples/optim/example_cloth_throw.py +0 -228
  290. warp/examples/optim/example_drone.py +0 -870
  291. warp/examples/optim/example_inverse_kinematics.py +0 -182
  292. warp/examples/optim/example_inverse_kinematics_torch.py +0 -191
  293. warp/examples/optim/example_softbody_properties.py +0 -400
  294. warp/examples/optim/example_spring_cage.py +0 -245
  295. warp/examples/optim/example_trajectory.py +0 -227
  296. warp/examples/sim/example_cartpole.py +0 -143
  297. warp/examples/sim/example_cloth.py +0 -225
  298. warp/examples/sim/example_cloth_self_contact.py +0 -316
  299. warp/examples/sim/example_granular.py +0 -130
  300. warp/examples/sim/example_granular_collision_sdf.py +0 -202
  301. warp/examples/sim/example_jacobian_ik.py +0 -244
  302. warp/examples/sim/example_particle_chain.py +0 -124
  303. warp/examples/sim/example_quadruped.py +0 -203
  304. warp/examples/sim/example_rigid_chain.py +0 -203
  305. warp/examples/sim/example_rigid_contact.py +0 -195
  306. warp/examples/sim/example_rigid_force.py +0 -133
  307. warp/examples/sim/example_rigid_gyroscopic.py +0 -115
  308. warp/examples/sim/example_rigid_soft_contact.py +0 -140
  309. warp/examples/sim/example_soft_body.py +0 -196
  310. warp/examples/tile/example_tile_walker.py +0 -327
  311. warp/sim/__init__.py +0 -74
  312. warp/sim/articulation.py +0 -793
  313. warp/sim/collide.py +0 -2570
  314. warp/sim/graph_coloring.py +0 -307
  315. warp/sim/import_mjcf.py +0 -791
  316. warp/sim/import_snu.py +0 -227
  317. warp/sim/import_urdf.py +0 -579
  318. warp/sim/import_usd.py +0 -898
  319. warp/sim/inertia.py +0 -357
  320. warp/sim/integrator.py +0 -245
  321. warp/sim/integrator_euler.py +0 -2000
  322. warp/sim/integrator_featherstone.py +0 -2101
  323. warp/sim/integrator_vbd.py +0 -2487
  324. warp/sim/integrator_xpbd.py +0 -3295
  325. warp/sim/model.py +0 -4821
  326. warp/sim/particles.py +0 -121
  327. warp/sim/render.py +0 -431
  328. warp/sim/utils.py +0 -431
  329. warp/tests/sim/disabled_kinematics.py +0 -244
  330. warp/tests/sim/test_cloth.py +0 -863
  331. warp/tests/sim/test_collision.py +0 -743
  332. warp/tests/sim/test_coloring.py +0 -347
  333. warp/tests/sim/test_inertia.py +0 -161
  334. warp/tests/sim/test_model.py +0 -226
  335. warp/tests/sim/test_sim_grad.py +0 -287
  336. warp/tests/sim/test_sim_grad_bounce_linear.py +0 -212
  337. warp/tests/sim/test_sim_kinematics.py +0 -98
  338. warp/thirdparty/__init__.py +0 -0
  339. warp_lang-1.9.1.dist-info/RECORD +0 -456
  340. /warp/{fem → _src/fem}/quadrature/__init__.py +0 -0
  341. /warp/{tests/sim → _src/thirdparty}/__init__.py +0 -0
  342. /warp/{thirdparty → _src/thirdparty}/appdirs.py +0 -0
  343. /warp/{thirdparty → _src/thirdparty}/dlpack.py +0 -0
  344. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/WHEEL +0 -0
  345. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/licenses/LICENSE.md +0 -0
  346. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/top_level.txt +0 -0
warp/fem/field/field.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,659 +13,14 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- from typing import Any, ClassVar, Dict, Optional, Set
16
+ # isort: skip_file
17
17
 
18
- import warp as wp
19
- from warp.fem import cache
20
- from warp.fem.domain import GeometryDomain, Sides
21
- from warp.fem.geometry import DeformedGeometry, Geometry
22
- from warp.fem.operator import Operator, integrand
23
- from warp.fem.space import FunctionSpace, SpacePartition
24
- from warp.fem.types import NULL_ELEMENT_INDEX, ElementKind, Sample
25
- from warp.fem.utils import type_zero_element
18
+ # TODO: Remove after cleaning up the public API.
26
19
 
20
+ from warp._src.fem.field import field as _field
27
21
 
28
- class FieldLike:
29
- """Base class for integrable fields"""
30
22
 
31
- EvalArg: wp.codegen.Struct
32
- """Structure containing field-level arguments passed to device functions for field evaluation"""
23
+ def __getattr__(name):
24
+ from warp._src.utils import get_deprecated_api
33
25
 
34
- ElementEvalArg: wp.codegen.Struct
35
- """Structure combining geometry-level and field-level arguments passed to device functions for field evaluation"""
36
-
37
- def eval_arg_value(self, device) -> "EvalArg": # noqa: F821
38
- """Value of the field-level arguments to be passed to device functions"""
39
- raise NotImplementedError
40
-
41
- def fill_eval_arg(self, arg: "FieldLike.EvalArg", device):
42
- """Fill the field-level arguments to be passed to device functions"""
43
- raise NotImplementedError
44
-
45
- @property
46
- def degree(self) -> int:
47
- """Polynomial degree of the field, used to estimate necessary quadrature order"""
48
- raise NotImplementedError
49
-
50
- @property
51
- def name(self) -> str:
52
- raise NotImplementedError
53
-
54
- @property
55
- def __str__(self) -> str:
56
- return self.name
57
-
58
- def gradient_valid(self) -> bool:
59
- """Whether the gradient operator is implemented for this field."""
60
- return False
61
-
62
- def divergence_valid(self) -> bool:
63
- """Whether the divergence operator is implemented for this field."""
64
- return False
65
-
66
- @staticmethod
67
- def eval_inner(args: "ElementEvalArg", s: Sample): # noqa: F821
68
- """Device function evaluating the inner field value at a sample point"""
69
- raise NotImplementedError
70
-
71
- @staticmethod
72
- def eval_grad_inner(args: "ElementEvalArg", s: Sample): # noqa: F821
73
- """Device function evaluating the inner field gradient at a sample point"""
74
- raise NotImplementedError
75
-
76
- @staticmethod
77
- def eval_div_inner(args: "ElementEvalArg", s: Sample): # noqa: F821
78
- """Device function evaluating the inner field divergence at a sample point"""
79
- raise NotImplementedError
80
-
81
- @staticmethod
82
- def eval_outer(args: "ElementEvalArg", s: Sample): # noqa: F821
83
- """Device function evaluating the outer field value at a sample point"""
84
- raise NotImplementedError
85
-
86
- @staticmethod
87
- def eval_grad_outer(args: "ElementEvalArg", s: Sample): # noqa: F821
88
- """Device function evaluating the outer field gradient at a sample point"""
89
- raise NotImplementedError
90
-
91
- @staticmethod
92
- def eval_div_outer(args: "ElementEvalArg", s: Sample): # noqa: F821
93
- """Device function evaluating the outer field divergence at a sample point"""
94
- raise NotImplementedError
95
-
96
- @staticmethod
97
- def eval_degree(args: "ElementEvalArg"): # noqa: F821
98
- """Polynomial degree of the field is applicable, or hint for determination of interpolation order"""
99
- raise NotImplementedError
100
-
101
- def notify_operator_usage(self, ops: Set[Operator]):
102
- """Makes the Domain aware that the operators `ops` will be applied"""
103
- pass
104
-
105
-
106
- class GeometryField(FieldLike):
107
- """Base class for fields defined over a geometry"""
108
-
109
- @property
110
- def geometry(self) -> Geometry:
111
- """Geometry over which the field is expressed"""
112
- raise NotImplementedError
113
-
114
- @property
115
- def element_kind(self) -> ElementKind:
116
- """Kind of element over which the field is expressed"""
117
- raise NotImplementedError
118
-
119
- @staticmethod
120
- def eval_reference_grad_inner(args: "ElementEvalArg", s: Sample): # noqa: F821
121
- """Device function evaluating the inner field gradient with respect to reference element coordinates at a sample point"""
122
- raise NotImplementedError
123
-
124
- @staticmethod
125
- def eval_reference_grad_outer(args: "ElementEvalArg", s: Sample): # noqa: F821
126
- """Device function evaluating the outer field gradient with respect to reference element coordinates at a sample point"""
127
- raise NotImplementedError
128
-
129
- def trace(self) -> FieldLike:
130
- """Trace of this field over lower-dimensional elements"""
131
- raise NotImplementedError
132
-
133
- def make_deformed_geometry(self, relative=True) -> Geometry:
134
- """Returns a deformed version of the underlying geometry, with positions displaced according to this field's values.
135
-
136
- Args:
137
- relative: If ``True``, the field is interpreted as a relative displacement over the original geometry.
138
- If ``False``, the field values are interpreted as absolute positions.
139
-
140
- """
141
- return DeformedGeometry(self, relative=relative)
142
-
143
- @property
144
- def gradient_dtype(self):
145
- """Return type of the (world space) gradient operator. Assumes self.gradient_valid()"""
146
- if wp.types.type_is_matrix(self.dtype):
147
- return None
148
-
149
- if wp.types.type_is_vector(self.dtype):
150
- return cache.cached_mat_type(
151
- shape=(wp.types.type_size(self.dtype), self.geometry.dimension),
152
- dtype=wp.types.type_scalar_type(self.dtype),
153
- )
154
- if wp.types.type_is_quaternion(self.dtype):
155
- return cache.cached_mat_type(
156
- shape=(4, self.geometry.dimension),
157
- dtype=wp.types.type_scalar_type(self.dtype),
158
- )
159
- return cache.cached_vec_type(length=self.geometry.dimension, dtype=wp.types.type_scalar_type(self.dtype))
160
-
161
- @property
162
- def reference_gradient_dtype(self):
163
- """Return type of the reference space gradient operator. Assumes self.gradient_valid()"""
164
- if wp.types.type_is_matrix(self.dtype):
165
- return None
166
-
167
- if wp.types.type_is_vector(self.dtype):
168
- return cache.cached_mat_type(
169
- shape=(wp.types.type_size(self.dtype), self.geometry.cell_dimension),
170
- dtype=wp.types.type_scalar_type(self.dtype),
171
- )
172
- if wp.types.type_is_quaternion(self.dtype):
173
- return cache.cached_mat_type(
174
- shape=(4, self.geometry.cell_dimension),
175
- dtype=wp.types.type_scalar_type(self.dtype),
176
- )
177
- return cache.cached_vec_type(length=self.geometry.cell_dimension, dtype=wp.types.type_scalar_type(self.dtype))
178
-
179
- @property
180
- def divergence_dtype(self):
181
- """Return type of the divergence operator. Assumes self.divergence_valid()"""
182
- if wp.types.type_is_vector(self.dtype):
183
- return wp.types.type_scalar_type(self.dtype)
184
- if wp.types.type_is_matrix(self.dtype):
185
- return cache.cached_vec_type(length=self.dtype._shape_[1], dtype=wp.types.type_scalar_type(self.dtype))
186
- return None
187
-
188
-
189
- class SpaceField(GeometryField):
190
- """Base class for fields defined over a function space"""
191
-
192
- def __init__(self, space: FunctionSpace, space_partition: SpacePartition):
193
- self._space = space
194
- self._space_partition = space_partition
195
-
196
- self.gradient_valid = self.space.gradient_valid
197
- self.divergence_valid = self.space.divergence_valid
198
-
199
- @property
200
- def geometry(self) -> Geometry:
201
- return self._space.geometry
202
-
203
- @property
204
- def element_kind(self) -> ElementKind:
205
- return self._space.element_kind
206
-
207
- @property
208
- def space(self) -> FunctionSpace:
209
- return self._space
210
-
211
- @property
212
- def space_partition(self) -> SpacePartition:
213
- return self._space_partition
214
-
215
- @property
216
- def degree(self) -> int:
217
- return self.space.degree
218
-
219
- @property
220
- def dtype(self) -> type:
221
- return self.space.dtype
222
-
223
- @property
224
- def dof_dtype(self) -> type:
225
- return self.space.dof_dtype
226
-
227
- def _make_eval_degree(self):
228
- ORDER = self.space.ORDER
229
-
230
- @cache.dynamic_func(suffix=self.name)
231
- def degree(args: self.ElementEvalArg):
232
- return ORDER
233
-
234
- return degree
235
-
236
-
237
- class DiscreteField(SpaceField):
238
- """Explicitly-valued field defined over a partition of a discrete function space"""
239
-
240
- @property
241
- def dof_values(self) -> wp.array:
242
- """Array of degrees of freedom values"""
243
- raise NotImplementedError
244
-
245
- @dof_values.setter
246
- def dof_values(self, values: wp.array):
247
- """Sets degrees of freedom values from an array"""
248
- raise NotImplementedError
249
-
250
- @staticmethod
251
- def set_node_value(args: "FieldLike.EvalArg", node_index: int, value: Any):
252
- """Device function setting the value at given node"""
253
- raise NotImplementedError
254
-
255
- @property
256
- def name(self) -> str:
257
- return f"{self.__class__.__qualname__}_{self.space.name}_{self.space_partition.name}"
258
-
259
-
260
- class ImplicitField(GeometryField):
261
- """Field defined from an arbitrary function over a domain.
262
- Does not support autodiff yet, so if gradient/divergence evaluation is required corresponding functions must be provided.
263
-
264
- Args:
265
- domain: Domain over which the field is defined
266
- func: Warp function evaluating the field at a given position. Must accept at least one argument, with the first argument being the evaluation position (``wp.vec2`` or ``wp.vec3``).
267
- values: Optional dictionary of additional argument values to be passed to the evaluation function.
268
- grad_func: Optional gradient evaluation function; must take same arguments as `func`
269
- div_func: Optional divergence evaluation function; must take same arguments as `func`
270
- degree: Optional hint for automatic determination of quadrature orders when integrating this field
271
- """
272
-
273
- _dynamic_attribute_constructors: ClassVar = {
274
- "ElementEvalArg": lambda obj: obj._make_element_eval_arg(),
275
- "eval_degree": lambda obj: obj._make_eval_degree(),
276
- "eval_inner": lambda obj: obj._make_eval_func(obj._func),
277
- "eval_grad_inner": lambda obj: obj._make_eval_func(obj._grad_func),
278
- "eval_div_inner": lambda obj: obj._make_eval_func(obj._div_func),
279
- "eval_reference_grad_inner": lambda obj: obj._make_eval_reference_grad(),
280
- "eval_outer": lambda obj: obj.eval_inner,
281
- "eval_grad_outer": lambda obj: obj.eval_grad_inner,
282
- "eval_div_outer": lambda obj: obj.eval_div_inner,
283
- "eval_reference_grad_outer": lambda obj: obj.eval_reference_grad_inner,
284
- }
285
-
286
- def __init__(
287
- self,
288
- domain: GeometryDomain,
289
- func: wp.Function,
290
- values: Optional[Dict[str, Any]] = None,
291
- grad_func: Optional[wp.Function] = None,
292
- div_func: Optional[wp.Function] = None,
293
- degree=0,
294
- ):
295
- self.domain = domain
296
- self._degree = degree
297
-
298
- if not isinstance(func, wp.Function):
299
- raise ValueError("Implicit field function must be a warp Function (decorated with `wp.func`)")
300
-
301
- self._func = func
302
- self._grad_func = grad_func
303
- self._div_func = div_func
304
-
305
- argspec = integrand(func.func).argspec
306
- arg_types = argspec.annotations
307
-
308
- pos_arg_type = arg_types.pop(argspec.args[0]) if arg_types else None
309
- if not pos_arg_type or not wp.types.types_equal(
310
- pos_arg_type, wp.vec(length=domain.geometry.dimension, dtype=float), match_generic=True
311
- ):
312
- raise ValueError(
313
- f"Implicit field function '{func.func.__name__}' must accept a position as its first argument"
314
- )
315
-
316
- self.EvalArg = cache.get_argument_struct(arg_types)
317
- self.values = values
318
-
319
- cache.setup_dynamic_attributes(self)
320
-
321
- @property
322
- def values(self):
323
- return self._func_arg
324
-
325
- @values.setter
326
- def values(self, v):
327
- self._values = v
328
- self._func_arg = cache.populate_argument_struct(self.EvalArg, v, self._func.func.__name__)
329
-
330
- @property
331
- def geometry(self) -> Geometry:
332
- return self.domain.geometry
333
-
334
- @property
335
- def element_kind(self) -> ElementKind:
336
- return self.domain.element_kind
337
-
338
- def eval_arg_value(self, device):
339
- return self._func_arg
340
-
341
- def fill_eval_arg(self, arg, device):
342
- cache.populate_argument_struct(self.EvalArg, self._values, self._func.func.__name__, arg)
343
-
344
- @property
345
- def degree(self) -> int:
346
- return self._degree
347
-
348
- @property
349
- def name(self) -> str:
350
- return f"Implicit_{self.domain.name}_{self.degree}_{self.EvalArg.key}"
351
-
352
- def gradient_valid(self) -> bool:
353
- return self._grad_func is not None
354
-
355
- def divergence_valid(self) -> bool:
356
- return self._div_func is not None
357
-
358
- def _make_eval_func(self, func):
359
- if func is None:
360
- return None
361
-
362
- @cache.dynamic_func(
363
- suffix=f"{self.name}_{func.key}",
364
- code_transformers=[cache.ExpandStarredArgumentStruct({"args.eval_arg": self.EvalArg})],
365
- )
366
- def eval_inner(args: self.ElementEvalArg, s: Sample):
367
- pos = self.domain.element_position(args.elt_arg, s)
368
- return func(pos, *args.eval_arg)
369
-
370
- return eval_inner
371
-
372
- def _make_eval_reference_grad(self):
373
- if self.eval_grad_inner is None:
374
- return None
375
-
376
- @cache.dynamic_func(suffix=f"{self.eval_grad_inner.key}")
377
- def eval_reference_grad_inner(args: self.ElementEvalArg, s: Sample):
378
- return self.eval_grad_inner(args, s) * self.domain.element_deformation_gradient(args.elt_arg, s)
379
-
380
- return eval_reference_grad_inner
381
-
382
- def _make_element_eval_arg(self):
383
- @cache.dynamic_struct(suffix=self.name)
384
- class ElementEvalArg:
385
- elt_arg: self.domain.ElementArg
386
- eval_arg: self.EvalArg
387
-
388
- return ElementEvalArg
389
-
390
- def _make_eval_degree(self):
391
- ORDER = wp.constant(self._degree)
392
-
393
- @cache.dynamic_func(suffix=self.name)
394
- def degree(args: self.ElementEvalArg):
395
- return ORDER
396
-
397
- return degree
398
-
399
- def trace(self):
400
- if self.element_kind == ElementKind.SIDE:
401
- raise RuntimeError("Trace only available for field defined on cell elements")
402
-
403
- return ImplicitField(
404
- domain=Sides(self.domain.geometry_partition),
405
- func=self._func,
406
- values={name: getattr(self.values, name) for name in self.EvalArg.vars},
407
- grad_func=self._grad_func,
408
- div_func=self._div_func,
409
- degree=self._degree,
410
- )
411
-
412
-
413
- class UniformField(GeometryField):
414
- """Field defined as a constant value over a domain.
415
-
416
- Args:
417
- domain: Domain over which the field is defined
418
- value: Uniform value over the domain
419
- """
420
-
421
- _dynamic_attribute_constructors: ClassVar = {
422
- "EvalArg": lambda obj: obj._make_eval_arg(),
423
- "ElementEvalArg": lambda obj: obj._make_element_eval_arg(),
424
- "eval_degree": lambda obj: obj._make_eval_degree(),
425
- "eval_inner": lambda obj: obj._make_eval_inner(),
426
- "eval_grad_inner": lambda obj: obj._make_eval_zero(obj.gradient_dtype),
427
- "eval_div_inner": lambda obj: obj._make_eval_zero(obj.divergence_dtype),
428
- "eval_reference_grad_inner": lambda obj: obj._make_eval_zero(obj.reference_gradient_dtype),
429
- "eval_outer": lambda obj: obj.eval_inner,
430
- "eval_grad_outer": lambda obj: obj.eval_grad_inner,
431
- "eval_div_outer": lambda obj: obj.eval_div_inner,
432
- "eval_reference_grad_outer": lambda obj: obj.eval_reference_grad_inner,
433
- }
434
-
435
- def __init__(self, domain: GeometryDomain, value: Any):
436
- self.domain = domain
437
-
438
- if not wp.types.is_value(value):
439
- raise ValueError("value must be a Warp scalar, vector or matrix")
440
-
441
- self.dtype = wp.types.type_to_warp(type(value))
442
- self._value = self.dtype(value)
443
-
444
- cache.setup_dynamic_attributes(self)
445
-
446
- @property
447
- def value(self):
448
- return self._value
449
-
450
- @value.setter
451
- def value(self, v):
452
- value_type = wp.types.type_to_warp(type(v))
453
- assert wp.types.types_equal(value_type, self.dtype)
454
- self._value = self.dtype(v)
455
-
456
- @property
457
- def geometry(self) -> Geometry:
458
- return self.domain.geometry
459
-
460
- @property
461
- def element_kind(self) -> ElementKind:
462
- return self.domain.element_kind
463
-
464
- def eval_arg_value(self, device):
465
- arg = self.EvalArg()
466
- arg.value = self.value
467
- return arg
468
-
469
- def fill_eval_arg(self, arg, device):
470
- arg.value = self.value
471
-
472
- @property
473
- def degree(self) -> int:
474
- return 0
475
-
476
- def gradient_valid(self) -> bool:
477
- return self.gradient_dtype is not None
478
-
479
- def divergence_valid(self) -> bool:
480
- return self.divergence_dtype is not None
481
-
482
- @property
483
- def name(self) -> str:
484
- return f"Uniform{self.domain.name}_{wp.types.get_type_code(self.dtype)}"
485
-
486
- def _make_eval_inner(self):
487
- @cache.dynamic_func(suffix=self.name)
488
- def eval_inner(args: self.ElementEvalArg, s: Sample):
489
- return args.eval_arg.value
490
-
491
- return eval_inner
492
-
493
- def _make_eval_zero(self, dtype):
494
- if dtype is None:
495
- return None
496
-
497
- zero_element = type_zero_element(dtype)
498
-
499
- @cache.dynamic_func(suffix=f"{self.name}_{wp.types.get_type_code(dtype)}")
500
- def eval_zero(args: self.ElementEvalArg, s: Sample):
501
- return zero_element()
502
-
503
- return eval_zero
504
-
505
- def _make_eval_arg(self):
506
- @cache.dynamic_struct(suffix=self.name)
507
- class EvalArg:
508
- value: self.dtype
509
-
510
- return EvalArg
511
-
512
- def _make_element_eval_arg(self):
513
- @cache.dynamic_struct(suffix=self.name)
514
- class ElementEvalArg:
515
- elt_arg: self.domain.ElementArg
516
- eval_arg: self.EvalArg
517
-
518
- return ElementEvalArg
519
-
520
- def _make_eval_degree(self):
521
- @cache.dynamic_func(suffix=self.name)
522
- def degree(args: self.ElementEvalArg):
523
- return 0
524
-
525
- return degree
526
-
527
- def trace(self):
528
- if self.element_kind == ElementKind.SIDE:
529
- raise RuntimeError("Trace only available for field defined on cell elements")
530
-
531
- return UniformField(domain=Sides(self.domain.geometry_partition), value=self.value)
532
-
533
-
534
- class NonconformingField(GeometryField):
535
- """Field defined as the map of a DiscreteField over a non-conforming geometry.
536
-
537
- Args:
538
- domain: The new domain over which the nonconforming field will be evaluated
539
- field: Nonconforming discrete field
540
- background: Uniform value or domain-conforming field determining the value outside of the geometry of definition of `field`
541
- """
542
-
543
- _LOOKUP_EPS = wp.constant(1.0e-6)
544
-
545
- _dynamic_attribute_constructors: ClassVar = {
546
- "EvalArg": lambda obj: obj._make_eval_arg(),
547
- "ElementEvalArg": lambda obj: obj._make_element_eval_arg(),
548
- "eval_degree": lambda obj: obj._make_eval_degree(),
549
- "eval_inner": lambda obj: obj._make_nonconforming_eval("eval_inner"),
550
- "eval_grad_inner": lambda obj: obj._make_nonconforming_eval("eval_grad_inner"),
551
- "eval_div_inner": lambda obj: obj._make_nonconforming_eval("eval_div_inner"),
552
- "eval_reference_grad_inner": lambda obj: obj._make_eval_reference_grad(),
553
- "eval_outer": lambda obj: obj.eval_inner,
554
- "eval_grad_outer": lambda obj: obj.eval_grad_inner,
555
- "eval_div_outer": lambda obj: obj.eval_div_inner,
556
- "eval_reference_grad_outer": lambda obj: obj.eval_reference_grad_inner,
557
- }
558
-
559
- def __init__(self, domain: GeometryDomain, field: DiscreteField, background: Any = 0.0):
560
- self.domain = domain
561
-
562
- self.field = field
563
- self.dtype = field.dtype
564
-
565
- if not isinstance(background, GeometryField):
566
- background = UniformField(domain, self.dtype(background))
567
- elif background.geometry != domain.geometry or background.element_kind != domain.element_kind:
568
- raise ValueError("Background field must be conforming to the domain")
569
- self.background = background
570
-
571
- cache.setup_dynamic_attributes(self)
572
-
573
- @property
574
- def geometry(self) -> Geometry:
575
- return self.domain.geometry
576
-
577
- @property
578
- def element_kind(self) -> ElementKind:
579
- return self.domain.element_kind
580
-
581
- def eval_arg_value(self, device):
582
- arg = self.EvalArg()
583
- self.fill_eval_arg(arg, device)
584
- return arg
585
-
586
- def fill_eval_arg(self, arg, device):
587
- self.field.fill_eval_arg(arg.field_cell_eval_arg.eval_arg, device)
588
- self.field.geometry.fill_cell_arg(arg.field_cell_eval_arg.elt_arg, device)
589
- self.background.fill_eval_arg(arg.background_arg, device)
590
-
591
- @property
592
- def degree(self) -> int:
593
- return self.field.degree
594
-
595
- def gradient_valid(self) -> bool:
596
- return self.field.gradient_valid() and self.background.gradient_valid()
597
-
598
- def divergence_valid(self) -> bool:
599
- return self.field.divergence_valid() and self.background.divergence_valid()
600
-
601
- @property
602
- def name(self) -> str:
603
- return f"{self.domain.name}_{self.field.name}_{self.background.name}"
604
-
605
- def _make_nonconforming_eval(self, eval_func_name):
606
- field_eval = getattr(self.field, eval_func_name)
607
- bg_eval = getattr(self.background, eval_func_name)
608
-
609
- if field_eval is None or bg_eval is None:
610
- return None
611
-
612
- cell_lookup = self.field.geometry.cell_lookup
613
-
614
- @cache.dynamic_func(suffix=f"{eval_func_name}_{self.name}")
615
- def eval_nc(args: self.ElementEvalArg, s: Sample):
616
- pos = self.domain.element_position(args.elt_arg, s)
617
- cell_arg = args.eval_arg.field_cell_eval_arg.elt_arg
618
- nonconforming_s = cell_lookup(cell_arg, pos, NonconformingField._LOOKUP_EPS)
619
- if nonconforming_s.element_index != NULL_ELEMENT_INDEX:
620
- if (
621
- wp.length_sq(pos - self.field.geometry.cell_position(cell_arg, nonconforming_s))
622
- <= NonconformingField._LOOKUP_EPS
623
- ):
624
- return field_eval(
625
- self.field.ElementEvalArg(cell_arg, args.eval_arg.field_cell_eval_arg.eval_arg), nonconforming_s
626
- )
627
-
628
- return bg_eval(self.background.ElementEvalArg(args.elt_arg, args.eval_arg.background_arg), s)
629
-
630
- return eval_nc
631
-
632
- def _make_eval_reference_grad(self):
633
- if self.eval_grad_inner is None:
634
- return None
635
-
636
- @cache.dynamic_func(suffix=f"{self.eval_grad_inner.key}")
637
- def eval_reference_grad_inner(args: self.ElementEvalArg, s: Sample):
638
- return self.eval_grad_inner(args, s) * self.domain.element_deformation_gradient(args.elt_arg, s)
639
-
640
- return eval_reference_grad_inner
641
-
642
- def _make_eval_arg(self):
643
- @cache.dynamic_struct(suffix=self.name)
644
- class EvalArg:
645
- field_cell_eval_arg: self.field.ElementEvalArg
646
- background_arg: self.background.EvalArg
647
-
648
- return EvalArg
649
-
650
- def _make_element_eval_arg(self):
651
- @cache.dynamic_struct(suffix=self.name)
652
- class ElementEvalArg:
653
- elt_arg: self.domain.ElementArg
654
- eval_arg: self.EvalArg
655
-
656
- return ElementEvalArg
657
-
658
- def _make_eval_degree(self):
659
- @cache.dynamic_func(suffix=self.name)
660
- def degree(args: self.ElementEvalArg):
661
- return self.field.eval_degree(args.eval_arg.field_cell_eval_arg)
662
-
663
- return degree
664
-
665
- def trace(self):
666
- if self.element_kind == ElementKind.SIDE:
667
- raise RuntimeError("Trace only available for field defined on cell elements")
668
-
669
- return NonconformingField(
670
- domain=Sides(self.domain.geometry_partition), field=self.field, background=self.background.trace()
671
- )
26
+ return get_deprecated_api(_field, "wp.fem.field", name)
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,20 +13,9 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- from .adaptive_nanogrid import AdaptiveNanogrid
17
- from .deformed_geometry import DeformedGeometry
18
- from .element import Element
19
- from .geometry import Geometry
20
- from .grid_2d import Grid2D
21
- from .grid_3d import Grid3D
22
- from .hexmesh import Hexmesh
23
- from .nanogrid import Nanogrid
24
- from .partition import (
25
- ExplicitGeometryPartition,
26
- GeometryPartition,
27
- LinearGeometryPartition,
28
- WholeGeometryPartition,
29
- )
30
- from .quadmesh import Quadmesh, Quadmesh2D, Quadmesh3D
31
- from .tetmesh import Tetmesh
32
- from .trimesh import Trimesh, Trimesh2D, Trimesh3D
16
+ # isort: skip_file
17
+
18
+ from . import closest_point as closest_point
19
+
20
+ from warp._src.fem.geometry import DeformedGeometry as DeformedGeometry
21
+ from warp._src.fem.geometry import WholeGeometryPartition as WholeGeometryPartition