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,103 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 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
+ import numpy as np
17
+
18
+ import warp as wp
19
+
20
+ BLOCK_DIM = 128
21
+
22
+ TILE = 32
23
+
24
+
25
+ def create_test_kernel(storage_type: str):
26
+ @wp.kernel
27
+ def load_store(a: wp.array2d(dtype=wp.float32), b: wp.array2d(dtype=wp.float32)):
28
+ i, j = wp.tid()
29
+
30
+ if wp.static(storage_type == "shared"):
31
+ a_tile = wp.tile_load(a, shape=(TILE, TILE), offset=(i * TILE, j * TILE), storage="shared")
32
+ else:
33
+ a_tile = wp.tile_load(a, shape=(TILE, TILE), offset=(i * TILE, j * TILE), storage="register")
34
+
35
+ wp.tile_store(b, a_tile, offset=(i * TILE, j * TILE))
36
+
37
+ return load_store
38
+
39
+
40
+ if __name__ == "__main__":
41
+ wp.config.quiet = True
42
+ wp.init()
43
+ wp.clear_kernel_cache()
44
+ wp.set_module_options({"fast_math": True, "enable_backward": False})
45
+
46
+ iterations = 100
47
+ rng = np.random.default_rng(42)
48
+
49
+ shared_benchmark_data = {}
50
+ register_benchmark_data = {}
51
+ memcpy_benchmark_data = {}
52
+
53
+ sizes = list(range(128, 4097, 128))
54
+
55
+ print(f"{'Transfer Size (Bytes)':<23s} {'Shared (GiB/s)':<16s} {'Register (GiB/s)':<18s} {'memcpy (GiB/s)':<16s}")
56
+ print("-" * 79)
57
+
58
+ for size in sizes:
59
+ a = wp.array(rng.random((size, size), dtype=np.float32), dtype=wp.float32)
60
+ b = wp.empty_like(a)
61
+
62
+ for storage_type in ("shared", "register"):
63
+ load_store = create_test_kernel(storage_type)
64
+
65
+ cmd = wp.launch_tiled(
66
+ load_store,
67
+ dim=(a.shape[0] // TILE, a.shape[1] // TILE),
68
+ inputs=[a],
69
+ outputs=[b],
70
+ block_dim=BLOCK_DIM,
71
+ record_cmd=True,
72
+ )
73
+ # Warmup
74
+ for _ in range(5):
75
+ cmd.launch()
76
+
77
+ with wp.ScopedTimer("benchmark", cuda_filter=wp.TIMING_KERNEL, print=False, synchronize=True) as timer:
78
+ for _ in range(iterations):
79
+ cmd.launch()
80
+
81
+ np.testing.assert_equal(a.numpy(), b.numpy())
82
+
83
+ timing_results = [result.elapsed for result in timer.timing_results]
84
+ avg_bw = 2.0 * (a.capacity / (1024 * 1024 * 1024)) / (1e-3 * np.mean(timing_results))
85
+
86
+ if storage_type == "shared":
87
+ shared_benchmark_data[a.capacity] = avg_bw
88
+ else:
89
+ register_benchmark_data[a.capacity] = avg_bw
90
+
91
+ # Compare with memcpy
92
+ with wp.ScopedTimer("benchmark", cuda_filter=wp.TIMING_MEMCPY, print=False, synchronize=True) as timer:
93
+ for _ in range(iterations):
94
+ wp.copy(b, a)
95
+
96
+ timing_results = [result.elapsed for result in timer.timing_results]
97
+ avg_bw = 2.0 * (a.capacity / (1024 * 1024 * 1024)) / (1e-3 * np.mean(timing_results))
98
+ memcpy_benchmark_data[a.capacity] = avg_bw
99
+
100
+ # Print results
101
+ print(
102
+ f"{a.capacity:<23d} {shared_benchmark_data[a.capacity]:<#16.4g} {register_benchmark_data[a.capacity]:<#18.4g} {memcpy_benchmark_data[a.capacity]:<#16.4g}"
103
+ )
@@ -0,0 +1,155 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 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
+ import time
17
+
18
+ import numpy as np
19
+
20
+ import warp as wp
21
+
22
+ BLOCK_DIM = 128
23
+
24
+
25
+ def create_test_kernel(KEY_TYPE, MAX_SORT_LENGTH):
26
+ @wp.kernel
27
+ def tile_sort_kernel(
28
+ input_keys: wp.array(dtype=KEY_TYPE, ndim=2),
29
+ input_values: wp.array(dtype=wp.int32, ndim=2),
30
+ output_keys: wp.array(dtype=KEY_TYPE, ndim=2),
31
+ output_values: wp.array(dtype=wp.int32, ndim=2),
32
+ ):
33
+ batch_id, i = wp.tid()
34
+
35
+ # Load input into shared memory
36
+ keys = wp.tile_load(input_keys[batch_id], shape=MAX_SORT_LENGTH, storage="shared")
37
+ values = wp.tile_load(input_values[batch_id], shape=MAX_SORT_LENGTH, storage="shared")
38
+
39
+ # Perform in-place sorting
40
+ wp.tile_sort(keys, values)
41
+
42
+ # Store sorted shared memory into output arrays
43
+ wp.tile_store(output_keys[batch_id], keys)
44
+ wp.tile_store(output_values[batch_id], values)
45
+
46
+ return tile_sort_kernel
47
+
48
+
49
+ if __name__ == "__main__":
50
+ wp.config.quiet = True
51
+ wp.init()
52
+ wp.clear_kernel_cache()
53
+ wp.set_module_options({"fast_math": True, "enable_backward": False})
54
+
55
+ iterations = 100
56
+ rng = np.random.default_rng(42)
57
+
58
+ shared_benchmark_data = {}
59
+ cub_segmented_sort_benchmark_data = {}
60
+
61
+ array_length = list(range(16, 257, 16))
62
+
63
+ print(
64
+ f"{'Type':<12s} {'Batch Size':<12s} {'Length':<12s} {'Tile Sort (ms)':<16s} {'Cub Segmented Sort (ms)':<24s} {'CubTime/TileTime':<16s}"
65
+ )
66
+ print("-" * 100)
67
+
68
+ for dtype in [int, float]:
69
+ for batch_size_exponent in range(5, 11):
70
+ batch_size = 2**batch_size_exponent
71
+ for length in array_length:
72
+ if dtype == int:
73
+ np_keys = rng.choice(1000000000, size=(batch_size, length), replace=False)
74
+ else: # dtype == float
75
+ np_keys = rng.choice(1000000, size=(batch_size, length), replace=False).astype(np.float32)
76
+
77
+ np_values = np.tile(np.arange(length), (batch_size, 1))
78
+
79
+ # Sort using NumPy for validation
80
+ np_sorted_keys = np.zeros_like(np_keys)
81
+ np_sorted_values = np.zeros_like(np_values)
82
+ for b in range(batch_size):
83
+ sorted_indices = np.argsort(np_keys[b])
84
+ np_sorted_keys[b] = np_keys[b][sorted_indices]
85
+ np_sorted_values[b] = np_values[b][sorted_indices]
86
+
87
+ # Generate random keys and iota indexer
88
+ input_keys = wp.array(np_keys, dtype=dtype, ndim=2, device="cuda")
89
+ input_values = wp.array(np_values, dtype=int, ndim=2, device="cuda")
90
+ output_keys = wp.zeros_like(input_keys, device="cuda")
91
+ output_values = wp.zeros_like(input_values, device="cuda")
92
+
93
+ kernel = create_test_kernel(dtype, length)
94
+
95
+ cmd = wp.launch_tiled(
96
+ kernel,
97
+ dim=batch_size,
98
+ inputs=[input_keys, input_values, output_keys, output_values],
99
+ block_dim=BLOCK_DIM,
100
+ record_cmd=True,
101
+ )
102
+ # Warmup
103
+ for _ in range(5):
104
+ cmd.launch()
105
+
106
+ with wp.ScopedTimer("benchmark", cuda_filter=wp.TIMING_KERNEL, print=False, synchronize=True) as timer:
107
+ for _ in range(iterations):
108
+ cmd.launch()
109
+ wp.synchronize()
110
+
111
+ if dtype == int:
112
+ keys_match = np.array_equal(output_keys.numpy(), np_sorted_keys)
113
+ else: # dtype == float
114
+ keys_match = np.allclose(output_keys.numpy(), np_sorted_keys, atol=1e-6) # Use tolerance for floats
115
+
116
+ values_match = np.array_equal(output_values.numpy(), np_sorted_values)
117
+
118
+ # Validate results
119
+ assert keys_match, f"Key sorting mismatch for dtype={dtype}!"
120
+ assert values_match, f"Value sorting mismatch for dtype={dtype}!"
121
+
122
+ timing_results = [result.elapsed for result in timer.timing_results]
123
+ mean_timing = np.mean(timing_results)
124
+
125
+ shared_benchmark_data[length] = mean_timing
126
+
127
+ # Allocate memory
128
+ input_keys = wp.zeros(shape=(batch_size * 2, length), dtype=dtype, device="cuda")
129
+ input_values = wp.zeros(shape=(batch_size * 2, length), dtype=int, device="cuda")
130
+
131
+ # Copy data
132
+ input_keys.assign(np_keys)
133
+ input_values.assign(np_values)
134
+
135
+ input_keys = input_keys.reshape(-1)
136
+ input_values = input_values.reshape(-1)
137
+
138
+ segments = wp.array(np.arange(0, batch_size + 1) * length, dtype=int, device="cuda")
139
+
140
+ # Compare with cub segmented radix sort
141
+ # Warmup
142
+ for _ in range(5):
143
+ wp.utils.segmented_sort_pairs(input_keys, input_values, batch_size * length, segments)
144
+
145
+ t1 = time.time_ns()
146
+ for _ in range(iterations):
147
+ wp.utils.segmented_sort_pairs(input_keys, input_values, batch_size * length, segments)
148
+ wp.synchronize()
149
+ t2 = time.time_ns()
150
+ cub_segmented_sort_benchmark_data[length] = (t2 - t1) / (1_000_000 * iterations)
151
+
152
+ # Print results
153
+ print(
154
+ f"{dtype!s:<12s} {batch_size:<12d} {length:<12d} {shared_benchmark_data[length]:<16.4g} {cub_segmented_sort_benchmark_data[length]:<24.4g} {cub_segmented_sort_benchmark_data[length] / shared_benchmark_data[length]:<16.4g}"
155
+ )
@@ -0,0 +1,37 @@
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
+ import os
17
+ import subprocess
18
+ import sys
19
+
20
+
21
+ def open_file(filename):
22
+ if sys.platform == "win32":
23
+ os.startfile(filename)
24
+ else:
25
+ subprocess.call(["xdg-open", filename])
26
+
27
+
28
+ if __name__ == "__main__":
29
+ import warp.examples
30
+
31
+ source_dir = warp.examples.get_source_directory()
32
+ print(f"Example source directory: {source_dir}")
33
+
34
+ try:
35
+ open_file(source_dir)
36
+ except Exception:
37
+ pass
@@ -0,0 +1,86 @@
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
+ ###########################################################################
17
+ # Example CuPy
18
+ #
19
+ # The example demonstrates interoperability with CuPy on CUDA devices
20
+ # and NumPy on CPU devices.
21
+ ###########################################################################
22
+
23
+ import warp as wp
24
+
25
+
26
+ @wp.kernel
27
+ def saxpy(x: wp.array(dtype=float), y: wp.array(dtype=float), a: float):
28
+ i = wp.tid()
29
+ y[i] = a * x[i] + y[i]
30
+
31
+
32
+ class Example:
33
+ def __init__(self):
34
+ device = wp.get_device()
35
+
36
+ self.n = 10
37
+ self.a = 1.0
38
+
39
+ if device.is_cuda:
40
+ # use CuPy arrays on CUDA devices
41
+ import cupy as cp
42
+
43
+ print(f"Using CuPy on device {device}")
44
+
45
+ # tell CuPy to use the same device
46
+ with cp.cuda.Device(device.ordinal):
47
+ self.x = cp.arange(self.n, dtype=cp.float32)
48
+ self.y = cp.ones(self.n, dtype=cp.float32)
49
+ else:
50
+ # use NumPy arrays on CPU
51
+ import numpy as np
52
+
53
+ print("Using NumPy on CPU")
54
+
55
+ self.x = np.arange(self.n, dtype=np.float32)
56
+ self.y = np.ones(self.n, dtype=np.float32)
57
+
58
+ def step(self):
59
+ # Launch a Warp kernel on the pre-allocated arrays.
60
+ # When running on a CUDA device, these are CuPy arrays.
61
+ # When running on the CPU, these are NumPy arrays.
62
+ #
63
+ # Note that the arrays can be passed to Warp kernels directly. Under the hood,
64
+ # Warp uses the __cuda_array_interface__ and __array_interface__ protocols to
65
+ # access the data.
66
+ wp.launch(saxpy, dim=self.n, inputs=[self.x, self.y, self.a])
67
+
68
+ def render(self):
69
+ print(self.y)
70
+
71
+
72
+ if __name__ == "__main__":
73
+ import argparse
74
+
75
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
76
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
77
+ parser.add_argument("--num_frames", type=int, default=10, help="Total number of frames.")
78
+
79
+ args = parser.parse_known_args()[0]
80
+
81
+ with wp.ScopedDevice(args.device):
82
+ example = Example()
83
+
84
+ for _ in range(args.num_frames):
85
+ example.step()
86
+ example.render()
@@ -0,0 +1,241 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2022 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
+ ###########################################################################
17
+ # Example DEM
18
+ #
19
+ # Shows how to implement a DEM particle simulation with cohesion between
20
+ # particles. Neighbors are found using the wp.HashGrid class, and
21
+ # wp.hash_grid_query(), wp.hash_grid_query_next() kernel methods.
22
+ #
23
+ ###########################################################################
24
+
25
+ import numpy as np
26
+
27
+ import warp as wp
28
+ import warp.render
29
+
30
+
31
+ @wp.func
32
+ def contact_force(n: wp.vec3, v: wp.vec3, c: float, k_n: float, k_d: float, k_f: float, k_mu: float):
33
+ vn = wp.dot(n, v)
34
+ jn = c * k_n
35
+ jd = min(vn, 0.0) * k_d
36
+
37
+ # contact force
38
+ fn = jn + jd
39
+
40
+ # friction force
41
+ vt = v - n * vn
42
+ vs = wp.length(vt)
43
+
44
+ if vs > 0.0:
45
+ vt = vt / vs
46
+
47
+ # Coulomb condition
48
+ ft = wp.min(vs * k_f, k_mu * wp.abs(fn))
49
+
50
+ # total force
51
+ return -n * fn - vt * ft
52
+
53
+
54
+ @wp.kernel
55
+ def apply_forces(
56
+ grid: wp.uint64,
57
+ particle_x: wp.array(dtype=wp.vec3),
58
+ particle_v: wp.array(dtype=wp.vec3),
59
+ particle_f: wp.array(dtype=wp.vec3),
60
+ radius: float,
61
+ k_contact: float,
62
+ k_damp: float,
63
+ k_friction: float,
64
+ k_mu: float,
65
+ ):
66
+ tid = wp.tid()
67
+
68
+ # order threads by cell
69
+ i = wp.hash_grid_point_id(grid, tid)
70
+
71
+ x = particle_x[i]
72
+ v = particle_v[i]
73
+
74
+ f = wp.vec3()
75
+
76
+ # ground contact
77
+ n = wp.vec3(0.0, 1.0, 0.0)
78
+ c = wp.dot(n, x)
79
+
80
+ cohesion_ground = 0.02
81
+ cohesion_particle = 0.0075
82
+
83
+ if c < cohesion_ground:
84
+ f = f + contact_force(n, v, c, k_contact, k_damp, 100.0, 0.5)
85
+
86
+ # particle contact
87
+ neighbors = wp.hash_grid_query(grid, x, radius * 5.0)
88
+
89
+ for index in neighbors:
90
+ if index != i:
91
+ # compute distance to point
92
+ n = x - particle_x[index]
93
+ d = wp.length(n)
94
+ err = d - radius * 2.0
95
+
96
+ if err <= cohesion_particle:
97
+ n = n / d
98
+ vrel = v - particle_v[index]
99
+
100
+ f = f + contact_force(n, vrel, err, k_contact, k_damp, k_friction, k_mu)
101
+
102
+ particle_f[i] = f
103
+
104
+
105
+ @wp.kernel
106
+ def integrate(
107
+ x: wp.array(dtype=wp.vec3),
108
+ v: wp.array(dtype=wp.vec3),
109
+ f: wp.array(dtype=wp.vec3),
110
+ gravity: wp.vec3,
111
+ dt: float,
112
+ inv_mass: float,
113
+ ):
114
+ tid = wp.tid()
115
+
116
+ v_new = v[tid] + f[tid] * inv_mass * dt + gravity * dt
117
+ x_new = x[tid] + v_new * dt
118
+
119
+ v[tid] = v_new
120
+ x[tid] = x_new
121
+
122
+
123
+ class Example:
124
+ def __init__(self, stage_path="example_dem.usd"):
125
+ fps = 60
126
+ self.frame_dt = 1.0 / fps
127
+
128
+ self.sim_substeps = 64
129
+ self.sim_dt = self.frame_dt / self.sim_substeps
130
+ self.sim_time = 0.0
131
+
132
+ self.point_radius = 0.1
133
+
134
+ self.k_contact = 8000.0
135
+ self.k_damp = 2.0
136
+ self.k_friction = 1.0
137
+ self.k_mu = 100000.0 # for cohesive materials
138
+
139
+ self.inv_mass = 64.0
140
+
141
+ self.grid = wp.HashGrid(128, 128, 128)
142
+ self.grid_cell_size = self.point_radius * 5.0
143
+
144
+ self.points = self.particle_grid(32, 64, 32, (0.0, 0.5, 0.0), self.point_radius, 0.1)
145
+
146
+ self.x = wp.array(self.points, dtype=wp.vec3)
147
+ self.v = wp.array(np.ones([len(self.x), 3]) * np.array([0.0, 0.0, 15.0]), dtype=wp.vec3)
148
+ self.f = wp.zeros_like(self.v)
149
+
150
+ if stage_path:
151
+ self.renderer = wp.render.UsdRenderer(stage_path)
152
+ self.renderer.render_ground()
153
+ else:
154
+ self.renderer = None
155
+
156
+ self.use_cuda_graph = wp.get_device().is_cuda
157
+ if self.use_cuda_graph:
158
+ with wp.ScopedCapture() as capture:
159
+ self.simulate()
160
+ self.graph = capture.graph
161
+
162
+ def simulate(self):
163
+ for _ in range(self.sim_substeps):
164
+ wp.launch(
165
+ kernel=apply_forces,
166
+ dim=len(self.x),
167
+ inputs=[
168
+ self.grid.id,
169
+ self.x,
170
+ self.v,
171
+ self.f,
172
+ self.point_radius,
173
+ self.k_contact,
174
+ self.k_damp,
175
+ self.k_friction,
176
+ self.k_mu,
177
+ ],
178
+ )
179
+ wp.launch(
180
+ kernel=integrate,
181
+ dim=len(self.x),
182
+ inputs=[self.x, self.v, self.f, (0.0, -9.8, 0.0), self.sim_dt, self.inv_mass],
183
+ )
184
+
185
+ def step(self):
186
+ with wp.ScopedTimer("step"):
187
+ with wp.ScopedTimer("grid build", active=False):
188
+ self.grid.build(self.x, self.grid_cell_size)
189
+
190
+ if self.use_cuda_graph:
191
+ wp.capture_launch(self.graph)
192
+ else:
193
+ self.simulate()
194
+
195
+ self.sim_time += self.frame_dt
196
+
197
+ def render(self):
198
+ if self.renderer is None:
199
+ return
200
+
201
+ with wp.ScopedTimer("render"):
202
+ self.renderer.begin_frame(self.sim_time)
203
+ self.renderer.render_points(
204
+ points=self.x.numpy(), radius=self.point_radius, name="points", colors=(0.8, 0.3, 0.2)
205
+ )
206
+ self.renderer.end_frame()
207
+
208
+ # creates a grid of particles
209
+ def particle_grid(self, dim_x, dim_y, dim_z, lower, radius, jitter):
210
+ rng = np.random.default_rng(42)
211
+ points = np.meshgrid(np.linspace(0, dim_x, dim_x), np.linspace(0, dim_y, dim_y), np.linspace(0, dim_z, dim_z))
212
+ points_t = np.array((points[0], points[1], points[2])).T * radius * 2.0 + np.array(lower)
213
+ points_t = points_t + rng.random(size=points_t.shape) * radius * jitter
214
+
215
+ return points_t.reshape((-1, 3))
216
+
217
+
218
+ if __name__ == "__main__":
219
+ import argparse
220
+
221
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
222
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
223
+ parser.add_argument(
224
+ "--stage_path",
225
+ type=lambda x: None if x == "None" else str(x),
226
+ default="example_dem.usd",
227
+ help="Path to the output USD file.",
228
+ )
229
+ parser.add_argument("--num_frames", type=int, default=200, help="Total number of frames.")
230
+
231
+ args = parser.parse_known_args()[0]
232
+
233
+ with wp.ScopedDevice(args.device):
234
+ example = Example(stage_path=args.stage_path)
235
+
236
+ for _ in range(args.num_frames):
237
+ example.step()
238
+ example.render()
239
+
240
+ if example.renderer:
241
+ example.renderer.save()