warp-lang 1.7.0__py3-none-manylinux_2_28_x86_64.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 +139 -0
- warp/__init__.pyi +1 -0
- warp/autograd.py +1142 -0
- warp/bin/warp-clang.so +0 -0
- warp/bin/warp.so +0 -0
- warp/build.py +557 -0
- warp/build_dll.py +405 -0
- warp/builtins.py +6855 -0
- warp/codegen.py +3969 -0
- warp/config.py +158 -0
- warp/constants.py +57 -0
- warp/context.py +6812 -0
- warp/dlpack.py +462 -0
- warp/examples/__init__.py +24 -0
- warp/examples/assets/bear.usd +0 -0
- warp/examples/assets/bunny.usd +0 -0
- warp/examples/assets/cartpole.urdf +110 -0
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/cube.usd +0 -0
- warp/examples/assets/nonuniform.usd +0 -0
- warp/examples/assets/nv_ant.xml +92 -0
- warp/examples/assets/nv_humanoid.xml +183 -0
- warp/examples/assets/nvidia_logo.png +0 -0
- warp/examples/assets/pixel.jpg +0 -0
- warp/examples/assets/quadruped.urdf +268 -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/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 +194 -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 +193 -0
- warp/examples/core/example_sample_mesh.py +300 -0
- warp/examples/core/example_sph.py +411 -0
- warp/examples/core/example_torch.py +211 -0
- warp/examples/core/example_wave.py +269 -0
- warp/examples/fem/example_adaptive_grid.py +286 -0
- warp/examples/fem/example_apic_fluid.py +423 -0
- warp/examples/fem/example_burgers.py +261 -0
- warp/examples/fem/example_convection_diffusion.py +178 -0
- warp/examples/fem/example_convection_diffusion_dg.py +204 -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 +220 -0
- warp/examples/fem/example_distortion_energy.py +228 -0
- warp/examples/fem/example_magnetostatics.py +240 -0
- warp/examples/fem/example_mixed_elasticity.py +291 -0
- warp/examples/fem/example_navier_stokes.py +261 -0
- warp/examples/fem/example_nonconforming_contact.py +298 -0
- warp/examples/fem/example_stokes.py +213 -0
- warp/examples/fem/example_stokes_transfer.py +262 -0
- warp/examples/fem/example_streamlines.py +352 -0
- warp/examples/fem/utils.py +1000 -0
- warp/examples/interop/example_jax_callable.py +116 -0
- warp/examples/interop/example_jax_ffi_callback.py +132 -0
- warp/examples/interop/example_jax_kernel.py +205 -0
- warp/examples/optim/example_bounce.py +266 -0
- warp/examples/optim/example_cloth_throw.py +228 -0
- warp/examples/optim/example_diffray.py +561 -0
- warp/examples/optim/example_drone.py +870 -0
- warp/examples/optim/example_fluid_checkpoint.py +497 -0
- warp/examples/optim/example_inverse_kinematics.py +182 -0
- warp/examples/optim/example_inverse_kinematics_torch.py +191 -0
- warp/examples/optim/example_softbody_properties.py +400 -0
- warp/examples/optim/example_spring_cage.py +245 -0
- warp/examples/optim/example_trajectory.py +227 -0
- warp/examples/sim/example_cartpole.py +143 -0
- warp/examples/sim/example_cloth.py +225 -0
- warp/examples/sim/example_cloth_self_contact.py +322 -0
- warp/examples/sim/example_granular.py +130 -0
- warp/examples/sim/example_granular_collision_sdf.py +202 -0
- warp/examples/sim/example_jacobian_ik.py +244 -0
- warp/examples/sim/example_particle_chain.py +124 -0
- warp/examples/sim/example_quadruped.py +203 -0
- warp/examples/sim/example_rigid_chain.py +203 -0
- warp/examples/sim/example_rigid_contact.py +195 -0
- warp/examples/sim/example_rigid_force.py +133 -0
- warp/examples/sim/example_rigid_gyroscopic.py +115 -0
- warp/examples/sim/example_rigid_soft_contact.py +140 -0
- warp/examples/sim/example_soft_body.py +196 -0
- warp/examples/tile/example_tile_cholesky.py +87 -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_mlp.py +383 -0
- warp/examples/tile/example_tile_nbody.py +199 -0
- warp/examples/tile/example_tile_walker.py +327 -0
- warp/fabric.py +355 -0
- warp/fem/__init__.py +106 -0
- warp/fem/adaptivity.py +508 -0
- warp/fem/cache.py +572 -0
- warp/fem/dirichlet.py +202 -0
- warp/fem/domain.py +411 -0
- warp/fem/field/__init__.py +125 -0
- warp/fem/field/field.py +619 -0
- warp/fem/field/nodal_field.py +326 -0
- warp/fem/field/restriction.py +37 -0
- warp/fem/field/virtual.py +848 -0
- warp/fem/geometry/__init__.py +32 -0
- warp/fem/geometry/adaptive_nanogrid.py +857 -0
- warp/fem/geometry/closest_point.py +84 -0
- warp/fem/geometry/deformed_geometry.py +221 -0
- warp/fem/geometry/element.py +776 -0
- warp/fem/geometry/geometry.py +362 -0
- warp/fem/geometry/grid_2d.py +392 -0
- warp/fem/geometry/grid_3d.py +452 -0
- warp/fem/geometry/hexmesh.py +911 -0
- warp/fem/geometry/nanogrid.py +571 -0
- warp/fem/geometry/partition.py +389 -0
- warp/fem/geometry/quadmesh.py +663 -0
- warp/fem/geometry/tetmesh.py +855 -0
- warp/fem/geometry/trimesh.py +806 -0
- warp/fem/integrate.py +2335 -0
- warp/fem/linalg.py +419 -0
- warp/fem/operator.py +293 -0
- warp/fem/polynomial.py +229 -0
- warp/fem/quadrature/__init__.py +17 -0
- warp/fem/quadrature/pic_quadrature.py +299 -0
- warp/fem/quadrature/quadrature.py +591 -0
- warp/fem/space/__init__.py +228 -0
- warp/fem/space/basis_function_space.py +468 -0
- warp/fem/space/basis_space.py +667 -0
- warp/fem/space/dof_mapper.py +251 -0
- warp/fem/space/function_space.py +309 -0
- warp/fem/space/grid_2d_function_space.py +177 -0
- warp/fem/space/grid_3d_function_space.py +227 -0
- warp/fem/space/hexmesh_function_space.py +257 -0
- warp/fem/space/nanogrid_function_space.py +201 -0
- warp/fem/space/partition.py +367 -0
- warp/fem/space/quadmesh_function_space.py +223 -0
- warp/fem/space/restriction.py +179 -0
- warp/fem/space/shape/__init__.py +143 -0
- warp/fem/space/shape/cube_shape_function.py +1105 -0
- warp/fem/space/shape/shape_function.py +133 -0
- warp/fem/space/shape/square_shape_function.py +926 -0
- warp/fem/space/shape/tet_shape_function.py +834 -0
- warp/fem/space/shape/triangle_shape_function.py +672 -0
- warp/fem/space/tetmesh_function_space.py +271 -0
- warp/fem/space/topology.py +424 -0
- warp/fem/space/trimesh_function_space.py +194 -0
- warp/fem/types.py +99 -0
- warp/fem/utils.py +420 -0
- warp/jax.py +187 -0
- warp/jax_experimental/__init__.py +16 -0
- warp/jax_experimental/custom_call.py +351 -0
- warp/jax_experimental/ffi.py +698 -0
- warp/jax_experimental/xla_ffi.py +602 -0
- warp/math.py +244 -0
- warp/native/array.h +1145 -0
- warp/native/builtin.h +1800 -0
- warp/native/bvh.cpp +492 -0
- warp/native/bvh.cu +791 -0
- warp/native/bvh.h +554 -0
- warp/native/clang/clang.cpp +536 -0
- warp/native/coloring.cpp +613 -0
- warp/native/crt.cpp +51 -0
- warp/native/crt.h +362 -0
- warp/native/cuda_crt.h +1058 -0
- warp/native/cuda_util.cpp +646 -0
- warp/native/cuda_util.h +307 -0
- warp/native/error.cpp +77 -0
- warp/native/error.h +36 -0
- warp/native/exports.h +1878 -0
- warp/native/fabric.h +245 -0
- warp/native/hashgrid.cpp +311 -0
- warp/native/hashgrid.cu +87 -0
- warp/native/hashgrid.h +240 -0
- warp/native/initializer_array.h +41 -0
- warp/native/intersect.h +1230 -0
- warp/native/intersect_adj.h +375 -0
- warp/native/intersect_tri.h +339 -0
- warp/native/marching.cpp +19 -0
- warp/native/marching.cu +514 -0
- warp/native/marching.h +19 -0
- warp/native/mat.h +2220 -0
- warp/native/mathdx.cpp +87 -0
- warp/native/matnn.h +343 -0
- warp/native/mesh.cpp +266 -0
- warp/native/mesh.cu +404 -0
- warp/native/mesh.h +1980 -0
- warp/native/nanovdb/GridHandle.h +366 -0
- warp/native/nanovdb/HostBuffer.h +590 -0
- warp/native/nanovdb/NanoVDB.h +6624 -0
- warp/native/nanovdb/PNanoVDB.h +3390 -0
- warp/native/noise.h +859 -0
- warp/native/quat.h +1371 -0
- warp/native/rand.h +342 -0
- warp/native/range.h +139 -0
- warp/native/reduce.cpp +174 -0
- warp/native/reduce.cu +364 -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 +53 -0
- warp/native/scan.h +23 -0
- warp/native/solid_angle.h +466 -0
- warp/native/sort.cpp +251 -0
- warp/native/sort.cu +277 -0
- warp/native/sort.h +33 -0
- warp/native/sparse.cpp +378 -0
- warp/native/sparse.cu +524 -0
- warp/native/spatial.h +657 -0
- warp/native/svd.h +702 -0
- warp/native/temp_buffer.h +46 -0
- warp/native/tile.h +2584 -0
- warp/native/tile_reduce.h +264 -0
- warp/native/vec.h +1426 -0
- warp/native/volume.cpp +501 -0
- warp/native/volume.cu +67 -0
- warp/native/volume.h +969 -0
- warp/native/volume_builder.cu +477 -0
- warp/native/volume_builder.h +52 -0
- warp/native/volume_impl.h +70 -0
- warp/native/warp.cpp +1082 -0
- warp/native/warp.cu +3636 -0
- warp/native/warp.h +381 -0
- warp/optim/__init__.py +17 -0
- warp/optim/adam.py +163 -0
- warp/optim/linear.py +1137 -0
- warp/optim/sgd.py +112 -0
- warp/paddle.py +407 -0
- warp/render/__init__.py +18 -0
- warp/render/render_opengl.py +3518 -0
- warp/render/render_usd.py +784 -0
- warp/render/utils.py +160 -0
- warp/sim/__init__.py +65 -0
- warp/sim/articulation.py +793 -0
- warp/sim/collide.py +2395 -0
- warp/sim/graph_coloring.py +300 -0
- warp/sim/import_mjcf.py +790 -0
- warp/sim/import_snu.py +227 -0
- warp/sim/import_urdf.py +579 -0
- warp/sim/import_usd.py +894 -0
- warp/sim/inertia.py +324 -0
- warp/sim/integrator.py +242 -0
- warp/sim/integrator_euler.py +1997 -0
- warp/sim/integrator_featherstone.py +2101 -0
- warp/sim/integrator_vbd.py +2048 -0
- warp/sim/integrator_xpbd.py +3292 -0
- warp/sim/model.py +4791 -0
- warp/sim/particles.py +121 -0
- warp/sim/render.py +427 -0
- warp/sim/utils.py +428 -0
- warp/sparse.py +2057 -0
- warp/stubs.py +3333 -0
- warp/tape.py +1203 -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_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_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 +634 -0
- warp/tests/geometry/__init__.py +0 -0
- warp/tests/geometry/test_bvh.py +200 -0
- warp/tests/geometry/test_hash_grid.py +221 -0
- warp/tests/geometry/test_marching_cubes.py +74 -0
- warp/tests/geometry/test_mesh.py +316 -0
- warp/tests/geometry/test_mesh_query_aabb.py +399 -0
- warp/tests/geometry/test_mesh_query_point.py +932 -0
- warp/tests/geometry/test_mesh_query_ray.py +311 -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 +729 -0
- warp/tests/interop/test_jax.py +371 -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/sim/__init__.py +0 -0
- warp/tests/sim/disabled_kinematics.py +244 -0
- warp/tests/sim/flaky_test_sim_grad.py +290 -0
- warp/tests/sim/test_collision.py +604 -0
- warp/tests/sim/test_coloring.py +258 -0
- warp/tests/sim/test_model.py +224 -0
- warp/tests/sim/test_sim_grad_bounce_linear.py +212 -0
- warp/tests/sim/test_sim_kinematics.py +98 -0
- warp/tests/sim/test_vbd.py +597 -0
- warp/tests/test_adam.py +163 -0
- warp/tests/test_arithmetic.py +1096 -0
- warp/tests/test_array.py +2972 -0
- warp/tests/test_array_reduce.py +156 -0
- warp/tests/test_assert.py +250 -0
- warp/tests/test_atomic.py +153 -0
- warp/tests/test_bool.py +220 -0
- warp/tests/test_builtins_resolution.py +1298 -0
- warp/tests/test_closest_point_edge_edge.py +327 -0
- warp/tests/test_codegen.py +810 -0
- warp/tests/test_codegen_instancing.py +1495 -0
- warp/tests/test_compile_consts.py +215 -0
- warp/tests/test_conditional.py +252 -0
- warp/tests/test_context.py +42 -0
- warp/tests/test_copy.py +238 -0
- warp/tests/test_ctypes.py +638 -0
- warp/tests/test_dense.py +73 -0
- warp/tests/test_devices.py +97 -0
- warp/tests/test_examples.py +482 -0
- warp/tests/test_fabricarray.py +996 -0
- warp/tests/test_fast_math.py +74 -0
- warp/tests/test_fem.py +2003 -0
- warp/tests/test_fp16.py +136 -0
- warp/tests/test_func.py +454 -0
- warp/tests/test_future_annotations.py +98 -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 +73 -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 +193 -0
- warp/tests/test_lvalue.py +427 -0
- warp/tests/test_mat.py +2089 -0
- warp/tests/test_mat_lite.py +122 -0
- warp/tests/test_mat_scalar_ops.py +2913 -0
- warp/tests/test_math.py +178 -0
- warp/tests/test_mlp.py +282 -0
- warp/tests/test_module_hashing.py +258 -0
- warp/tests/test_modules_lite.py +44 -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 +339 -0
- warp/tests/test_quat.py +2315 -0
- warp/tests/test_rand.py +339 -0
- warp/tests/test_reload.py +302 -0
- warp/tests/test_rounding.py +185 -0
- warp/tests/test_runlength_encode.py +196 -0
- warp/tests/test_scalar_ops.py +105 -0
- warp/tests/test_smoothstep.py +108 -0
- warp/tests/test_snippet.py +318 -0
- warp/tests/test_sparse.py +582 -0
- warp/tests/test_spatial.py +2229 -0
- warp/tests/test_special_values.py +361 -0
- warp/tests/test_static.py +592 -0
- warp/tests/test_struct.py +734 -0
- warp/tests/test_tape.py +204 -0
- warp/tests/test_transient_module.py +93 -0
- warp/tests/test_triangle_closest_point.py +145 -0
- warp/tests/test_types.py +562 -0
- warp/tests/test_utils.py +588 -0
- warp/tests/test_vec.py +1487 -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/tile/__init__.py +0 -0
- warp/tests/tile/test_tile.py +780 -0
- warp/tests/tile/test_tile_load.py +407 -0
- warp/tests/tile/test_tile_mathdx.py +208 -0
- warp/tests/tile/test_tile_mlp.py +402 -0
- warp/tests/tile/test_tile_reduce.py +447 -0
- warp/tests/tile/test_tile_shared_memory.py +247 -0
- warp/tests/tile/test_tile_view.py +173 -0
- warp/tests/unittest_serial.py +47 -0
- warp/tests/unittest_suites.py +427 -0
- warp/tests/unittest_utils.py +468 -0
- warp/tests/walkthrough_debug.py +93 -0
- warp/thirdparty/__init__.py +0 -0
- warp/thirdparty/appdirs.py +598 -0
- warp/thirdparty/dlpack.py +145 -0
- warp/thirdparty/unittest_parallel.py +570 -0
- warp/torch.py +391 -0
- warp/types.py +5230 -0
- warp/utils.py +1137 -0
- warp_lang-1.7.0.dist-info/METADATA +516 -0
- warp_lang-1.7.0.dist-info/RECORD +429 -0
- warp_lang-1.7.0.dist-info/WHEEL +5 -0
- warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
- warp_lang-1.7.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,194 @@
|
|
|
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 warp as wp
|
|
17
|
+
from warp.fem import cache
|
|
18
|
+
from warp.fem.geometry import Trimesh
|
|
19
|
+
from warp.fem.types import ElementIndex
|
|
20
|
+
|
|
21
|
+
from .shape import TriangleShapeFunction
|
|
22
|
+
from .topology import SpaceTopology, forward_base_topology
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@wp.struct
|
|
26
|
+
class TrimeshTopologyArg:
|
|
27
|
+
edge_vertex_indices: wp.array(dtype=wp.vec2i)
|
|
28
|
+
tri_edge_indices: wp.array2d(dtype=int)
|
|
29
|
+
|
|
30
|
+
vertex_count: int
|
|
31
|
+
edge_count: int
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class TrimeshSpaceTopology(SpaceTopology):
|
|
35
|
+
TopologyArg = TrimeshTopologyArg
|
|
36
|
+
|
|
37
|
+
def __init__(self, mesh: Trimesh, shape: TriangleShapeFunction):
|
|
38
|
+
self._shape = shape
|
|
39
|
+
super().__init__(mesh, shape.NODES_PER_ELEMENT)
|
|
40
|
+
self._mesh = mesh
|
|
41
|
+
|
|
42
|
+
self._compute_tri_edge_indices()
|
|
43
|
+
self.element_node_index = self._make_element_node_index()
|
|
44
|
+
self.element_node_sign = self._make_element_node_sign()
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def name(self):
|
|
48
|
+
return f"{self.geometry.name}_{self._shape.name}"
|
|
49
|
+
|
|
50
|
+
@cache.cached_arg_value
|
|
51
|
+
def topo_arg_value(self, device):
|
|
52
|
+
arg = TrimeshTopologyArg()
|
|
53
|
+
arg.tri_edge_indices = self._tri_edge_indices.to(device)
|
|
54
|
+
arg.edge_vertex_indices = self._mesh.edge_vertex_indices.to(device)
|
|
55
|
+
|
|
56
|
+
arg.vertex_count = self._mesh.vertex_count()
|
|
57
|
+
arg.edge_count = self._mesh.side_count()
|
|
58
|
+
return arg
|
|
59
|
+
|
|
60
|
+
def _compute_tri_edge_indices(self):
|
|
61
|
+
self._tri_edge_indices = wp.empty(
|
|
62
|
+
dtype=int, device=self._mesh.tri_vertex_indices.device, shape=(self._mesh.cell_count(), 3)
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
wp.launch(
|
|
66
|
+
kernel=TrimeshSpaceTopology._compute_tri_edge_indices_kernel,
|
|
67
|
+
dim=self._mesh.edge_tri_indices.shape,
|
|
68
|
+
device=self._mesh.tri_vertex_indices.device,
|
|
69
|
+
inputs=[
|
|
70
|
+
self._mesh.edge_tri_indices,
|
|
71
|
+
self._mesh.edge_vertex_indices,
|
|
72
|
+
self._mesh.tri_vertex_indices,
|
|
73
|
+
self._tri_edge_indices,
|
|
74
|
+
],
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
@wp.func
|
|
78
|
+
def _find_edge_index_in_tri(
|
|
79
|
+
edge_vtx: wp.vec2i,
|
|
80
|
+
tri_vtx: wp.vec3i,
|
|
81
|
+
):
|
|
82
|
+
for k in range(2):
|
|
83
|
+
if (edge_vtx[0] == tri_vtx[k] and edge_vtx[1] == tri_vtx[k + 1]) or (
|
|
84
|
+
edge_vtx[1] == tri_vtx[k] and edge_vtx[0] == tri_vtx[k + 1]
|
|
85
|
+
):
|
|
86
|
+
return k
|
|
87
|
+
return 2
|
|
88
|
+
|
|
89
|
+
@wp.kernel
|
|
90
|
+
def _compute_tri_edge_indices_kernel(
|
|
91
|
+
edge_tri_indices: wp.array(dtype=wp.vec2i),
|
|
92
|
+
edge_vertex_indices: wp.array(dtype=wp.vec2i),
|
|
93
|
+
tri_vertex_indices: wp.array2d(dtype=int),
|
|
94
|
+
tri_edge_indices: wp.array2d(dtype=int),
|
|
95
|
+
):
|
|
96
|
+
e = wp.tid()
|
|
97
|
+
|
|
98
|
+
edge_vtx = edge_vertex_indices[e]
|
|
99
|
+
edge_tris = edge_tri_indices[e]
|
|
100
|
+
|
|
101
|
+
t0 = edge_tris[0]
|
|
102
|
+
t0_vtx = wp.vec3i(tri_vertex_indices[t0, 0], tri_vertex_indices[t0, 1], tri_vertex_indices[t0, 2])
|
|
103
|
+
t0_edge = TrimeshSpaceTopology._find_edge_index_in_tri(edge_vtx, t0_vtx)
|
|
104
|
+
tri_edge_indices[t0, t0_edge] = e
|
|
105
|
+
|
|
106
|
+
t1 = edge_tris[1]
|
|
107
|
+
if t1 != t0:
|
|
108
|
+
t1_vtx = wp.vec3i(tri_vertex_indices[t1, 0], tri_vertex_indices[t1, 1], tri_vertex_indices[t1, 2])
|
|
109
|
+
t1_edge = TrimeshSpaceTopology._find_edge_index_in_tri(edge_vtx, t1_vtx)
|
|
110
|
+
tri_edge_indices[t1, t1_edge] = e
|
|
111
|
+
|
|
112
|
+
def node_count(self) -> int:
|
|
113
|
+
return (
|
|
114
|
+
self._mesh.vertex_count() * self._shape.VERTEX_NODE_COUNT
|
|
115
|
+
+ self._mesh.side_count() * self._shape.EDGE_NODE_COUNT
|
|
116
|
+
+ self._mesh.cell_count() * self._shape.INTERIOR_NODE_COUNT
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
def _make_element_node_index(self):
|
|
120
|
+
VERTEX_NODE_COUNT = self._shape.VERTEX_NODE_COUNT
|
|
121
|
+
INTERIOR_NODES_PER_SIDE = self._shape.EDGE_NODE_COUNT
|
|
122
|
+
INTERIOR_NODES_PER_CELL = self._shape.INTERIOR_NODE_COUNT
|
|
123
|
+
|
|
124
|
+
@cache.dynamic_func(suffix=self.name)
|
|
125
|
+
def element_node_index(
|
|
126
|
+
geo_arg: self.geometry.CellArg,
|
|
127
|
+
topo_arg: TrimeshTopologyArg,
|
|
128
|
+
element_index: ElementIndex,
|
|
129
|
+
node_index_in_elt: int,
|
|
130
|
+
):
|
|
131
|
+
node_type, type_index = self._shape.node_type_and_type_index(node_index_in_elt)
|
|
132
|
+
|
|
133
|
+
if wp.static(VERTEX_NODE_COUNT > 0):
|
|
134
|
+
if node_type == TriangleShapeFunction.VERTEX:
|
|
135
|
+
vertex = type_index // VERTEX_NODE_COUNT
|
|
136
|
+
vertex_node = type_index - VERTEX_NODE_COUNT * vertex
|
|
137
|
+
return geo_arg.topology.tri_vertex_indices[element_index][vertex] * VERTEX_NODE_COUNT + vertex_node
|
|
138
|
+
|
|
139
|
+
global_offset = topo_arg.vertex_count * VERTEX_NODE_COUNT
|
|
140
|
+
|
|
141
|
+
if wp.static(INTERIOR_NODES_PER_SIDE > 0):
|
|
142
|
+
if node_type == TriangleShapeFunction.EDGE:
|
|
143
|
+
edge = type_index // INTERIOR_NODES_PER_SIDE
|
|
144
|
+
edge_node = type_index - INTERIOR_NODES_PER_SIDE * edge
|
|
145
|
+
|
|
146
|
+
global_edge_index = topo_arg.tri_edge_indices[element_index][edge]
|
|
147
|
+
|
|
148
|
+
if (
|
|
149
|
+
topo_arg.edge_vertex_indices[global_edge_index][0]
|
|
150
|
+
!= geo_arg.topology.tri_vertex_indices[element_index][edge]
|
|
151
|
+
):
|
|
152
|
+
edge_node = INTERIOR_NODES_PER_SIDE - 1 - edge_node
|
|
153
|
+
|
|
154
|
+
return global_offset + INTERIOR_NODES_PER_SIDE * global_edge_index + edge_node
|
|
155
|
+
|
|
156
|
+
global_offset += INTERIOR_NODES_PER_SIDE * topo_arg.edge_count
|
|
157
|
+
|
|
158
|
+
return global_offset + INTERIOR_NODES_PER_CELL * element_index + type_index
|
|
159
|
+
|
|
160
|
+
return element_node_index
|
|
161
|
+
|
|
162
|
+
def _make_element_node_sign(self):
|
|
163
|
+
INTERIOR_NODES_PER_SIDE = self._shape.EDGE_NODE_COUNT
|
|
164
|
+
|
|
165
|
+
@cache.dynamic_func(suffix=self.name)
|
|
166
|
+
def element_node_sign(
|
|
167
|
+
geo_arg: self.geometry.CellArg,
|
|
168
|
+
topo_arg: TrimeshTopologyArg,
|
|
169
|
+
element_index: ElementIndex,
|
|
170
|
+
node_index_in_elt: int,
|
|
171
|
+
):
|
|
172
|
+
node_type, type_index = self._shape.node_type_and_type_index(node_index_in_elt)
|
|
173
|
+
|
|
174
|
+
if node_type == TriangleShapeFunction.EDGE:
|
|
175
|
+
edge = type_index // INTERIOR_NODES_PER_SIDE
|
|
176
|
+
|
|
177
|
+
global_edge_index = topo_arg.tri_edge_indices[element_index][edge]
|
|
178
|
+
return wp.where(
|
|
179
|
+
topo_arg.edge_vertex_indices[global_edge_index][0]
|
|
180
|
+
== geo_arg.topology.tri_vertex_indices[element_index][edge],
|
|
181
|
+
1.0,
|
|
182
|
+
-1.0,
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
return 1.0
|
|
186
|
+
|
|
187
|
+
return element_node_sign
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def make_trimesh_space_topology(mesh: Trimesh, shape: TriangleShapeFunction):
|
|
191
|
+
if isinstance(shape, TriangleShapeFunction):
|
|
192
|
+
return forward_base_topology(TrimeshSpaceTopology, mesh, shape)
|
|
193
|
+
|
|
194
|
+
raise ValueError(f"Unsupported shape function {shape.name}")
|
warp/fem/types.py
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
from enum import Enum
|
|
17
|
+
|
|
18
|
+
import warp as wp
|
|
19
|
+
|
|
20
|
+
# kept to avoid breaking existing example code, no longer used internally
|
|
21
|
+
vec2i = wp.vec2i
|
|
22
|
+
vec3i = wp.vec3i
|
|
23
|
+
vec4i = wp.vec4i
|
|
24
|
+
|
|
25
|
+
Coords = wp.vec3
|
|
26
|
+
OUTSIDE = wp.constant(-1.0e8)
|
|
27
|
+
|
|
28
|
+
ElementIndex = int
|
|
29
|
+
QuadraturePointIndex = int
|
|
30
|
+
NodeIndex = int
|
|
31
|
+
|
|
32
|
+
NULL_ELEMENT_INDEX = wp.constant(-1)
|
|
33
|
+
NULL_QP_INDEX = wp.constant(-1)
|
|
34
|
+
NULL_NODE_INDEX = wp.constant((1 << 31) - 1) # this should be larger than normal nodes when sorting
|
|
35
|
+
|
|
36
|
+
DofIndex = wp.vec2i
|
|
37
|
+
"""Opaque descriptor for indexing degrees of freedom within elements"""
|
|
38
|
+
NULL_DOF_INDEX = wp.constant(DofIndex(-1, -1))
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@wp.func
|
|
42
|
+
def get_node_index_in_element(dof_idx: DofIndex):
|
|
43
|
+
return dof_idx[0]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@wp.func
|
|
47
|
+
def get_node_coord(dof_idx: DofIndex):
|
|
48
|
+
return dof_idx[1]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class ElementKind(Enum):
|
|
52
|
+
CELL = 0
|
|
53
|
+
SIDE = 1
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@wp.struct
|
|
57
|
+
class NodeElementIndex:
|
|
58
|
+
domain_element_index: ElementIndex
|
|
59
|
+
node_index_in_element: int
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@wp.struct
|
|
63
|
+
class Sample:
|
|
64
|
+
"""Per-sample point context for evaluating fields and related operators in integrands"""
|
|
65
|
+
|
|
66
|
+
element_index: ElementIndex
|
|
67
|
+
"""Index of the geometry element the sample point is in"""
|
|
68
|
+
element_coords: Coords
|
|
69
|
+
"""Coordinates of the sample point inside the element"""
|
|
70
|
+
qp_index: QuadraturePointIndex = NULL_QP_INDEX
|
|
71
|
+
"""If the sample corresponds to a quadrature point, its global index"""
|
|
72
|
+
qp_weight: float = 0.0
|
|
73
|
+
"""If the sample corresponds to a quadrature point, its weight"""
|
|
74
|
+
test_dof: DofIndex = NULL_DOF_INDEX
|
|
75
|
+
"""For linear of bilinear form assembly, index of the test degree-of-freedom currently being considered"""
|
|
76
|
+
trial_dof: DofIndex = NULL_DOF_INDEX
|
|
77
|
+
"""For bilinear form assembly, index of the trial degree-of-freedom currently being considered"""
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@wp.func
|
|
81
|
+
def make_free_sample(element_index: ElementIndex, element_coords: Coords):
|
|
82
|
+
"""Returns a :class:`Sample` that is not associated to any quadrature point or dof"""
|
|
83
|
+
return Sample(element_index, element_coords, NULL_QP_INDEX, 0.0, NULL_DOF_INDEX, NULL_DOF_INDEX)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class Field:
|
|
87
|
+
"""
|
|
88
|
+
Tag for field-like integrand arguments
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
call_operator: "warp.fem.operator.Operator" = None # noqa: F821 Set in operator.py
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class Domain:
|
|
95
|
+
"""
|
|
96
|
+
Tag for domain-like integrand arguments
|
|
97
|
+
"""
|
|
98
|
+
|
|
99
|
+
call_operator: "warp.fem.operator.Operator" = None # noqa: F821 Set in operator.py
|