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.
- warp/__init__.py +334 -0
- warp/__init__.pyi +5856 -0
- warp/_src/__init__.py +14 -0
- warp/_src/autograd.py +1077 -0
- warp/_src/build.py +620 -0
- warp/_src/build_dll.py +642 -0
- warp/_src/builtins.py +10555 -0
- warp/_src/codegen.py +4361 -0
- warp/_src/config.py +178 -0
- warp/_src/constants.py +59 -0
- warp/_src/context.py +8352 -0
- warp/_src/dlpack.py +464 -0
- warp/_src/fabric.py +362 -0
- warp/_src/fem/__init__.py +14 -0
- warp/_src/fem/adaptivity.py +510 -0
- warp/_src/fem/cache.py +689 -0
- warp/_src/fem/dirichlet.py +190 -0
- warp/_src/fem/domain.py +553 -0
- warp/_src/fem/field/__init__.py +131 -0
- warp/_src/fem/field/field.py +703 -0
- warp/_src/fem/field/nodal_field.py +403 -0
- warp/_src/fem/field/restriction.py +39 -0
- warp/_src/fem/field/virtual.py +1021 -0
- warp/_src/fem/geometry/__init__.py +32 -0
- warp/_src/fem/geometry/adaptive_nanogrid.py +782 -0
- warp/_src/fem/geometry/closest_point.py +99 -0
- warp/_src/fem/geometry/deformed_geometry.py +277 -0
- warp/_src/fem/geometry/element.py +854 -0
- warp/_src/fem/geometry/geometry.py +693 -0
- warp/_src/fem/geometry/grid_2d.py +478 -0
- warp/_src/fem/geometry/grid_3d.py +539 -0
- warp/_src/fem/geometry/hexmesh.py +956 -0
- warp/_src/fem/geometry/nanogrid.py +660 -0
- warp/_src/fem/geometry/partition.py +483 -0
- warp/_src/fem/geometry/quadmesh.py +597 -0
- warp/_src/fem/geometry/tetmesh.py +762 -0
- warp/_src/fem/geometry/trimesh.py +588 -0
- warp/_src/fem/integrate.py +2507 -0
- warp/_src/fem/linalg.py +385 -0
- warp/_src/fem/operator.py +398 -0
- warp/_src/fem/polynomial.py +231 -0
- warp/_src/fem/quadrature/__init__.py +17 -0
- warp/_src/fem/quadrature/pic_quadrature.py +318 -0
- warp/_src/fem/quadrature/quadrature.py +665 -0
- warp/_src/fem/space/__init__.py +248 -0
- warp/_src/fem/space/basis_function_space.py +499 -0
- warp/_src/fem/space/basis_space.py +681 -0
- warp/_src/fem/space/dof_mapper.py +253 -0
- warp/_src/fem/space/function_space.py +312 -0
- warp/_src/fem/space/grid_2d_function_space.py +179 -0
- warp/_src/fem/space/grid_3d_function_space.py +229 -0
- warp/_src/fem/space/hexmesh_function_space.py +255 -0
- warp/_src/fem/space/nanogrid_function_space.py +199 -0
- warp/_src/fem/space/partition.py +435 -0
- warp/_src/fem/space/quadmesh_function_space.py +222 -0
- warp/_src/fem/space/restriction.py +221 -0
- warp/_src/fem/space/shape/__init__.py +152 -0
- warp/_src/fem/space/shape/cube_shape_function.py +1107 -0
- warp/_src/fem/space/shape/shape_function.py +134 -0
- warp/_src/fem/space/shape/square_shape_function.py +928 -0
- warp/_src/fem/space/shape/tet_shape_function.py +829 -0
- warp/_src/fem/space/shape/triangle_shape_function.py +674 -0
- warp/_src/fem/space/tetmesh_function_space.py +270 -0
- warp/_src/fem/space/topology.py +461 -0
- warp/_src/fem/space/trimesh_function_space.py +193 -0
- warp/_src/fem/types.py +114 -0
- warp/_src/fem/utils.py +488 -0
- warp/_src/jax.py +188 -0
- warp/_src/jax_experimental/__init__.py +14 -0
- warp/_src/jax_experimental/custom_call.py +389 -0
- warp/_src/jax_experimental/ffi.py +1286 -0
- warp/_src/jax_experimental/xla_ffi.py +658 -0
- warp/_src/marching_cubes.py +710 -0
- warp/_src/math.py +416 -0
- warp/_src/optim/__init__.py +14 -0
- warp/_src/optim/adam.py +165 -0
- warp/_src/optim/linear.py +1608 -0
- warp/_src/optim/sgd.py +114 -0
- warp/_src/paddle.py +408 -0
- warp/_src/render/__init__.py +14 -0
- warp/_src/render/imgui_manager.py +291 -0
- warp/_src/render/render_opengl.py +3638 -0
- warp/_src/render/render_usd.py +939 -0
- warp/_src/render/utils.py +162 -0
- warp/_src/sparse.py +2718 -0
- warp/_src/tape.py +1208 -0
- warp/_src/thirdparty/__init__.py +0 -0
- warp/_src/thirdparty/appdirs.py +598 -0
- warp/_src/thirdparty/dlpack.py +145 -0
- warp/_src/thirdparty/unittest_parallel.py +676 -0
- warp/_src/torch.py +393 -0
- warp/_src/types.py +5888 -0
- warp/_src/utils.py +1695 -0
- warp/autograd.py +33 -0
- warp/bin/libwarp-clang.dylib +0 -0
- warp/bin/libwarp.dylib +0 -0
- warp/build.py +29 -0
- warp/build_dll.py +24 -0
- warp/codegen.py +24 -0
- warp/constants.py +24 -0
- warp/context.py +33 -0
- warp/dlpack.py +24 -0
- warp/examples/__init__.py +24 -0
- warp/examples/assets/bear.usd +0 -0
- warp/examples/assets/bunny.usd +0 -0
- warp/examples/assets/cube.usd +0 -0
- warp/examples/assets/nonuniform.usd +0 -0
- warp/examples/assets/nvidia_logo.png +0 -0
- warp/examples/assets/pixel.jpg +0 -0
- warp/examples/assets/rocks.nvdb +0 -0
- warp/examples/assets/rocks.usd +0 -0
- warp/examples/assets/sphere.usd +0 -0
- warp/examples/assets/square_cloth.usd +0 -0
- warp/examples/benchmarks/benchmark_api.py +389 -0
- warp/examples/benchmarks/benchmark_cloth.py +296 -0
- warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
- warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
- warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
- warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
- warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
- warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
- warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
- warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
- warp/examples/benchmarks/benchmark_gemm.py +164 -0
- warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
- warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
- warp/examples/benchmarks/benchmark_launches.py +301 -0
- warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
- warp/examples/benchmarks/benchmark_tile_sort.py +155 -0
- warp/examples/browse.py +37 -0
- warp/examples/core/example_cupy.py +86 -0
- warp/examples/core/example_dem.py +241 -0
- warp/examples/core/example_fluid.py +299 -0
- warp/examples/core/example_graph_capture.py +150 -0
- warp/examples/core/example_marching_cubes.py +195 -0
- warp/examples/core/example_mesh.py +180 -0
- warp/examples/core/example_mesh_intersect.py +211 -0
- warp/examples/core/example_nvdb.py +182 -0
- warp/examples/core/example_raycast.py +111 -0
- warp/examples/core/example_raymarch.py +205 -0
- warp/examples/core/example_render_opengl.py +290 -0
- warp/examples/core/example_sample_mesh.py +300 -0
- warp/examples/core/example_sph.py +411 -0
- warp/examples/core/example_spin_lock.py +93 -0
- warp/examples/core/example_torch.py +211 -0
- warp/examples/core/example_wave.py +269 -0
- warp/examples/core/example_work_queue.py +118 -0
- warp/examples/distributed/example_jacobi_mpi.py +506 -0
- warp/examples/fem/example_adaptive_grid.py +286 -0
- warp/examples/fem/example_apic_fluid.py +469 -0
- warp/examples/fem/example_burgers.py +261 -0
- warp/examples/fem/example_convection_diffusion.py +181 -0
- warp/examples/fem/example_convection_diffusion_dg.py +225 -0
- warp/examples/fem/example_darcy_ls_optimization.py +489 -0
- warp/examples/fem/example_deformed_geometry.py +172 -0
- warp/examples/fem/example_diffusion.py +196 -0
- warp/examples/fem/example_diffusion_3d.py +225 -0
- warp/examples/fem/example_diffusion_mgpu.py +225 -0
- warp/examples/fem/example_distortion_energy.py +228 -0
- warp/examples/fem/example_elastic_shape_optimization.py +387 -0
- warp/examples/fem/example_magnetostatics.py +242 -0
- warp/examples/fem/example_mixed_elasticity.py +293 -0
- warp/examples/fem/example_navier_stokes.py +263 -0
- warp/examples/fem/example_nonconforming_contact.py +300 -0
- warp/examples/fem/example_stokes.py +213 -0
- warp/examples/fem/example_stokes_transfer.py +262 -0
- warp/examples/fem/example_streamlines.py +357 -0
- warp/examples/fem/utils.py +1047 -0
- warp/examples/interop/example_jax_callable.py +146 -0
- warp/examples/interop/example_jax_ffi_callback.py +132 -0
- warp/examples/interop/example_jax_kernel.py +232 -0
- warp/examples/optim/example_diffray.py +561 -0
- warp/examples/optim/example_fluid_checkpoint.py +497 -0
- warp/examples/tile/example_tile_block_cholesky.py +502 -0
- warp/examples/tile/example_tile_cholesky.py +88 -0
- warp/examples/tile/example_tile_convolution.py +66 -0
- warp/examples/tile/example_tile_fft.py +55 -0
- warp/examples/tile/example_tile_filtering.py +113 -0
- warp/examples/tile/example_tile_matmul.py +85 -0
- warp/examples/tile/example_tile_mcgp.py +191 -0
- warp/examples/tile/example_tile_mlp.py +385 -0
- warp/examples/tile/example_tile_nbody.py +199 -0
- warp/fabric.py +24 -0
- warp/fem/__init__.py +173 -0
- warp/fem/adaptivity.py +26 -0
- warp/fem/cache.py +30 -0
- warp/fem/dirichlet.py +24 -0
- warp/fem/field/__init__.py +24 -0
- warp/fem/field/field.py +26 -0
- warp/fem/geometry/__init__.py +21 -0
- warp/fem/geometry/closest_point.py +31 -0
- warp/fem/linalg.py +38 -0
- warp/fem/operator.py +32 -0
- warp/fem/polynomial.py +29 -0
- warp/fem/space/__init__.py +22 -0
- warp/fem/space/basis_space.py +24 -0
- warp/fem/space/shape/__init__.py +68 -0
- warp/fem/space/topology.py +24 -0
- warp/fem/types.py +24 -0
- warp/fem/utils.py +32 -0
- warp/jax.py +29 -0
- warp/jax_experimental/__init__.py +29 -0
- warp/jax_experimental/custom_call.py +29 -0
- warp/jax_experimental/ffi.py +39 -0
- warp/jax_experimental/xla_ffi.py +24 -0
- warp/marching_cubes.py +24 -0
- warp/math.py +37 -0
- warp/native/array.h +1687 -0
- warp/native/builtin.h +2327 -0
- warp/native/bvh.cpp +562 -0
- warp/native/bvh.cu +826 -0
- warp/native/bvh.h +555 -0
- warp/native/clang/clang.cpp +541 -0
- warp/native/coloring.cpp +622 -0
- warp/native/crt.cpp +51 -0
- warp/native/crt.h +568 -0
- warp/native/cuda_crt.h +1058 -0
- warp/native/cuda_util.cpp +677 -0
- warp/native/cuda_util.h +313 -0
- warp/native/error.cpp +77 -0
- warp/native/error.h +36 -0
- warp/native/exports.h +2023 -0
- warp/native/fabric.h +246 -0
- warp/native/hashgrid.cpp +311 -0
- warp/native/hashgrid.cu +89 -0
- warp/native/hashgrid.h +240 -0
- warp/native/initializer_array.h +41 -0
- warp/native/intersect.h +1253 -0
- warp/native/intersect_adj.h +375 -0
- warp/native/intersect_tri.h +348 -0
- warp/native/mat.h +5189 -0
- warp/native/mathdx.cpp +93 -0
- warp/native/matnn.h +221 -0
- warp/native/mesh.cpp +266 -0
- warp/native/mesh.cu +406 -0
- warp/native/mesh.h +2097 -0
- warp/native/nanovdb/GridHandle.h +533 -0
- warp/native/nanovdb/HostBuffer.h +591 -0
- warp/native/nanovdb/NanoVDB.h +6246 -0
- warp/native/nanovdb/NodeManager.h +323 -0
- warp/native/nanovdb/PNanoVDB.h +3390 -0
- warp/native/noise.h +859 -0
- warp/native/quat.h +1664 -0
- warp/native/rand.h +342 -0
- warp/native/range.h +145 -0
- warp/native/reduce.cpp +174 -0
- warp/native/reduce.cu +363 -0
- warp/native/runlength_encode.cpp +79 -0
- warp/native/runlength_encode.cu +61 -0
- warp/native/scan.cpp +47 -0
- warp/native/scan.cu +55 -0
- warp/native/scan.h +23 -0
- warp/native/solid_angle.h +466 -0
- warp/native/sort.cpp +251 -0
- warp/native/sort.cu +286 -0
- warp/native/sort.h +35 -0
- warp/native/sparse.cpp +241 -0
- warp/native/sparse.cu +435 -0
- warp/native/spatial.h +1306 -0
- warp/native/svd.h +727 -0
- warp/native/temp_buffer.h +46 -0
- warp/native/tile.h +4124 -0
- warp/native/tile_radix_sort.h +1112 -0
- warp/native/tile_reduce.h +838 -0
- warp/native/tile_scan.h +240 -0
- warp/native/tuple.h +189 -0
- warp/native/vec.h +2199 -0
- warp/native/version.h +23 -0
- warp/native/volume.cpp +501 -0
- warp/native/volume.cu +68 -0
- warp/native/volume.h +970 -0
- warp/native/volume_builder.cu +483 -0
- warp/native/volume_builder.h +52 -0
- warp/native/volume_impl.h +70 -0
- warp/native/warp.cpp +1143 -0
- warp/native/warp.cu +4604 -0
- warp/native/warp.h +358 -0
- warp/optim/__init__.py +20 -0
- warp/optim/adam.py +24 -0
- warp/optim/linear.py +35 -0
- warp/optim/sgd.py +24 -0
- warp/paddle.py +24 -0
- warp/py.typed +0 -0
- warp/render/__init__.py +22 -0
- warp/render/imgui_manager.py +29 -0
- warp/render/render_opengl.py +24 -0
- warp/render/render_usd.py +24 -0
- warp/render/utils.py +24 -0
- warp/sparse.py +51 -0
- warp/tape.py +24 -0
- warp/tests/__init__.py +1 -0
- warp/tests/__main__.py +4 -0
- warp/tests/assets/curlnoise_golden.npy +0 -0
- warp/tests/assets/mlp_golden.npy +0 -0
- warp/tests/assets/pixel.npy +0 -0
- warp/tests/assets/pnoise_golden.npy +0 -0
- warp/tests/assets/spiky.usd +0 -0
- warp/tests/assets/test_grid.nvdb +0 -0
- warp/tests/assets/test_index_grid.nvdb +0 -0
- warp/tests/assets/test_int32_grid.nvdb +0 -0
- warp/tests/assets/test_vec_grid.nvdb +0 -0
- warp/tests/assets/torus.nvdb +0 -0
- warp/tests/assets/torus.usda +105 -0
- warp/tests/aux_test_class_kernel.py +34 -0
- warp/tests/aux_test_compile_consts_dummy.py +18 -0
- warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
- warp/tests/aux_test_dependent.py +29 -0
- warp/tests/aux_test_grad_customs.py +29 -0
- warp/tests/aux_test_instancing_gc.py +26 -0
- warp/tests/aux_test_module_aot.py +7 -0
- warp/tests/aux_test_module_unload.py +23 -0
- warp/tests/aux_test_name_clash1.py +40 -0
- warp/tests/aux_test_name_clash2.py +40 -0
- warp/tests/aux_test_reference.py +9 -0
- warp/tests/aux_test_reference_reference.py +8 -0
- warp/tests/aux_test_square.py +16 -0
- warp/tests/aux_test_unresolved_func.py +22 -0
- warp/tests/aux_test_unresolved_symbol.py +22 -0
- warp/tests/cuda/__init__.py +0 -0
- warp/tests/cuda/test_async.py +676 -0
- warp/tests/cuda/test_conditional_captures.py +1147 -0
- warp/tests/cuda/test_ipc.py +124 -0
- warp/tests/cuda/test_mempool.py +233 -0
- warp/tests/cuda/test_multigpu.py +169 -0
- warp/tests/cuda/test_peer.py +139 -0
- warp/tests/cuda/test_pinned.py +84 -0
- warp/tests/cuda/test_streams.py +691 -0
- warp/tests/geometry/__init__.py +0 -0
- warp/tests/geometry/test_bvh.py +335 -0
- warp/tests/geometry/test_hash_grid.py +259 -0
- warp/tests/geometry/test_marching_cubes.py +294 -0
- warp/tests/geometry/test_mesh.py +318 -0
- warp/tests/geometry/test_mesh_query_aabb.py +392 -0
- warp/tests/geometry/test_mesh_query_point.py +935 -0
- warp/tests/geometry/test_mesh_query_ray.py +323 -0
- warp/tests/geometry/test_volume.py +1103 -0
- warp/tests/geometry/test_volume_write.py +346 -0
- warp/tests/interop/__init__.py +0 -0
- warp/tests/interop/test_dlpack.py +730 -0
- warp/tests/interop/test_jax.py +1673 -0
- warp/tests/interop/test_paddle.py +800 -0
- warp/tests/interop/test_torch.py +1001 -0
- warp/tests/run_coverage_serial.py +39 -0
- warp/tests/test_adam.py +162 -0
- warp/tests/test_arithmetic.py +1096 -0
- warp/tests/test_array.py +3756 -0
- warp/tests/test_array_reduce.py +156 -0
- warp/tests/test_assert.py +303 -0
- warp/tests/test_atomic.py +336 -0
- warp/tests/test_atomic_bitwise.py +209 -0
- warp/tests/test_atomic_cas.py +312 -0
- warp/tests/test_bool.py +220 -0
- warp/tests/test_builtins_resolution.py +732 -0
- warp/tests/test_closest_point_edge_edge.py +327 -0
- warp/tests/test_codegen.py +974 -0
- warp/tests/test_codegen_instancing.py +1495 -0
- warp/tests/test_compile_consts.py +215 -0
- warp/tests/test_conditional.py +298 -0
- warp/tests/test_context.py +35 -0
- warp/tests/test_copy.py +319 -0
- warp/tests/test_ctypes.py +618 -0
- warp/tests/test_dense.py +73 -0
- warp/tests/test_devices.py +127 -0
- warp/tests/test_enum.py +136 -0
- warp/tests/test_examples.py +424 -0
- warp/tests/test_fabricarray.py +998 -0
- warp/tests/test_fast_math.py +72 -0
- warp/tests/test_fem.py +2204 -0
- warp/tests/test_fixedarray.py +229 -0
- warp/tests/test_fp16.py +136 -0
- warp/tests/test_func.py +501 -0
- warp/tests/test_future_annotations.py +100 -0
- warp/tests/test_generics.py +656 -0
- warp/tests/test_grad.py +893 -0
- warp/tests/test_grad_customs.py +339 -0
- warp/tests/test_grad_debug.py +341 -0
- warp/tests/test_implicit_init.py +411 -0
- warp/tests/test_import.py +45 -0
- warp/tests/test_indexedarray.py +1140 -0
- warp/tests/test_intersect.py +103 -0
- warp/tests/test_iter.py +76 -0
- warp/tests/test_large.py +177 -0
- warp/tests/test_launch.py +411 -0
- warp/tests/test_lerp.py +151 -0
- warp/tests/test_linear_solvers.py +223 -0
- warp/tests/test_lvalue.py +427 -0
- warp/tests/test_map.py +526 -0
- warp/tests/test_mat.py +3515 -0
- warp/tests/test_mat_assign_copy.py +178 -0
- warp/tests/test_mat_constructors.py +573 -0
- warp/tests/test_mat_lite.py +122 -0
- warp/tests/test_mat_scalar_ops.py +2913 -0
- warp/tests/test_math.py +212 -0
- warp/tests/test_module_aot.py +287 -0
- warp/tests/test_module_hashing.py +258 -0
- warp/tests/test_modules_lite.py +70 -0
- warp/tests/test_noise.py +252 -0
- warp/tests/test_operators.py +299 -0
- warp/tests/test_options.py +129 -0
- warp/tests/test_overwrite.py +551 -0
- warp/tests/test_print.py +408 -0
- warp/tests/test_quat.py +2653 -0
- warp/tests/test_quat_assign_copy.py +145 -0
- warp/tests/test_rand.py +339 -0
- warp/tests/test_reload.py +303 -0
- warp/tests/test_rounding.py +157 -0
- warp/tests/test_runlength_encode.py +196 -0
- warp/tests/test_scalar_ops.py +133 -0
- warp/tests/test_smoothstep.py +108 -0
- warp/tests/test_snippet.py +318 -0
- warp/tests/test_sparse.py +845 -0
- warp/tests/test_spatial.py +2859 -0
- warp/tests/test_spatial_assign_copy.py +160 -0
- warp/tests/test_special_values.py +361 -0
- warp/tests/test_static.py +640 -0
- warp/tests/test_struct.py +901 -0
- warp/tests/test_tape.py +242 -0
- warp/tests/test_transient_module.py +93 -0
- warp/tests/test_triangle_closest_point.py +192 -0
- warp/tests/test_tuple.py +361 -0
- warp/tests/test_types.py +615 -0
- warp/tests/test_utils.py +594 -0
- warp/tests/test_vec.py +1408 -0
- warp/tests/test_vec_assign_copy.py +143 -0
- warp/tests/test_vec_constructors.py +325 -0
- warp/tests/test_vec_lite.py +80 -0
- warp/tests/test_vec_scalar_ops.py +2327 -0
- warp/tests/test_verify_fp.py +100 -0
- warp/tests/test_version.py +75 -0
- warp/tests/tile/__init__.py +0 -0
- warp/tests/tile/test_tile.py +1519 -0
- warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
- warp/tests/tile/test_tile_cholesky.py +608 -0
- warp/tests/tile/test_tile_load.py +724 -0
- warp/tests/tile/test_tile_mathdx.py +156 -0
- warp/tests/tile/test_tile_matmul.py +179 -0
- warp/tests/tile/test_tile_mlp.py +400 -0
- warp/tests/tile/test_tile_reduce.py +950 -0
- warp/tests/tile/test_tile_shared_memory.py +376 -0
- warp/tests/tile/test_tile_sort.py +121 -0
- warp/tests/tile/test_tile_view.py +173 -0
- warp/tests/unittest_serial.py +47 -0
- warp/tests/unittest_suites.py +430 -0
- warp/tests/unittest_utils.py +469 -0
- warp/tests/walkthrough_debug.py +95 -0
- warp/torch.py +24 -0
- warp/types.py +51 -0
- warp/utils.py +31 -0
- warp_lang-1.10.0.dist-info/METADATA +459 -0
- warp_lang-1.10.0.dist-info/RECORD +468 -0
- warp_lang-1.10.0.dist-info/WHEEL +5 -0
- warp_lang-1.10.0.dist-info/licenses/LICENSE.md +176 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
- 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
|
+
)
|
warp/examples/browse.py
ADDED
|
@@ -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()
|