warp-lang 1.7.0__py3-none-manylinux_2_34_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (429) hide show
  1. warp/__init__.py +139 -0
  2. warp/__init__.pyi +1 -0
  3. warp/autograd.py +1142 -0
  4. warp/bin/warp-clang.so +0 -0
  5. warp/bin/warp.so +0 -0
  6. warp/build.py +557 -0
  7. warp/build_dll.py +405 -0
  8. warp/builtins.py +6855 -0
  9. warp/codegen.py +3969 -0
  10. warp/config.py +158 -0
  11. warp/constants.py +57 -0
  12. warp/context.py +6812 -0
  13. warp/dlpack.py +462 -0
  14. warp/examples/__init__.py +24 -0
  15. warp/examples/assets/bear.usd +0 -0
  16. warp/examples/assets/bunny.usd +0 -0
  17. warp/examples/assets/cartpole.urdf +110 -0
  18. warp/examples/assets/crazyflie.usd +0 -0
  19. warp/examples/assets/cube.usd +0 -0
  20. warp/examples/assets/nonuniform.usd +0 -0
  21. warp/examples/assets/nv_ant.xml +92 -0
  22. warp/examples/assets/nv_humanoid.xml +183 -0
  23. warp/examples/assets/nvidia_logo.png +0 -0
  24. warp/examples/assets/pixel.jpg +0 -0
  25. warp/examples/assets/quadruped.urdf +268 -0
  26. warp/examples/assets/rocks.nvdb +0 -0
  27. warp/examples/assets/rocks.usd +0 -0
  28. warp/examples/assets/sphere.usd +0 -0
  29. warp/examples/assets/square_cloth.usd +0 -0
  30. warp/examples/benchmarks/benchmark_api.py +389 -0
  31. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  32. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  33. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  34. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  35. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  36. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  37. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  38. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  39. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  40. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  41. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  42. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  43. warp/examples/benchmarks/benchmark_launches.py +301 -0
  44. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  45. warp/examples/browse.py +37 -0
  46. warp/examples/core/example_cupy.py +86 -0
  47. warp/examples/core/example_dem.py +241 -0
  48. warp/examples/core/example_fluid.py +299 -0
  49. warp/examples/core/example_graph_capture.py +150 -0
  50. warp/examples/core/example_marching_cubes.py +194 -0
  51. warp/examples/core/example_mesh.py +180 -0
  52. warp/examples/core/example_mesh_intersect.py +211 -0
  53. warp/examples/core/example_nvdb.py +182 -0
  54. warp/examples/core/example_raycast.py +111 -0
  55. warp/examples/core/example_raymarch.py +205 -0
  56. warp/examples/core/example_render_opengl.py +193 -0
  57. warp/examples/core/example_sample_mesh.py +300 -0
  58. warp/examples/core/example_sph.py +411 -0
  59. warp/examples/core/example_torch.py +211 -0
  60. warp/examples/core/example_wave.py +269 -0
  61. warp/examples/fem/example_adaptive_grid.py +286 -0
  62. warp/examples/fem/example_apic_fluid.py +423 -0
  63. warp/examples/fem/example_burgers.py +261 -0
  64. warp/examples/fem/example_convection_diffusion.py +178 -0
  65. warp/examples/fem/example_convection_diffusion_dg.py +204 -0
  66. warp/examples/fem/example_deformed_geometry.py +172 -0
  67. warp/examples/fem/example_diffusion.py +196 -0
  68. warp/examples/fem/example_diffusion_3d.py +225 -0
  69. warp/examples/fem/example_diffusion_mgpu.py +220 -0
  70. warp/examples/fem/example_distortion_energy.py +228 -0
  71. warp/examples/fem/example_magnetostatics.py +240 -0
  72. warp/examples/fem/example_mixed_elasticity.py +291 -0
  73. warp/examples/fem/example_navier_stokes.py +261 -0
  74. warp/examples/fem/example_nonconforming_contact.py +298 -0
  75. warp/examples/fem/example_stokes.py +213 -0
  76. warp/examples/fem/example_stokes_transfer.py +262 -0
  77. warp/examples/fem/example_streamlines.py +352 -0
  78. warp/examples/fem/utils.py +1000 -0
  79. warp/examples/interop/example_jax_callable.py +116 -0
  80. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  81. warp/examples/interop/example_jax_kernel.py +205 -0
  82. warp/examples/optim/example_bounce.py +266 -0
  83. warp/examples/optim/example_cloth_throw.py +228 -0
  84. warp/examples/optim/example_diffray.py +561 -0
  85. warp/examples/optim/example_drone.py +870 -0
  86. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  87. warp/examples/optim/example_inverse_kinematics.py +182 -0
  88. warp/examples/optim/example_inverse_kinematics_torch.py +191 -0
  89. warp/examples/optim/example_softbody_properties.py +400 -0
  90. warp/examples/optim/example_spring_cage.py +245 -0
  91. warp/examples/optim/example_trajectory.py +227 -0
  92. warp/examples/sim/example_cartpole.py +143 -0
  93. warp/examples/sim/example_cloth.py +225 -0
  94. warp/examples/sim/example_cloth_self_contact.py +322 -0
  95. warp/examples/sim/example_granular.py +130 -0
  96. warp/examples/sim/example_granular_collision_sdf.py +202 -0
  97. warp/examples/sim/example_jacobian_ik.py +244 -0
  98. warp/examples/sim/example_particle_chain.py +124 -0
  99. warp/examples/sim/example_quadruped.py +203 -0
  100. warp/examples/sim/example_rigid_chain.py +203 -0
  101. warp/examples/sim/example_rigid_contact.py +195 -0
  102. warp/examples/sim/example_rigid_force.py +133 -0
  103. warp/examples/sim/example_rigid_gyroscopic.py +115 -0
  104. warp/examples/sim/example_rigid_soft_contact.py +140 -0
  105. warp/examples/sim/example_soft_body.py +196 -0
  106. warp/examples/tile/example_tile_cholesky.py +87 -0
  107. warp/examples/tile/example_tile_convolution.py +66 -0
  108. warp/examples/tile/example_tile_fft.py +55 -0
  109. warp/examples/tile/example_tile_filtering.py +113 -0
  110. warp/examples/tile/example_tile_matmul.py +85 -0
  111. warp/examples/tile/example_tile_mlp.py +383 -0
  112. warp/examples/tile/example_tile_nbody.py +199 -0
  113. warp/examples/tile/example_tile_walker.py +327 -0
  114. warp/fabric.py +355 -0
  115. warp/fem/__init__.py +106 -0
  116. warp/fem/adaptivity.py +508 -0
  117. warp/fem/cache.py +572 -0
  118. warp/fem/dirichlet.py +202 -0
  119. warp/fem/domain.py +411 -0
  120. warp/fem/field/__init__.py +125 -0
  121. warp/fem/field/field.py +619 -0
  122. warp/fem/field/nodal_field.py +326 -0
  123. warp/fem/field/restriction.py +37 -0
  124. warp/fem/field/virtual.py +848 -0
  125. warp/fem/geometry/__init__.py +32 -0
  126. warp/fem/geometry/adaptive_nanogrid.py +857 -0
  127. warp/fem/geometry/closest_point.py +84 -0
  128. warp/fem/geometry/deformed_geometry.py +221 -0
  129. warp/fem/geometry/element.py +776 -0
  130. warp/fem/geometry/geometry.py +362 -0
  131. warp/fem/geometry/grid_2d.py +392 -0
  132. warp/fem/geometry/grid_3d.py +452 -0
  133. warp/fem/geometry/hexmesh.py +911 -0
  134. warp/fem/geometry/nanogrid.py +571 -0
  135. warp/fem/geometry/partition.py +389 -0
  136. warp/fem/geometry/quadmesh.py +663 -0
  137. warp/fem/geometry/tetmesh.py +855 -0
  138. warp/fem/geometry/trimesh.py +806 -0
  139. warp/fem/integrate.py +2335 -0
  140. warp/fem/linalg.py +419 -0
  141. warp/fem/operator.py +293 -0
  142. warp/fem/polynomial.py +229 -0
  143. warp/fem/quadrature/__init__.py +17 -0
  144. warp/fem/quadrature/pic_quadrature.py +299 -0
  145. warp/fem/quadrature/quadrature.py +591 -0
  146. warp/fem/space/__init__.py +228 -0
  147. warp/fem/space/basis_function_space.py +468 -0
  148. warp/fem/space/basis_space.py +667 -0
  149. warp/fem/space/dof_mapper.py +251 -0
  150. warp/fem/space/function_space.py +309 -0
  151. warp/fem/space/grid_2d_function_space.py +177 -0
  152. warp/fem/space/grid_3d_function_space.py +227 -0
  153. warp/fem/space/hexmesh_function_space.py +257 -0
  154. warp/fem/space/nanogrid_function_space.py +201 -0
  155. warp/fem/space/partition.py +367 -0
  156. warp/fem/space/quadmesh_function_space.py +223 -0
  157. warp/fem/space/restriction.py +179 -0
  158. warp/fem/space/shape/__init__.py +143 -0
  159. warp/fem/space/shape/cube_shape_function.py +1105 -0
  160. warp/fem/space/shape/shape_function.py +133 -0
  161. warp/fem/space/shape/square_shape_function.py +926 -0
  162. warp/fem/space/shape/tet_shape_function.py +834 -0
  163. warp/fem/space/shape/triangle_shape_function.py +672 -0
  164. warp/fem/space/tetmesh_function_space.py +271 -0
  165. warp/fem/space/topology.py +424 -0
  166. warp/fem/space/trimesh_function_space.py +194 -0
  167. warp/fem/types.py +99 -0
  168. warp/fem/utils.py +420 -0
  169. warp/jax.py +187 -0
  170. warp/jax_experimental/__init__.py +16 -0
  171. warp/jax_experimental/custom_call.py +351 -0
  172. warp/jax_experimental/ffi.py +698 -0
  173. warp/jax_experimental/xla_ffi.py +602 -0
  174. warp/math.py +244 -0
  175. warp/native/array.h +1145 -0
  176. warp/native/builtin.h +1800 -0
  177. warp/native/bvh.cpp +492 -0
  178. warp/native/bvh.cu +791 -0
  179. warp/native/bvh.h +554 -0
  180. warp/native/clang/clang.cpp +536 -0
  181. warp/native/coloring.cpp +613 -0
  182. warp/native/crt.cpp +51 -0
  183. warp/native/crt.h +362 -0
  184. warp/native/cuda_crt.h +1058 -0
  185. warp/native/cuda_util.cpp +646 -0
  186. warp/native/cuda_util.h +307 -0
  187. warp/native/error.cpp +77 -0
  188. warp/native/error.h +36 -0
  189. warp/native/exports.h +1878 -0
  190. warp/native/fabric.h +245 -0
  191. warp/native/hashgrid.cpp +311 -0
  192. warp/native/hashgrid.cu +87 -0
  193. warp/native/hashgrid.h +240 -0
  194. warp/native/initializer_array.h +41 -0
  195. warp/native/intersect.h +1230 -0
  196. warp/native/intersect_adj.h +375 -0
  197. warp/native/intersect_tri.h +339 -0
  198. warp/native/marching.cpp +19 -0
  199. warp/native/marching.cu +514 -0
  200. warp/native/marching.h +19 -0
  201. warp/native/mat.h +2220 -0
  202. warp/native/mathdx.cpp +87 -0
  203. warp/native/matnn.h +343 -0
  204. warp/native/mesh.cpp +266 -0
  205. warp/native/mesh.cu +404 -0
  206. warp/native/mesh.h +1980 -0
  207. warp/native/nanovdb/GridHandle.h +366 -0
  208. warp/native/nanovdb/HostBuffer.h +590 -0
  209. warp/native/nanovdb/NanoVDB.h +6624 -0
  210. warp/native/nanovdb/PNanoVDB.h +3390 -0
  211. warp/native/noise.h +859 -0
  212. warp/native/quat.h +1371 -0
  213. warp/native/rand.h +342 -0
  214. warp/native/range.h +139 -0
  215. warp/native/reduce.cpp +174 -0
  216. warp/native/reduce.cu +364 -0
  217. warp/native/runlength_encode.cpp +79 -0
  218. warp/native/runlength_encode.cu +61 -0
  219. warp/native/scan.cpp +47 -0
  220. warp/native/scan.cu +53 -0
  221. warp/native/scan.h +23 -0
  222. warp/native/solid_angle.h +466 -0
  223. warp/native/sort.cpp +251 -0
  224. warp/native/sort.cu +277 -0
  225. warp/native/sort.h +33 -0
  226. warp/native/sparse.cpp +378 -0
  227. warp/native/sparse.cu +524 -0
  228. warp/native/spatial.h +657 -0
  229. warp/native/svd.h +702 -0
  230. warp/native/temp_buffer.h +46 -0
  231. warp/native/tile.h +2584 -0
  232. warp/native/tile_reduce.h +264 -0
  233. warp/native/vec.h +1426 -0
  234. warp/native/volume.cpp +501 -0
  235. warp/native/volume.cu +67 -0
  236. warp/native/volume.h +969 -0
  237. warp/native/volume_builder.cu +477 -0
  238. warp/native/volume_builder.h +52 -0
  239. warp/native/volume_impl.h +70 -0
  240. warp/native/warp.cpp +1082 -0
  241. warp/native/warp.cu +3636 -0
  242. warp/native/warp.h +381 -0
  243. warp/optim/__init__.py +17 -0
  244. warp/optim/adam.py +163 -0
  245. warp/optim/linear.py +1137 -0
  246. warp/optim/sgd.py +112 -0
  247. warp/paddle.py +407 -0
  248. warp/render/__init__.py +18 -0
  249. warp/render/render_opengl.py +3518 -0
  250. warp/render/render_usd.py +784 -0
  251. warp/render/utils.py +160 -0
  252. warp/sim/__init__.py +65 -0
  253. warp/sim/articulation.py +793 -0
  254. warp/sim/collide.py +2395 -0
  255. warp/sim/graph_coloring.py +300 -0
  256. warp/sim/import_mjcf.py +790 -0
  257. warp/sim/import_snu.py +227 -0
  258. warp/sim/import_urdf.py +579 -0
  259. warp/sim/import_usd.py +894 -0
  260. warp/sim/inertia.py +324 -0
  261. warp/sim/integrator.py +242 -0
  262. warp/sim/integrator_euler.py +1997 -0
  263. warp/sim/integrator_featherstone.py +2101 -0
  264. warp/sim/integrator_vbd.py +2048 -0
  265. warp/sim/integrator_xpbd.py +3292 -0
  266. warp/sim/model.py +4791 -0
  267. warp/sim/particles.py +121 -0
  268. warp/sim/render.py +427 -0
  269. warp/sim/utils.py +428 -0
  270. warp/sparse.py +2057 -0
  271. warp/stubs.py +3333 -0
  272. warp/tape.py +1203 -0
  273. warp/tests/__init__.py +1 -0
  274. warp/tests/__main__.py +4 -0
  275. warp/tests/assets/curlnoise_golden.npy +0 -0
  276. warp/tests/assets/mlp_golden.npy +0 -0
  277. warp/tests/assets/pixel.npy +0 -0
  278. warp/tests/assets/pnoise_golden.npy +0 -0
  279. warp/tests/assets/spiky.usd +0 -0
  280. warp/tests/assets/test_grid.nvdb +0 -0
  281. warp/tests/assets/test_index_grid.nvdb +0 -0
  282. warp/tests/assets/test_int32_grid.nvdb +0 -0
  283. warp/tests/assets/test_vec_grid.nvdb +0 -0
  284. warp/tests/assets/torus.nvdb +0 -0
  285. warp/tests/assets/torus.usda +105 -0
  286. warp/tests/aux_test_class_kernel.py +34 -0
  287. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  288. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  289. warp/tests/aux_test_dependent.py +29 -0
  290. warp/tests/aux_test_grad_customs.py +29 -0
  291. warp/tests/aux_test_instancing_gc.py +26 -0
  292. warp/tests/aux_test_module_unload.py +23 -0
  293. warp/tests/aux_test_name_clash1.py +40 -0
  294. warp/tests/aux_test_name_clash2.py +40 -0
  295. warp/tests/aux_test_reference.py +9 -0
  296. warp/tests/aux_test_reference_reference.py +8 -0
  297. warp/tests/aux_test_square.py +16 -0
  298. warp/tests/aux_test_unresolved_func.py +22 -0
  299. warp/tests/aux_test_unresolved_symbol.py +22 -0
  300. warp/tests/cuda/__init__.py +0 -0
  301. warp/tests/cuda/test_async.py +676 -0
  302. warp/tests/cuda/test_ipc.py +124 -0
  303. warp/tests/cuda/test_mempool.py +233 -0
  304. warp/tests/cuda/test_multigpu.py +169 -0
  305. warp/tests/cuda/test_peer.py +139 -0
  306. warp/tests/cuda/test_pinned.py +84 -0
  307. warp/tests/cuda/test_streams.py +634 -0
  308. warp/tests/geometry/__init__.py +0 -0
  309. warp/tests/geometry/test_bvh.py +200 -0
  310. warp/tests/geometry/test_hash_grid.py +221 -0
  311. warp/tests/geometry/test_marching_cubes.py +74 -0
  312. warp/tests/geometry/test_mesh.py +316 -0
  313. warp/tests/geometry/test_mesh_query_aabb.py +399 -0
  314. warp/tests/geometry/test_mesh_query_point.py +932 -0
  315. warp/tests/geometry/test_mesh_query_ray.py +311 -0
  316. warp/tests/geometry/test_volume.py +1103 -0
  317. warp/tests/geometry/test_volume_write.py +346 -0
  318. warp/tests/interop/__init__.py +0 -0
  319. warp/tests/interop/test_dlpack.py +729 -0
  320. warp/tests/interop/test_jax.py +371 -0
  321. warp/tests/interop/test_paddle.py +800 -0
  322. warp/tests/interop/test_torch.py +1001 -0
  323. warp/tests/run_coverage_serial.py +39 -0
  324. warp/tests/sim/__init__.py +0 -0
  325. warp/tests/sim/disabled_kinematics.py +244 -0
  326. warp/tests/sim/flaky_test_sim_grad.py +290 -0
  327. warp/tests/sim/test_collision.py +604 -0
  328. warp/tests/sim/test_coloring.py +258 -0
  329. warp/tests/sim/test_model.py +224 -0
  330. warp/tests/sim/test_sim_grad_bounce_linear.py +212 -0
  331. warp/tests/sim/test_sim_kinematics.py +98 -0
  332. warp/tests/sim/test_vbd.py +597 -0
  333. warp/tests/test_adam.py +163 -0
  334. warp/tests/test_arithmetic.py +1096 -0
  335. warp/tests/test_array.py +2972 -0
  336. warp/tests/test_array_reduce.py +156 -0
  337. warp/tests/test_assert.py +250 -0
  338. warp/tests/test_atomic.py +153 -0
  339. warp/tests/test_bool.py +220 -0
  340. warp/tests/test_builtins_resolution.py +1298 -0
  341. warp/tests/test_closest_point_edge_edge.py +327 -0
  342. warp/tests/test_codegen.py +810 -0
  343. warp/tests/test_codegen_instancing.py +1495 -0
  344. warp/tests/test_compile_consts.py +215 -0
  345. warp/tests/test_conditional.py +252 -0
  346. warp/tests/test_context.py +42 -0
  347. warp/tests/test_copy.py +238 -0
  348. warp/tests/test_ctypes.py +638 -0
  349. warp/tests/test_dense.py +73 -0
  350. warp/tests/test_devices.py +97 -0
  351. warp/tests/test_examples.py +482 -0
  352. warp/tests/test_fabricarray.py +996 -0
  353. warp/tests/test_fast_math.py +74 -0
  354. warp/tests/test_fem.py +2003 -0
  355. warp/tests/test_fp16.py +136 -0
  356. warp/tests/test_func.py +454 -0
  357. warp/tests/test_future_annotations.py +98 -0
  358. warp/tests/test_generics.py +656 -0
  359. warp/tests/test_grad.py +893 -0
  360. warp/tests/test_grad_customs.py +339 -0
  361. warp/tests/test_grad_debug.py +341 -0
  362. warp/tests/test_implicit_init.py +411 -0
  363. warp/tests/test_import.py +45 -0
  364. warp/tests/test_indexedarray.py +1140 -0
  365. warp/tests/test_intersect.py +73 -0
  366. warp/tests/test_iter.py +76 -0
  367. warp/tests/test_large.py +177 -0
  368. warp/tests/test_launch.py +411 -0
  369. warp/tests/test_lerp.py +151 -0
  370. warp/tests/test_linear_solvers.py +193 -0
  371. warp/tests/test_lvalue.py +427 -0
  372. warp/tests/test_mat.py +2089 -0
  373. warp/tests/test_mat_lite.py +122 -0
  374. warp/tests/test_mat_scalar_ops.py +2913 -0
  375. warp/tests/test_math.py +178 -0
  376. warp/tests/test_mlp.py +282 -0
  377. warp/tests/test_module_hashing.py +258 -0
  378. warp/tests/test_modules_lite.py +44 -0
  379. warp/tests/test_noise.py +252 -0
  380. warp/tests/test_operators.py +299 -0
  381. warp/tests/test_options.py +129 -0
  382. warp/tests/test_overwrite.py +551 -0
  383. warp/tests/test_print.py +339 -0
  384. warp/tests/test_quat.py +2315 -0
  385. warp/tests/test_rand.py +339 -0
  386. warp/tests/test_reload.py +302 -0
  387. warp/tests/test_rounding.py +185 -0
  388. warp/tests/test_runlength_encode.py +196 -0
  389. warp/tests/test_scalar_ops.py +105 -0
  390. warp/tests/test_smoothstep.py +108 -0
  391. warp/tests/test_snippet.py +318 -0
  392. warp/tests/test_sparse.py +582 -0
  393. warp/tests/test_spatial.py +2229 -0
  394. warp/tests/test_special_values.py +361 -0
  395. warp/tests/test_static.py +592 -0
  396. warp/tests/test_struct.py +734 -0
  397. warp/tests/test_tape.py +204 -0
  398. warp/tests/test_transient_module.py +93 -0
  399. warp/tests/test_triangle_closest_point.py +145 -0
  400. warp/tests/test_types.py +562 -0
  401. warp/tests/test_utils.py +588 -0
  402. warp/tests/test_vec.py +1487 -0
  403. warp/tests/test_vec_lite.py +80 -0
  404. warp/tests/test_vec_scalar_ops.py +2327 -0
  405. warp/tests/test_verify_fp.py +100 -0
  406. warp/tests/tile/__init__.py +0 -0
  407. warp/tests/tile/test_tile.py +780 -0
  408. warp/tests/tile/test_tile_load.py +407 -0
  409. warp/tests/tile/test_tile_mathdx.py +208 -0
  410. warp/tests/tile/test_tile_mlp.py +402 -0
  411. warp/tests/tile/test_tile_reduce.py +447 -0
  412. warp/tests/tile/test_tile_shared_memory.py +247 -0
  413. warp/tests/tile/test_tile_view.py +173 -0
  414. warp/tests/unittest_serial.py +47 -0
  415. warp/tests/unittest_suites.py +427 -0
  416. warp/tests/unittest_utils.py +468 -0
  417. warp/tests/walkthrough_debug.py +93 -0
  418. warp/thirdparty/__init__.py +0 -0
  419. warp/thirdparty/appdirs.py +598 -0
  420. warp/thirdparty/dlpack.py +145 -0
  421. warp/thirdparty/unittest_parallel.py +570 -0
  422. warp/torch.py +391 -0
  423. warp/types.py +5230 -0
  424. warp/utils.py +1137 -0
  425. warp_lang-1.7.0.dist-info/METADATA +516 -0
  426. warp_lang-1.7.0.dist-info/RECORD +429 -0
  427. warp_lang-1.7.0.dist-info/WHEEL +5 -0
  428. warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
  429. warp_lang-1.7.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,225 @@
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 Sim Cloth
18
+ #
19
+ # Shows a simulation of an FEM cloth model colliding against a static
20
+ # rigid body mesh using the wp.sim.ModelBuilder().
21
+ #
22
+ ###########################################################################
23
+
24
+ import math
25
+ import os
26
+ from enum import Enum
27
+
28
+ import numpy as np
29
+ from pxr import Usd, UsdGeom
30
+
31
+ import warp as wp
32
+ import warp.examples
33
+ import warp.sim
34
+ import warp.sim.render
35
+
36
+
37
+ class IntegratorType(Enum):
38
+ EULER = "euler"
39
+ XPBD = "xpbd"
40
+ VBD = "vbd"
41
+
42
+ def __str__(self):
43
+ return self.value
44
+
45
+
46
+ class Example:
47
+ def __init__(
48
+ self, stage_path="example_cloth.usd", integrator: IntegratorType = IntegratorType.EULER, height=32, width=64
49
+ ):
50
+ self.integrator_type = integrator
51
+
52
+ self.sim_height = height
53
+ self.sim_width = width
54
+
55
+ fps = 60
56
+ self.sim_substeps = 32
57
+ self.frame_dt = 1.0 / fps
58
+ self.sim_dt = self.frame_dt / self.sim_substeps
59
+ self.sim_time = 0.0
60
+ self.profiler = {}
61
+
62
+ builder = wp.sim.ModelBuilder()
63
+
64
+ if self.integrator_type == IntegratorType.EULER:
65
+ builder.add_cloth_grid(
66
+ pos=wp.vec3(0.0, 4.0, 0.0),
67
+ rot=wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), math.pi * 0.5),
68
+ vel=wp.vec3(0.0, 0.0, 0.0),
69
+ dim_x=self.sim_width,
70
+ dim_y=self.sim_height,
71
+ cell_x=0.1,
72
+ cell_y=0.1,
73
+ mass=0.1,
74
+ fix_left=True,
75
+ tri_ke=1.0e3,
76
+ tri_ka=1.0e3,
77
+ tri_kd=1.0e1,
78
+ )
79
+ elif self.integrator_type == IntegratorType.XPBD:
80
+ builder.add_cloth_grid(
81
+ pos=wp.vec3(0.0, 4.0, 0.0),
82
+ rot=wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), math.pi * 0.5),
83
+ vel=wp.vec3(0.0, 0.0, 0.0),
84
+ dim_x=self.sim_width,
85
+ dim_y=self.sim_height,
86
+ cell_x=0.1,
87
+ cell_y=0.1,
88
+ mass=0.1,
89
+ fix_left=True,
90
+ edge_ke=1.0e2,
91
+ add_springs=True,
92
+ spring_ke=1.0e3,
93
+ spring_kd=0.0,
94
+ )
95
+ else:
96
+ # VBD
97
+ builder.add_cloth_grid(
98
+ pos=wp.vec3(0.0, 4.0, 0.0),
99
+ rot=wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), math.pi * 0.5),
100
+ vel=wp.vec3(0.0, 0.0, 0.0),
101
+ dim_x=self.sim_width,
102
+ dim_y=self.sim_height,
103
+ cell_x=0.1,
104
+ cell_y=0.1,
105
+ mass=0.1,
106
+ fix_left=True,
107
+ tri_ke=1e4,
108
+ tri_ka=1e4,
109
+ tri_kd=1e-5,
110
+ edge_ke=100,
111
+ )
112
+
113
+ usd_stage = Usd.Stage.Open(os.path.join(warp.examples.get_asset_directory(), "bunny.usd"))
114
+ usd_geom = UsdGeom.Mesh(usd_stage.GetPrimAtPath("/root/bunny"))
115
+
116
+ mesh_points = np.array(usd_geom.GetPointsAttr().Get())
117
+ mesh_indices = np.array(usd_geom.GetFaceVertexIndicesAttr().Get())
118
+
119
+ mesh = wp.sim.Mesh(mesh_points, mesh_indices)
120
+
121
+ builder.add_shape_mesh(
122
+ body=-1,
123
+ mesh=mesh,
124
+ pos=wp.vec3(1.0, 0.0, 1.0),
125
+ rot=wp.quat_from_axis_angle(wp.vec3(0.0, 1.0, 0.0), math.pi * 0.5),
126
+ scale=wp.vec3(2.0, 2.0, 2.0),
127
+ ke=1.0e2,
128
+ kd=1.0e2,
129
+ kf=1.0e1,
130
+ )
131
+
132
+ if self.integrator_type == IntegratorType.VBD:
133
+ builder.color()
134
+
135
+ self.model = builder.finalize()
136
+ self.model.ground = True
137
+ self.model.soft_contact_ke = 1.0e4
138
+ self.model.soft_contact_kd = 1.0e2
139
+
140
+ if self.integrator_type == IntegratorType.EULER:
141
+ self.integrator = wp.sim.SemiImplicitIntegrator()
142
+ elif self.integrator_type == IntegratorType.XPBD:
143
+ self.integrator = wp.sim.XPBDIntegrator(iterations=1)
144
+ else:
145
+ self.integrator = wp.sim.VBDIntegrator(self.model, iterations=1)
146
+
147
+ self.state_0 = self.model.state()
148
+ self.state_1 = self.model.state()
149
+
150
+ if stage_path:
151
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage_path, scaling=40.0)
152
+ else:
153
+ self.renderer = None
154
+
155
+ self.use_cuda_graph = wp.get_device().is_cuda
156
+ if self.use_cuda_graph:
157
+ with wp.ScopedCapture() as capture:
158
+ self.simulate()
159
+ self.graph = capture.graph
160
+
161
+ def simulate(self):
162
+ wp.sim.collide(self.model, self.state_0)
163
+
164
+ for _ in range(self.sim_substeps):
165
+ self.state_0.clear_forces()
166
+
167
+ self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
168
+
169
+ # swap states
170
+ (self.state_0, self.state_1) = (self.state_1, self.state_0)
171
+
172
+ def step(self):
173
+ with wp.ScopedTimer("step", dict=self.profiler):
174
+ if self.use_cuda_graph:
175
+ wp.capture_launch(self.graph)
176
+ else:
177
+ self.simulate()
178
+ self.sim_time += self.frame_dt
179
+
180
+ def render(self):
181
+ if self.renderer is None:
182
+ return
183
+
184
+ with wp.ScopedTimer("render"):
185
+ self.renderer.begin_frame(self.sim_time)
186
+ self.renderer.render(self.state_0)
187
+ self.renderer.end_frame()
188
+
189
+
190
+ if __name__ == "__main__":
191
+ import argparse
192
+
193
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
194
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
195
+ parser.add_argument(
196
+ "--stage_path",
197
+ type=lambda x: None if x == "None" else str(x),
198
+ default="example_cloth.usd",
199
+ help="Path to the output USD file.",
200
+ )
201
+ parser.add_argument("--num_frames", type=int, default=300, help="Total number of frames.")
202
+ parser.add_argument(
203
+ "--integrator",
204
+ help="Type of integrator",
205
+ type=IntegratorType,
206
+ choices=list(IntegratorType),
207
+ default=IntegratorType.EULER,
208
+ )
209
+ parser.add_argument("--width", type=int, default=64, help="Cloth resolution in x.")
210
+ parser.add_argument("--height", type=int, default=32, help="Cloth resolution in y.")
211
+
212
+ args = parser.parse_known_args()[0]
213
+
214
+ with wp.ScopedDevice(args.device):
215
+ example = Example(stage_path=args.stage_path, integrator=args.integrator, height=args.height, width=args.width)
216
+
217
+ for _i in range(args.num_frames):
218
+ example.step()
219
+ example.render()
220
+
221
+ frame_times = example.profiler["step"]
222
+ print("\nAverage frame sim time: {:.2f} ms".format(sum(frame_times) / len(frame_times)))
223
+
224
+ if example.renderer:
225
+ example.renderer.save()
@@ -0,0 +1,322 @@
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 Sim Cloth Self Contact
18
+ #
19
+ # This simulation demonstrates twisting an FEM cloth model using the VBD
20
+ # integrator, showcasing its ability to handle complex self-contacts while
21
+ # ensuring it remains intersection-free.
22
+ #
23
+ ###########################################################################
24
+
25
+ import math
26
+ import os
27
+
28
+ import numpy as np
29
+ from pxr import Usd, UsdGeom
30
+
31
+ import warp as wp
32
+ import warp.examples
33
+ import warp.sim
34
+ import warp.sim.render
35
+ from warp.sim.model import PARTICLE_FLAG_ACTIVE
36
+
37
+
38
+ @wp.kernel
39
+ def initialize_rotation(
40
+ # input
41
+ vertex_indices_to_rot: wp.array(dtype=wp.int32),
42
+ pos: wp.array(dtype=wp.vec3),
43
+ rot_centers: wp.array(dtype=wp.vec3),
44
+ rot_axes: wp.array(dtype=wp.vec3),
45
+ t: wp.array(dtype=float),
46
+ # output
47
+ roots: wp.array(dtype=wp.vec3),
48
+ roots_to_ps: wp.array(dtype=wp.vec3),
49
+ ):
50
+ tid = wp.tid()
51
+ v_index = vertex_indices_to_rot[wp.tid()]
52
+
53
+ p = pos[v_index]
54
+ rot_center = rot_centers[tid]
55
+ rot_axis = rot_axes[tid]
56
+ op = p - rot_center
57
+
58
+ root = wp.dot(op, rot_axis) * rot_axis
59
+
60
+ root_to_p = p - root
61
+
62
+ roots[tid] = root
63
+ roots_to_ps[tid] = root_to_p
64
+
65
+ if tid == 0:
66
+ t[0] = 0.0
67
+
68
+
69
+ @wp.kernel
70
+ def apply_rotation(
71
+ # input
72
+ vertex_indices_to_rot: wp.array(dtype=wp.int32),
73
+ rot_axes: wp.array(dtype=wp.vec3),
74
+ roots: wp.array(dtype=wp.vec3),
75
+ roots_to_ps: wp.array(dtype=wp.vec3),
76
+ t: wp.array(dtype=float),
77
+ angular_velocity: float,
78
+ dt: float,
79
+ end_time: float,
80
+ # output
81
+ pos_0: wp.array(dtype=wp.vec3),
82
+ pos_1: wp.array(dtype=wp.vec3),
83
+ ):
84
+ cur_t = t[0]
85
+ if cur_t > end_time:
86
+ return
87
+
88
+ tid = wp.tid()
89
+ v_index = vertex_indices_to_rot[wp.tid()]
90
+
91
+ rot_axis = rot_axes[tid]
92
+
93
+ ux = rot_axis[0]
94
+ uy = rot_axis[1]
95
+ uz = rot_axis[2]
96
+
97
+ theta = cur_t * angular_velocity
98
+
99
+ R = wp.mat33(
100
+ wp.cos(theta) + ux * ux * (1.0 - wp.cos(theta)),
101
+ ux * uy * (1.0 - wp.cos(theta)) - uz * wp.sin(theta),
102
+ ux * uz * (1.0 - wp.cos(theta)) + uy * wp.sin(theta),
103
+ uy * ux * (1.0 - wp.cos(theta)) + uz * wp.sin(theta),
104
+ wp.cos(theta) + uy * uy * (1.0 - wp.cos(theta)),
105
+ uy * uz * (1.0 - wp.cos(theta)) - ux * wp.sin(theta),
106
+ uz * ux * (1.0 - wp.cos(theta)) - uy * wp.sin(theta),
107
+ uz * uy * (1.0 - wp.cos(theta)) + ux * wp.sin(theta),
108
+ wp.cos(theta) + uz * uz * (1.0 - wp.cos(theta)),
109
+ )
110
+
111
+ root = roots[tid]
112
+ root_to_p = roots_to_ps[tid]
113
+ root_to_p_rot = R * root_to_p
114
+ p_rot = root + root_to_p_rot
115
+
116
+ pos_0[v_index] = p_rot
117
+ pos_1[v_index] = p_rot
118
+
119
+ if tid == 0:
120
+ t[0] = cur_t + dt
121
+
122
+
123
+ class Example:
124
+ def __init__(self, stage_path="example_cloth_self_contact.usd", num_frames=600):
125
+ fps = 60
126
+ self.frame_dt = 1.0 / fps
127
+ # must be an even number when using CUDA Graph
128
+ self.num_substeps = 10
129
+ self.iterations = 4
130
+ self.dt = self.frame_dt / self.num_substeps
131
+
132
+ self.num_frames = num_frames
133
+ self.sim_time = 0.0
134
+ self.profiler = {}
135
+
136
+ self.rot_angular_velocity = math.pi / 3
137
+ self.rot_end_time = 10
138
+ self.use_cuda_graph = wp.get_device().is_cuda
139
+
140
+ usd_stage = Usd.Stage.Open(os.path.join(warp.examples.get_asset_directory(), "square_cloth.usd"))
141
+ usd_geom = UsdGeom.Mesh(usd_stage.GetPrimAtPath("/root/cloth/cloth"))
142
+
143
+ mesh_points = np.array(usd_geom.GetPointsAttr().Get())
144
+ mesh_indices = np.array(usd_geom.GetFaceVertexIndicesAttr().Get())
145
+
146
+ self.input_scale_factor = 1.0
147
+ self.renderer_scale_factor = 0.01
148
+
149
+ vertices = [wp.vec3(v) * self.input_scale_factor for v in mesh_points]
150
+ self.faces = mesh_indices.reshape(-1, 3)
151
+
152
+ builder = wp.sim.ModelBuilder()
153
+ builder.add_cloth_mesh(
154
+ pos=wp.vec3(0.0, 0.0, 0.0),
155
+ rot=wp.quat_identity(),
156
+ scale=1.0,
157
+ vertices=vertices,
158
+ indices=mesh_indices,
159
+ vel=wp.vec3(0.0, 0.0, 0.0),
160
+ density=0.02,
161
+ tri_ke=1.0e5,
162
+ tri_ka=1.0e5,
163
+ tri_kd=2.0e-6,
164
+ edge_ke=10,
165
+ )
166
+ builder.color()
167
+ self.model = builder.finalize()
168
+ self.model.ground = False
169
+ self.model.soft_contact_ke = 1.0e5
170
+ self.model.soft_contact_kd = 1.0e-6
171
+ self.model.soft_contact_mu = 0.2
172
+
173
+ # set up contact query and contact detection distances
174
+ self.model.soft_contact_radius = 0.2
175
+ self.model.soft_contact_margin = 0.35
176
+
177
+ cloth_size = 50
178
+ left_side = [cloth_size - 1 + i * cloth_size for i in range(cloth_size)]
179
+ right_side = [i * cloth_size for i in range(cloth_size)]
180
+ rot_point_indices = left_side + right_side
181
+
182
+ if len(rot_point_indices):
183
+ flags = self.model.particle_flags.numpy()
184
+ for fixed_vertex_id in rot_point_indices:
185
+ flags[fixed_vertex_id] = wp.uint32(int(flags[fixed_vertex_id]) & ~int(PARTICLE_FLAG_ACTIVE))
186
+
187
+ self.model.particle_flags = wp.array(flags)
188
+
189
+ self.integrator = wp.sim.VBDIntegrator(
190
+ self.model,
191
+ self.iterations,
192
+ handle_self_contact=True,
193
+ )
194
+ self.state0 = self.model.state()
195
+ self.state1 = self.model.state()
196
+
197
+ rot_axes = [[1, 0, 0]] * len(right_side) + [[-1, 0, 0]] * len(left_side)
198
+
199
+ self.rot_point_indices = wp.array(rot_point_indices, dtype=int)
200
+ self.t = wp.zeros((1,), dtype=float)
201
+ self.rot_centers = wp.zeros(len(rot_point_indices), dtype=wp.vec3)
202
+ self.rot_axes = wp.array(rot_axes, dtype=wp.vec3)
203
+
204
+ self.roots = wp.zeros_like(self.rot_centers)
205
+ self.roots_to_ps = wp.zeros_like(self.rot_centers)
206
+
207
+ wp.launch(
208
+ kernel=initialize_rotation,
209
+ dim=self.rot_point_indices.shape[0],
210
+ inputs=[
211
+ self.rot_point_indices,
212
+ self.state0.particle_q,
213
+ self.rot_centers,
214
+ self.rot_axes,
215
+ self.t,
216
+ ],
217
+ outputs=[
218
+ self.roots,
219
+ self.roots_to_ps,
220
+ ],
221
+ )
222
+
223
+ if stage_path:
224
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage_path, scaling=1)
225
+ else:
226
+ self.renderer = None
227
+ self.cuda_graph = None
228
+ if self.use_cuda_graph:
229
+ with wp.ScopedCapture() as capture:
230
+ for _ in range(self.num_substeps):
231
+ wp.launch(
232
+ kernel=apply_rotation,
233
+ dim=self.rot_point_indices.shape[0],
234
+ inputs=[
235
+ self.rot_point_indices,
236
+ self.rot_axes,
237
+ self.roots,
238
+ self.roots_to_ps,
239
+ self.t,
240
+ self.rot_angular_velocity,
241
+ self.dt,
242
+ self.rot_end_time,
243
+ ],
244
+ outputs=[
245
+ self.state0.particle_q,
246
+ self.state1.particle_q,
247
+ ],
248
+ )
249
+
250
+ self.integrator.simulate(self.model, self.state0, self.state1, self.dt, None)
251
+ (self.state0, self.state1) = (self.state1, self.state0)
252
+
253
+ self.cuda_graph = capture.graph
254
+
255
+ def step(self):
256
+ with wp.ScopedTimer("step", print=False, dict=self.profiler):
257
+ if self.use_cuda_graph:
258
+ wp.capture_launch(self.cuda_graph)
259
+ else:
260
+ for _ in range(self.num_substeps):
261
+ wp.launch(
262
+ kernel=apply_rotation,
263
+ dim=self.rot_point_indices.shape[0],
264
+ inputs=[
265
+ self.rot_point_indices,
266
+ self.rot_axes,
267
+ self.roots,
268
+ self.roots_to_ps,
269
+ self.t,
270
+ self.rot_angular_velocity,
271
+ self.dt,
272
+ self.rot_end_time,
273
+ ],
274
+ outputs=[
275
+ self.state0.particle_q,
276
+ self.state1.particle_q,
277
+ ],
278
+ )
279
+ self.integrator.simulate(self.model, self.state0, self.state1, self.dt)
280
+
281
+ (self.state0, self.state1) = (self.state1, self.state0)
282
+
283
+ self.sim_time += self.dt
284
+
285
+ def render(self):
286
+ if self.renderer is None:
287
+ return
288
+
289
+ with wp.ScopedTimer("render", print=False):
290
+ self.renderer.begin_frame(self.sim_time)
291
+ self.renderer.render(self.state0)
292
+ self.renderer.end_frame()
293
+
294
+
295
+ if __name__ == "__main__":
296
+ import argparse
297
+
298
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
299
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
300
+ parser.add_argument(
301
+ "--stage_path",
302
+ type=lambda x: None if x == "None" else str(x),
303
+ default="example_cloth_self_contact.usd",
304
+ help="Path to the output USD file.",
305
+ )
306
+ parser.add_argument("--num_frames", type=int, default=300, help="Total number of frames.")
307
+
308
+ args = parser.parse_known_args()[0]
309
+
310
+ with wp.ScopedDevice(args.device):
311
+ example = Example(stage_path=args.stage_path, num_frames=args.num_frames)
312
+
313
+ for i in range(example.num_frames):
314
+ example.step()
315
+ example.render()
316
+ print(f"[{i:4d}/{example.num_frames}]")
317
+
318
+ frame_times = example.profiler["step"]
319
+ print("\nAverage frame sim time: {:.2f} ms".format(sum(frame_times) / len(frame_times)))
320
+
321
+ if example.renderer:
322
+ example.renderer.save()
@@ -0,0 +1,130 @@
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 Sim Granular
18
+ #
19
+ # Shows how to set up a particle-based granular material model using the
20
+ # wp.sim.ModelBuilder().
21
+ #
22
+ ###########################################################################
23
+
24
+ import warp as wp
25
+ import warp.sim
26
+ import warp.sim.render
27
+
28
+
29
+ class Example:
30
+ def __init__(self, stage_path="example_granular.usd"):
31
+ fps = 60
32
+ self.frame_dt = 1.0 / fps
33
+
34
+ self.sim_substeps = 64
35
+ self.sim_dt = self.frame_dt / self.sim_substeps
36
+ self.sim_time = 0.0
37
+
38
+ self.radius = 0.1
39
+
40
+ builder = wp.sim.ModelBuilder()
41
+ builder.default_particle_radius = self.radius
42
+
43
+ builder.add_particle_grid(
44
+ dim_x=16,
45
+ dim_y=32,
46
+ dim_z=16,
47
+ cell_x=self.radius * 2.0,
48
+ cell_y=self.radius * 2.0,
49
+ cell_z=self.radius * 2.0,
50
+ pos=wp.vec3(0.0, 1.0, 0.0),
51
+ rot=wp.quat_identity(),
52
+ vel=wp.vec3(5.0, 0.0, 0.0),
53
+ mass=0.1,
54
+ jitter=self.radius * 0.1,
55
+ )
56
+
57
+ self.model = builder.finalize()
58
+ self.model.particle_kf = 25.0
59
+
60
+ self.model.soft_contact_kd = 100.0
61
+ self.model.soft_contact_kf *= 2.0
62
+
63
+ self.state_0 = self.model.state()
64
+ self.state_1 = self.model.state()
65
+
66
+ self.integrator = wp.sim.SemiImplicitIntegrator()
67
+
68
+ if stage_path:
69
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage_path, scaling=20.0)
70
+ else:
71
+ self.renderer = None
72
+
73
+ self.use_cuda_graph = wp.get_device().is_cuda
74
+ if self.use_cuda_graph:
75
+ with wp.ScopedCapture() as capture:
76
+ self.simulate()
77
+ self.graph = capture.graph
78
+
79
+ def simulate(self):
80
+ for _ in range(self.sim_substeps):
81
+ self.state_0.clear_forces()
82
+ self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
83
+
84
+ # swap states
85
+ (self.state_0, self.state_1) = (self.state_1, self.state_0)
86
+
87
+ def step(self):
88
+ with wp.ScopedTimer("step"):
89
+ self.model.particle_grid.build(self.state_0.particle_q, self.radius * 2.0)
90
+ if self.use_cuda_graph:
91
+ wp.capture_launch(self.graph)
92
+ else:
93
+ self.simulate()
94
+
95
+ self.sim_time += self.frame_dt
96
+
97
+ def render(self):
98
+ if self.renderer is None:
99
+ return
100
+
101
+ with wp.ScopedTimer("render"):
102
+ self.renderer.begin_frame(self.sim_time)
103
+ self.renderer.render(self.state_0)
104
+ self.renderer.end_frame()
105
+
106
+
107
+ if __name__ == "__main__":
108
+ import argparse
109
+
110
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
111
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
112
+ parser.add_argument(
113
+ "--stage_path",
114
+ type=lambda x: None if x == "None" else str(x),
115
+ default="example_granular.usd",
116
+ help="Path to the output USD file.",
117
+ )
118
+ parser.add_argument("--num_frames", type=int, default=400, help="Total number of frames.")
119
+
120
+ args = parser.parse_known_args()[0]
121
+
122
+ with wp.ScopedDevice(args.device):
123
+ example = Example(stage_path=args.stage_path)
124
+
125
+ for _ in range(args.num_frames):
126
+ example.step()
127
+ example.render()
128
+
129
+ if example.renderer:
130
+ example.renderer.save()