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,326 @@
|
|
|
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 typing import Any
|
|
17
|
+
|
|
18
|
+
import warp as wp
|
|
19
|
+
from warp.fem import cache
|
|
20
|
+
from warp.fem.space import CollocatedFunctionSpace, SpacePartition
|
|
21
|
+
from warp.fem.types import NULL_NODE_INDEX, ElementIndex, Sample
|
|
22
|
+
|
|
23
|
+
from .field import DiscreteField
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class NodalFieldBase(DiscreteField):
|
|
27
|
+
"""Base class for nodal field and nodal field traces. Does not hold values"""
|
|
28
|
+
|
|
29
|
+
def __init__(self, space: CollocatedFunctionSpace, space_partition: SpacePartition):
|
|
30
|
+
super().__init__(space, space_partition)
|
|
31
|
+
|
|
32
|
+
self.EvalArg = self._make_eval_arg()
|
|
33
|
+
self.ElementEvalArg = self._make_element_eval_arg()
|
|
34
|
+
self.eval_degree = DiscreteField._make_eval_degree(self)
|
|
35
|
+
|
|
36
|
+
self._read_node_value = self._make_read_node_value()
|
|
37
|
+
|
|
38
|
+
self.eval_inner = self._make_eval_inner()
|
|
39
|
+
self.eval_outer = self._make_eval_outer()
|
|
40
|
+
self.eval_grad_inner = self._make_eval_grad_inner(world_space=True)
|
|
41
|
+
self.eval_grad_outer = self._make_eval_grad_outer(world_space=True)
|
|
42
|
+
self.eval_reference_grad_inner = self._make_eval_grad_inner(world_space=False)
|
|
43
|
+
self.eval_reference_grad_outer = self._make_eval_grad_outer(world_space=False)
|
|
44
|
+
self.eval_div_inner = self._make_eval_div_inner()
|
|
45
|
+
self.eval_div_outer = self._make_eval_div_outer()
|
|
46
|
+
|
|
47
|
+
self.set_node_value = self._make_set_node_value()
|
|
48
|
+
self.node_partition_index = self._make_node_partition_index()
|
|
49
|
+
|
|
50
|
+
def _make_eval_arg(self):
|
|
51
|
+
@cache.dynamic_struct(suffix=self.name)
|
|
52
|
+
class EvalArg:
|
|
53
|
+
dof_values: wp.array(dtype=self.space.dof_dtype)
|
|
54
|
+
space_arg: self.space.SpaceArg
|
|
55
|
+
topology_arg: self.space.topology.TopologyArg
|
|
56
|
+
partition_arg: self.space_partition.PartitionArg
|
|
57
|
+
|
|
58
|
+
return EvalArg
|
|
59
|
+
|
|
60
|
+
def _make_element_eval_arg(self):
|
|
61
|
+
@cache.dynamic_struct(suffix=self.name)
|
|
62
|
+
class ElementEvalArg:
|
|
63
|
+
elt_arg: self.space.topology.ElementArg
|
|
64
|
+
eval_arg: self.EvalArg
|
|
65
|
+
|
|
66
|
+
return ElementEvalArg
|
|
67
|
+
|
|
68
|
+
def _make_read_node_value(self):
|
|
69
|
+
@cache.dynamic_func(suffix=self.name)
|
|
70
|
+
def read_node_value(args: self.ElementEvalArg, geo_element_index: ElementIndex, node_index_in_elt: int):
|
|
71
|
+
nidx = self.space.topology.element_node_index(
|
|
72
|
+
args.elt_arg, args.eval_arg.topology_arg, geo_element_index, node_index_in_elt
|
|
73
|
+
)
|
|
74
|
+
pidx = self.space_partition.partition_node_index(args.eval_arg.partition_arg, nidx)
|
|
75
|
+
if pidx == NULL_NODE_INDEX:
|
|
76
|
+
return self.space.dof_dtype(0.0)
|
|
77
|
+
|
|
78
|
+
return args.eval_arg.dof_values[pidx]
|
|
79
|
+
|
|
80
|
+
return read_node_value
|
|
81
|
+
|
|
82
|
+
def _make_eval_inner(self):
|
|
83
|
+
@cache.dynamic_func(suffix=self.name)
|
|
84
|
+
def eval_inner(args: self.ElementEvalArg, s: Sample):
|
|
85
|
+
local_value_map = self.space.local_value_map_inner(args.elt_arg, s.element_index, s.element_coords)
|
|
86
|
+
node_count = self.space.topology.element_node_count(
|
|
87
|
+
args.elt_arg, args.eval_arg.topology_arg, s.element_index
|
|
88
|
+
)
|
|
89
|
+
res = self.space.dtype(0.0)
|
|
90
|
+
for k in range(node_count):
|
|
91
|
+
res += self.space.space_value(
|
|
92
|
+
self._read_node_value(args, s.element_index, k),
|
|
93
|
+
self.space.element_inner_weight(
|
|
94
|
+
args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
|
|
95
|
+
),
|
|
96
|
+
local_value_map,
|
|
97
|
+
)
|
|
98
|
+
return res
|
|
99
|
+
|
|
100
|
+
return eval_inner
|
|
101
|
+
|
|
102
|
+
def _make_eval_grad_inner(self, world_space: bool):
|
|
103
|
+
if not self.space.gradient_valid():
|
|
104
|
+
return None
|
|
105
|
+
|
|
106
|
+
@cache.dynamic_func(suffix=self.name)
|
|
107
|
+
def eval_grad_inner(args: self.ElementEvalArg, s: Sample, grad_transform: Any):
|
|
108
|
+
local_value_map = self.space.local_value_map_inner(args.elt_arg, s.element_index, s.element_coords)
|
|
109
|
+
node_count = self.space.topology.element_node_count(
|
|
110
|
+
args.elt_arg, args.eval_arg.topology_arg, s.element_index
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
res = self.gradient_dtype(0.0)
|
|
114
|
+
for k in range(node_count):
|
|
115
|
+
res += self.space.space_gradient(
|
|
116
|
+
self._read_node_value(args, s.element_index, k),
|
|
117
|
+
self.space.element_inner_weight_gradient(
|
|
118
|
+
args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
|
|
119
|
+
),
|
|
120
|
+
local_value_map,
|
|
121
|
+
grad_transform,
|
|
122
|
+
)
|
|
123
|
+
return res
|
|
124
|
+
|
|
125
|
+
@cache.dynamic_func(suffix=self.name)
|
|
126
|
+
def eval_grad_inner_ref_space(args: self.ElementEvalArg, s: Sample):
|
|
127
|
+
grad_transform = 1.0
|
|
128
|
+
return eval_grad_inner(args, s, grad_transform)
|
|
129
|
+
|
|
130
|
+
@cache.dynamic_func(suffix=self.name)
|
|
131
|
+
def eval_grad_inner_world_space(args: self.ElementEvalArg, s: Sample):
|
|
132
|
+
grad_transform = self.space.element_inner_reference_gradient_transform(args.elt_arg, s)
|
|
133
|
+
return eval_grad_inner(args, s, grad_transform)
|
|
134
|
+
|
|
135
|
+
return eval_grad_inner_world_space if world_space else eval_grad_inner_ref_space
|
|
136
|
+
|
|
137
|
+
def _make_eval_div_inner(self):
|
|
138
|
+
if not self.divergence_valid():
|
|
139
|
+
return None
|
|
140
|
+
|
|
141
|
+
@cache.dynamic_func(suffix=self.name)
|
|
142
|
+
def eval_div_inner(args: self.ElementEvalArg, s: Sample):
|
|
143
|
+
grad_transform = self.space.element_inner_reference_gradient_transform(args.elt_arg, s)
|
|
144
|
+
local_value_map = self.space.local_value_map_inner(args.elt_arg, s.element_index, s.element_coords)
|
|
145
|
+
node_count = self.space.topology.element_node_count(
|
|
146
|
+
args.elt_arg, args.eval_arg.topology_arg, s.element_index
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
res = self.divergence_dtype(0.0)
|
|
150
|
+
for k in range(node_count):
|
|
151
|
+
res += self.space.space_divergence(
|
|
152
|
+
self._read_node_value(args, s.element_index, k),
|
|
153
|
+
self.space.element_inner_weight_gradient(
|
|
154
|
+
args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
|
|
155
|
+
),
|
|
156
|
+
local_value_map,
|
|
157
|
+
grad_transform,
|
|
158
|
+
)
|
|
159
|
+
return res
|
|
160
|
+
|
|
161
|
+
return eval_div_inner
|
|
162
|
+
|
|
163
|
+
def _make_eval_outer(self):
|
|
164
|
+
@cache.dynamic_func(suffix=self.name)
|
|
165
|
+
def eval_outer(args: self.ElementEvalArg, s: Sample):
|
|
166
|
+
local_value_map = self.space.local_value_map_outer(args.elt_arg, s.element_index, s.element_coords)
|
|
167
|
+
node_count = self.space.topology.element_node_count(
|
|
168
|
+
args.elt_arg, args.eval_arg.topology_arg, s.element_index
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
res = self.dtype(0.0)
|
|
172
|
+
for k in range(node_count):
|
|
173
|
+
res += self.space.space_value(
|
|
174
|
+
self._read_node_value(args, s.element_index, k),
|
|
175
|
+
self.space.element_outer_weight(
|
|
176
|
+
args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
|
|
177
|
+
),
|
|
178
|
+
local_value_map,
|
|
179
|
+
)
|
|
180
|
+
return res
|
|
181
|
+
|
|
182
|
+
return eval_outer
|
|
183
|
+
|
|
184
|
+
def _make_eval_grad_outer(self, world_space: bool):
|
|
185
|
+
if not self.space.gradient_valid():
|
|
186
|
+
return None
|
|
187
|
+
|
|
188
|
+
@cache.dynamic_func(suffix=self.name)
|
|
189
|
+
def eval_grad_outer(args: self.ElementEvalArg, s: Sample, grad_transform: Any):
|
|
190
|
+
local_value_map = self.space.local_value_map_outer(args.elt_arg, s.element_index, s.element_coords)
|
|
191
|
+
node_count = self.space.topology.element_node_count(
|
|
192
|
+
args.elt_arg, args.eval_arg.topology_arg, s.element_index
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
res = self.gradient_dtype(0.0)
|
|
196
|
+
for k in range(node_count):
|
|
197
|
+
res += self.space.space_gradient(
|
|
198
|
+
self._read_node_value(args, s.element_index, k),
|
|
199
|
+
self.space.element_outer_weight_gradient(
|
|
200
|
+
args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
|
|
201
|
+
),
|
|
202
|
+
local_value_map,
|
|
203
|
+
grad_transform,
|
|
204
|
+
)
|
|
205
|
+
return res
|
|
206
|
+
|
|
207
|
+
@cache.dynamic_func(suffix=self.name)
|
|
208
|
+
def eval_grad_outer_ref_space(args: self.ElementEvalArg, s: Sample):
|
|
209
|
+
grad_transform = 1.0
|
|
210
|
+
return eval_grad_outer_ref_space(args, s, grad_transform)
|
|
211
|
+
|
|
212
|
+
@cache.dynamic_func(suffix=self.name)
|
|
213
|
+
def eval_grad_outer_world_space(args: self.ElementEvalArg, s: Sample):
|
|
214
|
+
grad_transform = self.space.element_outer_reference_gradient_transform(args.elt_arg, s)
|
|
215
|
+
return eval_grad_outer_ref_space(args, s, grad_transform)
|
|
216
|
+
|
|
217
|
+
return eval_grad_outer_world_space if world_space else eval_grad_outer_ref_space
|
|
218
|
+
|
|
219
|
+
def _make_eval_div_outer(self):
|
|
220
|
+
if not self.divergence_valid():
|
|
221
|
+
return None
|
|
222
|
+
|
|
223
|
+
@cache.dynamic_func(suffix=self.name)
|
|
224
|
+
def eval_div_outer(args: self.ElementEvalArg, s: Sample):
|
|
225
|
+
grad_transform = self.space.element_outer_reference_gradient_transform(args.elt_arg, s)
|
|
226
|
+
local_value_map = self.space.local_value_map_outer(args.elt_arg, s.element_index, s.element_coords)
|
|
227
|
+
node_count = self.space.topology.element_node_count(
|
|
228
|
+
args.elt_arg, args.eval_arg.topology_arg, s.element_index
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
res = self.divergence_dtype(0.0)
|
|
232
|
+
for k in range(node_count):
|
|
233
|
+
res += self.space.space_divergence(
|
|
234
|
+
self._read_node_value(args, s.element_index, k),
|
|
235
|
+
self.space.element_outer_weight_gradient(
|
|
236
|
+
args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
|
|
237
|
+
),
|
|
238
|
+
local_value_map,
|
|
239
|
+
grad_transform,
|
|
240
|
+
)
|
|
241
|
+
return res
|
|
242
|
+
|
|
243
|
+
return eval_div_outer
|
|
244
|
+
|
|
245
|
+
def _make_set_node_value(self):
|
|
246
|
+
@cache.dynamic_func(suffix=self.name)
|
|
247
|
+
def set_node_value(
|
|
248
|
+
elt_arg: self.space.ElementArg,
|
|
249
|
+
eval_arg: self.EvalArg,
|
|
250
|
+
element_index: ElementIndex,
|
|
251
|
+
node_index_in_element: int,
|
|
252
|
+
partition_node_index: int,
|
|
253
|
+
value: self.space.dtype,
|
|
254
|
+
):
|
|
255
|
+
eval_arg.dof_values[partition_node_index] = self.space.node_dof_value(
|
|
256
|
+
elt_arg, eval_arg.space_arg, element_index, node_index_in_element, value
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
return set_node_value
|
|
260
|
+
|
|
261
|
+
def _make_node_partition_index(self):
|
|
262
|
+
@cache.dynamic_func(suffix=self.name)
|
|
263
|
+
def node_partition_index(args: self.ElementEvalArg, node_index: int):
|
|
264
|
+
return self.space_partition.partition_node_index(args.eval_arg.partition_arg, node_index)
|
|
265
|
+
|
|
266
|
+
return node_partition_index
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
class NodalField(NodalFieldBase):
|
|
270
|
+
"""A field holding values for all degrees of freedom at each node of the underlying function space partition
|
|
271
|
+
|
|
272
|
+
See also: warp.fem.space.CollocatedFunctionSpace.make_field
|
|
273
|
+
"""
|
|
274
|
+
|
|
275
|
+
def __init__(self, space: CollocatedFunctionSpace, space_partition: SpacePartition):
|
|
276
|
+
if space.topology != space_partition.space_topology:
|
|
277
|
+
raise ValueError("Incompatible space and space partition topologies")
|
|
278
|
+
|
|
279
|
+
super().__init__(space, space_partition)
|
|
280
|
+
|
|
281
|
+
self._dof_values = wp.zeros(n=self.space_partition.node_count(), dtype=self.dof_dtype)
|
|
282
|
+
|
|
283
|
+
def eval_arg_value(self, device):
|
|
284
|
+
arg = self.EvalArg()
|
|
285
|
+
arg.dof_values = self._dof_values.to(device)
|
|
286
|
+
arg.space_arg = self.space.space_arg_value(device)
|
|
287
|
+
arg.partition_arg = self.space_partition.partition_arg_value(device)
|
|
288
|
+
arg.topology_arg = self.space.topology.topo_arg_value(device)
|
|
289
|
+
|
|
290
|
+
return arg
|
|
291
|
+
|
|
292
|
+
@property
|
|
293
|
+
def dof_values(self) -> wp.array:
|
|
294
|
+
"""Returns a warp array containing the values at all degrees of freedom of the underlying space partition"""
|
|
295
|
+
return self._dof_values
|
|
296
|
+
|
|
297
|
+
@dof_values.setter
|
|
298
|
+
def dof_values(self, values):
|
|
299
|
+
"""Sets the degrees-of-freedom values
|
|
300
|
+
|
|
301
|
+
Args:
|
|
302
|
+
values: Array that is convertible to a warp array of length ``self.space_partition.node_count()`` and data type ``self.space.dof_dtype``
|
|
303
|
+
"""
|
|
304
|
+
|
|
305
|
+
if isinstance(values, wp.array):
|
|
306
|
+
self._dof_values = values
|
|
307
|
+
else:
|
|
308
|
+
self._dof_values = wp.array(values, dtype=self.dof_dtype)
|
|
309
|
+
|
|
310
|
+
class Trace(NodalFieldBase):
|
|
311
|
+
def __init__(self, field):
|
|
312
|
+
self._field = field
|
|
313
|
+
super().__init__(field.space.trace(), field.space_partition)
|
|
314
|
+
|
|
315
|
+
def eval_arg_value(self, device):
|
|
316
|
+
arg = self.EvalArg()
|
|
317
|
+
arg.dof_values = self._field.dof_values.to(device)
|
|
318
|
+
arg.space_arg = self.space.space_arg_value(device)
|
|
319
|
+
arg.partition_arg = self.space_partition.partition_arg_value(device)
|
|
320
|
+
arg.topology_arg = self.space.topology.topo_arg_value(device)
|
|
321
|
+
|
|
322
|
+
return arg
|
|
323
|
+
|
|
324
|
+
def trace(self) -> Trace:
|
|
325
|
+
trace_field = NodalField.Trace(self)
|
|
326
|
+
return trace_field
|
|
@@ -0,0 +1,37 @@
|
|
|
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 warp.fem.space import SpaceRestriction
|
|
17
|
+
|
|
18
|
+
from .field import DiscreteField
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class FieldRestriction:
|
|
22
|
+
"""Restriction of a discrete field to a given GeometryDomain"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, space_restriction: SpaceRestriction, field: DiscreteField):
|
|
25
|
+
if field.space.dimension - 1 == space_restriction.space_topology.dimension:
|
|
26
|
+
field = field.trace()
|
|
27
|
+
|
|
28
|
+
if field.space.dimension != space_restriction.space_topology.dimension:
|
|
29
|
+
raise ValueError("Incompatible space and field dimensions")
|
|
30
|
+
|
|
31
|
+
if field.space.topology != space_restriction.space_topology:
|
|
32
|
+
raise ValueError("Incompatible field and space restriction topologies")
|
|
33
|
+
|
|
34
|
+
self.space_restriction = space_restriction
|
|
35
|
+
self.domain = self.space_restriction.domain
|
|
36
|
+
self.field = field
|
|
37
|
+
self.space = self.field.space
|