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

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.dll +0 -0
  92. warp/bin/warp.dll +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
@@ -15,22 +15,11 @@
15
15
 
16
16
  from typing import Optional
17
17
 
18
- import numpy as np
19
-
20
18
  import warp as wp
21
- from warp.fem import cache, utils
22
- from warp.fem.types import OUTSIDE, Coords, ElementIndex, Sample, make_free_sample
23
-
24
- from .element import Cube, Square
25
- from .geometry import Geometry
26
- from .nanogrid import (
27
- Nanogrid,
28
- _add_axis_flag,
29
- _build_node_grid,
30
- _extract_axis_flag,
31
- _get_boundary_mask,
32
- _make_face_flags,
33
- )
19
+ from warp._src.fem import cache, utils
20
+ from warp._src.fem.types import OUTSIDE, Coords, ElementIndex, Sample, make_free_sample
21
+
22
+ from .nanogrid import NanogridBase
34
23
 
35
24
  _FACE_LEVEL_BIT = wp.constant(wp.uint8(4)) # follows nanogrid.FACE_OUTER_OFFSET_BIT
36
25
  _GRID_LEVEL_BIT = wp.constant(wp.int32(19)) # follows nanogrid.GRID_AXIS_FLAG
@@ -57,7 +46,7 @@ class AdaptiveNanogridSideArg:
57
46
  face_areas: wp.vec3
58
47
 
59
48
 
60
- class AdaptiveNanogrid(Geometry):
49
+ class AdaptiveNanogrid(NanogridBase):
61
50
  """Adaptive sparse grid"""
62
51
 
63
52
  dimension = 3
@@ -86,61 +75,24 @@ class AdaptiveNanogrid(Geometry):
86
75
  raise ValueError("Too many refinement levels, max 8 supported")
87
76
 
88
77
  self.level_count = level_count
89
- self._cell_grid = cell_grid
90
78
  self._cell_level = cell_level
91
79
 
92
- device = self._cell_grid.device
93
- self._cell_ijk = wp.array(dtype=wp.vec3i, shape=(cell_grid.get_voxel_count(),), device=device)
94
- self._cell_grid.get_voxels(out=self._cell_ijk)
95
- self._cell_grid_info = self._cell_grid.get_grid_info()
80
+ device = cell_grid.device
81
+ cell_ijk = wp.array(dtype=wp.vec3i, shape=(cell_grid.get_voxel_count(),), device=device)
82
+ cell_grid.get_voxels(out=cell_ijk)
96
83
 
97
- self._node_grid = _build_node_grid(self._cell_ijk, self._cell_level, self._cell_grid, temporary_store)
98
- node_count = self._node_grid.get_voxel_count()
99
- self._node_ijk = wp.array(shape=(node_count,), dtype=wp.vec3i, device=device)
100
- self._node_grid.get_voxels(out=self._node_ijk)
84
+ node_grid = _build_node_grid(cell_ijk, cell_level, cell_grid, temporary_store)
85
+ node_count = node_grid.get_voxel_count()
86
+ node_ijk = wp.array(shape=(node_count,), dtype=wp.vec3i, device=device)
87
+ node_grid.get_voxels(out=node_ijk)
101
88
 
102
- self._face_grid = None
103
- self._face_ijk = None
89
+ super().__init__(cell_grid, cell_ijk, node_grid, node_ijk)
104
90
 
105
91
  self._stacked_edge_grid = None
106
92
  self._stacked_edge_count = 0
107
93
  self._stacked_face_grid = None
108
94
  self._stacked_face_count = 0
109
95
 
110
- transform = self.transform
111
- self._inverse_transform = wp.mat33f(np.linalg.inv(transform))
112
- self._cell_volume = abs(np.linalg.det(transform))
113
- self._face_areas = wp.vec3(
114
- tuple(np.linalg.norm(np.cross(transform[:, k - 2], transform[:, k - 1])) for k in range(3))
115
- )
116
-
117
- @property
118
- def cell_grid(self) -> wp.Volume:
119
- return self._cell_grid
120
-
121
- @property
122
- def vertex_grid(self) -> wp.Volume:
123
- return self._node_grid
124
-
125
- @property
126
- def face_grid(self) -> wp.Volume:
127
- self._ensure_face_grid()
128
- return self._face_grid
129
-
130
- def cell_count(self):
131
- return self._cell_ijk.shape[0]
132
-
133
- def vertex_count(self):
134
- return self._node_ijk.shape[0]
135
-
136
- def side_count(self):
137
- self._ensure_face_grid()
138
- return self._face_ijk.shape[0]
139
-
140
- def boundary_side_count(self):
141
- self._ensure_face_grid()
142
- return self._boundary_face_indices.shape[0]
143
-
144
96
  @property
145
97
  def stacked_face_grid(self) -> wp.Volume:
146
98
  self._ensure_stacked_face_grid()
@@ -159,24 +111,8 @@ class AdaptiveNanogrid(Geometry):
159
111
  self._ensure_stacked_edge_grid()
160
112
  return self._stacked_edge_count
161
113
 
162
- def reference_cell(self) -> Cube:
163
- return Cube()
164
-
165
- def reference_side(self) -> Square:
166
- return Square()
167
-
168
- @property
169
- def transform(self):
170
- return np.array(self._cell_grid_info.transform_matrix).reshape(3, 3)
171
-
172
114
  CellArg = AdaptiveNanogridCellArg
173
115
 
174
- @cache.cached_arg_value
175
- def cell_arg_value(self, device) -> CellArg:
176
- args = self.CellArg()
177
- self.fill_cell_arg(args, device)
178
- return args
179
-
180
116
  def fill_cell_arg(self, arg: CellArg, device):
181
117
  arg.cell_grid = self._cell_grid.id
182
118
  arg.cell_ijk = self._cell_ijk
@@ -242,9 +178,6 @@ class AdaptiveNanogrid(Geometry):
242
178
  dist, coords = AdaptiveNanogrid._cell_closest_point_local(args, cell_index, uvw)
243
179
  return coords, dist
244
180
 
245
- def make_filtered_cell_lookup(self, filter_func: wp.Function = None):
246
- return Nanogrid._make_filtered_cell_lookup(self, filter_func)
247
-
248
181
  @wp.func
249
182
  def cell_measure(args: CellArg, s: Sample):
250
183
  scale = AdaptiveNanogrid._cell_scale(args, s.element_index)
@@ -254,23 +187,12 @@ class AdaptiveNanogrid(Geometry):
254
187
  def cell_normal(args: CellArg, s: Sample):
255
188
  return wp.vec3(0.0)
256
189
 
257
- SideIndexArg = Nanogrid.SideIndexArg
258
- side_index_arg_value = Nanogrid.side_index_arg_value
259
- fill_side_index_arg = Nanogrid.fill_side_index_arg
260
-
261
190
  SideArg = AdaptiveNanogridSideArg
262
191
 
263
192
  @wp.func
264
193
  def side_to_cell_arg(side_arg: SideArg):
265
194
  return side_arg.cell_arg
266
195
 
267
- @cache.cached_arg_value
268
- def side_arg_value(self, device) -> SideArg:
269
- args = self.SideArg()
270
- self.fill_side_arg(args, device)
271
-
272
- return args
273
-
274
196
  def fill_side_arg(self, arg: SideArg, device):
275
197
  self._ensure_face_grid()
276
198
 
@@ -280,10 +202,6 @@ class AdaptiveNanogrid(Geometry):
280
202
  arg.face_cell_indices = self._face_cell_indices.to(device)
281
203
  arg.face_areas = self._face_areas
282
204
 
283
- @wp.func
284
- def boundary_side_index(args: SideIndexArg, boundary_side_index: int):
285
- return args.boundary_face_indices[boundary_side_index]
286
-
287
205
  @wp.func
288
206
  def _get_face_level(flags: wp.uint8):
289
207
  return wp.int32(flags >> _FACE_LEVEL_BIT)
@@ -296,11 +214,11 @@ class AdaptiveNanogrid(Geometry):
296
214
  def side_position(args: SideArg, s: Sample):
297
215
  ijk = args.face_ijk[s.element_index]
298
216
  flags = args.face_flags[s.element_index]
299
- axis = Nanogrid._get_face_axis(flags)
300
- flip = Nanogrid._get_face_inner_offset(flags)
217
+ axis = NanogridBase._get_face_axis(flags)
218
+ flip = NanogridBase._get_face_inner_offset(flags)
301
219
  scale = AdaptiveNanogrid._get_face_scale(flags)
302
220
 
303
- uvw = wp.vec3(ijk) + scale * Nanogrid._side_to_cell_coords(axis, flip, 0.0, s.element_coords)
221
+ uvw = wp.vec3(ijk) + scale * NanogridBase._side_to_cell_coords(axis, flip, 0.0, s.element_coords)
304
222
 
305
223
  cell_grid = args.cell_arg.cell_grid
306
224
  return wp.volume_index_to_world(cell_grid, uvw - wp.vec3(0.5))
@@ -308,10 +226,10 @@ class AdaptiveNanogrid(Geometry):
308
226
  @wp.func
309
227
  def side_deformation_gradient(args: SideArg, s: Sample):
310
228
  flags = args.face_flags[s.element_index]
311
- axis = Nanogrid._get_face_axis(flags)
312
- flip = Nanogrid._get_face_inner_offset(flags)
229
+ axis = NanogridBase._get_face_axis(flags)
230
+ flip = NanogridBase._get_face_inner_offset(flags)
313
231
  scale = AdaptiveNanogrid._get_face_scale(flags)
314
- v1, v2 = Nanogrid._face_tangent_vecs(args.cell_arg.cell_grid, axis, flip)
232
+ v1, v2 = NanogridBase._face_tangent_vecs(args.cell_arg.cell_grid, axis, flip)
315
233
  return wp.matrix_from_cols(v1, v2) * scale
316
234
 
317
235
  @wp.func
@@ -327,24 +245,24 @@ class AdaptiveNanogrid(Geometry):
327
245
  @wp.func
328
246
  def side_measure(args: SideArg, s: Sample):
329
247
  flags = args.face_flags[s.element_index]
330
- axis = Nanogrid._get_face_axis(flags)
248
+ axis = NanogridBase._get_face_axis(flags)
331
249
  scale = AdaptiveNanogrid._get_face_scale(flags)
332
250
  return args.face_areas[axis] * scale * scale
333
251
 
334
252
  @wp.func
335
253
  def side_measure_ratio(args: SideArg, s: Sample):
336
254
  flags = args.face_flags[s.element_index]
337
- axis = Nanogrid._get_face_axis(flags)
255
+ axis = NanogridBase._get_face_axis(flags)
338
256
  scale = AdaptiveNanogrid._get_face_scale(flags)
339
257
  return args.face_areas[axis] / (args.cell_arg.cell_volume * scale)
340
258
 
341
259
  @wp.func
342
260
  def side_normal(args: SideArg, s: Sample):
343
261
  flags = args.face_flags[s.element_index]
344
- axis = Nanogrid._get_face_axis(flags)
345
- flip = Nanogrid._get_face_inner_offset(flags)
262
+ axis = NanogridBase._get_face_axis(flags)
263
+ flip = NanogridBase._get_face_inner_offset(flags)
346
264
 
347
- v1, v2 = Nanogrid._face_tangent_vecs(args.cell_arg.cell_grid, axis, flip)
265
+ v1, v2 = NanogridBase._face_tangent_vecs(args.cell_arg.cell_grid, axis, flip)
348
266
  return wp.cross(v1, v2) / args.face_areas[axis]
349
267
 
350
268
  @wp.func
@@ -368,11 +286,11 @@ class AdaptiveNanogrid(Geometry):
368
286
  @wp.func
369
287
  def side_inner_cell_coords(args: SideArg, side_index: ElementIndex, side_coords: Coords):
370
288
  flags = args.face_flags[side_index]
371
- axis = Nanogrid._get_face_axis(flags)
372
- flip = Nanogrid._get_face_inner_offset(flags)
373
- offset = Nanogrid._get_face_inner_offset(flags)
289
+ axis = NanogridBase._get_face_axis(flags)
290
+ flip = NanogridBase._get_face_inner_offset(flags)
291
+ offset = NanogridBase._get_face_inner_offset(flags)
374
292
 
375
- same_level_cell_coords = Nanogrid._side_to_cell_coords(axis, flip, 1.0 - float(offset), side_coords)
293
+ same_level_cell_coords = NanogridBase._side_to_cell_coords(axis, flip, 1.0 - float(offset), side_coords)
376
294
  same_level_cell_ijk = args.face_ijk[side_index]
377
295
  side_level = AdaptiveNanogrid._get_face_level(flags)
378
296
  same_level_cell_ijk[axis] += (offset - 1) << side_level
@@ -388,11 +306,11 @@ class AdaptiveNanogrid(Geometry):
388
306
  @wp.func
389
307
  def side_outer_cell_coords(args: SideArg, side_index: ElementIndex, side_coords: Coords):
390
308
  flags = args.face_flags[side_index]
391
- axis = Nanogrid._get_face_axis(flags)
392
- flip = Nanogrid._get_face_inner_offset(flags)
393
- offset = Nanogrid._get_face_outer_offset(flags)
309
+ axis = NanogridBase._get_face_axis(flags)
310
+ flip = NanogridBase._get_face_inner_offset(flags)
311
+ offset = NanogridBase._get_face_outer_offset(flags)
394
312
 
395
- same_level_cell_coords = Nanogrid._side_to_cell_coords(axis, flip, float(offset), side_coords)
313
+ same_level_cell_coords = NanogridBase._side_to_cell_coords(axis, flip, float(offset), side_coords)
396
314
  same_level_cell_ijk = args.face_ijk[side_index]
397
315
  side_level = AdaptiveNanogrid._get_face_level(flags)
398
316
  same_level_cell_ijk[axis] -= offset << side_level
@@ -413,8 +331,8 @@ class AdaptiveNanogrid(Geometry):
413
331
  element_coords: Coords,
414
332
  ):
415
333
  flags = args.face_flags[side_index]
416
- axis = Nanogrid._get_face_axis(flags)
417
- flip = Nanogrid._get_face_inner_offset(flags)
334
+ axis = NanogridBase._get_face_axis(flags)
335
+ flip = NanogridBase._get_face_inner_offset(flags)
418
336
  side_level = AdaptiveNanogrid._get_face_level(flags)
419
337
  cell_level = int(args.cell_arg.cell_level[element_index])
420
338
 
@@ -431,7 +349,7 @@ class AdaptiveNanogrid(Geometry):
431
349
  and wp.max(same_level_cell_coords) <= 1.0
432
350
  )
433
351
 
434
- return wp.where(on_side, Nanogrid._cell_to_side_coords(axis, flip, same_level_cell_coords), Coords(OUTSIDE))
352
+ return wp.where(on_side, NanogridBase._cell_to_side_coords(axis, flip, same_level_cell_coords), Coords(OUTSIDE))
435
353
 
436
354
  @wp.func
437
355
  def side_coordinates(args: SideArg, side_index: int, pos: wp.vec3):
@@ -442,10 +360,10 @@ class AdaptiveNanogrid(Geometry):
442
360
 
443
361
  flags = args.face_flags[side_index]
444
362
  side_level = AdaptiveNanogrid._get_face_level(flags)
445
- axis = Nanogrid._get_face_axis(flags)
446
- flip = Nanogrid._get_face_inner_offset(flags)
363
+ axis = NanogridBase._get_face_axis(flags)
364
+ flip = NanogridBase._get_face_inner_offset(flags)
447
365
 
448
- return Nanogrid._cell_to_side_coords(axis, flip, fine_cell_coords / float(1 << side_level))
366
+ return NanogridBase._cell_to_side_coords(axis, flip, fine_cell_coords / float(1 << side_level))
449
367
 
450
368
  @wp.func
451
369
  def side_closest_point(args: SideArg, side_index: int, pos: wp.vec3):
@@ -454,10 +372,12 @@ class AdaptiveNanogrid(Geometry):
454
372
  proj_coords = Coords(wp.clamp(coords[0], 0.0, 1.0), wp.clamp(coords[1], 0.0, 1.0), 0.0)
455
373
 
456
374
  flags = args.face_flags[side_index]
457
- axis = Nanogrid._get_face_axis(flags)
458
- flip = Nanogrid._get_face_inner_offset(flags)
375
+ axis = NanogridBase._get_face_axis(flags)
376
+ flip = NanogridBase._get_face_inner_offset(flags)
459
377
  side_level = AdaptiveNanogrid._get_face_level(flags)
460
- cell_coord_offset = Nanogrid._side_to_cell_coords(axis, flip, 0, coords - proj_coords) * float(1 << side_level)
378
+ cell_coord_offset = NanogridBase._side_to_cell_coords(axis, flip, 0, coords - proj_coords) * float(
379
+ 1 << side_level
380
+ )
461
381
 
462
382
  return proj_coords, wp.length_sq(wp.volume_index_to_world_dir(args.cell_grid, cell_coord_offset))
463
383
 
@@ -492,16 +412,12 @@ class AdaptiveNanogrid(Geometry):
492
412
  self._face_ijk,
493
413
  self._face_cell_indices,
494
414
  self._face_flags,
495
- boundary_face_mask.array,
415
+ boundary_face_mask,
496
416
  ],
497
417
  )
498
- boundary_face_indices, _ = utils.masked_indices(boundary_face_mask.array)
418
+ boundary_face_indices, _ = utils.masked_indices(boundary_face_mask)
499
419
  self._boundary_face_indices = boundary_face_indices.detach()
500
420
 
501
- def _ensure_face_grid(self):
502
- if self._face_ijk is None:
503
- self._build_face_grid()
504
-
505
421
  def _ensure_stacked_edge_grid(self):
506
422
  if self._stacked_edge_grid is None:
507
423
  self._stacked_edge_grid = _build_stacked_edge_grid(
@@ -537,7 +453,7 @@ class AdaptiveNanogrid(Geometry):
537
453
  level_flag = ((level >> ax) & 1) << _GRID_LEVEL_BIT
538
454
  ijk[ax] = wp.where(coord < 0, coord & ~level_flag, coord | level_flag)
539
455
 
540
- return _add_axis_flag(ijk, axis)
456
+ return NanogridBase._add_axis_flag(ijk, axis)
541
457
 
542
458
  @wp.func
543
459
  def find_cell(
@@ -576,15 +492,15 @@ def _cell_face_indices(
576
492
  ):
577
493
  cell = wp.tid()
578
494
  ijk = cell_ijk[cell]
579
- node_ijk[cell, 0] = _add_axis_flag(ijk, 0)
580
- node_ijk[cell, 1] = _add_axis_flag(ijk, 1)
581
- node_ijk[cell, 2] = _add_axis_flag(ijk, 2)
495
+ node_ijk[cell, 0] = NanogridBase._add_axis_flag(ijk, 0)
496
+ node_ijk[cell, 1] = NanogridBase._add_axis_flag(ijk, 1)
497
+ node_ijk[cell, 2] = NanogridBase._add_axis_flag(ijk, 2)
582
498
 
583
499
  offset = 1 << int(cell_level[cell])
584
500
 
585
- node_ijk[cell, 3] = _add_axis_flag(ijk + wp.vec3i(offset, 0, 0), 0)
586
- node_ijk[cell, 4] = _add_axis_flag(ijk + wp.vec3i(0, offset, 0), 1)
587
- node_ijk[cell, 5] = _add_axis_flag(ijk + wp.vec3i(0, 0, offset), 2)
501
+ node_ijk[cell, 3] = NanogridBase._add_axis_flag(ijk + wp.vec3i(offset, 0, 0), 0)
502
+ node_ijk[cell, 4] = NanogridBase._add_axis_flag(ijk + wp.vec3i(0, offset, 0), 1)
503
+ node_ijk[cell, 5] = NanogridBase._add_axis_flag(ijk + wp.vec3i(0, 0, offset), 2)
588
504
 
589
505
 
590
506
  @wp.kernel
@@ -640,12 +556,12 @@ def _build_node_grid(cell_ijk, cell_level, cell_grid: wp.Volume, temporary_store
640
556
  cell_nodes = cache.borrow_temporary(temporary_store, shape=(cell_count, 8), dtype=wp.vec3i, device=cell_ijk.device)
641
557
  wp.launch(
642
558
  _cell_node_indices,
643
- dim=cell_nodes.array.shape,
644
- inputs=[cell_ijk, cell_level, cell_nodes.array],
559
+ dim=cell_nodes.shape,
560
+ inputs=[cell_ijk, cell_level, cell_nodes],
645
561
  device=cell_ijk.device,
646
562
  )
647
563
  node_grid = wp.Volume.allocate_by_voxels(
648
- cell_nodes.array.flatten(), voxel_size=cell_grid.get_voxel_size()[0], device=cell_ijk.device
564
+ cell_nodes.flatten(), voxel_size=cell_grid.get_voxel_size()[0], device=cell_ijk.device
649
565
  )
650
566
 
651
567
  return node_grid
@@ -655,11 +571,9 @@ def _build_cell_face_grid(cell_ijk, cell_level, grid: wp.Volume, temporary_store
655
571
  cell_count = cell_ijk.shape[0]
656
572
 
657
573
  cell_faces = cache.borrow_temporary(temporary_store, shape=(cell_count, 6), dtype=wp.vec3i, device=cell_ijk.device)
658
- wp.launch(
659
- _cell_face_indices, dim=cell_count, inputs=[cell_ijk, cell_level, cell_faces.array], device=cell_ijk.device
660
- )
574
+ wp.launch(_cell_face_indices, dim=cell_count, inputs=[cell_ijk, cell_level, cell_faces], device=cell_ijk.device)
661
575
  face_grid = wp.Volume.allocate_by_voxels(
662
- cell_faces.array.flatten(), voxel_size=grid.get_voxel_size()[0], device=cell_ijk.device
576
+ cell_faces.flatten(), voxel_size=grid.get_voxel_size()[0], device=cell_ijk.device
663
577
  )
664
578
 
665
579
  return face_grid
@@ -680,8 +594,8 @@ def _build_completed_face_grid(
680
594
  additional_face_count = cache.borrow_temporary(temporary_store, shape=1, dtype=int, device=device)
681
595
 
682
596
  # Count the number of supplemental faces we need to add at resolution boundaries
683
- cell_face_grid.get_voxels(out=cell_face_ijk.array)
684
- additional_face_count.array.zero_()
597
+ cell_face_grid.get_voxels(out=cell_face_ijk)
598
+ additional_face_count.zero_()
685
599
  wp.launch(
686
600
  _count_multires_faces,
687
601
  dim=cell_face_count,
@@ -690,15 +604,15 @@ def _build_completed_face_grid(
690
604
  cell_grid.id,
691
605
  level_count,
692
606
  cell_level,
693
- cell_face_ijk.array,
694
- additional_face_count.array,
607
+ cell_face_ijk,
608
+ additional_face_count,
695
609
  ],
696
610
  )
697
611
 
698
612
  # Cat these new faces with the original ones
699
- cat_face_count = cell_face_count + int(additional_face_count.array.numpy()[0])
613
+ cat_face_count = cell_face_count + int(additional_face_count.numpy()[0])
700
614
  cat_face_ijk = cache.borrow_temporary(temporary_store, shape=(cat_face_count,), dtype=wp.vec3i, device=device)
701
- wp.copy(src=cell_face_ijk.array, dest=cat_face_ijk.array, dest_offset=cat_face_count - cell_face_count)
615
+ wp.copy(src=cell_face_ijk, dest=cat_face_ijk, dest_offset=cat_face_count - cell_face_count)
702
616
 
703
617
  wp.launch(
704
618
  _fill_multires_faces,
@@ -708,15 +622,15 @@ def _build_completed_face_grid(
708
622
  cell_grid.id,
709
623
  level_count,
710
624
  cell_level,
711
- cell_face_ijk.array,
712
- additional_face_count.array,
713
- cat_face_ijk.array,
625
+ cell_face_ijk,
626
+ additional_face_count,
627
+ cat_face_ijk,
714
628
  ],
715
629
  )
716
630
 
717
631
  # Now recreate a new grid with all those faces
718
632
  face_grid = wp.Volume.allocate_by_voxels(
719
- cat_face_ijk.array.flatten(), voxel_size=cell_face_grid.get_voxel_size(), device=device
633
+ cat_face_ijk.flatten(), voxel_size=cell_face_grid.get_voxel_size(), device=device
720
634
  )
721
635
 
722
636
  return face_grid
@@ -729,11 +643,11 @@ def _build_stacked_face_grid(cell_ijk, cell_level, grid: wp.Volume, temporary_st
729
643
  wp.launch(
730
644
  _cell_stacked_face_indices,
731
645
  dim=cell_count,
732
- inputs=[cell_ijk, cell_level, cell_faces.array],
646
+ inputs=[cell_ijk, cell_level, cell_faces],
733
647
  device=cell_ijk.device,
734
648
  )
735
649
  face_grid = wp.Volume.allocate_by_voxels(
736
- cell_faces.array.flatten(), voxel_size=grid.get_voxel_size()[0], device=cell_ijk.device
650
+ cell_faces.flatten(), voxel_size=grid.get_voxel_size()[0], device=cell_ijk.device
737
651
  )
738
652
 
739
653
  return face_grid
@@ -746,11 +660,11 @@ def _build_stacked_edge_grid(cell_ijk, cell_level, grid: wp.Volume, temporary_st
746
660
  wp.launch(
747
661
  _cell_stacked_edge_indices,
748
662
  dim=cell_count,
749
- inputs=[cell_ijk, cell_level, cell_edges.array],
663
+ inputs=[cell_ijk, cell_level, cell_edges],
750
664
  device=cell_ijk.device,
751
665
  )
752
666
  edge_grid = wp.Volume.allocate_by_voxels(
753
- cell_edges.array.flatten(), voxel_size=grid.get_voxel_size()[0], device=cell_ijk.device
667
+ cell_edges.flatten(), voxel_size=grid.get_voxel_size()[0], device=cell_ijk.device
754
668
  )
755
669
 
756
670
  return edge_grid
@@ -782,7 +696,7 @@ def _count_multires_faces(
782
696
  ):
783
697
  face = wp.tid()
784
698
 
785
- axis, ijk = _extract_axis_flag(face_ijk[face])
699
+ axis, ijk = NanogridBase._extract_axis_flag(face_ijk[face])
786
700
 
787
701
  plus_cell_index, minus_cell_index = _find_face_neighbours(cell_grid, ijk, axis, level_count, cell_level)
788
702
 
@@ -809,7 +723,7 @@ def _fill_multires_faces(
809
723
  ):
810
724
  face = wp.tid()
811
725
 
812
- axis, ijk = _extract_axis_flag(face_ijk[face])
726
+ axis, ijk = NanogridBase._extract_axis_flag(face_ijk[face])
813
727
  plus_cell_index, minus_cell_index = _find_face_neighbours(cell_grid, ijk, axis, level_count, cell_level)
814
728
 
815
729
  if plus_cell_index == -1 or minus_cell_index == -1:
@@ -834,7 +748,7 @@ def _fill_multires_faces(
834
748
  f_ijk = base_ijk
835
749
  f_ijk[(axis + 1) % 3] |= (f & side_mask) << fine_level
836
750
  f_ijk[(axis + 2) % 3] |= (f >> level_diff) << fine_level
837
- added_ijk[offset + f] = _add_axis_flag(f_ijk, axis)
751
+ added_ijk[offset + f] = NanogridBase._add_axis_flag(f_ijk, axis)
838
752
 
839
753
 
840
754
  @wp.kernel
@@ -849,7 +763,7 @@ def _build_face_indices_and_flags(
849
763
  ):
850
764
  face = wp.tid()
851
765
 
852
- axis, ijk = _extract_axis_flag(face_ijk[face])
766
+ axis, ijk = NanogridBase._extract_axis_flag(face_ijk[face])
853
767
 
854
768
  plus_cell_index, minus_cell_index = _find_face_neighbours(cell_grid, ijk, axis, level_count, cell_level)
855
769
 
@@ -859,8 +773,8 @@ def _build_face_indices_and_flags(
859
773
  face_level = wp.min(cell_level[inner_cell], cell_level[outer_cell])
860
774
 
861
775
  face_ijk[face] = ijk
862
- flags = _make_face_flags(axis, plus_cell_index, minus_cell_index) | (face_level << _FACE_LEVEL_BIT)
776
+ flags = NanogridBase._make_face_flags(axis, plus_cell_index, minus_cell_index) | (face_level << _FACE_LEVEL_BIT)
863
777
  face_flags[face] = flags
864
- boundary_face_mask[face] = _get_boundary_mask(flags)
778
+ boundary_face_mask[face] = NanogridBase._get_boundary_mask(flags)
865
779
 
866
780
  face_cell_indices[face] = wp.vec2i(inner_cell, outer_cell)
@@ -0,0 +1,97 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from typing import Any
17
+
18
+ import warp as wp
19
+ from warp._src.fem.types import Coords
20
+
21
+
22
+ @wp.func
23
+ def project_on_seg_at_origin(q: Any, seg: Any, len_sq: float):
24
+ s = wp.clamp(wp.dot(q, seg) / len_sq, 0.0, 1.0)
25
+ return wp.length_sq(q - s * seg), s
26
+
27
+
28
+ @wp.func
29
+ def project_on_tri_at_origin(q: Any, e1: Any, e2: Any):
30
+ e1e1 = wp.dot(e1, e1)
31
+ e1e2 = wp.dot(e1, e2)
32
+ e2e2 = wp.dot(e2, e2)
33
+
34
+ det = e1e1 * e2e2 - e1e2 * e1e2
35
+
36
+ if det > e1e1 * e2e2 * 1.0e-6:
37
+ e1p = wp.dot(e1, q)
38
+ e2p = wp.dot(e2, q)
39
+
40
+ s = (e2e2 * e1p - e1e2 * e2p) / det
41
+ t = (e1e1 * e2p - e1e2 * e1p) / det
42
+
43
+ if s >= 0.0 and t >= 0.0 and s + t <= 1.0:
44
+ # point inside triangle (distance can be non-zero in 3D case)
45
+ return wp.length_sq(q - s * e1 - t * e2), Coords(1.0 - s - t, s, t)
46
+
47
+ d1, s1 = project_on_seg_at_origin(q, e1, e1e1)
48
+ d2, s2 = project_on_seg_at_origin(q, e2, e2e2)
49
+ d12, s12 = project_on_seg_at_origin(q - e1, e2 - e1, wp.length_sq(e2 - e1))
50
+
51
+ if d1 <= d2:
52
+ if d1 <= d12:
53
+ return d1, Coords(1.0 - s1, s1, 0.0)
54
+ elif d2 <= d12:
55
+ return d2, Coords(1.0 - s2, 0.0, s2)
56
+
57
+ return d12, Coords(0.0, 1.0 - s12, s12)
58
+
59
+
60
+ @wp.func
61
+ def project_on_tet_at_origin(q: wp.vec3, e1: wp.vec3, e2: wp.vec3, e3: wp.vec3):
62
+ mat = wp.inverse(wp.matrix_from_cols(e1, e2, e3))
63
+ coords = mat * q
64
+
65
+ if wp.min(coords) >= 0.0 and coords[0] + coords[1] + coords[2] <= 1.0:
66
+ return 0.0, coords
67
+
68
+ # Not inside tet, compare closest point on each tri
69
+
70
+ d12, s12 = project_on_tri_at_origin(q, e1, e2)
71
+ d23, s23 = project_on_tri_at_origin(q, e2, e3)
72
+ d31, s31 = project_on_tri_at_origin(q, e3, e1)
73
+ d123, s123 = project_on_tri_at_origin(q - e1, e2 - e1, e3 - e1)
74
+
75
+ dmin = wp.min(wp.vec4(d12, d23, d31, d123))
76
+
77
+ if dmin == d12:
78
+ return dmin, Coords(s12[1], s12[2], 0.0)
79
+ elif dmin == d23:
80
+ return dmin, Coords(0.0, s23[1], s23[2])
81
+ elif dmin == d31:
82
+ return dmin, Coords(s31[2], 0.0, s31[1])
83
+ else:
84
+ return dmin, s123
85
+
86
+
87
+ @wp.func
88
+ def project_on_box_at_origin(coords: wp.vec3, sizes: wp.vec3):
89
+ proj_coords = wp.min(wp.max(coords, wp.vec3(0.0)), sizes)
90
+ return wp.length_sq(coords - proj_coords), wp.cw_div(proj_coords, sizes)
91
+
92
+
93
+ @wp.func
94
+ def project_on_box_at_origin(coords: wp.vec2, sizes: wp.vec2):
95
+ proj_coords = wp.min(wp.max(coords, wp.vec2(0.0)), sizes)
96
+ norm_coords = wp.cw_div(proj_coords, sizes)
97
+ return wp.length_sq(coords - proj_coords), Coords(norm_coords[0], norm_coords[1], 0.0)
@@ -16,9 +16,10 @@
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
 
@@ -54,16 +55,17 @@ class DeformedGeometry(Geometry):
54
55
  """Constructs a Deformed Geometry from a displacement or absolute position field defined over a base geometry.
55
56
  The deformation field does not need to be isoparameteric.
56
57
 
57
- See also: :meth:`warp.fem.DiscreteField.make_deformed_geometry`
58
+ See also: :meth:`warp.fem.GeometryField.make_deformed_geometry`
58
59
  """
59
60
 
60
- from warp.fem.field import DiscreteField, GeometryField
61
+ from warp._src.fem.field import GeometryField
61
62
 
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
- )
63
+ if field.dtype is not None and (
64
+ not type_is_vector(field.dtype) or type_size(field.dtype) != field.geometry.dimension
65
+ ):
66
+ raise ValueError(
67
+ "Invalid value type for position field, must be vector-valued with same dimension as underlying geometry"
68
+ )
67
69
  if field.eval_grad_inner is None:
68
70
  raise ValueError("Gradient evaluation is not supported on the passed field")
69
71
 
@@ -113,11 +115,6 @@ class DeformedGeometry(Geometry):
113
115
 
114
116
  return CellArg
115
117
 
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
118
  def fill_cell_arg(self, args: "DeformedGeometry.CellArg", device):
122
119
  self.base.fill_cell_arg(args.base_arg, device)
123
120
  self.field.fill_eval_arg(args.field_arg, device)
@@ -161,11 +158,6 @@ class DeformedGeometry(Geometry):
161
158
 
162
159
  return SideArg
163
160
 
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
161
  def fill_side_arg(self, args: "DeformedGeometry.SideArg", device):
170
162
  self.base.fill_side_arg(args.base_arg, device)
171
163
  self.field.fill_eval_arg(args.field_arg, device)
@@ -259,11 +251,11 @@ class DeformedGeometry(Geometry):
259
251
  return cell_bvh_id
260
252
 
261
253
  def _make_cell_bounds(self):
262
- points, _weights = self.reference_cell().instantiate_quadrature(
254
+ points, _weights = self.reference_cell().prototype.instantiate_quadrature(
263
255
  order=self.field.degree, family=Polynomial.LOBATTO_GAUSS_LEGENDRE
264
256
  )
265
257
 
266
- points = cache.cached_mat_type((len(points), 3), dtype=float)(points)
258
+ points = wp.matrix_from_rows(*points)
267
259
  point_count = len(points)
268
260
 
269
261
  @cache.dynamic_func(suffix=self.name)