warp-lang 1.10.0__py3-none-macosx_11_0_arm64.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 (468) hide show
  1. warp/__init__.py +334 -0
  2. warp/__init__.pyi +5856 -0
  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/_src/builtins.py +10555 -0
  8. warp/_src/codegen.py +4361 -0
  9. warp/_src/config.py +178 -0
  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/_src/fem/domain.py +553 -0
  19. warp/_src/fem/field/__init__.py +131 -0
  20. warp/_src/fem/field/field.py +703 -0
  21. warp/_src/fem/field/nodal_field.py +403 -0
  22. warp/_src/fem/field/restriction.py +39 -0
  23. warp/_src/fem/field/virtual.py +1021 -0
  24. warp/_src/fem/geometry/__init__.py +32 -0
  25. warp/_src/fem/geometry/adaptive_nanogrid.py +782 -0
  26. warp/_src/fem/geometry/closest_point.py +99 -0
  27. warp/_src/fem/geometry/deformed_geometry.py +277 -0
  28. warp/_src/fem/geometry/element.py +854 -0
  29. warp/_src/fem/geometry/geometry.py +693 -0
  30. warp/_src/fem/geometry/grid_2d.py +478 -0
  31. warp/_src/fem/geometry/grid_3d.py +539 -0
  32. warp/_src/fem/geometry/hexmesh.py +956 -0
  33. warp/_src/fem/geometry/nanogrid.py +660 -0
  34. warp/_src/fem/geometry/partition.py +483 -0
  35. warp/_src/fem/geometry/quadmesh.py +597 -0
  36. warp/_src/fem/geometry/tetmesh.py +762 -0
  37. warp/_src/fem/geometry/trimesh.py +588 -0
  38. warp/_src/fem/integrate.py +2507 -0
  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/_src/fem/quadrature/__init__.py +17 -0
  43. warp/_src/fem/quadrature/pic_quadrature.py +318 -0
  44. warp/_src/fem/quadrature/quadrature.py +665 -0
  45. warp/_src/fem/space/__init__.py +248 -0
  46. warp/_src/fem/space/basis_function_space.py +499 -0
  47. warp/_src/fem/space/basis_space.py +681 -0
  48. warp/_src/fem/space/dof_mapper.py +253 -0
  49. warp/_src/fem/space/function_space.py +312 -0
  50. warp/_src/fem/space/grid_2d_function_space.py +179 -0
  51. warp/_src/fem/space/grid_3d_function_space.py +229 -0
  52. warp/_src/fem/space/hexmesh_function_space.py +255 -0
  53. warp/_src/fem/space/nanogrid_function_space.py +199 -0
  54. warp/_src/fem/space/partition.py +435 -0
  55. warp/_src/fem/space/quadmesh_function_space.py +222 -0
  56. warp/_src/fem/space/restriction.py +221 -0
  57. warp/_src/fem/space/shape/__init__.py +152 -0
  58. warp/_src/fem/space/shape/cube_shape_function.py +1107 -0
  59. warp/_src/fem/space/shape/shape_function.py +134 -0
  60. warp/_src/fem/space/shape/square_shape_function.py +928 -0
  61. warp/_src/fem/space/shape/tet_shape_function.py +829 -0
  62. warp/_src/fem/space/shape/triangle_shape_function.py +674 -0
  63. warp/_src/fem/space/tetmesh_function_space.py +270 -0
  64. warp/_src/fem/space/topology.py +461 -0
  65. warp/_src/fem/space/trimesh_function_space.py +193 -0
  66. warp/_src/fem/types.py +114 -0
  67. warp/_src/fem/utils.py +488 -0
  68. warp/_src/jax.py +188 -0
  69. warp/_src/jax_experimental/__init__.py +14 -0
  70. warp/_src/jax_experimental/custom_call.py +389 -0
  71. warp/_src/jax_experimental/ffi.py +1286 -0
  72. warp/_src/jax_experimental/xla_ffi.py +658 -0
  73. warp/_src/marching_cubes.py +710 -0
  74. warp/_src/math.py +416 -0
  75. warp/_src/optim/__init__.py +14 -0
  76. warp/_src/optim/adam.py +165 -0
  77. warp/_src/optim/linear.py +1608 -0
  78. warp/_src/optim/sgd.py +114 -0
  79. warp/_src/paddle.py +408 -0
  80. warp/_src/render/__init__.py +14 -0
  81. warp/_src/render/imgui_manager.py +291 -0
  82. warp/_src/render/render_opengl.py +3638 -0
  83. warp/_src/render/render_usd.py +939 -0
  84. warp/_src/render/utils.py +162 -0
  85. warp/_src/sparse.py +2718 -0
  86. warp/_src/tape.py +1208 -0
  87. warp/_src/thirdparty/__init__.py +0 -0
  88. warp/_src/thirdparty/appdirs.py +598 -0
  89. warp/_src/thirdparty/dlpack.py +145 -0
  90. warp/_src/thirdparty/unittest_parallel.py +676 -0
  91. warp/_src/torch.py +393 -0
  92. warp/_src/types.py +5888 -0
  93. warp/_src/utils.py +1695 -0
  94. warp/autograd.py +33 -0
  95. warp/bin/libwarp-clang.dylib +0 -0
  96. warp/bin/libwarp.dylib +0 -0
  97. warp/build.py +29 -0
  98. warp/build_dll.py +24 -0
  99. warp/codegen.py +24 -0
  100. warp/constants.py +24 -0
  101. warp/context.py +33 -0
  102. warp/dlpack.py +24 -0
  103. warp/examples/__init__.py +24 -0
  104. warp/examples/assets/bear.usd +0 -0
  105. warp/examples/assets/bunny.usd +0 -0
  106. warp/examples/assets/cube.usd +0 -0
  107. warp/examples/assets/nonuniform.usd +0 -0
  108. warp/examples/assets/nvidia_logo.png +0 -0
  109. warp/examples/assets/pixel.jpg +0 -0
  110. warp/examples/assets/rocks.nvdb +0 -0
  111. warp/examples/assets/rocks.usd +0 -0
  112. warp/examples/assets/sphere.usd +0 -0
  113. warp/examples/assets/square_cloth.usd +0 -0
  114. warp/examples/benchmarks/benchmark_api.py +389 -0
  115. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  116. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  117. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  118. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  119. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  120. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  121. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  122. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  123. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  124. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  125. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  126. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  127. warp/examples/benchmarks/benchmark_launches.py +301 -0
  128. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  129. warp/examples/benchmarks/benchmark_tile_sort.py +155 -0
  130. warp/examples/browse.py +37 -0
  131. warp/examples/core/example_cupy.py +86 -0
  132. warp/examples/core/example_dem.py +241 -0
  133. warp/examples/core/example_fluid.py +299 -0
  134. warp/examples/core/example_graph_capture.py +150 -0
  135. warp/examples/core/example_marching_cubes.py +195 -0
  136. warp/examples/core/example_mesh.py +180 -0
  137. warp/examples/core/example_mesh_intersect.py +211 -0
  138. warp/examples/core/example_nvdb.py +182 -0
  139. warp/examples/core/example_raycast.py +111 -0
  140. warp/examples/core/example_raymarch.py +205 -0
  141. warp/examples/core/example_render_opengl.py +290 -0
  142. warp/examples/core/example_sample_mesh.py +300 -0
  143. warp/examples/core/example_sph.py +411 -0
  144. warp/examples/core/example_spin_lock.py +93 -0
  145. warp/examples/core/example_torch.py +211 -0
  146. warp/examples/core/example_wave.py +269 -0
  147. warp/examples/core/example_work_queue.py +118 -0
  148. warp/examples/distributed/example_jacobi_mpi.py +506 -0
  149. warp/examples/fem/example_adaptive_grid.py +286 -0
  150. warp/examples/fem/example_apic_fluid.py +469 -0
  151. warp/examples/fem/example_burgers.py +261 -0
  152. warp/examples/fem/example_convection_diffusion.py +181 -0
  153. warp/examples/fem/example_convection_diffusion_dg.py +225 -0
  154. warp/examples/fem/example_darcy_ls_optimization.py +489 -0
  155. warp/examples/fem/example_deformed_geometry.py +172 -0
  156. warp/examples/fem/example_diffusion.py +196 -0
  157. warp/examples/fem/example_diffusion_3d.py +225 -0
  158. warp/examples/fem/example_diffusion_mgpu.py +225 -0
  159. warp/examples/fem/example_distortion_energy.py +228 -0
  160. warp/examples/fem/example_elastic_shape_optimization.py +387 -0
  161. warp/examples/fem/example_magnetostatics.py +242 -0
  162. warp/examples/fem/example_mixed_elasticity.py +293 -0
  163. warp/examples/fem/example_navier_stokes.py +263 -0
  164. warp/examples/fem/example_nonconforming_contact.py +300 -0
  165. warp/examples/fem/example_stokes.py +213 -0
  166. warp/examples/fem/example_stokes_transfer.py +262 -0
  167. warp/examples/fem/example_streamlines.py +357 -0
  168. warp/examples/fem/utils.py +1047 -0
  169. warp/examples/interop/example_jax_callable.py +146 -0
  170. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  171. warp/examples/interop/example_jax_kernel.py +232 -0
  172. warp/examples/optim/example_diffray.py +561 -0
  173. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  174. warp/examples/tile/example_tile_block_cholesky.py +502 -0
  175. warp/examples/tile/example_tile_cholesky.py +88 -0
  176. warp/examples/tile/example_tile_convolution.py +66 -0
  177. warp/examples/tile/example_tile_fft.py +55 -0
  178. warp/examples/tile/example_tile_filtering.py +113 -0
  179. warp/examples/tile/example_tile_matmul.py +85 -0
  180. warp/examples/tile/example_tile_mcgp.py +191 -0
  181. warp/examples/tile/example_tile_mlp.py +385 -0
  182. warp/examples/tile/example_tile_nbody.py +199 -0
  183. warp/fabric.py +24 -0
  184. warp/fem/__init__.py +173 -0
  185. warp/fem/adaptivity.py +26 -0
  186. warp/fem/cache.py +30 -0
  187. warp/fem/dirichlet.py +24 -0
  188. warp/fem/field/__init__.py +24 -0
  189. warp/fem/field/field.py +26 -0
  190. warp/fem/geometry/__init__.py +21 -0
  191. warp/fem/geometry/closest_point.py +31 -0
  192. warp/fem/linalg.py +38 -0
  193. warp/fem/operator.py +32 -0
  194. warp/fem/polynomial.py +29 -0
  195. warp/fem/space/__init__.py +22 -0
  196. warp/fem/space/basis_space.py +24 -0
  197. warp/fem/space/shape/__init__.py +68 -0
  198. warp/fem/space/topology.py +24 -0
  199. warp/fem/types.py +24 -0
  200. warp/fem/utils.py +32 -0
  201. warp/jax.py +29 -0
  202. warp/jax_experimental/__init__.py +29 -0
  203. warp/jax_experimental/custom_call.py +29 -0
  204. warp/jax_experimental/ffi.py +39 -0
  205. warp/jax_experimental/xla_ffi.py +24 -0
  206. warp/marching_cubes.py +24 -0
  207. warp/math.py +37 -0
  208. warp/native/array.h +1687 -0
  209. warp/native/builtin.h +2327 -0
  210. warp/native/bvh.cpp +562 -0
  211. warp/native/bvh.cu +826 -0
  212. warp/native/bvh.h +555 -0
  213. warp/native/clang/clang.cpp +541 -0
  214. warp/native/coloring.cpp +622 -0
  215. warp/native/crt.cpp +51 -0
  216. warp/native/crt.h +568 -0
  217. warp/native/cuda_crt.h +1058 -0
  218. warp/native/cuda_util.cpp +677 -0
  219. warp/native/cuda_util.h +313 -0
  220. warp/native/error.cpp +77 -0
  221. warp/native/error.h +36 -0
  222. warp/native/exports.h +2023 -0
  223. warp/native/fabric.h +246 -0
  224. warp/native/hashgrid.cpp +311 -0
  225. warp/native/hashgrid.cu +89 -0
  226. warp/native/hashgrid.h +240 -0
  227. warp/native/initializer_array.h +41 -0
  228. warp/native/intersect.h +1253 -0
  229. warp/native/intersect_adj.h +375 -0
  230. warp/native/intersect_tri.h +348 -0
  231. warp/native/mat.h +5189 -0
  232. warp/native/mathdx.cpp +93 -0
  233. warp/native/matnn.h +221 -0
  234. warp/native/mesh.cpp +266 -0
  235. warp/native/mesh.cu +406 -0
  236. warp/native/mesh.h +2097 -0
  237. warp/native/nanovdb/GridHandle.h +533 -0
  238. warp/native/nanovdb/HostBuffer.h +591 -0
  239. warp/native/nanovdb/NanoVDB.h +6246 -0
  240. warp/native/nanovdb/NodeManager.h +323 -0
  241. warp/native/nanovdb/PNanoVDB.h +3390 -0
  242. warp/native/noise.h +859 -0
  243. warp/native/quat.h +1664 -0
  244. warp/native/rand.h +342 -0
  245. warp/native/range.h +145 -0
  246. warp/native/reduce.cpp +174 -0
  247. warp/native/reduce.cu +363 -0
  248. warp/native/runlength_encode.cpp +79 -0
  249. warp/native/runlength_encode.cu +61 -0
  250. warp/native/scan.cpp +47 -0
  251. warp/native/scan.cu +55 -0
  252. warp/native/scan.h +23 -0
  253. warp/native/solid_angle.h +466 -0
  254. warp/native/sort.cpp +251 -0
  255. warp/native/sort.cu +286 -0
  256. warp/native/sort.h +35 -0
  257. warp/native/sparse.cpp +241 -0
  258. warp/native/sparse.cu +435 -0
  259. warp/native/spatial.h +1306 -0
  260. warp/native/svd.h +727 -0
  261. warp/native/temp_buffer.h +46 -0
  262. warp/native/tile.h +4124 -0
  263. warp/native/tile_radix_sort.h +1112 -0
  264. warp/native/tile_reduce.h +838 -0
  265. warp/native/tile_scan.h +240 -0
  266. warp/native/tuple.h +189 -0
  267. warp/native/vec.h +2199 -0
  268. warp/native/version.h +23 -0
  269. warp/native/volume.cpp +501 -0
  270. warp/native/volume.cu +68 -0
  271. warp/native/volume.h +970 -0
  272. warp/native/volume_builder.cu +483 -0
  273. warp/native/volume_builder.h +52 -0
  274. warp/native/volume_impl.h +70 -0
  275. warp/native/warp.cpp +1143 -0
  276. warp/native/warp.cu +4604 -0
  277. warp/native/warp.h +358 -0
  278. warp/optim/__init__.py +20 -0
  279. warp/optim/adam.py +24 -0
  280. warp/optim/linear.py +35 -0
  281. warp/optim/sgd.py +24 -0
  282. warp/paddle.py +24 -0
  283. warp/py.typed +0 -0
  284. warp/render/__init__.py +22 -0
  285. warp/render/imgui_manager.py +29 -0
  286. warp/render/render_opengl.py +24 -0
  287. warp/render/render_usd.py +24 -0
  288. warp/render/utils.py +24 -0
  289. warp/sparse.py +51 -0
  290. warp/tape.py +24 -0
  291. warp/tests/__init__.py +1 -0
  292. warp/tests/__main__.py +4 -0
  293. warp/tests/assets/curlnoise_golden.npy +0 -0
  294. warp/tests/assets/mlp_golden.npy +0 -0
  295. warp/tests/assets/pixel.npy +0 -0
  296. warp/tests/assets/pnoise_golden.npy +0 -0
  297. warp/tests/assets/spiky.usd +0 -0
  298. warp/tests/assets/test_grid.nvdb +0 -0
  299. warp/tests/assets/test_index_grid.nvdb +0 -0
  300. warp/tests/assets/test_int32_grid.nvdb +0 -0
  301. warp/tests/assets/test_vec_grid.nvdb +0 -0
  302. warp/tests/assets/torus.nvdb +0 -0
  303. warp/tests/assets/torus.usda +105 -0
  304. warp/tests/aux_test_class_kernel.py +34 -0
  305. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  306. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  307. warp/tests/aux_test_dependent.py +29 -0
  308. warp/tests/aux_test_grad_customs.py +29 -0
  309. warp/tests/aux_test_instancing_gc.py +26 -0
  310. warp/tests/aux_test_module_aot.py +7 -0
  311. warp/tests/aux_test_module_unload.py +23 -0
  312. warp/tests/aux_test_name_clash1.py +40 -0
  313. warp/tests/aux_test_name_clash2.py +40 -0
  314. warp/tests/aux_test_reference.py +9 -0
  315. warp/tests/aux_test_reference_reference.py +8 -0
  316. warp/tests/aux_test_square.py +16 -0
  317. warp/tests/aux_test_unresolved_func.py +22 -0
  318. warp/tests/aux_test_unresolved_symbol.py +22 -0
  319. warp/tests/cuda/__init__.py +0 -0
  320. warp/tests/cuda/test_async.py +676 -0
  321. warp/tests/cuda/test_conditional_captures.py +1147 -0
  322. warp/tests/cuda/test_ipc.py +124 -0
  323. warp/tests/cuda/test_mempool.py +233 -0
  324. warp/tests/cuda/test_multigpu.py +169 -0
  325. warp/tests/cuda/test_peer.py +139 -0
  326. warp/tests/cuda/test_pinned.py +84 -0
  327. warp/tests/cuda/test_streams.py +691 -0
  328. warp/tests/geometry/__init__.py +0 -0
  329. warp/tests/geometry/test_bvh.py +335 -0
  330. warp/tests/geometry/test_hash_grid.py +259 -0
  331. warp/tests/geometry/test_marching_cubes.py +294 -0
  332. warp/tests/geometry/test_mesh.py +318 -0
  333. warp/tests/geometry/test_mesh_query_aabb.py +392 -0
  334. warp/tests/geometry/test_mesh_query_point.py +935 -0
  335. warp/tests/geometry/test_mesh_query_ray.py +323 -0
  336. warp/tests/geometry/test_volume.py +1103 -0
  337. warp/tests/geometry/test_volume_write.py +346 -0
  338. warp/tests/interop/__init__.py +0 -0
  339. warp/tests/interop/test_dlpack.py +730 -0
  340. warp/tests/interop/test_jax.py +1673 -0
  341. warp/tests/interop/test_paddle.py +800 -0
  342. warp/tests/interop/test_torch.py +1001 -0
  343. warp/tests/run_coverage_serial.py +39 -0
  344. warp/tests/test_adam.py +162 -0
  345. warp/tests/test_arithmetic.py +1096 -0
  346. warp/tests/test_array.py +3756 -0
  347. warp/tests/test_array_reduce.py +156 -0
  348. warp/tests/test_assert.py +303 -0
  349. warp/tests/test_atomic.py +336 -0
  350. warp/tests/test_atomic_bitwise.py +209 -0
  351. warp/tests/test_atomic_cas.py +312 -0
  352. warp/tests/test_bool.py +220 -0
  353. warp/tests/test_builtins_resolution.py +732 -0
  354. warp/tests/test_closest_point_edge_edge.py +327 -0
  355. warp/tests/test_codegen.py +974 -0
  356. warp/tests/test_codegen_instancing.py +1495 -0
  357. warp/tests/test_compile_consts.py +215 -0
  358. warp/tests/test_conditional.py +298 -0
  359. warp/tests/test_context.py +35 -0
  360. warp/tests/test_copy.py +319 -0
  361. warp/tests/test_ctypes.py +618 -0
  362. warp/tests/test_dense.py +73 -0
  363. warp/tests/test_devices.py +127 -0
  364. warp/tests/test_enum.py +136 -0
  365. warp/tests/test_examples.py +424 -0
  366. warp/tests/test_fabricarray.py +998 -0
  367. warp/tests/test_fast_math.py +72 -0
  368. warp/tests/test_fem.py +2204 -0
  369. warp/tests/test_fixedarray.py +229 -0
  370. warp/tests/test_fp16.py +136 -0
  371. warp/tests/test_func.py +501 -0
  372. warp/tests/test_future_annotations.py +100 -0
  373. warp/tests/test_generics.py +656 -0
  374. warp/tests/test_grad.py +893 -0
  375. warp/tests/test_grad_customs.py +339 -0
  376. warp/tests/test_grad_debug.py +341 -0
  377. warp/tests/test_implicit_init.py +411 -0
  378. warp/tests/test_import.py +45 -0
  379. warp/tests/test_indexedarray.py +1140 -0
  380. warp/tests/test_intersect.py +103 -0
  381. warp/tests/test_iter.py +76 -0
  382. warp/tests/test_large.py +177 -0
  383. warp/tests/test_launch.py +411 -0
  384. warp/tests/test_lerp.py +151 -0
  385. warp/tests/test_linear_solvers.py +223 -0
  386. warp/tests/test_lvalue.py +427 -0
  387. warp/tests/test_map.py +526 -0
  388. warp/tests/test_mat.py +3515 -0
  389. warp/tests/test_mat_assign_copy.py +178 -0
  390. warp/tests/test_mat_constructors.py +573 -0
  391. warp/tests/test_mat_lite.py +122 -0
  392. warp/tests/test_mat_scalar_ops.py +2913 -0
  393. warp/tests/test_math.py +212 -0
  394. warp/tests/test_module_aot.py +287 -0
  395. warp/tests/test_module_hashing.py +258 -0
  396. warp/tests/test_modules_lite.py +70 -0
  397. warp/tests/test_noise.py +252 -0
  398. warp/tests/test_operators.py +299 -0
  399. warp/tests/test_options.py +129 -0
  400. warp/tests/test_overwrite.py +551 -0
  401. warp/tests/test_print.py +408 -0
  402. warp/tests/test_quat.py +2653 -0
  403. warp/tests/test_quat_assign_copy.py +145 -0
  404. warp/tests/test_rand.py +339 -0
  405. warp/tests/test_reload.py +303 -0
  406. warp/tests/test_rounding.py +157 -0
  407. warp/tests/test_runlength_encode.py +196 -0
  408. warp/tests/test_scalar_ops.py +133 -0
  409. warp/tests/test_smoothstep.py +108 -0
  410. warp/tests/test_snippet.py +318 -0
  411. warp/tests/test_sparse.py +845 -0
  412. warp/tests/test_spatial.py +2859 -0
  413. warp/tests/test_spatial_assign_copy.py +160 -0
  414. warp/tests/test_special_values.py +361 -0
  415. warp/tests/test_static.py +640 -0
  416. warp/tests/test_struct.py +901 -0
  417. warp/tests/test_tape.py +242 -0
  418. warp/tests/test_transient_module.py +93 -0
  419. warp/tests/test_triangle_closest_point.py +192 -0
  420. warp/tests/test_tuple.py +361 -0
  421. warp/tests/test_types.py +615 -0
  422. warp/tests/test_utils.py +594 -0
  423. warp/tests/test_vec.py +1408 -0
  424. warp/tests/test_vec_assign_copy.py +143 -0
  425. warp/tests/test_vec_constructors.py +325 -0
  426. warp/tests/test_vec_lite.py +80 -0
  427. warp/tests/test_vec_scalar_ops.py +2327 -0
  428. warp/tests/test_verify_fp.py +100 -0
  429. warp/tests/test_version.py +75 -0
  430. warp/tests/tile/__init__.py +0 -0
  431. warp/tests/tile/test_tile.py +1519 -0
  432. warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
  433. warp/tests/tile/test_tile_cholesky.py +608 -0
  434. warp/tests/tile/test_tile_load.py +724 -0
  435. warp/tests/tile/test_tile_mathdx.py +156 -0
  436. warp/tests/tile/test_tile_matmul.py +179 -0
  437. warp/tests/tile/test_tile_mlp.py +400 -0
  438. warp/tests/tile/test_tile_reduce.py +950 -0
  439. warp/tests/tile/test_tile_shared_memory.py +376 -0
  440. warp/tests/tile/test_tile_sort.py +121 -0
  441. warp/tests/tile/test_tile_view.py +173 -0
  442. warp/tests/unittest_serial.py +47 -0
  443. warp/tests/unittest_suites.py +430 -0
  444. warp/tests/unittest_utils.py +469 -0
  445. warp/tests/walkthrough_debug.py +95 -0
  446. warp/torch.py +24 -0
  447. warp/types.py +51 -0
  448. warp/utils.py +31 -0
  449. warp_lang-1.10.0.dist-info/METADATA +459 -0
  450. warp_lang-1.10.0.dist-info/RECORD +468 -0
  451. warp_lang-1.10.0.dist-info/WHEEL +5 -0
  452. warp_lang-1.10.0.dist-info/licenses/LICENSE.md +176 -0
  453. warp_lang-1.10.0.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
  454. warp_lang-1.10.0.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
  455. warp_lang-1.10.0.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
  456. warp_lang-1.10.0.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
  457. warp_lang-1.10.0.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
  458. warp_lang-1.10.0.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
  459. warp_lang-1.10.0.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
  460. warp_lang-1.10.0.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
  461. warp_lang-1.10.0.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
  462. warp_lang-1.10.0.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
  463. warp_lang-1.10.0.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
  464. warp_lang-1.10.0.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
  465. warp_lang-1.10.0.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
  466. warp_lang-1.10.0.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
  467. warp_lang-1.10.0.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
  468. warp_lang-1.10.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,660 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024 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, Optional
17
+
18
+ import numpy as np
19
+
20
+ import warp as wp
21
+ from warp._src.fem import cache, utils
22
+ from warp._src.fem.types import NULL_ELEMENT_INDEX, OUTSIDE, Coords, ElementIndex, Sample, make_free_sample
23
+
24
+ from .element import Element
25
+ from .geometry import Geometry
26
+
27
+ _wp_module_name_ = "warp.fem.geometry.nanogrid"
28
+
29
+
30
+ class NanogridBase(Geometry):
31
+ """Base class for regular and adaptive Nanogrid"""
32
+
33
+ dimension = 3
34
+
35
+ # Flag used for building edge/face grids to disambiguiate axis within the grid
36
+ # Morton indexing allows for
37
+ GRID_AXIS_FLAG = wp.constant(wp.int32(1 << 20))
38
+
39
+ FACE_AXIS_MASK = wp.constant(wp.uint8((1 << 2) - 1))
40
+ FACE_INNER_OFFSET_BIT = wp.constant(wp.uint8(2))
41
+ FACE_OUTER_OFFSET_BIT = wp.constant(wp.uint8(3))
42
+
43
+ def __init__(
44
+ self,
45
+ cell_grid: wp.Volume,
46
+ cell_ijk: wp.array(dtype=wp.vec3i),
47
+ node_grid: wp.Volume,
48
+ node_ijk: wp.array(dtype=wp.vec3i),
49
+ ):
50
+ self._cell_grid = cell_grid
51
+ self._cell_ijk = cell_ijk
52
+ self._node_grid = node_grid
53
+ self._node_ijk = node_ijk
54
+
55
+ self._face_grid = None
56
+ self._face_ijk = None
57
+ self._boundary_face_indices = None
58
+
59
+ self._cell_grid_info = cell_grid.get_grid_info()
60
+ self._init_transform()
61
+
62
+ def reference_cell(self) -> Element:
63
+ return Element.CUBE
64
+
65
+ def reference_side(self) -> Element:
66
+ return Element.SQUARE
67
+
68
+ def _init_transform(self):
69
+ transform = np.array(self.transform).reshape(3, 3)
70
+
71
+ diag = np.diag(transform)
72
+ if np.max(np.abs(transform - np.diag(diag))) < 1.0e-6 * np.max(diag):
73
+ # Rectangular voxels
74
+ self._inverse_transform = wp.mat33f(
75
+ 1.0 / diag[0], 0.0, 0.0, 0.0, 1.0 / diag[1], 0.0, 0.0, 0.0, 1.0 / diag[2]
76
+ )
77
+ self._cell_volume = wp.float32(diag[0] * diag[1] * diag[2])
78
+ self._face_areas = wp.vec3(diag[1] * diag[2], diag[2] * diag[0], diag[0] * diag[1])
79
+ else:
80
+ self._inverse_transform = wp.mat33f(np.linalg.inv(transform))
81
+ self._cell_volume = wp.float32(abs(np.linalg.det(transform)))
82
+ self._face_areas = wp.vec3(
83
+ tuple(np.linalg.norm(np.cross(transform[:, k - 2], transform[:, k - 1])) for k in range(3))
84
+ )
85
+
86
+ @property
87
+ def transform(self):
88
+ return self._cell_grid_info.transform_matrix
89
+
90
+ @property
91
+ def cell_grid(self) -> wp.Volume:
92
+ return self._cell_grid
93
+
94
+ @property
95
+ def vertex_grid(self) -> wp.Volume:
96
+ return self._node_grid
97
+
98
+ @property
99
+ def face_grid(self) -> wp.Volume:
100
+ self._ensure_face_grid()
101
+ return self._face_grid
102
+
103
+ def cell_count(self):
104
+ return self._cell_ijk.shape[0]
105
+
106
+ def vertex_count(self):
107
+ return self._node_ijk.shape[0]
108
+
109
+ def side_count(self):
110
+ self._ensure_face_grid()
111
+ return self._face_ijk.shape[0]
112
+
113
+ def boundary_side_count(self):
114
+ self._ensure_face_grid()
115
+ return self._boundary_face_indices.shape[0]
116
+
117
+ @wp.struct
118
+ class SideIndexArg:
119
+ boundary_face_indices: wp.array(dtype=int)
120
+
121
+ def fill_side_index_arg(self, arg: SideIndexArg, device):
122
+ self._ensure_face_grid()
123
+ arg.boundary_face_indices = self._boundary_face_indices.to(device)
124
+
125
+ @wp.func
126
+ def boundary_side_index(args: SideIndexArg, boundary_side_index: int):
127
+ return args.boundary_face_indices[boundary_side_index]
128
+
129
+ def make_filtered_cell_lookup(grid_geo, filter_func: wp.Function = None):
130
+ suffix = f"{grid_geo.name}{filter_func.key if filter_func is not None else ''}"
131
+
132
+ @cache.dynamic_func(suffix=suffix)
133
+ def cell_lookup(args: grid_geo.CellArg, pos: wp.vec3, max_dist: float, filter_data: Any, filter_target: Any):
134
+ grid = args.cell_grid
135
+
136
+ # Start at corresponding voxel
137
+ uvw = wp.volume_world_to_index(grid, pos) + wp.vec3(0.5)
138
+ i, j, k = int(wp.floor(uvw[0])), int(wp.floor(uvw[1])), int(wp.floor(uvw[2]))
139
+ cell_index = grid_geo._lookup_cell_index(args, i, j, k)
140
+
141
+ if cell_index != -1:
142
+ coords = grid_geo._cell_coordinates_local(args, cell_index, uvw)
143
+ if wp.static(filter_func is None):
144
+ return make_free_sample(cell_index, coords)
145
+ else:
146
+ if filter_func(filter_data, cell_index) == filter_target:
147
+ return make_free_sample(cell_index, coords)
148
+
149
+ # Iterate over increasingly larger neighborhoods
150
+ cell_size = wp.vec3(
151
+ wp.length(wp.volume_index_to_world_dir(grid, wp.vec3(1.0, 0.0, 0.0))),
152
+ wp.length(wp.volume_index_to_world_dir(grid, wp.vec3(0.0, 1.0, 0.0))),
153
+ wp.length(wp.volume_index_to_world_dir(grid, wp.vec3(0.0, 0.0, 1.0))),
154
+ )
155
+
156
+ offset = float(0.5)
157
+ min_cell_size = wp.min(cell_size)
158
+ max_offset = wp.ceil(max_dist / min_cell_size)
159
+ scales = wp.cw_div(wp.vec3(min_cell_size), wp.vec3(cell_size))
160
+
161
+ closest_cell = NULL_ELEMENT_INDEX
162
+ closest_coords = Coords()
163
+
164
+ while closest_cell == NULL_ELEMENT_INDEX:
165
+ uvw_min = wp.vec3i(uvw - offset * scales)
166
+ uvw_max = wp.vec3i(uvw + offset * scales) + wp.vec3i(1)
167
+
168
+ closest_dist = min_cell_size * min_cell_size * float(offset * offset)
169
+
170
+ for i in range(uvw_min[0], uvw_max[0]):
171
+ for j in range(uvw_min[1], uvw_max[1]):
172
+ for k in range(uvw_min[2], uvw_max[2]):
173
+ cell_index = grid_geo._lookup_cell_index(args, i, j, k)
174
+ if cell_index == -1:
175
+ continue
176
+
177
+ if wp.static(filter_func is not None):
178
+ if filter_func(filter_data, cell_index) != filter_target:
179
+ continue
180
+ dist, coords = grid_geo._cell_closest_point_local(args, cell_index, uvw)
181
+
182
+ if dist <= closest_dist:
183
+ closest_dist = dist
184
+ closest_coords = coords
185
+ closest_cell = cell_index
186
+
187
+ if offset >= max_offset:
188
+ break
189
+ offset = wp.min(3.0 * offset, max_offset)
190
+
191
+ return make_free_sample(closest_cell, closest_coords)
192
+
193
+ return cell_lookup
194
+
195
+ def _ensure_face_grid(self):
196
+ if self._face_ijk is None:
197
+ self._build_face_grid()
198
+
199
+ @wp.func
200
+ def _add_axis_flag(ijk: wp.vec3i, axis: int):
201
+ coord = ijk[axis]
202
+ ijk[axis] = wp.where(coord < 0, coord & (~NanogridBase.GRID_AXIS_FLAG), coord | NanogridBase.GRID_AXIS_FLAG)
203
+ return ijk
204
+
205
+ @wp.func
206
+ def _extract_axis_flag(ijk: wp.vec3i):
207
+ for ax in range(3):
208
+ coord = ijk[ax]
209
+ if coord < 0:
210
+ if (ijk[ax] & NanogridBase.GRID_AXIS_FLAG) == 0:
211
+ ijk[ax] = ijk[ax] | NanogridBase.GRID_AXIS_FLAG
212
+ return ax, ijk
213
+ else:
214
+ if (ijk[ax] & NanogridBase.GRID_AXIS_FLAG) != 0:
215
+ ijk[ax] = ijk[ax] & (~NanogridBase.GRID_AXIS_FLAG)
216
+ return ax, ijk
217
+
218
+ return -1, ijk
219
+
220
+ @wp.func
221
+ def _make_face_flags(axis: int, plus_cell_index: int, minus_cell_index: int):
222
+ plus_boundary = wp.uint8(wp.where(plus_cell_index == -1, 1, 0)) << NanogridBase.FACE_OUTER_OFFSET_BIT
223
+ minus_boundary = wp.uint8(wp.where(minus_cell_index == -1, 1, 0)) << NanogridBase.FACE_INNER_OFFSET_BIT
224
+
225
+ return wp.uint8(axis) | plus_boundary | minus_boundary
226
+
227
+ @wp.func
228
+ def _get_boundary_mask(flags: wp.uint8):
229
+ return int((flags >> NanogridBase.FACE_OUTER_OFFSET_BIT) | (flags >> NanogridBase.FACE_INNER_OFFSET_BIT)) & 1
230
+
231
+ @wp.func
232
+ def _get_face_axis(flags: wp.uint8):
233
+ return wp.int32(flags & NanogridBase.FACE_AXIS_MASK)
234
+
235
+ @wp.func
236
+ def _get_face_inner_offset(flags: wp.uint8):
237
+ return wp.int32(flags >> NanogridBase.FACE_INNER_OFFSET_BIT) & 1
238
+
239
+ @wp.func
240
+ def _get_face_outer_offset(flags: wp.uint8):
241
+ return wp.int32(flags >> NanogridBase.FACE_OUTER_OFFSET_BIT) & 1
242
+
243
+ @wp.func
244
+ def _side_to_cell_coords(axis: int, flip: int, inner: float, side_coords: Coords):
245
+ uvw = wp.vec3()
246
+ uvw[axis] = inner
247
+ uvw[(axis + 1 + flip) % 3] = side_coords[0]
248
+ uvw[(axis + 2 - flip) % 3] = side_coords[1]
249
+ return uvw
250
+
251
+ @wp.func
252
+ def _cell_to_side_coords(axis: int, flip: int, cell_coords: Coords):
253
+ return Coords(cell_coords[(axis + 1 + flip) % 3], cell_coords[(axis + 2 - flip) % 3], 0.0)
254
+
255
+ @wp.func
256
+ def _face_tangent_vecs(cell_grid: wp.uint64, axis: int, flip: int):
257
+ u_axis = wp.vec3()
258
+ v_axis = wp.vec3()
259
+ u_axis[(axis + 1 + flip) % 3] = 1.0
260
+ v_axis[(axis + 2 - flip) % 3] = 1.0
261
+ return wp.volume_index_to_world_dir(cell_grid, u_axis), wp.volume_index_to_world_dir(cell_grid, v_axis)
262
+
263
+
264
+ @wp.struct
265
+ class NanogridCellArg:
266
+ # Utility device functions
267
+ cell_grid: wp.uint64
268
+ cell_ijk: wp.array(dtype=wp.vec3i)
269
+ inverse_transform: wp.mat33
270
+ cell_volume: float
271
+
272
+
273
+ @wp.struct
274
+ class NanogridSideArg:
275
+ # Utility device functions
276
+ cell_arg: NanogridCellArg
277
+ face_ijk: wp.array(dtype=wp.vec3i)
278
+ face_flags: wp.array(dtype=wp.uint8)
279
+ face_areas: wp.vec3
280
+
281
+
282
+ class Nanogrid(NanogridBase):
283
+ """Sparse grid geometry"""
284
+
285
+ def __init__(self, grid: wp.Volume, temporary_store: Optional[cache.TemporaryStore] = None):
286
+ """
287
+ Constructs a sparse grid geometry from an in-memory NanoVDB volume.
288
+
289
+ Args:
290
+ grid: The NanoVDB volume. Any type is accepted, but for indexing efficiency an index grid is recommended.
291
+ If `grid` is an 'on' index grid, cells will be created for active voxels only, otherwise cells will
292
+ be created for all leaf voxels.
293
+ temporary_store: shared pool from which to allocate temporary arrays
294
+ """
295
+
296
+ self._cell_grid = grid
297
+ self._cell_grid_info = grid.get_grid_info()
298
+
299
+ device = self._cell_grid.device
300
+ cell_ijk = wp.array(dtype=wp.vec3i, shape=(grid.get_voxel_count(),), device=device)
301
+ grid.get_voxels(out=cell_ijk)
302
+
303
+ node_grid = _build_node_grid(cell_ijk, grid, temporary_store)
304
+ node_count = node_grid.get_voxel_count()
305
+ node_ijk = wp.array(shape=(node_count,), dtype=wp.vec3i, device=device)
306
+ node_grid.get_voxels(out=node_ijk)
307
+
308
+ super().__init__(grid, cell_ijk, node_grid, node_ijk)
309
+
310
+ self._edge_count = 0
311
+ self._edge_grid = None
312
+
313
+ @property
314
+ def edge_grid(self) -> wp.Volume:
315
+ self._ensure_edge_grid()
316
+ return self._edge_grid
317
+
318
+ def edge_count(self):
319
+ self._ensure_edge_grid()
320
+ return self._edge_count
321
+
322
+ CellArg = NanogridCellArg
323
+
324
+ def fill_cell_arg(self, arg, device):
325
+ arg.cell_grid = self._cell_grid.id
326
+ arg.cell_ijk = self._cell_ijk
327
+
328
+ arg.inverse_transform = self._inverse_transform
329
+ arg.cell_volume = self._cell_volume
330
+
331
+ @wp.func
332
+ def cell_position(args: CellArg, s: Sample):
333
+ uvw = wp.vec3(args.cell_ijk[s.element_index]) + s.element_coords
334
+ return wp.volume_index_to_world(args.cell_grid, uvw - wp.vec3(0.5))
335
+
336
+ @wp.func
337
+ def cell_deformation_gradient(args: CellArg, s: Sample):
338
+ return wp.inverse(args.inverse_transform)
339
+
340
+ @wp.func
341
+ def cell_inverse_deformation_gradient(args: CellArg, s: Sample):
342
+ return args.inverse_transform
343
+
344
+ def supports_cell_lookup(self, device):
345
+ return True
346
+
347
+ @wp.func
348
+ def _lookup_cell_index(args: NanogridCellArg, i: int, j: int, k: int):
349
+ return wp.volume_lookup_index(args.cell_grid, i, j, k)
350
+
351
+ @wp.func
352
+ def _cell_coordinates_local(args: NanogridCellArg, cell_index: int, uvw: wp.vec3):
353
+ ijk = wp.vec3(args.cell_ijk[cell_index])
354
+ rel_pos = uvw - ijk
355
+ return rel_pos
356
+
357
+ @wp.func
358
+ def _cell_closest_point_local(args: NanogridCellArg, cell_index: int, uvw: wp.vec3):
359
+ ijk = wp.vec3(args.cell_ijk[cell_index])
360
+ rel_pos = uvw - ijk
361
+ coords = wp.min(wp.max(rel_pos, wp.vec3(0.0)), wp.vec3(1.0))
362
+ return wp.length_sq(wp.volume_index_to_world_dir(args.cell_grid, coords - rel_pos)), coords
363
+
364
+ @wp.func
365
+ def cell_coordinates(args: NanogridCellArg, cell_index: int, pos: wp.vec3):
366
+ uvw = wp.volume_world_to_index(args.cell_grid, pos) + wp.vec3(0.5)
367
+ return Nanogrid._cell_coordinates_local(args, cell_index, uvw)
368
+
369
+ @wp.func
370
+ def cell_closest_point(args: NanogridCellArg, cell_index: int, pos: wp.vec3):
371
+ uvw = wp.volume_world_to_index(args.cell_grid, pos) + wp.vec3(0.5)
372
+ dist, coords = Nanogrid._cell_closest_point_local(args, cell_index, uvw)
373
+ return coords, dist
374
+
375
+ @wp.func
376
+ def cell_measure(args: CellArg, s: Sample):
377
+ return args.cell_volume
378
+
379
+ @wp.func
380
+ def cell_normal(args: CellArg, s: Sample):
381
+ return wp.vec3(0.0)
382
+
383
+ SideArg = NanogridSideArg
384
+
385
+ def fill_side_arg(self, arg: SideArg, device):
386
+ self._ensure_face_grid()
387
+ self.fill_cell_arg(arg.cell_arg, device)
388
+ arg.face_ijk = self._face_ijk.to(device)
389
+ arg.face_flags = self._face_flags.to(device)
390
+ arg.face_areas = self._face_areas
391
+
392
+ @wp.func
393
+ def side_position(args: SideArg, s: Sample):
394
+ ijk = args.face_ijk[s.element_index]
395
+ flags = args.face_flags[s.element_index]
396
+ axis = Nanogrid._get_face_axis(flags)
397
+ flip = Nanogrid._get_face_inner_offset(flags)
398
+
399
+ uvw = wp.vec3(ijk) + Nanogrid._side_to_cell_coords(axis, flip, 0.0, s.element_coords)
400
+
401
+ cell_grid = args.cell_arg.cell_grid
402
+ return wp.volume_index_to_world(cell_grid, uvw - wp.vec3(0.5))
403
+
404
+ @wp.func
405
+ def side_deformation_gradient(args: SideArg, s: Sample):
406
+ flags = args.face_flags[s.element_index]
407
+ axis = Nanogrid._get_face_axis(flags)
408
+ flip = Nanogrid._get_face_inner_offset(flags)
409
+ v1, v2 = Nanogrid._face_tangent_vecs(args.cell_arg.cell_grid, axis, flip)
410
+ return wp.matrix_from_cols(v1, v2)
411
+
412
+ @wp.func
413
+ def side_inner_inverse_deformation_gradient(args: SideArg, s: Sample):
414
+ return Nanogrid.cell_inverse_deformation_gradient(args.cell_arg, s)
415
+
416
+ @wp.func
417
+ def side_outer_inverse_deformation_gradient(args: SideArg, s: Sample):
418
+ return Nanogrid.cell_inverse_deformation_gradient(args.cell_arg, s)
419
+
420
+ @wp.func
421
+ def side_measure(args: SideArg, s: Sample):
422
+ axis = Nanogrid._get_face_axis(args.face_flags[s.element_index])
423
+ return args.face_areas[axis]
424
+
425
+ @wp.func
426
+ def side_measure_ratio(args: SideArg, s: Sample):
427
+ axis = Nanogrid._get_face_axis(args.face_flags[s.element_index])
428
+ return args.face_areas[axis] / args.cell_arg.cell_volume
429
+
430
+ @wp.func
431
+ def side_normal(args: SideArg, s: Sample):
432
+ flags = args.face_flags[s.element_index]
433
+ axis = Nanogrid._get_face_axis(flags)
434
+ flip = Nanogrid._get_face_inner_offset(flags)
435
+
436
+ v1, v2 = Nanogrid._face_tangent_vecs(args.cell_arg.cell_grid, axis, flip)
437
+ return wp.cross(v1, v2) / args.face_areas[axis]
438
+
439
+ @wp.func
440
+ def side_inner_cell_index(args: SideArg, side_index: ElementIndex):
441
+ ijk = args.face_ijk[side_index]
442
+ flags = args.face_flags[side_index]
443
+ axis = Nanogrid._get_face_axis(flags)
444
+ offset = Nanogrid._get_face_inner_offset(flags)
445
+
446
+ ijk[axis] += offset - 1
447
+ cell_grid = args.cell_arg.cell_grid
448
+
449
+ return wp.volume_lookup_index(cell_grid, ijk[0], ijk[1], ijk[2])
450
+
451
+ @wp.func
452
+ def side_outer_cell_index(args: SideArg, side_index: ElementIndex):
453
+ ijk = args.face_ijk[side_index]
454
+ flags = args.face_flags[side_index]
455
+ axis = Nanogrid._get_face_axis(flags)
456
+ offset = Nanogrid._get_face_outer_offset(flags)
457
+
458
+ ijk[axis] -= offset
459
+ cell_grid = args.cell_arg.cell_grid
460
+
461
+ return wp.volume_lookup_index(cell_grid, ijk[0], ijk[1], ijk[2])
462
+
463
+ @wp.func
464
+ def side_inner_cell_coords(args: SideArg, side_index: ElementIndex, side_coords: Coords):
465
+ flags = args.face_flags[side_index]
466
+ axis = Nanogrid._get_face_axis(flags)
467
+ flip = Nanogrid._get_face_inner_offset(flags)
468
+ offset = float(Nanogrid._get_face_inner_offset(flags))
469
+ return Nanogrid._side_to_cell_coords(axis, flip, 1.0 - offset, side_coords)
470
+
471
+ @wp.func
472
+ def side_outer_cell_coords(args: SideArg, side_index: ElementIndex, side_coords: Coords):
473
+ flags = args.face_flags[side_index]
474
+ axis = Nanogrid._get_face_axis(flags)
475
+ flip = Nanogrid._get_face_inner_offset(flags)
476
+ offset = float(Nanogrid._get_face_outer_offset(flags))
477
+ return Nanogrid._side_to_cell_coords(axis, flip, offset, side_coords)
478
+
479
+ @wp.func
480
+ def side_from_cell_coords(
481
+ args: SideArg,
482
+ side_index: ElementIndex,
483
+ element_index: ElementIndex,
484
+ element_coords: Coords,
485
+ ):
486
+ flags = args.face_flags[side_index]
487
+ axis = Nanogrid._get_face_axis(flags)
488
+ flip = Nanogrid._get_face_inner_offset(flags)
489
+
490
+ cell_ijk = args.cell_arg.cell_ijk[element_index]
491
+ side_ijk = args.face_ijk[side_index]
492
+
493
+ on_side = float(side_ijk[axis] - cell_ijk[axis]) == element_coords[axis]
494
+
495
+ return wp.where(on_side, Nanogrid._cell_to_side_coords(axis, flip, element_coords), Coords(OUTSIDE))
496
+
497
+ @wp.func
498
+ def side_to_cell_arg(side_arg: SideArg):
499
+ return side_arg.cell_arg
500
+
501
+ @wp.func
502
+ def side_coordinates(args: SideArg, side_index: int, pos: wp.vec3):
503
+ cell_arg = args.cell_arg
504
+
505
+ ijk = args.face_ijk[side_index]
506
+ cell_coords = wp.volume_world_to_index(cell_arg.cell_grid, pos) + wp.vec3(0.5) - wp.vec3(ijk)
507
+
508
+ flags = args.face_flags[side_index]
509
+ axis = Nanogrid._get_face_axis(flags)
510
+ flip = Nanogrid._get_face_inner_offset(flags)
511
+ return Nanogrid._cell_to_side_coords(axis, flip, cell_coords)
512
+
513
+ @wp.func
514
+ def side_closest_point(args: SideArg, side_index: int, pos: wp.vec3):
515
+ coords = Nanogrid.side_coordinates(args, side_index, pos)
516
+
517
+ proj_coords = Coords(wp.clamp(coords[0], 0.0, 1.0), wp.clamp(coords[1], 0.0, 1.0), 0.0)
518
+
519
+ flags = args.face_flags[side_index]
520
+ axis = Nanogrid._get_face_axis(flags)
521
+ flip = Nanogrid._get_face_inner_offset(flags)
522
+ cell_coord_offset = Nanogrid._side_to_cell_coords(axis, flip, 0, coords - proj_coords)
523
+
524
+ return proj_coords, wp.length_sq(wp.volume_index_to_world_dir(args.cell_grid, cell_coord_offset))
525
+
526
+ def _build_face_grid(self, temporary_store: Optional[cache.TemporaryStore] = None):
527
+ device = self._cell_grid.device
528
+ self._face_grid = _build_face_grid(self._cell_ijk, self._cell_grid, temporary_store)
529
+ face_count = self._face_grid.get_voxel_count()
530
+ self._face_ijk = wp.array(shape=(face_count,), dtype=wp.vec3i, device=device)
531
+ self._face_grid.get_voxels(out=self._face_ijk)
532
+
533
+ self._face_flags = wp.array(shape=(face_count,), dtype=wp.uint8, device=device)
534
+ boundary_face_mask = cache.borrow_temporary(temporary_store, shape=(face_count,), dtype=wp.int32, device=device)
535
+
536
+ wp.launch(
537
+ _build_face_flags,
538
+ dim=face_count,
539
+ device=device,
540
+ inputs=[self._cell_grid.id, self._face_ijk, self._face_flags, boundary_face_mask],
541
+ )
542
+ boundary_face_indices, _ = utils.masked_indices(boundary_face_mask)
543
+ self._boundary_face_indices = boundary_face_indices.detach()
544
+
545
+ def _build_edge_grid(self, temporary_store: Optional[cache.TemporaryStore] = None):
546
+ self._edge_grid = _build_edge_grid(self._cell_ijk, self._cell_grid, temporary_store)
547
+ self._edge_count = self._edge_grid.get_voxel_count()
548
+
549
+ def _ensure_edge_grid(self):
550
+ if self._edge_grid is None:
551
+ self._build_edge_grid()
552
+
553
+
554
+ @wp.kernel
555
+ def _cell_node_indices(
556
+ cell_ijk: wp.array(dtype=wp.vec3i),
557
+ node_ijk: wp.array2d(dtype=wp.vec3i),
558
+ ):
559
+ cell, n = wp.tid()
560
+ node_ijk[cell, n] = cell_ijk[cell] + wp.vec3i((n & 4) >> 2, (n & 2) >> 1, n & 1)
561
+
562
+
563
+ @wp.kernel
564
+ def _cell_face_indices(
565
+ cell_ijk: wp.array(dtype=wp.vec3i),
566
+ node_ijk: wp.array2d(dtype=wp.vec3i),
567
+ ):
568
+ cell = wp.tid()
569
+ ijk = cell_ijk[cell]
570
+ node_ijk[cell, 0] = NanogridBase._add_axis_flag(ijk, 0)
571
+ node_ijk[cell, 1] = NanogridBase._add_axis_flag(ijk, 1)
572
+ node_ijk[cell, 2] = NanogridBase._add_axis_flag(ijk, 2)
573
+
574
+ node_ijk[cell, 3] = NanogridBase._add_axis_flag(ijk + wp.vec3i(1, 0, 0), 0)
575
+ node_ijk[cell, 4] = NanogridBase._add_axis_flag(ijk + wp.vec3i(0, 1, 0), 1)
576
+ node_ijk[cell, 5] = NanogridBase._add_axis_flag(ijk + wp.vec3i(0, 0, 1), 2)
577
+
578
+
579
+ @wp.kernel
580
+ def _cell_edge_indices(
581
+ cell_ijk: wp.array(dtype=wp.vec3i),
582
+ edge_ijk: wp.array2d(dtype=wp.vec3i),
583
+ ):
584
+ cell = wp.tid()
585
+ ijk = cell_ijk[cell]
586
+ edge_ijk[cell, 0] = NanogridBase._add_axis_flag(ijk, 0)
587
+ edge_ijk[cell, 1] = NanogridBase._add_axis_flag(ijk, 1)
588
+ edge_ijk[cell, 2] = NanogridBase._add_axis_flag(ijk, 2)
589
+
590
+ edge_ijk[cell, 3] = NanogridBase._add_axis_flag(ijk + wp.vec3i(0, 1, 0), 0)
591
+ edge_ijk[cell, 4] = NanogridBase._add_axis_flag(ijk + wp.vec3i(0, 0, 1), 1)
592
+ edge_ijk[cell, 5] = NanogridBase._add_axis_flag(ijk + wp.vec3i(1, 0, 0), 2)
593
+
594
+ edge_ijk[cell, 6] = NanogridBase._add_axis_flag(ijk + wp.vec3i(0, 1, 1), 0)
595
+ edge_ijk[cell, 7] = NanogridBase._add_axis_flag(ijk + wp.vec3i(1, 0, 1), 1)
596
+ edge_ijk[cell, 8] = NanogridBase._add_axis_flag(ijk + wp.vec3i(1, 1, 0), 2)
597
+
598
+ edge_ijk[cell, 9] = NanogridBase._add_axis_flag(ijk + wp.vec3i(0, 0, 1), 0)
599
+ edge_ijk[cell, 10] = NanogridBase._add_axis_flag(ijk + wp.vec3i(1, 0, 0), 1)
600
+ edge_ijk[cell, 11] = NanogridBase._add_axis_flag(ijk + wp.vec3i(0, 1, 0), 2)
601
+
602
+
603
+ def _build_node_grid(cell_ijk, grid: wp.Volume, temporary_store: cache.TemporaryStore):
604
+ cell_count = cell_ijk.shape[0]
605
+
606
+ cell_nodes = cache.borrow_temporary(temporary_store, shape=(cell_count, 8), dtype=wp.vec3i, device=cell_ijk.device)
607
+ wp.launch(_cell_node_indices, dim=cell_nodes.shape, inputs=[cell_ijk, cell_nodes], device=cell_ijk.device)
608
+ node_grid = wp.Volume.allocate_by_voxels(
609
+ cell_nodes.flatten(), voxel_size=grid.get_voxel_size(), device=cell_ijk.device
610
+ )
611
+
612
+ return node_grid
613
+
614
+
615
+ def _build_face_grid(cell_ijk, grid: wp.Volume, temporary_store: cache.TemporaryStore):
616
+ cell_count = cell_ijk.shape[0]
617
+
618
+ cell_faces = cache.borrow_temporary(temporary_store, shape=(cell_count, 6), dtype=wp.vec3i, device=cell_ijk.device)
619
+ wp.launch(_cell_face_indices, dim=cell_count, inputs=[cell_ijk, cell_faces], device=cell_ijk.device)
620
+ face_grid = wp.Volume.allocate_by_voxels(
621
+ cell_faces.flatten(), voxel_size=grid.get_voxel_size(), device=cell_ijk.device
622
+ )
623
+
624
+ return face_grid
625
+
626
+
627
+ def _build_edge_grid(cell_ijk, grid: wp.Volume, temporary_store: cache.TemporaryStore):
628
+ cell_count = cell_ijk.shape[0]
629
+
630
+ cell_edges = cache.borrow_temporary(temporary_store, shape=(cell_count, 12), dtype=wp.vec3i, device=cell_ijk.device)
631
+ wp.launch(_cell_edge_indices, dim=cell_count, inputs=[cell_ijk, cell_edges], device=cell_ijk.device)
632
+ edge_grid = wp.Volume.allocate_by_voxels(
633
+ cell_edges.flatten(), voxel_size=grid.get_voxel_size(), device=cell_ijk.device
634
+ )
635
+
636
+ return edge_grid
637
+
638
+
639
+ @wp.kernel
640
+ def _build_face_flags(
641
+ cell_grid: wp.uint64,
642
+ face_ijk: wp.array(dtype=wp.vec3i),
643
+ face_flags: wp.array(dtype=wp.uint8),
644
+ boundary_face_mask: wp.array(dtype=int),
645
+ ):
646
+ face = wp.tid()
647
+
648
+ axis, ijk = NanogridBase._extract_axis_flag(face_ijk[face])
649
+
650
+ ijk_minus = ijk
651
+ ijk_minus[axis] -= 1
652
+
653
+ plus_cell_index = wp.volume_lookup_index(cell_grid, ijk[0], ijk[1], ijk[2])
654
+ minus_cell_index = wp.volume_lookup_index(cell_grid, ijk_minus[0], ijk_minus[1], ijk_minus[2])
655
+
656
+ face_ijk[face] = ijk
657
+
658
+ flags = NanogridBase._make_face_flags(axis, plus_cell_index, minus_cell_index)
659
+ face_flags[face] = flags
660
+ boundary_face_mask[face] = NanogridBase._get_boundary_mask(flags)