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,499 @@
|
|
|
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
|
+
from functools import cached_property
|
|
17
|
+
from typing import Any, ClassVar, Optional
|
|
18
|
+
|
|
19
|
+
import warp as wp
|
|
20
|
+
from warp._src.fem import cache
|
|
21
|
+
from warp._src.fem.geometry import Geometry
|
|
22
|
+
from warp._src.fem.linalg import generalized_inner, generalized_outer
|
|
23
|
+
from warp._src.fem.types import NULL_QP_INDEX, Coords, ElementIndex, make_free_sample
|
|
24
|
+
from warp._src.fem.utils import type_basis_element
|
|
25
|
+
|
|
26
|
+
from .basis_space import BasisSpace
|
|
27
|
+
from .dof_mapper import DofMapper, IdentityMapper
|
|
28
|
+
from .function_space import FunctionSpace
|
|
29
|
+
from .partition import SpacePartition, make_space_partition
|
|
30
|
+
|
|
31
|
+
_wp_module_name_ = "warp.fem.space.basis_function_space"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class CollocatedFunctionSpace(FunctionSpace):
|
|
35
|
+
"""Function space where values are collocated at nodes"""
|
|
36
|
+
|
|
37
|
+
_dynamic_attribute_constructors: ClassVar = {
|
|
38
|
+
"node_basis_element": lambda obj: obj._make_node_basis_element(),
|
|
39
|
+
"value_basis_element": lambda obj: obj._make_value_basis_element(),
|
|
40
|
+
"node_coords_in_element": lambda obj: obj._basis.make_node_coords_in_element(),
|
|
41
|
+
"node_quadrature_weight": lambda obj: obj._basis.make_node_quadrature_weight(),
|
|
42
|
+
"element_inner_weight": lambda obj: obj._basis.make_element_inner_weight(),
|
|
43
|
+
"element_inner_weight_gradient": lambda obj: obj._basis.make_element_inner_weight_gradient(),
|
|
44
|
+
"element_outer_weight": lambda obj: obj._basis.make_element_outer_weight(),
|
|
45
|
+
"element_outer_weight_gradient": lambda obj: obj._basis.make_element_outer_weight_gradient(),
|
|
46
|
+
"space_value": lambda obj: obj._make_space_value(),
|
|
47
|
+
"space_gradient": lambda obj: obj._make_space_gradient(),
|
|
48
|
+
"space_divergence": lambda obj: obj._make_space_divergence(),
|
|
49
|
+
"node_dof_value": lambda obj: obj._make_node_dof_value(),
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@wp.struct
|
|
53
|
+
class LocalValueMap:
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
def __init__(self, basis: BasisSpace, dtype: type = float, dof_mapper: DofMapper = None):
|
|
57
|
+
self.dof_mapper = IdentityMapper(dtype) if dof_mapper is None else dof_mapper
|
|
58
|
+
self._basis = basis
|
|
59
|
+
|
|
60
|
+
super().__init__(topology=basis.topology)
|
|
61
|
+
|
|
62
|
+
self.dtype = self.dof_mapper.value_dtype
|
|
63
|
+
self.dof_dtype = self.dof_mapper.dof_dtype
|
|
64
|
+
self.VALUE_DOF_COUNT = self.dof_mapper.DOF_SIZE
|
|
65
|
+
self.NODE_DOF_COUNT = self.dof_mapper.DOF_SIZE
|
|
66
|
+
|
|
67
|
+
self.SpaceArg = self._basis.BasisArg
|
|
68
|
+
self.space_arg_value = self._basis.basis_arg_value
|
|
69
|
+
self.fill_space_arg = self._basis.fill_basis_arg
|
|
70
|
+
|
|
71
|
+
self.ORDER = self._basis.ORDER
|
|
72
|
+
|
|
73
|
+
cache.setup_dynamic_attributes(self)
|
|
74
|
+
|
|
75
|
+
# For backward compatibility
|
|
76
|
+
if hasattr(basis, "node_grid"):
|
|
77
|
+
self.node_grid = basis.node_grid
|
|
78
|
+
if hasattr(basis, "node_triangulation"):
|
|
79
|
+
self.node_triangulation = basis.node_triangulation
|
|
80
|
+
if hasattr(basis, "node_tets"):
|
|
81
|
+
self.node_tets = basis.node_tets
|
|
82
|
+
if hasattr(basis, "node_hexes"):
|
|
83
|
+
self.node_hexes = basis.node_hexes
|
|
84
|
+
if hasattr(basis, "vtk_cells"):
|
|
85
|
+
self.vtk_cells = basis.vtk_cells
|
|
86
|
+
|
|
87
|
+
@cached_property
|
|
88
|
+
def name(self):
|
|
89
|
+
return f"{self._basis.name}_{self.dof_mapper}".replace(".", "_")
|
|
90
|
+
|
|
91
|
+
@property
|
|
92
|
+
def basis(self) -> BasisSpace:
|
|
93
|
+
return self._basis
|
|
94
|
+
|
|
95
|
+
def node_positions(self, out: Optional[wp.array] = None) -> wp.array:
|
|
96
|
+
return self._basis.node_positions(out=out)
|
|
97
|
+
|
|
98
|
+
def make_field(
|
|
99
|
+
self,
|
|
100
|
+
space_partition: Optional[SpacePartition] = None,
|
|
101
|
+
) -> "wp.fem.field.NodalField":
|
|
102
|
+
from warp._src.fem.field import NodalField
|
|
103
|
+
|
|
104
|
+
if space_partition is None:
|
|
105
|
+
space_partition = make_space_partition(space_topology=self.topology)
|
|
106
|
+
|
|
107
|
+
return NodalField(space=self, space_partition=space_partition)
|
|
108
|
+
|
|
109
|
+
def trace(self) -> "CollocatedFunctionSpace":
|
|
110
|
+
return CollocatedFunctionSpaceTrace(self)
|
|
111
|
+
|
|
112
|
+
def _make_node_basis_element(self):
|
|
113
|
+
basis_element = type_basis_element(self.dof_dtype)
|
|
114
|
+
return basis_element
|
|
115
|
+
|
|
116
|
+
def _make_value_basis_element(self):
|
|
117
|
+
@cache.dynamic_func(suffix=self.name)
|
|
118
|
+
def value_basis_element(dof_coord: int, value_map: CollocatedFunctionSpace.LocalValueMap):
|
|
119
|
+
return self.dof_mapper.dof_to_value(self.node_basis_element(dof_coord))
|
|
120
|
+
|
|
121
|
+
return value_basis_element
|
|
122
|
+
|
|
123
|
+
@wp.func
|
|
124
|
+
def local_value_map_inner(
|
|
125
|
+
elt_arg: Any,
|
|
126
|
+
element_index: ElementIndex,
|
|
127
|
+
element_coords: Coords,
|
|
128
|
+
):
|
|
129
|
+
return CollocatedFunctionSpace.LocalValueMap()
|
|
130
|
+
|
|
131
|
+
@wp.func
|
|
132
|
+
def local_value_map_outer(
|
|
133
|
+
elt_arg: Any,
|
|
134
|
+
element_index: ElementIndex,
|
|
135
|
+
element_coords: Coords,
|
|
136
|
+
):
|
|
137
|
+
return CollocatedFunctionSpace.LocalValueMap()
|
|
138
|
+
|
|
139
|
+
def _make_space_value(self):
|
|
140
|
+
@cache.dynamic_func(suffix=self.name)
|
|
141
|
+
def value_func(
|
|
142
|
+
dof_value: self.dof_dtype,
|
|
143
|
+
node_weight: self._basis.weight_type,
|
|
144
|
+
local_value_map: self.LocalValueMap,
|
|
145
|
+
):
|
|
146
|
+
return node_weight * self.dof_mapper.dof_to_value(dof_value)
|
|
147
|
+
|
|
148
|
+
return value_func
|
|
149
|
+
|
|
150
|
+
def _make_space_gradient(self):
|
|
151
|
+
@cache.dynamic_func(suffix=self.name)
|
|
152
|
+
def gradient_func(
|
|
153
|
+
dof_value: self.dof_dtype,
|
|
154
|
+
node_weight_gradient: self._basis.weight_gradient_type,
|
|
155
|
+
local_value_map: self.LocalValueMap,
|
|
156
|
+
grad_transform: Any,
|
|
157
|
+
):
|
|
158
|
+
return generalized_outer(self.dof_mapper.dof_to_value(dof_value), node_weight_gradient * grad_transform)
|
|
159
|
+
|
|
160
|
+
return gradient_func
|
|
161
|
+
|
|
162
|
+
def _make_space_divergence(self):
|
|
163
|
+
@cache.dynamic_func(suffix=self.name)
|
|
164
|
+
def divergence_func(
|
|
165
|
+
dof_value: self.dof_dtype,
|
|
166
|
+
node_weight_gradient: self._basis.weight_gradient_type,
|
|
167
|
+
local_value_map: self.LocalValueMap,
|
|
168
|
+
grad_transform: Any,
|
|
169
|
+
):
|
|
170
|
+
return generalized_inner(self.dof_mapper.dof_to_value(dof_value), node_weight_gradient * grad_transform)
|
|
171
|
+
|
|
172
|
+
return divergence_func
|
|
173
|
+
|
|
174
|
+
def _make_node_dof_value(self):
|
|
175
|
+
@cache.dynamic_func(suffix=self.name)
|
|
176
|
+
def node_dof_value(
|
|
177
|
+
elt_arg: self.ElementArg,
|
|
178
|
+
space_arg: self.SpaceArg,
|
|
179
|
+
element_index: ElementIndex,
|
|
180
|
+
node_index_in_elt: int,
|
|
181
|
+
space_value: self.dtype,
|
|
182
|
+
):
|
|
183
|
+
return self.dof_mapper.value_to_dof(space_value)
|
|
184
|
+
|
|
185
|
+
return node_dof_value
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
class CollocatedFunctionSpaceTrace(CollocatedFunctionSpace):
|
|
189
|
+
"""Trace of a :class:`CollocatedFunctionSpace`"""
|
|
190
|
+
|
|
191
|
+
def __init__(self, space: CollocatedFunctionSpace):
|
|
192
|
+
self._space = space
|
|
193
|
+
super().__init__(space._basis.trace(), space.dtype, space.dof_mapper)
|
|
194
|
+
|
|
195
|
+
@cached_property
|
|
196
|
+
def name(self):
|
|
197
|
+
return f"{self._space.name}_Trace"
|
|
198
|
+
|
|
199
|
+
def __eq__(self, other: "CollocatedFunctionSpaceTrace") -> bool:
|
|
200
|
+
return self._space == other._space
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
class VectorValuedFunctionSpace(FunctionSpace):
|
|
204
|
+
"""Function space whose values are vectors"""
|
|
205
|
+
|
|
206
|
+
_dynamic_attribute_constructors: ClassVar = {
|
|
207
|
+
"value_basis_element": lambda obj: obj._make_value_basis_element(),
|
|
208
|
+
"node_coords_in_element": lambda obj: obj._basis.make_node_coords_in_element(),
|
|
209
|
+
"node_quadrature_weight": lambda obj: obj._basis.make_node_quadrature_weight(),
|
|
210
|
+
"element_inner_weight": lambda obj: obj._basis.make_element_inner_weight(),
|
|
211
|
+
"element_inner_weight_gradient": lambda obj: obj._basis.make_element_inner_weight_gradient(),
|
|
212
|
+
"element_outer_weight": lambda obj: obj._basis.make_element_outer_weight(),
|
|
213
|
+
"element_outer_weight_gradient": lambda obj: obj._basis.make_element_outer_weight_gradient(),
|
|
214
|
+
"space_value": lambda obj: obj._make_space_value(),
|
|
215
|
+
"space_gradient": lambda obj: obj._make_space_gradient(),
|
|
216
|
+
"space_divergence": lambda obj: obj._make_space_divergence(),
|
|
217
|
+
"node_dof_value": lambda obj: obj._make_node_dof_value(),
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
def __init__(self, basis: BasisSpace):
|
|
221
|
+
self._basis = basis
|
|
222
|
+
|
|
223
|
+
super().__init__(topology=basis.topology)
|
|
224
|
+
|
|
225
|
+
self.dtype = cache.cached_vec_type(self.geometry.dimension, dtype=float)
|
|
226
|
+
self.dof_dtype = wp.float32
|
|
227
|
+
|
|
228
|
+
self.VALUE_DOF_COUNT = self.geometry.dimension
|
|
229
|
+
self.NODE_DOF_COUNT = 1
|
|
230
|
+
|
|
231
|
+
self.SpaceArg = self._basis.BasisArg
|
|
232
|
+
self.space_arg_value = self._basis.basis_arg_value
|
|
233
|
+
self.fill_space_arg = self._basis.fill_basis_arg
|
|
234
|
+
|
|
235
|
+
self.ORDER = self._basis.ORDER
|
|
236
|
+
|
|
237
|
+
self.LocalValueMap = cache.cached_mat_type(
|
|
238
|
+
shape=(self.geometry.dimension, self.geometry.cell_dimension), dtype=float
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
cache.setup_dynamic_attributes(self, cls=__class__)
|
|
242
|
+
|
|
243
|
+
@property
|
|
244
|
+
def name(self):
|
|
245
|
+
return self._basis.name
|
|
246
|
+
|
|
247
|
+
@property
|
|
248
|
+
def basis(self) -> BasisSpace:
|
|
249
|
+
return self._basis
|
|
250
|
+
|
|
251
|
+
def node_positions(self, out: Optional[wp.array] = None) -> wp.array:
|
|
252
|
+
return self._basis.node_positions(out=out)
|
|
253
|
+
|
|
254
|
+
def make_field(
|
|
255
|
+
self,
|
|
256
|
+
space_partition: Optional[SpacePartition] = None,
|
|
257
|
+
) -> "wp.fem.field.NodalField":
|
|
258
|
+
from warp._src.fem.field import NodalField
|
|
259
|
+
|
|
260
|
+
if space_partition is None:
|
|
261
|
+
space_partition = make_space_partition(space_topology=self.topology)
|
|
262
|
+
|
|
263
|
+
return NodalField(space=self, space_partition=space_partition)
|
|
264
|
+
|
|
265
|
+
@wp.func
|
|
266
|
+
def node_basis_element(dof_coord: int):
|
|
267
|
+
return 1.0
|
|
268
|
+
|
|
269
|
+
def _make_value_basis_element(self):
|
|
270
|
+
basis_element = type_basis_element(self.dtype)
|
|
271
|
+
|
|
272
|
+
@cache.dynamic_func(suffix=self.name)
|
|
273
|
+
def value_basis_element(dof_coord: int, value_map: Any):
|
|
274
|
+
return value_map * basis_element(dof_coord)
|
|
275
|
+
|
|
276
|
+
return value_basis_element
|
|
277
|
+
|
|
278
|
+
def _make_space_value(self):
|
|
279
|
+
@cache.dynamic_func(suffix=self.name)
|
|
280
|
+
def value_func(
|
|
281
|
+
dof_value: self.dof_dtype,
|
|
282
|
+
node_weight: self._basis.weight_type,
|
|
283
|
+
local_value_map: self.LocalValueMap,
|
|
284
|
+
):
|
|
285
|
+
return local_value_map * (node_weight * dof_value)
|
|
286
|
+
|
|
287
|
+
return value_func
|
|
288
|
+
|
|
289
|
+
def _make_space_gradient(self):
|
|
290
|
+
@cache.dynamic_func(suffix=self.name)
|
|
291
|
+
def gradient_func(
|
|
292
|
+
dof_value: self.dof_dtype,
|
|
293
|
+
node_weight_gradient: self._basis.weight_gradient_type,
|
|
294
|
+
local_value_map: self.LocalValueMap,
|
|
295
|
+
grad_transform: Any,
|
|
296
|
+
):
|
|
297
|
+
return dof_value * local_value_map * node_weight_gradient * grad_transform
|
|
298
|
+
|
|
299
|
+
return gradient_func
|
|
300
|
+
|
|
301
|
+
def _make_space_divergence(self):
|
|
302
|
+
@cache.dynamic_func(suffix=self.name)
|
|
303
|
+
def divergence_func(
|
|
304
|
+
dof_value: self.dof_dtype,
|
|
305
|
+
node_weight_gradient: self._basis.weight_gradient_type,
|
|
306
|
+
local_value_map: self.LocalValueMap,
|
|
307
|
+
grad_transform: Any,
|
|
308
|
+
):
|
|
309
|
+
return dof_value * wp.trace(local_value_map * node_weight_gradient * grad_transform)
|
|
310
|
+
|
|
311
|
+
return divergence_func
|
|
312
|
+
|
|
313
|
+
def _make_node_dof_value(self):
|
|
314
|
+
@cache.dynamic_func(suffix=self.name)
|
|
315
|
+
def node_dof_value(
|
|
316
|
+
elt_arg: self.ElementArg,
|
|
317
|
+
space_arg: self.SpaceArg,
|
|
318
|
+
element_index: ElementIndex,
|
|
319
|
+
node_index_in_elt: int,
|
|
320
|
+
space_value: self.dtype,
|
|
321
|
+
):
|
|
322
|
+
coords = self.node_coords_in_element(elt_arg, space_arg, element_index, node_index_in_elt)
|
|
323
|
+
weight = self.element_inner_weight(
|
|
324
|
+
elt_arg, space_arg, element_index, coords, node_index_in_elt, NULL_QP_INDEX
|
|
325
|
+
)
|
|
326
|
+
local_value_map = self.local_value_map_inner(elt_arg, element_index, coords)
|
|
327
|
+
|
|
328
|
+
unit_value = local_value_map * weight
|
|
329
|
+
return wp.dot(space_value, unit_value) / wp.length_sq(unit_value)
|
|
330
|
+
|
|
331
|
+
return node_dof_value
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
class CovariantFunctionSpace(VectorValuedFunctionSpace):
|
|
335
|
+
"""Function space whose values are covariant vectors"""
|
|
336
|
+
|
|
337
|
+
_dynamic_attribute_constructors: ClassVar = {
|
|
338
|
+
"local_value_map_inner": lambda obj: obj._make_local_value_map(),
|
|
339
|
+
"local_value_map_outer": lambda obj: obj.local_value_map_inner,
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
def __init__(self, basis: BasisSpace):
|
|
343
|
+
super().__init__(basis)
|
|
344
|
+
|
|
345
|
+
cache.setup_dynamic_attributes(self, cls=__class__)
|
|
346
|
+
|
|
347
|
+
def trace(self) -> "CovariantFunctionSpaceTrace":
|
|
348
|
+
return CovariantFunctionSpaceTrace(self)
|
|
349
|
+
|
|
350
|
+
def _make_local_value_map(self):
|
|
351
|
+
@cache.dynamic_func(suffix=self.name)
|
|
352
|
+
def local_value_map(
|
|
353
|
+
elt_arg: self.ElementArg,
|
|
354
|
+
element_index: ElementIndex,
|
|
355
|
+
element_coords: Coords,
|
|
356
|
+
):
|
|
357
|
+
J = wp.transpose(
|
|
358
|
+
self.geometry.cell_inverse_deformation_gradient(
|
|
359
|
+
elt_arg, make_free_sample(element_index, element_coords)
|
|
360
|
+
)
|
|
361
|
+
)
|
|
362
|
+
return J
|
|
363
|
+
|
|
364
|
+
return local_value_map
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
class CovariantFunctionSpaceTrace(VectorValuedFunctionSpace):
|
|
368
|
+
"""Trace of a :class:`CovariantFunctionSpace`"""
|
|
369
|
+
|
|
370
|
+
_dynamic_attribute_constructors: ClassVar = {
|
|
371
|
+
"local_value_map_inner": lambda obj: obj._make_local_value_map_inner(),
|
|
372
|
+
"local_value_map_outer": lambda obj: obj._make_local_value_map_outer(),
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
def __init__(self, space: VectorValuedFunctionSpace):
|
|
376
|
+
self._space = space
|
|
377
|
+
super().__init__(space._basis.trace())
|
|
378
|
+
|
|
379
|
+
cache.setup_dynamic_attributes(self, cls=__class__)
|
|
380
|
+
|
|
381
|
+
@cached_property
|
|
382
|
+
def name(self):
|
|
383
|
+
return f"{self._space.name}_Trace"
|
|
384
|
+
|
|
385
|
+
def __eq__(self, other: "CovariantFunctionSpaceTrace") -> bool:
|
|
386
|
+
return self._space == other._space
|
|
387
|
+
|
|
388
|
+
def _make_local_value_map_inner(self):
|
|
389
|
+
@cache.dynamic_func(suffix=self.name)
|
|
390
|
+
def local_value_map_inner(
|
|
391
|
+
elt_arg: self.ElementArg,
|
|
392
|
+
element_index: ElementIndex,
|
|
393
|
+
element_coords: Coords,
|
|
394
|
+
):
|
|
395
|
+
return wp.transpose(
|
|
396
|
+
self.geometry.side_inner_inverse_deformation_gradient(
|
|
397
|
+
elt_arg, make_free_sample(element_index, element_coords)
|
|
398
|
+
)
|
|
399
|
+
)
|
|
400
|
+
|
|
401
|
+
return local_value_map_inner
|
|
402
|
+
|
|
403
|
+
def _make_local_value_map_outer(self):
|
|
404
|
+
@cache.dynamic_func(suffix=self.name)
|
|
405
|
+
def local_value_map_outer(
|
|
406
|
+
elt_arg: self.ElementArg,
|
|
407
|
+
element_index: ElementIndex,
|
|
408
|
+
element_coords: Coords,
|
|
409
|
+
):
|
|
410
|
+
return wp.transpose(
|
|
411
|
+
self.geometry.side_outer_inverse_deformation_gradient(
|
|
412
|
+
elt_arg, make_free_sample(element_index, element_coords)
|
|
413
|
+
)
|
|
414
|
+
)
|
|
415
|
+
|
|
416
|
+
return local_value_map_outer
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
class ContravariantFunctionSpace(VectorValuedFunctionSpace):
|
|
420
|
+
"""Function space whose values are contravariant vectors"""
|
|
421
|
+
|
|
422
|
+
_dynamic_attribute_constructors: ClassVar = {
|
|
423
|
+
"local_value_map_inner": lambda obj: obj._make_local_value_map(),
|
|
424
|
+
"local_value_map_outer": lambda obj: obj.local_value_map_inner,
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
def __init__(self, basis: BasisSpace):
|
|
428
|
+
super().__init__(basis)
|
|
429
|
+
|
|
430
|
+
cache.setup_dynamic_attributes(self, cls=__class__)
|
|
431
|
+
|
|
432
|
+
def trace(self) -> "ContravariantFunctionSpaceTrace":
|
|
433
|
+
return ContravariantFunctionSpaceTrace(self)
|
|
434
|
+
|
|
435
|
+
def _make_local_value_map(self):
|
|
436
|
+
@cache.dynamic_func(suffix=self.name)
|
|
437
|
+
def local_value_map(
|
|
438
|
+
elt_arg: self.ElementArg,
|
|
439
|
+
element_index: ElementIndex,
|
|
440
|
+
element_coords: Coords,
|
|
441
|
+
):
|
|
442
|
+
F = self.geometry.cell_deformation_gradient(elt_arg, make_free_sample(element_index, element_coords))
|
|
443
|
+
return F / Geometry._element_measure(F)
|
|
444
|
+
|
|
445
|
+
return local_value_map
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
class ContravariantFunctionSpaceTrace(VectorValuedFunctionSpace):
|
|
449
|
+
"""Trace of a :class:`ContravariantFunctionSpace`"""
|
|
450
|
+
|
|
451
|
+
_dynamic_attribute_constructors: ClassVar = {
|
|
452
|
+
"local_value_map_inner": lambda obj: obj._make_local_value_map_inner(),
|
|
453
|
+
"local_value_map_outer": lambda obj: obj._make_local_value_map_outer(),
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
def __init__(self, space: ContravariantFunctionSpace):
|
|
457
|
+
self._space = space
|
|
458
|
+
super().__init__(space._basis.trace())
|
|
459
|
+
|
|
460
|
+
cache.setup_dynamic_attributes(self, cls=__class__)
|
|
461
|
+
|
|
462
|
+
@cached_property
|
|
463
|
+
def name(self):
|
|
464
|
+
return f"{self._space.name}_Trace"
|
|
465
|
+
|
|
466
|
+
def __eq__(self, other: "ContravariantFunctionSpaceTrace") -> bool:
|
|
467
|
+
return self._space == other._space
|
|
468
|
+
|
|
469
|
+
def _make_local_value_map_inner(self):
|
|
470
|
+
@cache.dynamic_func(suffix=self.name)
|
|
471
|
+
def local_value_map_inner(
|
|
472
|
+
elt_arg: self.ElementArg,
|
|
473
|
+
element_index: ElementIndex,
|
|
474
|
+
element_coords: Coords,
|
|
475
|
+
):
|
|
476
|
+
cell_index = self.geometry.side_inner_cell_index(elt_arg, element_index)
|
|
477
|
+
cell_coords = self.geometry.side_inner_cell_coords(elt_arg, element_index, element_coords)
|
|
478
|
+
cell_arg = self.geometry.side_to_cell_arg(elt_arg)
|
|
479
|
+
|
|
480
|
+
F = self.geometry.cell_deformation_gradient(cell_arg, make_free_sample(cell_index, cell_coords))
|
|
481
|
+
return F / Geometry._element_measure(F)
|
|
482
|
+
|
|
483
|
+
return local_value_map_inner
|
|
484
|
+
|
|
485
|
+
def _make_local_value_map_outer(self):
|
|
486
|
+
@cache.dynamic_func(suffix=self.name)
|
|
487
|
+
def local_value_map_outer(
|
|
488
|
+
elt_arg: self.ElementArg,
|
|
489
|
+
element_index: ElementIndex,
|
|
490
|
+
element_coords: Coords,
|
|
491
|
+
):
|
|
492
|
+
cell_index = self.geometry.side_outer_cell_index(elt_arg, element_index)
|
|
493
|
+
cell_coords = self.geometry.side_outer_cell_coords(elt_arg, element_index, element_coords)
|
|
494
|
+
cell_arg = self.geometry.side_to_cell_arg(elt_arg)
|
|
495
|
+
|
|
496
|
+
F = self.geometry.cell_deformation_gradient(cell_arg, make_free_sample(cell_index, cell_coords))
|
|
497
|
+
return F / Geometry._element_measure(F)
|
|
498
|
+
|
|
499
|
+
return local_value_map_outer
|