warp-lang 1.9.0__py3-none-manylinux_2_34_aarch64.whl → 1.10.0__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 (350) hide show
  1. warp/__init__.py +301 -287
  2. warp/__init__.pyi +2302 -307
  3. warp/_src/__init__.py +14 -0
  4. warp/_src/autograd.py +1077 -0
  5. warp/_src/build.py +620 -0
  6. warp/_src/build_dll.py +642 -0
  7. warp/{builtins.py → _src/builtins.py} +1546 -224
  8. warp/_src/codegen.py +4361 -0
  9. warp/{config.py → _src/config.py} +178 -169
  10. warp/_src/constants.py +59 -0
  11. warp/_src/context.py +8352 -0
  12. warp/_src/dlpack.py +464 -0
  13. warp/_src/fabric.py +362 -0
  14. warp/_src/fem/__init__.py +14 -0
  15. warp/_src/fem/adaptivity.py +510 -0
  16. warp/_src/fem/cache.py +689 -0
  17. warp/_src/fem/dirichlet.py +190 -0
  18. warp/{fem → _src/fem}/domain.py +42 -30
  19. warp/_src/fem/field/__init__.py +131 -0
  20. warp/_src/fem/field/field.py +703 -0
  21. warp/{fem → _src/fem}/field/nodal_field.py +32 -15
  22. warp/{fem → _src/fem}/field/restriction.py +3 -1
  23. warp/{fem → _src/fem}/field/virtual.py +55 -27
  24. warp/_src/fem/geometry/__init__.py +32 -0
  25. warp/{fem → _src/fem}/geometry/adaptive_nanogrid.py +79 -163
  26. warp/_src/fem/geometry/closest_point.py +99 -0
  27. warp/{fem → _src/fem}/geometry/deformed_geometry.py +16 -22
  28. warp/{fem → _src/fem}/geometry/element.py +34 -10
  29. warp/{fem → _src/fem}/geometry/geometry.py +50 -20
  30. warp/{fem → _src/fem}/geometry/grid_2d.py +14 -23
  31. warp/{fem → _src/fem}/geometry/grid_3d.py +14 -23
  32. warp/{fem → _src/fem}/geometry/hexmesh.py +42 -63
  33. warp/{fem → _src/fem}/geometry/nanogrid.py +256 -247
  34. warp/{fem → _src/fem}/geometry/partition.py +123 -63
  35. warp/{fem → _src/fem}/geometry/quadmesh.py +28 -45
  36. warp/{fem → _src/fem}/geometry/tetmesh.py +42 -63
  37. warp/{fem → _src/fem}/geometry/trimesh.py +28 -45
  38. warp/{fem → _src/fem}/integrate.py +166 -158
  39. warp/_src/fem/linalg.py +385 -0
  40. warp/_src/fem/operator.py +398 -0
  41. warp/_src/fem/polynomial.py +231 -0
  42. warp/{fem → _src/fem}/quadrature/pic_quadrature.py +17 -20
  43. warp/{fem → _src/fem}/quadrature/quadrature.py +97 -47
  44. warp/_src/fem/space/__init__.py +248 -0
  45. warp/{fem → _src/fem}/space/basis_function_space.py +22 -11
  46. warp/_src/fem/space/basis_space.py +681 -0
  47. warp/{fem → _src/fem}/space/dof_mapper.py +5 -3
  48. warp/{fem → _src/fem}/space/function_space.py +16 -13
  49. warp/{fem → _src/fem}/space/grid_2d_function_space.py +6 -7
  50. warp/{fem → _src/fem}/space/grid_3d_function_space.py +6 -4
  51. warp/{fem → _src/fem}/space/hexmesh_function_space.py +6 -10
  52. warp/{fem → _src/fem}/space/nanogrid_function_space.py +5 -9
  53. warp/{fem → _src/fem}/space/partition.py +119 -60
  54. warp/{fem → _src/fem}/space/quadmesh_function_space.py +6 -10
  55. warp/{fem → _src/fem}/space/restriction.py +68 -33
  56. warp/_src/fem/space/shape/__init__.py +152 -0
  57. warp/{fem → _src/fem}/space/shape/cube_shape_function.py +11 -9
  58. warp/{fem → _src/fem}/space/shape/shape_function.py +10 -9
  59. warp/{fem → _src/fem}/space/shape/square_shape_function.py +8 -6
  60. warp/{fem → _src/fem}/space/shape/tet_shape_function.py +5 -3
  61. warp/{fem → _src/fem}/space/shape/triangle_shape_function.py +5 -3
  62. warp/{fem → _src/fem}/space/tetmesh_function_space.py +5 -9
  63. warp/_src/fem/space/topology.py +461 -0
  64. warp/{fem → _src/fem}/space/trimesh_function_space.py +5 -9
  65. warp/_src/fem/types.py +114 -0
  66. warp/_src/fem/utils.py +488 -0
  67. warp/_src/jax.py +188 -0
  68. warp/_src/jax_experimental/__init__.py +14 -0
  69. warp/_src/jax_experimental/custom_call.py +389 -0
  70. warp/_src/jax_experimental/ffi.py +1286 -0
  71. warp/_src/jax_experimental/xla_ffi.py +658 -0
  72. warp/_src/marching_cubes.py +710 -0
  73. warp/_src/math.py +416 -0
  74. warp/_src/optim/__init__.py +14 -0
  75. warp/_src/optim/adam.py +165 -0
  76. warp/_src/optim/linear.py +1608 -0
  77. warp/_src/optim/sgd.py +114 -0
  78. warp/_src/paddle.py +408 -0
  79. warp/_src/render/__init__.py +14 -0
  80. warp/_src/render/imgui_manager.py +291 -0
  81. warp/_src/render/render_opengl.py +3638 -0
  82. warp/_src/render/render_usd.py +939 -0
  83. warp/_src/render/utils.py +162 -0
  84. warp/_src/sparse.py +2718 -0
  85. warp/_src/tape.py +1208 -0
  86. warp/{thirdparty → _src/thirdparty}/unittest_parallel.py +9 -2
  87. warp/_src/torch.py +393 -0
  88. warp/_src/types.py +5888 -0
  89. warp/_src/utils.py +1695 -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 -471
  95. warp/codegen.py +6 -4246
  96. warp/constants.py +6 -39
  97. warp/context.py +12 -7851
  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 +3 -2
  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 -342
  136. warp/jax_experimental/ffi.py +17 -853
  137. warp/jax_experimental/xla_ffi.py +5 -596
  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 +316 -39
  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/sort.cu +22 -13
  159. warp/native/sort.h +2 -0
  160. warp/native/sparse.cu +7 -3
  161. warp/native/spatial.h +12 -0
  162. warp/native/tile.h +837 -70
  163. warp/native/tile_radix_sort.h +3 -3
  164. warp/native/tile_reduce.h +394 -46
  165. warp/native/tile_scan.h +4 -4
  166. warp/native/vec.h +469 -53
  167. warp/native/version.h +23 -0
  168. warp/native/volume.cpp +1 -1
  169. warp/native/volume.cu +1 -0
  170. warp/native/volume.h +1 -1
  171. warp/native/volume_builder.cu +2 -0
  172. warp/native/warp.cpp +60 -32
  173. warp/native/warp.cu +581 -280
  174. warp/native/warp.h +14 -11
  175. warp/optim/__init__.py +6 -3
  176. warp/optim/adam.py +6 -145
  177. warp/optim/linear.py +14 -1585
  178. warp/optim/sgd.py +6 -94
  179. warp/paddle.py +6 -388
  180. warp/render/__init__.py +8 -4
  181. warp/render/imgui_manager.py +7 -267
  182. warp/render/render_opengl.py +6 -3616
  183. warp/render/render_usd.py +6 -918
  184. warp/render/utils.py +6 -142
  185. warp/sparse.py +37 -2563
  186. warp/tape.py +6 -1188
  187. warp/tests/__main__.py +1 -1
  188. warp/tests/cuda/test_async.py +4 -4
  189. warp/tests/cuda/test_conditional_captures.py +1 -1
  190. warp/tests/cuda/test_multigpu.py +1 -1
  191. warp/tests/cuda/test_streams.py +58 -1
  192. warp/tests/geometry/test_bvh.py +157 -22
  193. warp/tests/geometry/test_hash_grid.py +38 -0
  194. warp/tests/geometry/test_marching_cubes.py +0 -1
  195. warp/tests/geometry/test_mesh.py +5 -3
  196. warp/tests/geometry/test_mesh_query_aabb.py +5 -12
  197. warp/tests/geometry/test_mesh_query_point.py +5 -2
  198. warp/tests/geometry/test_mesh_query_ray.py +15 -3
  199. warp/tests/geometry/test_volume_write.py +5 -5
  200. warp/tests/interop/test_dlpack.py +18 -17
  201. warp/tests/interop/test_jax.py +1382 -79
  202. warp/tests/interop/test_paddle.py +1 -1
  203. warp/tests/test_adam.py +0 -1
  204. warp/tests/test_arithmetic.py +9 -9
  205. warp/tests/test_array.py +580 -100
  206. warp/tests/test_array_reduce.py +3 -3
  207. warp/tests/test_atomic.py +12 -8
  208. warp/tests/test_atomic_bitwise.py +209 -0
  209. warp/tests/test_atomic_cas.py +4 -4
  210. warp/tests/test_bool.py +2 -2
  211. warp/tests/test_builtins_resolution.py +5 -571
  212. warp/tests/test_codegen.py +34 -15
  213. warp/tests/test_conditional.py +1 -1
  214. warp/tests/test_context.py +6 -6
  215. warp/tests/test_copy.py +242 -161
  216. warp/tests/test_ctypes.py +3 -3
  217. warp/tests/test_devices.py +24 -2
  218. warp/tests/test_examples.py +16 -84
  219. warp/tests/test_fabricarray.py +35 -35
  220. warp/tests/test_fast_math.py +0 -2
  221. warp/tests/test_fem.py +60 -14
  222. warp/tests/test_fixedarray.py +3 -3
  223. warp/tests/test_func.py +8 -5
  224. warp/tests/test_generics.py +1 -1
  225. warp/tests/test_indexedarray.py +24 -24
  226. warp/tests/test_intersect.py +39 -9
  227. warp/tests/test_large.py +1 -1
  228. warp/tests/test_lerp.py +3 -1
  229. warp/tests/test_linear_solvers.py +1 -1
  230. warp/tests/test_map.py +49 -4
  231. warp/tests/test_mat.py +52 -62
  232. warp/tests/test_mat_constructors.py +4 -5
  233. warp/tests/test_mat_lite.py +1 -1
  234. warp/tests/test_mat_scalar_ops.py +121 -121
  235. warp/tests/test_math.py +34 -0
  236. warp/tests/test_module_aot.py +4 -4
  237. warp/tests/test_modules_lite.py +28 -2
  238. warp/tests/test_print.py +11 -11
  239. warp/tests/test_quat.py +93 -58
  240. warp/tests/test_runlength_encode.py +1 -1
  241. warp/tests/test_scalar_ops.py +38 -10
  242. warp/tests/test_smoothstep.py +1 -1
  243. warp/tests/test_sparse.py +126 -15
  244. warp/tests/test_spatial.py +105 -87
  245. warp/tests/test_special_values.py +6 -6
  246. warp/tests/test_static.py +7 -7
  247. warp/tests/test_struct.py +13 -2
  248. warp/tests/test_triangle_closest_point.py +48 -1
  249. warp/tests/test_tuple.py +96 -0
  250. warp/tests/test_types.py +82 -9
  251. warp/tests/test_utils.py +52 -52
  252. warp/tests/test_vec.py +29 -29
  253. warp/tests/test_vec_constructors.py +5 -5
  254. warp/tests/test_vec_scalar_ops.py +97 -97
  255. warp/tests/test_version.py +75 -0
  256. warp/tests/tile/test_tile.py +239 -0
  257. warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
  258. warp/tests/tile/test_tile_cholesky.py +7 -4
  259. warp/tests/tile/test_tile_load.py +26 -2
  260. warp/tests/tile/test_tile_mathdx.py +3 -3
  261. warp/tests/tile/test_tile_matmul.py +1 -1
  262. warp/tests/tile/test_tile_mlp.py +2 -4
  263. warp/tests/tile/test_tile_reduce.py +214 -13
  264. warp/tests/unittest_suites.py +6 -14
  265. warp/tests/unittest_utils.py +10 -9
  266. warp/tests/walkthrough_debug.py +3 -1
  267. warp/torch.py +6 -373
  268. warp/types.py +29 -5750
  269. warp/utils.py +10 -1659
  270. {warp_lang-1.9.0.dist-info → warp_lang-1.10.0.dist-info}/METADATA +47 -103
  271. warp_lang-1.10.0.dist-info/RECORD +468 -0
  272. warp_lang-1.10.0.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
  273. warp_lang-1.10.0.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
  274. warp_lang-1.10.0.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
  275. warp_lang-1.10.0.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
  276. warp_lang-1.10.0.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
  277. warp_lang-1.10.0.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
  278. warp_lang-1.10.0.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
  279. warp_lang-1.10.0.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
  280. warp_lang-1.10.0.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
  281. warp_lang-1.10.0.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
  282. warp_lang-1.10.0.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
  283. warp_lang-1.10.0.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
  284. warp_lang-1.10.0.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
  285. warp_lang-1.10.0.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
  286. warp_lang-1.10.0.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
  287. warp/examples/assets/cartpole.urdf +0 -110
  288. warp/examples/assets/crazyflie.usd +0 -0
  289. warp/examples/assets/nv_ant.xml +0 -92
  290. warp/examples/assets/nv_humanoid.xml +0 -183
  291. warp/examples/assets/quadruped.urdf +0 -268
  292. warp/examples/optim/example_bounce.py +0 -266
  293. warp/examples/optim/example_cloth_throw.py +0 -228
  294. warp/examples/optim/example_drone.py +0 -870
  295. warp/examples/optim/example_inverse_kinematics.py +0 -182
  296. warp/examples/optim/example_inverse_kinematics_torch.py +0 -191
  297. warp/examples/optim/example_softbody_properties.py +0 -400
  298. warp/examples/optim/example_spring_cage.py +0 -245
  299. warp/examples/optim/example_trajectory.py +0 -227
  300. warp/examples/sim/example_cartpole.py +0 -143
  301. warp/examples/sim/example_cloth.py +0 -225
  302. warp/examples/sim/example_cloth_self_contact.py +0 -316
  303. warp/examples/sim/example_granular.py +0 -130
  304. warp/examples/sim/example_granular_collision_sdf.py +0 -202
  305. warp/examples/sim/example_jacobian_ik.py +0 -244
  306. warp/examples/sim/example_particle_chain.py +0 -124
  307. warp/examples/sim/example_quadruped.py +0 -203
  308. warp/examples/sim/example_rigid_chain.py +0 -203
  309. warp/examples/sim/example_rigid_contact.py +0 -195
  310. warp/examples/sim/example_rigid_force.py +0 -133
  311. warp/examples/sim/example_rigid_gyroscopic.py +0 -115
  312. warp/examples/sim/example_rigid_soft_contact.py +0 -140
  313. warp/examples/sim/example_soft_body.py +0 -196
  314. warp/examples/tile/example_tile_walker.py +0 -327
  315. warp/sim/__init__.py +0 -74
  316. warp/sim/articulation.py +0 -793
  317. warp/sim/collide.py +0 -2570
  318. warp/sim/graph_coloring.py +0 -307
  319. warp/sim/import_mjcf.py +0 -791
  320. warp/sim/import_snu.py +0 -227
  321. warp/sim/import_urdf.py +0 -579
  322. warp/sim/import_usd.py +0 -898
  323. warp/sim/inertia.py +0 -357
  324. warp/sim/integrator.py +0 -245
  325. warp/sim/integrator_euler.py +0 -2000
  326. warp/sim/integrator_featherstone.py +0 -2101
  327. warp/sim/integrator_vbd.py +0 -2487
  328. warp/sim/integrator_xpbd.py +0 -3295
  329. warp/sim/model.py +0 -4821
  330. warp/sim/particles.py +0 -121
  331. warp/sim/render.py +0 -431
  332. warp/sim/utils.py +0 -431
  333. warp/tests/sim/disabled_kinematics.py +0 -244
  334. warp/tests/sim/test_cloth.py +0 -863
  335. warp/tests/sim/test_collision.py +0 -743
  336. warp/tests/sim/test_coloring.py +0 -347
  337. warp/tests/sim/test_inertia.py +0 -161
  338. warp/tests/sim/test_model.py +0 -226
  339. warp/tests/sim/test_sim_grad.py +0 -287
  340. warp/tests/sim/test_sim_grad_bounce_linear.py +0 -212
  341. warp/tests/sim/test_sim_kinematics.py +0 -98
  342. warp/thirdparty/__init__.py +0 -0
  343. warp_lang-1.9.0.dist-info/RECORD +0 -456
  344. /warp/{fem → _src/fem}/quadrature/__init__.py +0 -0
  345. /warp/{tests/sim → _src/thirdparty}/__init__.py +0 -0
  346. /warp/{thirdparty → _src/thirdparty}/appdirs.py +0 -0
  347. /warp/{thirdparty → _src/thirdparty}/dlpack.py +0 -0
  348. {warp_lang-1.9.0.dist-info → warp_lang-1.10.0.dist-info}/WHEEL +0 -0
  349. {warp_lang-1.9.0.dist-info → warp_lang-1.10.0.dist-info}/licenses/LICENSE.md +0 -0
  350. {warp_lang-1.9.0.dist-info → warp_lang-1.10.0.dist-info}/top_level.txt +0 -0
@@ -16,12 +16,15 @@
16
16
  from typing import ClassVar
17
17
 
18
18
  import warp as wp
19
- from warp.fem import cache
20
- from warp.fem.polynomial import Polynomial
21
- from warp.fem.types import Coords, ElementIndex, Sample, make_free_sample
19
+ from warp._src.fem import cache
20
+ from warp._src.fem.polynomial import Polynomial
21
+ from warp._src.fem.types import Coords, ElementIndex, Sample, make_free_sample
22
+ from warp._src.types import type_is_vector, type_size
22
23
 
23
24
  from .geometry import Geometry
24
25
 
26
+ _wp_module_name_ = "warp.fem.geometry.deformed_geometry"
27
+
25
28
  _mat32 = wp.mat(shape=(3, 2), dtype=float)
26
29
 
27
30
 
@@ -54,16 +57,17 @@ class DeformedGeometry(Geometry):
54
57
  """Constructs a Deformed Geometry from a displacement or absolute position field defined over a base geometry.
55
58
  The deformation field does not need to be isoparameteric.
56
59
 
57
- See also: :meth:`warp.fem.DiscreteField.make_deformed_geometry`
60
+ See also: :meth:`warp.fem.GeometryField.make_deformed_geometry`
58
61
  """
59
62
 
60
- from warp.fem.field import DiscreteField, GeometryField
63
+ from warp._src.fem.field import GeometryField
61
64
 
62
- if isinstance(field, DiscreteField):
63
- if not wp.types.type_is_vector(field.dtype) or wp.types.type_size(field.dtype) != field.geometry.dimension:
64
- raise ValueError(
65
- "Invalid value type for position field, must be vector-valued with same dimension as underlying geometry"
66
- )
65
+ if field.dtype is not None and (
66
+ not type_is_vector(field.dtype) or type_size(field.dtype) != field.geometry.dimension
67
+ ):
68
+ raise ValueError(
69
+ "Invalid value type for position field, must be vector-valued with same dimension as underlying geometry"
70
+ )
67
71
  if field.eval_grad_inner is None:
68
72
  raise ValueError("Gradient evaluation is not supported on the passed field")
69
73
 
@@ -113,11 +117,6 @@ class DeformedGeometry(Geometry):
113
117
 
114
118
  return CellArg
115
119
 
116
- def cell_arg_value(self, device) -> "DeformedGeometry.CellArg":
117
- args = self.CellArg()
118
- self.fill_cell_arg(args, device)
119
- return args
120
-
121
120
  def fill_cell_arg(self, args: "DeformedGeometry.CellArg", device):
122
121
  self.base.fill_cell_arg(args.base_arg, device)
123
122
  self.field.fill_eval_arg(args.field_arg, device)
@@ -161,11 +160,6 @@ class DeformedGeometry(Geometry):
161
160
 
162
161
  return SideArg
163
162
 
164
- def side_arg_value(self, device) -> "DeformedGeometry.SideArg":
165
- args = self.SideArg()
166
- self.fill_side_arg(args, device)
167
- return args
168
-
169
163
  def fill_side_arg(self, args: "DeformedGeometry.SideArg", device):
170
164
  self.base.fill_side_arg(args.base_arg, device)
171
165
  self.field.fill_eval_arg(args.field_arg, device)
@@ -259,11 +253,11 @@ class DeformedGeometry(Geometry):
259
253
  return cell_bvh_id
260
254
 
261
255
  def _make_cell_bounds(self):
262
- points, _weights = self.reference_cell().instantiate_quadrature(
256
+ points, _weights = self.reference_cell().prototype.instantiate_quadrature(
263
257
  order=self.field.degree, family=Polynomial.LOBATTO_GAUSS_LEGENDRE
264
258
  )
265
259
 
266
- points = cache.cached_mat_type((len(points), 3), dtype=float)(points)
260
+ points = wp.matrix_from_rows(*points)
267
261
  point_count = len(points)
268
262
 
269
263
  @cache.dynamic_func(suffix=self.name)
@@ -13,16 +13,40 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ from enum import IntEnum
16
17
  from typing import List, Tuple
17
18
 
18
19
  import warp as wp
19
- from warp.fem.polynomial import Polynomial, quadrature_1d
20
- from warp.fem.types import Coords
20
+ from warp._src.fem.polynomial import Polynomial, quadrature_1d
21
+ from warp._src.fem.types import Coords
21
22
 
22
- _vec1 = wp.types.vector(length=1, dtype=float)
23
+ _wp_module_name_ = "warp.fem.geometry.element"
23
24
 
25
+ _vec1 = wp.vec(length=1, dtype=float)
24
26
 
25
- class Element:
27
+
28
+ class Element(IntEnum):
29
+ """Enumeration of reference element types"""
30
+
31
+ LINE_SEGMENT = 1
32
+ SQUARE = 2
33
+ CUBE = 3
34
+ TRIANGLE = 4
35
+ TETRAHEDRON = 5
36
+
37
+ @property
38
+ def prototype(self) -> "PrototypeElement":
39
+ """Prototype element for the given element type"""
40
+ return {
41
+ Element.LINE_SEGMENT: LinearEdge,
42
+ Element.SQUARE: Square,
43
+ Element.CUBE: Cube,
44
+ Element.TRIANGLE: Triangle,
45
+ Element.TETRAHEDRON: Tetrahedron,
46
+ }[self]
47
+
48
+
49
+ class PrototypeElement:
26
50
  dimension = 0
27
51
  """Intrinsic dimension of the element"""
28
52
 
@@ -76,7 +100,7 @@ def _point_count_from_order(order: int, family: Polynomial):
76
100
  return point_count
77
101
 
78
102
 
79
- class Cube(Element):
103
+ class Cube(PrototypeElement):
80
104
  dimension = 3
81
105
 
82
106
  @staticmethod
@@ -97,7 +121,7 @@ class Cube(Element):
97
121
  return coords, weights
98
122
 
99
123
 
100
- class Square(Element):
124
+ class Square(PrototypeElement):
101
125
  dimension = 2
102
126
 
103
127
  @staticmethod
@@ -118,7 +142,7 @@ class Square(Element):
118
142
  return coords, weights
119
143
 
120
144
 
121
- class LinearEdge(Element):
145
+ class LinearEdge(PrototypeElement):
122
146
  dimension = 1
123
147
 
124
148
  @staticmethod
@@ -137,7 +161,7 @@ class LinearEdge(Element):
137
161
  return coords, weights_1d
138
162
 
139
163
 
140
- class Triangle(Element):
164
+ class Triangle(PrototypeElement):
141
165
  dimension = 2
142
166
 
143
167
  @staticmethod
@@ -492,7 +516,7 @@ class Triangle(Element):
492
516
  return Coords(-ref_delta[0] - ref_delta[1], ref_delta[0], ref_delta[1])
493
517
 
494
518
 
495
- class Tetrahedron(Element):
519
+ class Tetrahedron(PrototypeElement):
496
520
  dimension = 3
497
521
 
498
522
  @staticmethod
@@ -827,4 +851,4 @@ class Tetrahedron(Element):
827
851
  c = c - Coords(n, 0.0, n)
828
852
 
829
853
  # project on cube
830
- return Element.project(c)
854
+ return PrototypeElement.project(c)
@@ -17,11 +17,14 @@ from functools import cached_property
17
17
  from typing import Any, ClassVar
18
18
 
19
19
  import warp as wp
20
- from warp.fem import cache
21
- from warp.fem.types import NULL_ELEMENT_INDEX, OUTSIDE, Coords, ElementIndex, ElementKind, Sample, make_free_sample
20
+ from warp._src.codegen import Struct
21
+ from warp._src.fem import cache
22
+ from warp._src.fem.types import NULL_ELEMENT_INDEX, OUTSIDE, Coords, ElementIndex, ElementKind, Sample, make_free_sample
22
23
 
23
24
  from .element import Element
24
25
 
26
+ _wp_module_name_ = "warp.fem.geometry.geometry"
27
+
25
28
  _mat32 = wp.mat(shape=(3, 2), dtype=float)
26
29
 
27
30
  _NULL_BVH_ID = wp.uint64(0)
@@ -66,7 +69,7 @@ class Geometry:
66
69
  @property
67
70
  def cell_dimension(self) -> int:
68
71
  """Manifold dimension of the geometry cells"""
69
- return self.reference_cell().dimension
72
+ return self.reference_cell().prototype.dimension
70
73
 
71
74
  @property
72
75
  def base(self) -> "Geometry":
@@ -80,22 +83,27 @@ class Geometry:
80
83
  def __str__(self) -> str:
81
84
  return self.name
82
85
 
83
- CellArg: wp.codegen.Struct
86
+ CellArg: Struct
84
87
  """Structure containing arguments to be passed to device functions evaluating cell-related quantities"""
85
88
 
86
- SideArg: wp.codegen.Struct
89
+ SideArg: Struct
87
90
  """Structure containing arguments to be passed to device functions evaluating side-related quantities"""
88
91
 
89
- SideIndexArg: wp.codegen.Struct
92
+ SideIndexArg: Struct
90
93
  """Structure containing arguments to be passed to device functions for indexing sides"""
91
94
 
95
+ @cache.cached_arg_value
92
96
  def cell_arg_value(self, device) -> "Geometry.CellArg":
93
97
  """Value of the arguments to be passed to cell-related device functions"""
94
- raise NotImplementedError
98
+ args = self.CellArg()
99
+ self.fill_cell_arg(args, device)
100
+ return args
95
101
 
96
102
  def fill_cell_arg(self, args: "Geometry.CellArg", device):
97
103
  """Fill the arguments to be passed to cell-related device functions"""
98
- raise NotImplementedError
104
+ if self.cell_arg_value is __class__.cell_arg_value:
105
+ raise NotImplementedError()
106
+ args.assign(self.cell_arg_value(device))
99
107
 
100
108
  @staticmethod
101
109
  def cell_position(args: "Geometry.CellArg", s: "Sample"):
@@ -130,13 +138,31 @@ class Geometry:
130
138
  For elements with the same dimension as the embedding space, this will be zero."""
131
139
  raise NotImplementedError
132
140
 
141
+ @cache.cached_arg_value
133
142
  def side_arg_value(self, device) -> "Geometry.SideArg":
134
143
  """Value of the arguments to be passed to side-related device functions"""
135
- raise NotImplementedError
144
+ args = self.SideArg()
145
+ self.fill_side_arg(args, device)
146
+ return args
136
147
 
137
148
  def fill_side_arg(self, args: "Geometry.SideArg", device):
138
149
  """Fill the arguments to be passed to side-related device functions"""
139
- raise NotImplementedError
150
+ if self.side_arg_value is __class__.side_arg_value:
151
+ raise NotImplementedError()
152
+ args.assign(self.side_arg_value(device))
153
+
154
+ @cache.cached_arg_value
155
+ def side_index_arg_value(self, device) -> "Geometry.SideIndexArg":
156
+ """Value of the arguments to be passed to side-related device functions"""
157
+ args = self.SideIndexArg()
158
+ self.fill_side_index_arg(args, device)
159
+ return args
160
+
161
+ def fill_side_index_arg(self, args: "Geometry.SideIndexArg", device):
162
+ """Fill the arguments to be passed to side-related device functions"""
163
+ if self.side_index_arg_value is __class__.side_index_arg_value:
164
+ raise NotImplementedError()
165
+ args.assign(self.side_index_arg_value(device))
140
166
 
141
167
  @staticmethod
142
168
  def boundary_side_index(args: "Geometry.SideIndexArg", boundary_side_index: int):
@@ -269,7 +295,7 @@ class Geometry:
269
295
  return wp.normalize(Fcross)
270
296
 
271
297
  def _make_cell_measure(self):
272
- REF_MEASURE = wp.constant(self.reference_cell().measure())
298
+ REF_MEASURE = wp.constant(self.reference_cell().prototype.measure())
273
299
 
274
300
  @cache.dynamic_func(suffix=self.name)
275
301
  def cell_measure(args: self.CellArg, s: Sample):
@@ -279,7 +305,7 @@ class Geometry:
279
305
  return cell_measure
280
306
 
281
307
  def _make_cell_normal(self):
282
- cell_dim = self.reference_cell().dimension
308
+ cell_dim = self.reference_cell().prototype.dimension
283
309
  geo_dim = self.dimension
284
310
  normal_vec = wp.vec(length=geo_dim, dtype=float)
285
311
 
@@ -300,7 +326,7 @@ class Geometry:
300
326
  return None
301
327
 
302
328
  def _make_cell_inverse_deformation_gradient(self):
303
- cell_dim = self.reference_cell().dimension
329
+ cell_dim = self.reference_cell().prototype.dimension
304
330
  geo_dim = self.dimension
305
331
 
306
332
  @cache.dynamic_func(suffix=self.name)
@@ -316,7 +342,7 @@ class Geometry:
316
342
  return cell_inverse_deformation_gradient if cell_dim == geo_dim else cell_pseudoinverse_deformation_gradient
317
343
 
318
344
  def _make_side_inverse_deformation_gradient(self):
319
- side_dim = self.reference_side().dimension
345
+ side_dim = self.reference_side().prototype.dimension
320
346
  geo_dim = self.dimension
321
347
 
322
348
  if side_dim == geo_dim:
@@ -345,7 +371,7 @@ class Geometry:
345
371
  return side_pseudoinverse_deformation_gradient
346
372
 
347
373
  def _make_side_measure(self):
348
- REF_MEASURE = wp.constant(self.reference_side().measure())
374
+ REF_MEASURE = wp.constant(self.reference_side().prototype.measure())
349
375
 
350
376
  @cache.dynamic_func(suffix=self.name)
351
377
  def side_measure(args: self.SideArg, s: Sample):
@@ -370,7 +396,7 @@ class Geometry:
370
396
  return side_measure_ratio
371
397
 
372
398
  def _make_side_normal(self):
373
- side_dim = self.reference_side().dimension
399
+ side_dim = self.reference_side().prototype.dimension
374
400
  geo_dim = self.dimension
375
401
 
376
402
  @cache.dynamic_func(suffix=self.name)
@@ -407,12 +433,12 @@ class Geometry:
407
433
  pos_type = cache.cached_vec_type(self.dimension, dtype=float)
408
434
 
409
435
  if element_kind == ElementKind.CELL:
410
- ref_elt = self.reference_cell()
436
+ ref_elt = self.reference_cell().prototype
411
437
  arg_type = self.CellArg
412
438
  elt_pos = self.cell_position
413
439
  elt_inv_grad = self.cell_inverse_deformation_gradient
414
440
  else:
415
- ref_elt = self.reference_side()
441
+ ref_elt = self.reference_side().prototype
416
442
  arg_type = self.SideArg
417
443
  elt_pos = self.side_position
418
444
  elt_inv_grad = self.side_inverse_deformation_gradient
@@ -452,12 +478,12 @@ class Geometry:
452
478
  element_coordinates = self._make_element_coordinates(element_kind=element_kind, assume_linear=assume_linear)
453
479
 
454
480
  if element_kind == ElementKind.CELL:
455
- ref_elt = self.reference_cell()
481
+ ref_elt = self.reference_cell().prototype
456
482
  arg_type = self.CellArg
457
483
  elt_pos = self.cell_position
458
484
  elt_def_grad = self.cell_deformation_gradient
459
485
  else:
460
- ref_elt = self.reference_side()
486
+ ref_elt = self.reference_side().prototype
461
487
  arg_type = self.SideArg
462
488
  elt_pos = self.side_position
463
489
  elt_def_grad = self.side_deformation_gradient
@@ -636,8 +662,12 @@ class Geometry:
636
662
 
637
663
  if self._bvhs is None:
638
664
  self._bvhs = {}
665
+
639
666
  self._bvhs[device.ordinal] = wp.Bvh(lowers, uppers)
640
667
 
668
+ Geometry.cell_arg_value.invalidate(self, device)
669
+ Geometry.side_arg_value.invalidate(self, device)
670
+
641
671
  def bvh_id(self, device):
642
672
  if self._bvhs is None:
643
673
  return _NULL_BVH_ID
@@ -13,16 +13,19 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ from functools import cached_property
16
17
  from typing import Any, Optional
17
18
 
18
19
  import warp as wp
19
- from warp.fem.cache import cached_arg_value, dynamic_func
20
- from warp.fem.types import NULL_ELEMENT_INDEX, OUTSIDE, Coords, ElementIndex, Sample, make_free_sample
20
+ from warp._src.fem.cache import cached_arg_value, dynamic_func
21
+ from warp._src.fem.types import NULL_ELEMENT_INDEX, OUTSIDE, Coords, ElementIndex, Sample, make_free_sample
21
22
 
22
23
  from .closest_point import project_on_box_at_origin
23
- from .element import LinearEdge, Square
24
+ from .element import Element
24
25
  from .geometry import Geometry
25
26
 
27
+ _wp_module_name_ = "warp.fem.geometry.grid_2d"
28
+
26
29
 
27
30
  @wp.struct
28
31
  class Grid2DCellArg:
@@ -59,7 +62,7 @@ class Grid2D(Geometry):
59
62
 
60
63
  self._res = res
61
64
 
62
- @property
65
+ @cached_property
63
66
  def extents(self) -> wp.vec3:
64
67
  # Avoid using native sub due to higher over of calling builtins from Python
65
68
  return wp.vec2(
@@ -67,7 +70,7 @@ class Grid2D(Geometry):
67
70
  self.bounds_hi[1] - self.bounds_lo[1],
68
71
  )
69
72
 
70
- @property
73
+ @cached_property
71
74
  def cell_size(self) -> wp.vec2:
72
75
  ex = self.extents
73
76
  return wp.vec2(
@@ -87,11 +90,11 @@ class Grid2D(Geometry):
87
90
  def boundary_side_count(self):
88
91
  return 2 * (self.res[0] + self.res[1])
89
92
 
90
- def reference_cell(self) -> Square:
91
- return Square()
93
+ def reference_cell(self) -> Element:
94
+ return Element.SQUARE
92
95
 
93
- def reference_side(self) -> LinearEdge:
94
- return LinearEdge()
96
+ def reference_side(self) -> Element:
97
+ return Element.LINE_SEGMENT
95
98
 
96
99
  @property
97
100
  def res(self):
@@ -101,7 +104,7 @@ class Grid2D(Geometry):
101
104
  def origin(self):
102
105
  return self.bounds_lo
103
106
 
104
- @property
107
+ @cached_property
105
108
  def strides(self):
106
109
  return wp.vec2i(self.res[1], 1)
107
110
 
@@ -183,12 +186,6 @@ class Grid2D(Geometry):
183
186
 
184
187
  # Geometry device interface
185
188
 
186
- @cached_arg_value
187
- def cell_arg_value(self, device) -> CellArg:
188
- args = self.CellArg()
189
- self.fill_cell_arg(args, device)
190
- return args
191
-
192
189
  def fill_cell_arg(self, args: CellArg, device):
193
190
  args.res = self.res
194
191
  args.cell_size = self.cell_size
@@ -303,23 +300,17 @@ class Grid2D(Geometry):
303
300
  @cached_arg_value
304
301
  def side_arg_value(self, device) -> SideArg:
305
302
  args = self.SideArg()
306
- self.fill_side_arg(args, device)
307
- return args
308
-
309
- def fill_side_arg(self, args: SideArg, device):
310
303
  args.axis_offsets = wp.vec2i(
311
304
  0,
312
305
  self.res[1],
313
306
  )
314
307
  args.cell_count = self.cell_count()
315
308
  args.cell_arg = self.cell_arg_value(device)
309
+ return args
316
310
 
317
311
  def side_index_arg_value(self, device) -> SideIndexArg:
318
312
  return self.side_arg_value(device)
319
313
 
320
- def fill_side_index_arg(self, args: SideIndexArg, device):
321
- self.fill_side_arg(args, device)
322
-
323
314
  @wp.func
324
315
  def boundary_side_index(args: SideArg, boundary_side_index: int):
325
316
  """Boundary side to side index"""
@@ -13,16 +13,19 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ from functools import cached_property
16
17
  from typing import Any, Optional
17
18
 
18
19
  import warp as wp
19
- from warp.fem.cache import cached_arg_value, dynamic_func
20
- from warp.fem.types import NULL_ELEMENT_INDEX, OUTSIDE, Coords, ElementIndex, Sample, make_free_sample
20
+ from warp._src.fem.cache import cached_arg_value, dynamic_func
21
+ from warp._src.fem.types import NULL_ELEMENT_INDEX, OUTSIDE, Coords, ElementIndex, Sample, make_free_sample
21
22
 
22
23
  from .closest_point import project_on_box_at_origin
23
- from .element import Cube, Square
24
+ from .element import Element
24
25
  from .geometry import Geometry
25
26
 
27
+ _wp_module_name_ = "warp.fem.geometry.grid_3d"
28
+
26
29
 
27
30
  @wp.struct
28
31
  class Grid3DCellArg:
@@ -56,7 +59,7 @@ class Grid3D(Geometry):
56
59
 
57
60
  self._res = res
58
61
 
59
- @property
62
+ @cached_property
60
63
  def extents(self) -> wp.vec3:
61
64
  # Avoid using native sub due to higher over of calling builtins from Python
62
65
  return wp.vec3(
@@ -65,7 +68,7 @@ class Grid3D(Geometry):
65
68
  self.bounds_hi[2] - self.bounds_lo[2],
66
69
  )
67
70
 
68
- @property
71
+ @cached_property
69
72
  def cell_size(self) -> wp.vec3:
70
73
  ex = self.extents
71
74
  return wp.vec3(
@@ -97,11 +100,11 @@ class Grid3D(Geometry):
97
100
  def boundary_side_count(self):
98
101
  return 2 * (self.res[1]) * (self.res[2]) + (self.res[0]) * 2 * (self.res[2]) + (self.res[0]) * (self.res[1]) * 2
99
102
 
100
- def reference_cell(self) -> Cube:
101
- return Cube()
103
+ def reference_cell(self) -> Element:
104
+ return Element.CUBE
102
105
 
103
- def reference_side(self) -> Square:
104
- return Square()
106
+ def reference_side(self) -> Element:
107
+ return Element.SQUARE
105
108
 
106
109
  @property
107
110
  def res(self):
@@ -111,7 +114,7 @@ class Grid3D(Geometry):
111
114
  def origin(self):
112
115
  return self.bounds_lo
113
116
 
114
- @property
117
+ @cached_property
115
118
  def strides(self):
116
119
  return wp.vec3i(self.res[1] * self.res[2], self.res[2], 1)
117
120
 
@@ -223,12 +226,6 @@ class Grid3D(Geometry):
223
226
 
224
227
  # Geometry device interface
225
228
 
226
- @cached_arg_value
227
- def cell_arg_value(self, device) -> CellArg:
228
- args = self.CellArg()
229
- self.fill_cell_arg(args, device)
230
- return args
231
-
232
229
  def fill_cell_arg(self, args: CellArg, device):
233
230
  args.res = self.res
234
231
  args.origin = self.bounds_lo
@@ -348,10 +345,6 @@ class Grid3D(Geometry):
348
345
  @cached_arg_value
349
346
  def side_arg_value(self, device) -> SideArg:
350
347
  args = self.SideArg()
351
- self.fill_side_arg(args, device)
352
- return args
353
-
354
- def fill_side_arg(self, args: SideArg, device):
355
348
  axis_dims = wp.vec3i(
356
349
  self.res[1] * self.res[2],
357
350
  self.res[2] * self.res[0],
@@ -364,13 +357,11 @@ class Grid3D(Geometry):
364
357
  )
365
358
  args.cell_count = self.cell_count()
366
359
  args.cell_arg = self.cell_arg_value(device)
360
+ return args
367
361
 
368
362
  def side_index_arg_value(self, device) -> SideIndexArg:
369
363
  return self.side_arg_value(device)
370
364
 
371
- def fill_side_index_arg(self, args: SideIndexArg, device):
372
- self.fill_side_arg(args, device)
373
-
374
365
  @wp.func
375
366
  def boundary_side_index(args: SideArg, boundary_side_index: int):
376
367
  """Boundary side to side index"""