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,263 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
###########################################################################
|
|
17
|
+
# Example Navier Stokes
|
|
18
|
+
#
|
|
19
|
+
# This example solves a 2D Navier-Stokes flow problem:
|
|
20
|
+
#
|
|
21
|
+
# Du/dt -nu D(u) + grad p = 0
|
|
22
|
+
# Div u = 0
|
|
23
|
+
#
|
|
24
|
+
# with (hard) velocity-Dirichlet boundary conditions
|
|
25
|
+
# and using semi-Lagrangian advection
|
|
26
|
+
###########################################################################
|
|
27
|
+
|
|
28
|
+
import warp as wp
|
|
29
|
+
import warp.examples.fem.utils as fem_example_utils
|
|
30
|
+
import warp.fem as fem
|
|
31
|
+
from warp.fem.linalg import array_axpy
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@wp.func
|
|
35
|
+
def u_boundary_value(x: wp.vec2, box_height: float, top_velocity: float):
|
|
36
|
+
# Horizontal velocity on top of domain, zero elsewhere
|
|
37
|
+
if x[1] >= box_height:
|
|
38
|
+
return wp.vec2(top_velocity, 0.0)
|
|
39
|
+
|
|
40
|
+
return wp.vec2(0.0, 0.0)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@fem.integrand
|
|
44
|
+
def mass_form(
|
|
45
|
+
s: fem.Sample,
|
|
46
|
+
u: fem.Field,
|
|
47
|
+
v: fem.Field,
|
|
48
|
+
):
|
|
49
|
+
return wp.dot(u(s), v(s))
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@fem.integrand
|
|
53
|
+
def inertia_form(s: fem.Sample, u: fem.Field, v: fem.Field, dt: float):
|
|
54
|
+
return mass_form(s, u, v) / dt
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@fem.integrand
|
|
58
|
+
def viscosity_form(s: fem.Sample, u: fem.Field, v: fem.Field, nu: float):
|
|
59
|
+
return 2.0 * nu * wp.ddot(fem.D(u, s), fem.D(v, s))
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@fem.integrand
|
|
63
|
+
def viscosity_and_inertia_form(s: fem.Sample, u: fem.Field, v: fem.Field, dt: float, nu: float):
|
|
64
|
+
return inertia_form(s, u, v, dt) + viscosity_form(s, u, v, nu)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@fem.integrand
|
|
68
|
+
def transported_inertia_form(s: fem.Sample, domain: fem.Domain, u: fem.Field, v: fem.Field, dt: float):
|
|
69
|
+
pos = domain(s)
|
|
70
|
+
vel = u(s)
|
|
71
|
+
|
|
72
|
+
conv_pos = pos - 0.5 * vel * dt
|
|
73
|
+
conv_s = fem.lookup(domain, conv_pos, s)
|
|
74
|
+
conv_vel = u(conv_s)
|
|
75
|
+
|
|
76
|
+
conv_pos = conv_pos - 0.5 * conv_vel * dt
|
|
77
|
+
conv_vel = u(fem.lookup(domain, conv_pos, conv_s))
|
|
78
|
+
|
|
79
|
+
return wp.dot(conv_vel, v(s)) / dt
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
@fem.integrand
|
|
83
|
+
def div_form(
|
|
84
|
+
s: fem.Sample,
|
|
85
|
+
u: fem.Field,
|
|
86
|
+
q: fem.Field,
|
|
87
|
+
):
|
|
88
|
+
return -q(s) * fem.div(u, s)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class Example:
|
|
92
|
+
def __init__(self, quiet=False, degree=2, resolution=25, Re=1000.0, top_velocity=1.0, mesh: str = "grid"):
|
|
93
|
+
self._quiet = quiet
|
|
94
|
+
|
|
95
|
+
self.sim_dt = 1.0 / resolution
|
|
96
|
+
self.current_frame = 0
|
|
97
|
+
|
|
98
|
+
viscosity = top_velocity / Re
|
|
99
|
+
|
|
100
|
+
if mesh == "tri":
|
|
101
|
+
positions, tri_vidx = fem_example_utils.gen_trimesh(res=wp.vec2i(resolution))
|
|
102
|
+
geo = fem.Trimesh2D(tri_vertex_indices=tri_vidx, positions=positions, build_bvh=True)
|
|
103
|
+
elif mesh == "quad":
|
|
104
|
+
positions, quad_vidx = fem_example_utils.gen_quadmesh(res=wp.vec2i(resolution))
|
|
105
|
+
geo = fem.Quadmesh2D(quad_vertex_indices=quad_vidx, positions=positions, build_bvh=True)
|
|
106
|
+
else:
|
|
107
|
+
geo = fem.Grid2D(res=wp.vec2i(resolution))
|
|
108
|
+
|
|
109
|
+
domain = fem.Cells(geometry=geo)
|
|
110
|
+
boundary = fem.BoundarySides(geo)
|
|
111
|
+
|
|
112
|
+
# Functions spaces: Q(d)-Q(d-1)
|
|
113
|
+
u_degree = degree
|
|
114
|
+
u_space = fem.make_polynomial_space(geo, degree=u_degree, dtype=wp.vec2)
|
|
115
|
+
p_space = fem.make_polynomial_space(geo, degree=u_degree - 1)
|
|
116
|
+
|
|
117
|
+
# Viscosity and inertia
|
|
118
|
+
u_test = fem.make_test(space=u_space, domain=domain)
|
|
119
|
+
u_trial = fem.make_trial(space=u_space, domain=domain)
|
|
120
|
+
|
|
121
|
+
u_matrix = fem.integrate(
|
|
122
|
+
viscosity_and_inertia_form,
|
|
123
|
+
fields={"u": u_trial, "v": u_test},
|
|
124
|
+
values={"nu": viscosity, "dt": self.sim_dt},
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
# Pressure-velocity coupling
|
|
128
|
+
p_test = fem.make_test(space=p_space, domain=domain)
|
|
129
|
+
div_matrix = fem.integrate(div_form, fields={"u": u_trial, "q": p_test})
|
|
130
|
+
|
|
131
|
+
# Enforcing the Dirichlet boundary condition the hard way;
|
|
132
|
+
# build projector for velocity left- and right-hand-sides
|
|
133
|
+
u_bd_test = fem.make_test(space=u_space, domain=boundary)
|
|
134
|
+
u_bd_trial = fem.make_trial(space=u_space, domain=boundary)
|
|
135
|
+
u_bd_projector = fem.integrate(mass_form, fields={"u": u_bd_trial, "v": u_bd_test}, assembly="nodal")
|
|
136
|
+
|
|
137
|
+
# Define an implicit field for our boundary condition value and integrate
|
|
138
|
+
u_bd_field = fem.ImplicitField(
|
|
139
|
+
domain=boundary, func=u_boundary_value, values={"top_velocity": top_velocity, "box_height": 1.0}
|
|
140
|
+
)
|
|
141
|
+
u_bd_value = fem.integrate(
|
|
142
|
+
mass_form,
|
|
143
|
+
fields={"u": u_bd_field, "v": u_bd_test},
|
|
144
|
+
assembly="nodal",
|
|
145
|
+
output_dtype=wp.vec2d,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
fem.normalize_dirichlet_projector(u_bd_projector, u_bd_value)
|
|
149
|
+
|
|
150
|
+
u_bd_rhs = wp.zeros_like(u_bd_value)
|
|
151
|
+
fem.project_linear_system(u_matrix, u_bd_rhs, u_bd_projector, u_bd_value, normalize_projector=False)
|
|
152
|
+
|
|
153
|
+
div_bd_rhs = -div_matrix @ u_bd_value
|
|
154
|
+
div_matrix -= div_matrix @ u_bd_projector
|
|
155
|
+
|
|
156
|
+
# Assemble saddle system
|
|
157
|
+
self._saddle_system = fem_example_utils.SaddleSystem(u_matrix, div_matrix)
|
|
158
|
+
|
|
159
|
+
# Save data for computing time steps rhs
|
|
160
|
+
self._u_bd_projector = u_bd_projector
|
|
161
|
+
self._u_bd_rhs = u_bd_rhs
|
|
162
|
+
self._u_test = u_test
|
|
163
|
+
self._div_bd_rhs = div_bd_rhs
|
|
164
|
+
|
|
165
|
+
# Velocitiy and pressure fields
|
|
166
|
+
self._u_field = u_space.make_field()
|
|
167
|
+
self._p_field = p_space.make_field()
|
|
168
|
+
|
|
169
|
+
self.renderer = fem_example_utils.Plot()
|
|
170
|
+
self.renderer.add_field("velocity", self._u_field)
|
|
171
|
+
|
|
172
|
+
def step(self):
|
|
173
|
+
self.current_frame += 1
|
|
174
|
+
|
|
175
|
+
u_rhs = fem.integrate(
|
|
176
|
+
transported_inertia_form,
|
|
177
|
+
fields={"u": self._u_field, "v": self._u_test},
|
|
178
|
+
values={"dt": self.sim_dt},
|
|
179
|
+
output_dtype=wp.vec2d,
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
# Apply boundary conditions
|
|
183
|
+
# u_rhs = (I - P) * u_rhs + u_bd_rhs
|
|
184
|
+
wp.sparse.bsr_mv(self._u_bd_projector, x=u_rhs, y=u_rhs, alpha=-1.0, beta=1.0)
|
|
185
|
+
array_axpy(x=self._u_bd_rhs, y=u_rhs, alpha=1.0, beta=1.0)
|
|
186
|
+
|
|
187
|
+
p_rhs = self._div_bd_rhs
|
|
188
|
+
|
|
189
|
+
x_u = wp.empty_like(u_rhs)
|
|
190
|
+
x_p = wp.empty_like(p_rhs)
|
|
191
|
+
wp.utils.array_cast(out_array=x_u, in_array=self._u_field.dof_values)
|
|
192
|
+
wp.utils.array_cast(out_array=x_p, in_array=self._p_field.dof_values)
|
|
193
|
+
|
|
194
|
+
fem_example_utils.bsr_solve_saddle(
|
|
195
|
+
saddle_system=self._saddle_system,
|
|
196
|
+
tol=1.0e-6,
|
|
197
|
+
x_u=x_u,
|
|
198
|
+
x_p=x_p,
|
|
199
|
+
b_u=u_rhs,
|
|
200
|
+
b_p=p_rhs,
|
|
201
|
+
quiet=self._quiet,
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
wp.utils.array_cast(in_array=x_u, out_array=self._u_field.dof_values)
|
|
205
|
+
wp.utils.array_cast(in_array=x_p, out_array=self._p_field.dof_values)
|
|
206
|
+
|
|
207
|
+
def render(self):
|
|
208
|
+
self.renderer.begin_frame(time=self.current_frame * self.sim_dt)
|
|
209
|
+
self.renderer.add_field("velocity", self._u_field)
|
|
210
|
+
self.renderer.end_frame()
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
if __name__ == "__main__":
|
|
214
|
+
import argparse
|
|
215
|
+
|
|
216
|
+
wp.set_module_options({"enable_backward": False})
|
|
217
|
+
|
|
218
|
+
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
219
|
+
parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
|
|
220
|
+
parser.add_argument("--resolution", type=int, default=25, help="Grid resolution.")
|
|
221
|
+
parser.add_argument("--degree", type=int, default=2, help="Polynomial degree of shape functions.")
|
|
222
|
+
parser.add_argument("--num_frames", type=int, default=1000, help="Total number of frames.")
|
|
223
|
+
parser.add_argument(
|
|
224
|
+
"--top_velocity",
|
|
225
|
+
type=float,
|
|
226
|
+
default=1.0,
|
|
227
|
+
help="Horizontal velocity boundary condition at the top of the domain.",
|
|
228
|
+
)
|
|
229
|
+
parser.add_argument("--Re", type=float, default=1000.0, help="Reynolds number.")
|
|
230
|
+
parser.add_argument("--mesh", choices=("grid", "tri", "quad"), default="grid", help="Mesh type.")
|
|
231
|
+
parser.add_argument(
|
|
232
|
+
"--headless",
|
|
233
|
+
action="store_true",
|
|
234
|
+
help="Run in headless mode, suppressing the opening of any graphical windows.",
|
|
235
|
+
)
|
|
236
|
+
parser.add_argument("--quiet", action="store_true", help="Suppresses the printing out of iteration residuals.")
|
|
237
|
+
|
|
238
|
+
args = parser.parse_known_args()[0]
|
|
239
|
+
|
|
240
|
+
with wp.ScopedDevice(args.device):
|
|
241
|
+
example = Example(
|
|
242
|
+
quiet=args.quiet,
|
|
243
|
+
degree=args.degree,
|
|
244
|
+
resolution=args.resolution,
|
|
245
|
+
Re=args.Re,
|
|
246
|
+
top_velocity=args.top_velocity,
|
|
247
|
+
mesh=args.mesh,
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
for k in range(args.num_frames):
|
|
251
|
+
print(f"Frame {k}:")
|
|
252
|
+
example.step()
|
|
253
|
+
example.render()
|
|
254
|
+
|
|
255
|
+
example.renderer.add_field("velocity_final", example._u_field)
|
|
256
|
+
|
|
257
|
+
if not args.headless:
|
|
258
|
+
example.renderer.plot(
|
|
259
|
+
options={
|
|
260
|
+
"velocity": {"arrows": {"glyph_scale": 0.25}},
|
|
261
|
+
"velocity_final": {"streamlines": {"density": 2.0}},
|
|
262
|
+
}
|
|
263
|
+
)
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
###########################################################################
|
|
17
|
+
# Example Nonconforming Contact
|
|
18
|
+
#
|
|
19
|
+
# This example demonstrates using nonconforming fields (warp.fem.NonconformingField)
|
|
20
|
+
# to solve a no-slip contact problem between two elastic bodies discretized separately.
|
|
21
|
+
#
|
|
22
|
+
# Div[ E: D(u) ] = g over each body
|
|
23
|
+
# u_top = u_bottom along the contact surface (top body bottom boundary)
|
|
24
|
+
# u_bottom = 0 along the bottom boundary of the bottom body
|
|
25
|
+
#
|
|
26
|
+
# with E the rank-4 elasticity tensor
|
|
27
|
+
#
|
|
28
|
+
# Below we use a simple staggered scheme for solving bodies iteratively,
|
|
29
|
+
# but more robust methods could be considered (e.g. Augmented Lagrangian)
|
|
30
|
+
###########################################################################
|
|
31
|
+
|
|
32
|
+
import numpy as np
|
|
33
|
+
|
|
34
|
+
import warp as wp
|
|
35
|
+
import warp.examples.fem.utils as fem_example_utils
|
|
36
|
+
import warp.fem as fem
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@wp.func
|
|
40
|
+
def compute_stress(tau: wp.mat22, E: wp.mat33):
|
|
41
|
+
"""Strain to stress computation (using Voigt notation to drop tensor order)"""
|
|
42
|
+
tau_sym = wp.vec3(tau[0, 0], tau[1, 1], tau[0, 1] + tau[1, 0])
|
|
43
|
+
sig_sym = E * tau_sym
|
|
44
|
+
return wp.mat22(sig_sym[0], 0.5 * sig_sym[2], 0.5 * sig_sym[2], sig_sym[1])
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@fem.integrand
|
|
48
|
+
def stress_form(s: fem.Sample, u: fem.Field, tau: fem.Field, E: wp.mat33):
|
|
49
|
+
"""Stress inside body: (E : D(u)) : tau"""
|
|
50
|
+
return wp.ddot(tau(s), compute_stress(fem.D(u, s), E))
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@fem.integrand
|
|
54
|
+
def boundary_stress_form(
|
|
55
|
+
s: fem.Sample,
|
|
56
|
+
domain: fem.Domain,
|
|
57
|
+
u: fem.Field,
|
|
58
|
+
tau: fem.Field,
|
|
59
|
+
):
|
|
60
|
+
"""Stress on boundary: u' tau n"""
|
|
61
|
+
return wp.dot(tau(s) * fem.normal(domain, s), u(s))
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@fem.integrand
|
|
65
|
+
def symmetric_grad_form(
|
|
66
|
+
s: fem.Sample,
|
|
67
|
+
u: fem.Field,
|
|
68
|
+
tau: fem.Field,
|
|
69
|
+
):
|
|
70
|
+
"""Symmetric part of gradient of displacement: D(u) : tau"""
|
|
71
|
+
return wp.ddot(tau(s), fem.D(u, s))
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@fem.integrand
|
|
75
|
+
def gravity_form(
|
|
76
|
+
s: fem.Sample,
|
|
77
|
+
v: fem.Field,
|
|
78
|
+
gravity: float,
|
|
79
|
+
):
|
|
80
|
+
return -gravity * v(s)[1]
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
@fem.integrand
|
|
84
|
+
def bottom_boundary_projector_form(
|
|
85
|
+
s: fem.Sample,
|
|
86
|
+
domain: fem.Domain,
|
|
87
|
+
u: fem.Field,
|
|
88
|
+
v: fem.Field,
|
|
89
|
+
):
|
|
90
|
+
# non zero on bottom boundary only
|
|
91
|
+
nor = fem.normal(domain, s)
|
|
92
|
+
return wp.dot(u(s), v(s)) * wp.max(0.0, -nor[1])
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@fem.integrand
|
|
96
|
+
def tensor_mass_form(
|
|
97
|
+
s: fem.Sample,
|
|
98
|
+
sig: fem.Field,
|
|
99
|
+
tau: fem.Field,
|
|
100
|
+
):
|
|
101
|
+
return wp.ddot(tau(s), sig(s))
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class Example:
|
|
105
|
+
def __init__(
|
|
106
|
+
self,
|
|
107
|
+
degree=2,
|
|
108
|
+
resolution=16,
|
|
109
|
+
young_modulus=1.0,
|
|
110
|
+
poisson_ratio=0.5,
|
|
111
|
+
nonconforming_stresses=False,
|
|
112
|
+
):
|
|
113
|
+
self._geo1 = fem.Grid2D(bounds_hi=wp.vec2(1.0, 0.5), res=wp.vec2i(resolution))
|
|
114
|
+
self._geo2 = fem.Grid2D(bounds_lo=(0.33, 0.5), bounds_hi=(0.67, 0.5 + 0.33), res=wp.vec2i(resolution))
|
|
115
|
+
|
|
116
|
+
# Strain-stress matrix
|
|
117
|
+
young = young_modulus
|
|
118
|
+
poisson = poisson_ratio
|
|
119
|
+
self._elasticity_mat = wp.mat33(
|
|
120
|
+
young
|
|
121
|
+
/ (1.0 - poisson * poisson)
|
|
122
|
+
* np.array(
|
|
123
|
+
[
|
|
124
|
+
[1.0, poisson, 0.0],
|
|
125
|
+
[poisson, 1.0, 0.0],
|
|
126
|
+
[0.0, 0.0, (1.0 - poisson * poisson) / (2.0 * (1.0 + poisson))],
|
|
127
|
+
]
|
|
128
|
+
)
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
# Displacement spaces and fields -- S_k
|
|
132
|
+
self._u1_space = fem.make_polynomial_space(
|
|
133
|
+
self._geo1, degree=degree, dtype=wp.vec2, element_basis=fem.ElementBasis.SERENDIPITY
|
|
134
|
+
)
|
|
135
|
+
self._u2_space = fem.make_polynomial_space(
|
|
136
|
+
self._geo2, degree=degree, dtype=wp.vec2, element_basis=fem.ElementBasis.SERENDIPITY
|
|
137
|
+
)
|
|
138
|
+
self._u1_field = self._u1_space.make_field()
|
|
139
|
+
self._u2_field = self._u2_space.make_field()
|
|
140
|
+
|
|
141
|
+
# Stress spaces and fields -- Q_{k-1}d
|
|
142
|
+
# Store stress degrees of freedom as symmetric tensors (3 dof) rather than full 2x2 matrices
|
|
143
|
+
self._tau1_space = fem.make_polynomial_space(
|
|
144
|
+
self._geo1,
|
|
145
|
+
degree=degree,
|
|
146
|
+
discontinuous=True,
|
|
147
|
+
element_basis=fem.ElementBasis.LAGRANGE,
|
|
148
|
+
dof_mapper=fem.SymmetricTensorMapper(wp.mat22),
|
|
149
|
+
)
|
|
150
|
+
self._tau2_space = fem.make_polynomial_space(
|
|
151
|
+
self._geo2,
|
|
152
|
+
degree=degree,
|
|
153
|
+
discontinuous=True,
|
|
154
|
+
element_basis=fem.ElementBasis.LAGRANGE,
|
|
155
|
+
dof_mapper=fem.SymmetricTensorMapper(wp.mat22),
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
self._sig1_field = self._tau1_space.make_field()
|
|
159
|
+
self._sig2_field = self._tau2_space.make_field()
|
|
160
|
+
self._sig2_field_new = self._tau2_space.make_field()
|
|
161
|
+
|
|
162
|
+
self.renderer = fem_example_utils.Plot()
|
|
163
|
+
|
|
164
|
+
def step(self):
|
|
165
|
+
# Solve for the two bodies separately
|
|
166
|
+
# Body (top) is 25x more dense and 5x stiffer than top body
|
|
167
|
+
# Body 1 affects body 2 through bottom displacement dirichlet BC
|
|
168
|
+
# Body 2 affects body 1 through applied strain on top
|
|
169
|
+
self.solve_solid(self._u1_field, self._sig1_field, self._u2_field, self._sig2_field, gravity=1.0, stiffness=1.0)
|
|
170
|
+
self.solve_solid(
|
|
171
|
+
self._u2_field, self._sig2_field_new, self._u1_field, self._sig1_field, gravity=25.0, stiffness=5.0
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
# Damped update of coupling stress (for stability)
|
|
175
|
+
alpha = 0.1
|
|
176
|
+
fem.linalg.array_axpy(
|
|
177
|
+
x=self._sig2_field_new.dof_values, y=self._sig2_field.dof_values, alpha=alpha, beta=1.0 - alpha
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
def solve_solid(
|
|
181
|
+
self,
|
|
182
|
+
u_field,
|
|
183
|
+
stress_field,
|
|
184
|
+
other_u_field,
|
|
185
|
+
other_stress_field,
|
|
186
|
+
gravity: float,
|
|
187
|
+
stiffness: float,
|
|
188
|
+
):
|
|
189
|
+
u_space = u_field.space
|
|
190
|
+
stress_space = stress_field.space
|
|
191
|
+
geo = u_field.space.geometry
|
|
192
|
+
|
|
193
|
+
domain = fem.Cells(geometry=geo)
|
|
194
|
+
boundary = fem.BoundarySides(geometry=geo)
|
|
195
|
+
|
|
196
|
+
u_test = fem.make_test(space=u_space, domain=domain)
|
|
197
|
+
u_trial = fem.make_trial(space=u_space, domain=domain)
|
|
198
|
+
tau_test = fem.make_test(space=stress_space, domain=domain)
|
|
199
|
+
tau_trial = fem.make_trial(space=stress_space, domain=domain)
|
|
200
|
+
|
|
201
|
+
u_bd_test = fem.make_test(space=u_space, domain=boundary)
|
|
202
|
+
u_bd_trial = fem.make_trial(space=u_space, domain=boundary)
|
|
203
|
+
|
|
204
|
+
# Assemble stiffness matrix
|
|
205
|
+
# (Note: this is constant per body, this could be precomputed)
|
|
206
|
+
sym_grad_matrix = fem.integrate(symmetric_grad_form, fields={"u": u_trial, "tau": tau_test})
|
|
207
|
+
|
|
208
|
+
tau_inv_mass_matrix = fem.integrate(
|
|
209
|
+
tensor_mass_form, fields={"sig": tau_trial, "tau": tau_test}, assembly="nodal"
|
|
210
|
+
)
|
|
211
|
+
fem_example_utils.invert_diagonal_bsr_matrix(tau_inv_mass_matrix)
|
|
212
|
+
|
|
213
|
+
stress_matrix = tau_inv_mass_matrix @ fem.integrate(
|
|
214
|
+
stress_form, fields={"u": u_trial, "tau": tau_test}, values={"E": self._elasticity_mat * stiffness}
|
|
215
|
+
)
|
|
216
|
+
stiffness_matrix = sym_grad_matrix.transpose() @ stress_matrix
|
|
217
|
+
|
|
218
|
+
# Right-hand-side
|
|
219
|
+
u_rhs = fem.integrate(gravity_form, fields={"v": u_test}, values={"gravity": gravity}, output_dtype=wp.vec2d)
|
|
220
|
+
|
|
221
|
+
# Add boundary stress from other solid field
|
|
222
|
+
other_stress_field = fem.NonconformingField(boundary, other_stress_field)
|
|
223
|
+
fem.integrate(
|
|
224
|
+
boundary_stress_form,
|
|
225
|
+
fields={"u": u_bd_test, "tau": other_stress_field},
|
|
226
|
+
output=u_rhs,
|
|
227
|
+
add=True,
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
# Enforce boundary conditions
|
|
231
|
+
u_bd_matrix = fem.integrate(
|
|
232
|
+
bottom_boundary_projector_form, fields={"u": u_bd_trial, "v": u_bd_test}, assembly="nodal"
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
# displacement from other body defines bottom boundary Dirichlet BC
|
|
236
|
+
other_u_field = fem.NonconformingField(boundary, other_u_field)
|
|
237
|
+
u_bd_rhs = fem.integrate(
|
|
238
|
+
bottom_boundary_projector_form, fields={"u": other_u_field, "v": u_bd_test}, assembly="nodal"
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
fem.project_linear_system(stiffness_matrix, u_rhs, u_bd_matrix, u_bd_rhs)
|
|
242
|
+
|
|
243
|
+
# solve
|
|
244
|
+
x = wp.zeros_like(u_rhs)
|
|
245
|
+
wp.utils.array_cast(in_array=u_field.dof_values, out_array=x)
|
|
246
|
+
fem_example_utils.bsr_cg(stiffness_matrix, b=u_rhs, x=x, tol=1.0e-6, quiet=True)
|
|
247
|
+
|
|
248
|
+
# Extract result
|
|
249
|
+
stress = stress_matrix @ x
|
|
250
|
+
wp.utils.array_cast(in_array=x, out_array=u_field.dof_values)
|
|
251
|
+
wp.utils.array_cast(in_array=stress, out_array=stress_field.dof_values)
|
|
252
|
+
|
|
253
|
+
def render(self):
|
|
254
|
+
self.renderer.add_field("u1", self._u1_field)
|
|
255
|
+
self.renderer.add_field("u2", self._u2_field)
|
|
256
|
+
self.renderer.add_field("sig1", self._sig1_field)
|
|
257
|
+
self.renderer.add_field("sig2", self._sig2_field)
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
if __name__ == "__main__":
|
|
261
|
+
import argparse
|
|
262
|
+
|
|
263
|
+
wp.set_module_options({"enable_backward": False})
|
|
264
|
+
|
|
265
|
+
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
266
|
+
parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
|
|
267
|
+
parser.add_argument("--resolution", type=int, default=32, help="Grid resolution.")
|
|
268
|
+
parser.add_argument("--degree", type=int, default=2, help="Polynomial degree of shape functions.")
|
|
269
|
+
parser.add_argument("--young_modulus", type=float, default=10.0)
|
|
270
|
+
parser.add_argument("--poisson_ratio", type=float, default=0.9)
|
|
271
|
+
parser.add_argument("--num_steps", type=int, default=50)
|
|
272
|
+
parser.add_argument(
|
|
273
|
+
"--headless",
|
|
274
|
+
action="store_true",
|
|
275
|
+
help="Run in headless mode, suppressing the opening of any graphical windows.",
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
args = parser.parse_known_args()[0]
|
|
279
|
+
|
|
280
|
+
with wp.ScopedDevice(args.device):
|
|
281
|
+
example = Example(
|
|
282
|
+
degree=args.degree,
|
|
283
|
+
resolution=args.resolution,
|
|
284
|
+
young_modulus=args.young_modulus,
|
|
285
|
+
poisson_ratio=args.poisson_ratio,
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
for i in range(args.num_steps):
|
|
289
|
+
print("Step", i)
|
|
290
|
+
example.step()
|
|
291
|
+
example.render()
|
|
292
|
+
|
|
293
|
+
if not args.headless:
|
|
294
|
+
example.renderer.plot(
|
|
295
|
+
{
|
|
296
|
+
"rows": 2,
|
|
297
|
+
"u1": {"displacement": {}},
|
|
298
|
+
"u2": {"displacement": {}},
|
|
299
|
+
},
|
|
300
|
+
)
|