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,242 @@
|
|
|
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 Magnetostatics
|
|
18
|
+
#
|
|
19
|
+
# This example demonstrates solving a 3d magnetostatics problem
|
|
20
|
+
# (a copper coil with radial current around a cylindrical iron core)
|
|
21
|
+
# using a curl-curl formulation and H(curl)-conforming function space
|
|
22
|
+
#
|
|
23
|
+
# 1/mu Curl B + j = 0
|
|
24
|
+
# Div. B = 0
|
|
25
|
+
#
|
|
26
|
+
# solved over field A such that B = Curl A,
|
|
27
|
+
# and Dirichlet homogeneous essential boundary conditions
|
|
28
|
+
#
|
|
29
|
+
# This example also illustrates using an ImplicitField to warp a grid mesh
|
|
30
|
+
# to a cylindrical domain
|
|
31
|
+
###########################################################################
|
|
32
|
+
|
|
33
|
+
import numpy as np
|
|
34
|
+
|
|
35
|
+
import warp as wp
|
|
36
|
+
import warp.examples.fem.utils as fem_example_utils
|
|
37
|
+
import warp.fem as fem
|
|
38
|
+
|
|
39
|
+
# Physics constants
|
|
40
|
+
MU_0 = wp.constant(np.pi * 4.0e-7) # Vacuum magnetic permeability
|
|
41
|
+
MU_c = wp.constant(1.25e-6) # Copper magnetic permeability
|
|
42
|
+
MU_i = wp.constant(6.0e-3) # Iron magnetic permeability
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@wp.func
|
|
46
|
+
def cube_to_cylinder(x: wp.vec3):
|
|
47
|
+
# mapping from unit square to unit disk
|
|
48
|
+
pos_xz = wp.vec3(x[0], 0.0, x[2])
|
|
49
|
+
return wp.max(wp.abs(pos_xz)) * wp.normalize(pos_xz) + wp.vec3(0.0, x[1], 0.0)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@wp.func
|
|
53
|
+
def cube_to_cylinder_grad(x: wp.vec3):
|
|
54
|
+
# gradient of mapping from unit square to unit disk
|
|
55
|
+
pos_xz = wp.vec3(x[0], 0.0, x[2])
|
|
56
|
+
if pos_xz == wp.vec3(0.0):
|
|
57
|
+
grad = wp.mat33(0.0)
|
|
58
|
+
else:
|
|
59
|
+
dir_xz = wp.normalize(pos_xz)
|
|
60
|
+
dir_grad = (wp.identity(n=3, dtype=float) - wp.outer(dir_xz, dir_xz)) / wp.length(pos_xz)
|
|
61
|
+
|
|
62
|
+
abs_xz = wp.abs(pos_xz)
|
|
63
|
+
xinf_grad = wp.where(
|
|
64
|
+
abs_xz[0] > abs_xz[2], wp.vec(wp.sign(pos_xz[0]), 0.0, 0.0), wp.vec3(0.0, 0.0, wp.sign(pos_xz[2]))
|
|
65
|
+
)
|
|
66
|
+
grad = dir_grad * wp.max(abs_xz) + wp.outer(dir_xz, xinf_grad)
|
|
67
|
+
|
|
68
|
+
grad[1, 1] = 1.0
|
|
69
|
+
return grad
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@wp.func
|
|
73
|
+
def permeability_field(
|
|
74
|
+
pos: wp.vec3,
|
|
75
|
+
core_radius: float,
|
|
76
|
+
core_height: float,
|
|
77
|
+
coil_internal_radius: float,
|
|
78
|
+
coil_external_radius: float,
|
|
79
|
+
coil_height: float,
|
|
80
|
+
):
|
|
81
|
+
x = wp.abs(pos[0])
|
|
82
|
+
y = wp.abs(pos[1])
|
|
83
|
+
z = wp.abs(pos[2])
|
|
84
|
+
|
|
85
|
+
r = wp.sqrt(x * x + z * z)
|
|
86
|
+
|
|
87
|
+
if r <= core_radius:
|
|
88
|
+
return wp.where(y < core_height, MU_i, MU_0)
|
|
89
|
+
|
|
90
|
+
if r >= coil_internal_radius and r <= coil_external_radius:
|
|
91
|
+
return wp.where(y < coil_height, MU_c, MU_0)
|
|
92
|
+
|
|
93
|
+
return MU_0
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@wp.func
|
|
97
|
+
def current_field(
|
|
98
|
+
pos: wp.vec3,
|
|
99
|
+
current: float,
|
|
100
|
+
coil_internal_radius: float,
|
|
101
|
+
coil_external_radius: float,
|
|
102
|
+
coil_height: float,
|
|
103
|
+
):
|
|
104
|
+
x = pos[0]
|
|
105
|
+
y = wp.abs(pos[1])
|
|
106
|
+
z = pos[2]
|
|
107
|
+
|
|
108
|
+
r = wp.sqrt(x * x + z * z)
|
|
109
|
+
|
|
110
|
+
return wp.where(
|
|
111
|
+
y < coil_height and r >= coil_internal_radius and r <= coil_external_radius,
|
|
112
|
+
wp.vec3(z, 0.0, -x) * current / r,
|
|
113
|
+
wp.vec3(0.0),
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@fem.integrand
|
|
118
|
+
def curl_curl_form(s: fem.Sample, domain: fem.Domain, u: fem.Field, v: fem.Field, mu: fem.Field):
|
|
119
|
+
return wp.dot(fem.curl(u, s), fem.curl(v, s)) / mu(s)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@fem.integrand
|
|
123
|
+
def mass_form(s: fem.Sample, domain: fem.Domain, v: fem.Field, u: fem.Field):
|
|
124
|
+
return wp.dot(u(s), v(s))
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
@fem.integrand
|
|
128
|
+
def curl_expr(s: fem.Sample, u: fem.Field):
|
|
129
|
+
return fem.curl(u, s)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class Example:
|
|
133
|
+
def __init__(self, quiet=False, mesh: str = "grid", resolution=32, domain_radius=2.0, current=1.0e6):
|
|
134
|
+
# We mesh the unit disk by first meshing the unit square, then building a deformed geometry
|
|
135
|
+
# from an implicit mapping field
|
|
136
|
+
|
|
137
|
+
if mesh == "hex":
|
|
138
|
+
positions, hex_vidx = fem_example_utils.gen_hexmesh(
|
|
139
|
+
bounds_lo=wp.vec3(-domain_radius, -domain_radius, -domain_radius),
|
|
140
|
+
bounds_hi=wp.vec3(domain_radius, domain_radius, domain_radius),
|
|
141
|
+
res=wp.vec3i(resolution, resolution, resolution),
|
|
142
|
+
)
|
|
143
|
+
cube_geo = fem.Hexmesh(hex_vertex_indices=hex_vidx, positions=positions)
|
|
144
|
+
elif mesh == "tet":
|
|
145
|
+
positions, tet_vidx = fem_example_utils.gen_tetmesh(
|
|
146
|
+
bounds_lo=wp.vec3(-domain_radius, -domain_radius, -domain_radius),
|
|
147
|
+
bounds_hi=wp.vec3(domain_radius, domain_radius, domain_radius),
|
|
148
|
+
res=wp.vec3i(resolution, resolution, resolution),
|
|
149
|
+
)
|
|
150
|
+
cube_geo = fem.Tetmesh(tet_vertex_indices=tet_vidx, positions=positions)
|
|
151
|
+
elif mesh == "nano":
|
|
152
|
+
vol = fem_example_utils.gen_volume(
|
|
153
|
+
bounds_lo=wp.vec3(-domain_radius, -domain_radius, -domain_radius),
|
|
154
|
+
bounds_hi=wp.vec3(domain_radius, domain_radius, domain_radius),
|
|
155
|
+
res=wp.vec3i(resolution, resolution, resolution),
|
|
156
|
+
)
|
|
157
|
+
cube_geo = fem.Nanogrid(grid=vol)
|
|
158
|
+
else:
|
|
159
|
+
cube_geo = fem.Grid3D(
|
|
160
|
+
bounds_lo=wp.vec3(-domain_radius, -domain_radius, -domain_radius),
|
|
161
|
+
bounds_hi=wp.vec3(domain_radius, domain_radius, domain_radius),
|
|
162
|
+
res=wp.vec3i(resolution, resolution, resolution),
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
def_field = fem.ImplicitField(
|
|
166
|
+
domain=fem.Cells(cube_geo), func=cube_to_cylinder, grad_func=cube_to_cylinder_grad
|
|
167
|
+
)
|
|
168
|
+
sim_geo = def_field.make_deformed_geometry(relative=False)
|
|
169
|
+
|
|
170
|
+
coil_config = {"coil_height": 0.25, "coil_internal_radius": 0.3, "coil_external_radius": 0.4}
|
|
171
|
+
core_config = {"core_height": 1.0, "core_radius": 0.2}
|
|
172
|
+
|
|
173
|
+
domain = fem.Cells(sim_geo)
|
|
174
|
+
self._permeability_field = fem.ImplicitField(
|
|
175
|
+
domain, func=permeability_field, values=dict(**coil_config, **core_config)
|
|
176
|
+
)
|
|
177
|
+
self._current_field = fem.ImplicitField(domain, func=current_field, values=dict(current=current, **coil_config))
|
|
178
|
+
|
|
179
|
+
A_space = fem.make_polynomial_space(
|
|
180
|
+
sim_geo, degree=1, element_basis=fem.ElementBasis.NEDELEC_FIRST_KIND, dtype=wp.vec3
|
|
181
|
+
)
|
|
182
|
+
self.A_field = A_space.make_field()
|
|
183
|
+
|
|
184
|
+
B_space = fem.make_polynomial_space(sim_geo, degree=1, element_basis=fem.ElementBasis.LAGRANGE, dtype=wp.vec3)
|
|
185
|
+
self.B_field = B_space.make_field()
|
|
186
|
+
|
|
187
|
+
self.renderer = fem_example_utils.Plot()
|
|
188
|
+
|
|
189
|
+
def step(self):
|
|
190
|
+
A_space = self.A_field.space
|
|
191
|
+
sim_geo = A_space.geometry
|
|
192
|
+
|
|
193
|
+
u = fem.make_trial(space=A_space)
|
|
194
|
+
v = fem.make_test(space=A_space)
|
|
195
|
+
lhs = fem.integrate(curl_curl_form, fields={"u": u, "v": v, "mu": self._permeability_field}, output_dtype=float)
|
|
196
|
+
rhs = fem.integrate(mass_form, fields={"v": v, "u": self._current_field}, output_dtype=float)
|
|
197
|
+
|
|
198
|
+
# Dirichlet BC
|
|
199
|
+
boundary = fem.BoundarySides(sim_geo)
|
|
200
|
+
u_bd = fem.make_trial(space=A_space, domain=boundary)
|
|
201
|
+
v_bd = fem.make_test(space=A_space, domain=boundary)
|
|
202
|
+
dirichlet_bd_proj = fem.integrate(
|
|
203
|
+
mass_form, fields={"u": u_bd, "v": v_bd}, assembly="nodal", output_dtype=float
|
|
204
|
+
)
|
|
205
|
+
fem.project_linear_system(lhs, rhs, dirichlet_bd_proj)
|
|
206
|
+
|
|
207
|
+
# solve using Conjugate Residual (numerically rhs may not be in image of lhs)
|
|
208
|
+
fem_example_utils.bsr_cg(lhs, b=rhs, x=self.A_field.dof_values, method="cr", max_iters=250, quiet=False)
|
|
209
|
+
|
|
210
|
+
# compute B as curl(A)
|
|
211
|
+
fem.interpolate(curl_expr, dest=self.B_field, fields={"u": self.A_field})
|
|
212
|
+
|
|
213
|
+
def render(self):
|
|
214
|
+
self.renderer.add_field("B", self.B_field)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
if __name__ == "__main__":
|
|
218
|
+
import argparse
|
|
219
|
+
|
|
220
|
+
wp.set_module_options({"enable_backward": False})
|
|
221
|
+
|
|
222
|
+
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
223
|
+
parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
|
|
224
|
+
parser.add_argument("--resolution", type=int, default=32, help="Grid resolution.")
|
|
225
|
+
parser.add_argument("--mesh", type=str, default="grid", choices=["tet", "hex", "grid", "nano"], help="Mesh type.")
|
|
226
|
+
parser.add_argument("--radius", type=float, default=2.0, help="Radius of simulation domain.")
|
|
227
|
+
parser.add_argument(
|
|
228
|
+
"--headless",
|
|
229
|
+
action="store_true",
|
|
230
|
+
help="Run in headless mode, suppressing the opening of any graphical windows.",
|
|
231
|
+
)
|
|
232
|
+
parser.add_argument("--quiet", action="store_true", help="Suppresses the printing out of iteration residuals.")
|
|
233
|
+
|
|
234
|
+
args = parser.parse_known_args()[0]
|
|
235
|
+
|
|
236
|
+
with wp.ScopedDevice(args.device):
|
|
237
|
+
example = Example(quiet=args.quiet, mesh=args.mesh, resolution=args.resolution, domain_radius=args.radius)
|
|
238
|
+
example.step()
|
|
239
|
+
example.render()
|
|
240
|
+
|
|
241
|
+
if not args.headless:
|
|
242
|
+
example.renderer.plot({"B": {"streamlines": {"density": 1.0}}})
|
|
@@ -0,0 +1,293 @@
|
|
|
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 Mixed Elasticity
|
|
18
|
+
#
|
|
19
|
+
# This example illustrates using Mixed FEM to solve a nonlinear static elasticity equilibrium problem:
|
|
20
|
+
#
|
|
21
|
+
# Div[ d/dF Psi(F(u)) ] = 0
|
|
22
|
+
#
|
|
23
|
+
# with Dirichlet boundary conditions on vertical sides and Psi an elastic potential function of the deformation gradient.
|
|
24
|
+
# Here we choose Psi Neo-Hookean, as per Sec 3.2 of "Stable Neo-Hookean Flesh Simulation" (Smith et al. 2018),
|
|
25
|
+
# Psi(F) = mu ||F||^2 + lambda (det J - 1 - mu/lambda)^2
|
|
26
|
+
#
|
|
27
|
+
# which we write as a sequence of Newton iterations:
|
|
28
|
+
# int {sigma : grad v} = 0 for all displacement test functions v
|
|
29
|
+
# int {sigma : tau} = int{dPsi/dF : tau} + int{grad du : d2 Psi/dF2 : tau} for all stress test functions tau
|
|
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
|
+
@fem.integrand
|
|
40
|
+
def displacement_gradient_form(
|
|
41
|
+
s: fem.Sample,
|
|
42
|
+
u: fem.Field,
|
|
43
|
+
tau: fem.Field,
|
|
44
|
+
):
|
|
45
|
+
"""grad(u) : tau"""
|
|
46
|
+
return wp.ddot(tau(s), fem.grad(u, s))
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@wp.func
|
|
50
|
+
def nh_parameters_from_lame(lame: wp.vec2):
|
|
51
|
+
"""Parameters such that for small strains model behaves according to Hooke's law"""
|
|
52
|
+
mu_nh = lame[1]
|
|
53
|
+
lambda_nh = lame[0] + lame[1]
|
|
54
|
+
|
|
55
|
+
return mu_nh, lambda_nh
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@fem.integrand
|
|
59
|
+
def nh_stress_form(s: fem.Sample, tau: fem.Field, u_cur: fem.Field, lame: wp.vec2):
|
|
60
|
+
"""d Psi/dF : tau"""
|
|
61
|
+
|
|
62
|
+
# Deformation gradient
|
|
63
|
+
F = wp.identity(n=2, dtype=float) + fem.grad(u_cur, s)
|
|
64
|
+
|
|
65
|
+
# Area term and its derivative w.r.t F
|
|
66
|
+
J = wp.determinant(F)
|
|
67
|
+
dJ_dF = wp.mat22(F[1, 1], -F[1, 0], -F[0, 1], F[0, 0])
|
|
68
|
+
|
|
69
|
+
mu_nh, lambda_nh = nh_parameters_from_lame(lame)
|
|
70
|
+
nh_stress = mu_nh * F + (lambda_nh * (J - 1.0) - mu_nh) * dJ_dF
|
|
71
|
+
|
|
72
|
+
return wp.ddot(tau(s), nh_stress)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@fem.integrand
|
|
76
|
+
def nh_stress_delta_form(s: fem.Sample, tau: fem.Field, u: fem.Field, u_cur: fem.Field, lame: wp.vec2):
|
|
77
|
+
"""grad(u) : d2 Psi/dF2 : tau"""
|
|
78
|
+
|
|
79
|
+
tau_s = tau(s)
|
|
80
|
+
sigma_s = fem.grad(u, s)
|
|
81
|
+
|
|
82
|
+
F = wp.identity(n=2, dtype=float) + fem.grad(u_cur, s)
|
|
83
|
+
dJ_dF = wp.mat22(F[1, 1], -F[1, 0], -F[0, 1], F[0, 0])
|
|
84
|
+
|
|
85
|
+
# Gauss--Newton approximation; ignore d2J/dF2 term
|
|
86
|
+
mu_nh, lambda_nh = nh_parameters_from_lame(lame)
|
|
87
|
+
return mu_nh * wp.ddot(tau_s, sigma_s) + lambda_nh * wp.ddot(dJ_dF, tau_s) * wp.ddot(dJ_dF, sigma_s)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@fem.integrand
|
|
91
|
+
def vertical_boundary_projector_form(
|
|
92
|
+
s: fem.Sample,
|
|
93
|
+
domain: fem.Domain,
|
|
94
|
+
u: fem.Field,
|
|
95
|
+
v: fem.Field,
|
|
96
|
+
):
|
|
97
|
+
# non zero on vertical boundary of domain only
|
|
98
|
+
nor = fem.normal(domain, s)
|
|
99
|
+
return wp.dot(u(s), v(s)) * wp.abs(nor[0])
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
@fem.integrand
|
|
103
|
+
def vertical_displacement_form(
|
|
104
|
+
s: fem.Sample,
|
|
105
|
+
domain: fem.Domain,
|
|
106
|
+
v: fem.Field,
|
|
107
|
+
displacement: float,
|
|
108
|
+
):
|
|
109
|
+
# opposed to normal on vertical boundary of domain only
|
|
110
|
+
nor = fem.normal(domain, s)
|
|
111
|
+
return -wp.abs(nor[0]) * displacement * wp.dot(nor, v(s))
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
@fem.integrand
|
|
115
|
+
def tensor_mass_form(
|
|
116
|
+
s: fem.Sample,
|
|
117
|
+
sig: fem.Field,
|
|
118
|
+
tau: fem.Field,
|
|
119
|
+
):
|
|
120
|
+
return wp.ddot(tau(s), sig(s))
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
@fem.integrand
|
|
124
|
+
def area_form(s: fem.Sample, u_cur: fem.Field):
|
|
125
|
+
F = wp.identity(n=2, dtype=float) + fem.grad(u_cur, s)
|
|
126
|
+
return wp.determinant(F)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class Example:
|
|
130
|
+
def __init__(
|
|
131
|
+
self,
|
|
132
|
+
quiet=False,
|
|
133
|
+
degree=2,
|
|
134
|
+
resolution=25,
|
|
135
|
+
mesh="grid",
|
|
136
|
+
displacement=0.1,
|
|
137
|
+
poisson_ratio=0.5,
|
|
138
|
+
nonconforming_stresses=False,
|
|
139
|
+
):
|
|
140
|
+
self._quiet = quiet
|
|
141
|
+
|
|
142
|
+
self._displacement = displacement
|
|
143
|
+
|
|
144
|
+
# Grid or mesh geometry
|
|
145
|
+
if mesh == "tri":
|
|
146
|
+
positions, tri_vidx = fem_example_utils.gen_trimesh(res=wp.vec2i(resolution))
|
|
147
|
+
self._geo = fem.Trimesh2D(tri_vertex_indices=tri_vidx, positions=positions)
|
|
148
|
+
elif mesh == "quad":
|
|
149
|
+
positions, quad_vidx = fem_example_utils.gen_quadmesh(res=wp.vec2i(resolution))
|
|
150
|
+
self._geo = fem.Quadmesh2D(quad_vertex_indices=quad_vidx, positions=positions)
|
|
151
|
+
else:
|
|
152
|
+
self._geo = fem.Grid2D(res=wp.vec2i(resolution))
|
|
153
|
+
|
|
154
|
+
# Lame coefficients from Young modulus and Poisson ratio
|
|
155
|
+
self._lame = wp.vec2(1.0 / (1.0 + poisson_ratio) * np.array([poisson_ratio / (1.0 - poisson_ratio), 0.5]))
|
|
156
|
+
|
|
157
|
+
# Function spaces -- S_k for displacement, Q_k or P_{k-1}d for stress
|
|
158
|
+
self._u_space = fem.make_polynomial_space(
|
|
159
|
+
self._geo, degree=degree, dtype=wp.vec2, element_basis=fem.ElementBasis.SERENDIPITY
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
if self._geo.reference_cell() == fem.Element.TRIANGLE:
|
|
163
|
+
# triangle elements
|
|
164
|
+
tau_basis = fem.ElementBasis.NONCONFORMING_POLYNOMIAL
|
|
165
|
+
tau_degree = degree - 1
|
|
166
|
+
else:
|
|
167
|
+
# square elements
|
|
168
|
+
tau_basis = fem.ElementBasis.LAGRANGE
|
|
169
|
+
tau_degree = degree
|
|
170
|
+
|
|
171
|
+
self._tau_space = fem.make_polynomial_space(
|
|
172
|
+
self._geo,
|
|
173
|
+
degree=tau_degree,
|
|
174
|
+
discontinuous=True,
|
|
175
|
+
element_basis=tau_basis,
|
|
176
|
+
family=fem.Polynomial.GAUSS_LEGENDRE,
|
|
177
|
+
dtype=wp.mat22,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
self._u_field = self._u_space.make_field()
|
|
181
|
+
|
|
182
|
+
self.renderer = fem_example_utils.Plot()
|
|
183
|
+
|
|
184
|
+
def step(self):
|
|
185
|
+
boundary = fem.BoundarySides(self._geo)
|
|
186
|
+
domain = fem.Cells(geometry=self._geo)
|
|
187
|
+
|
|
188
|
+
# Displacement boundary conditions
|
|
189
|
+
u_bd_test = fem.make_test(space=self._u_space, domain=boundary)
|
|
190
|
+
u_bd_trial = fem.make_trial(space=self._u_space, domain=boundary)
|
|
191
|
+
u_bd_rhs = fem.integrate(
|
|
192
|
+
vertical_displacement_form,
|
|
193
|
+
fields={"v": u_bd_test},
|
|
194
|
+
values={"displacement": self._displacement},
|
|
195
|
+
assembly="nodal",
|
|
196
|
+
output_dtype=wp.vec2d,
|
|
197
|
+
)
|
|
198
|
+
u_bd_matrix = fem.integrate(
|
|
199
|
+
vertical_boundary_projector_form, fields={"u": u_bd_trial, "v": u_bd_test}, assembly="nodal"
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
# Stress/velocity coupling
|
|
203
|
+
u_trial = fem.make_trial(space=self._u_space, domain=domain)
|
|
204
|
+
tau_test = fem.make_test(space=self._tau_space, domain=domain)
|
|
205
|
+
tau_trial = fem.make_trial(space=self._tau_space, domain=domain)
|
|
206
|
+
|
|
207
|
+
gradient_matrix = fem.integrate(displacement_gradient_form, fields={"u": u_trial, "tau": tau_test}).transpose()
|
|
208
|
+
|
|
209
|
+
# Compute inverse of the (block-diagonal) tau mass matrix
|
|
210
|
+
tau_inv_mass_matrix = fem.integrate(
|
|
211
|
+
tensor_mass_form, fields={"sig": tau_trial, "tau": tau_test}, assembly="nodal"
|
|
212
|
+
)
|
|
213
|
+
fem_example_utils.invert_diagonal_bsr_matrix(tau_inv_mass_matrix)
|
|
214
|
+
|
|
215
|
+
# Newton iterations (without line-search for simplicity)
|
|
216
|
+
for newton_iteration in range(5):
|
|
217
|
+
stress_matrix = fem.integrate(
|
|
218
|
+
nh_stress_delta_form,
|
|
219
|
+
fields={"u_cur": self._u_field, "u": u_trial, "tau": tau_test},
|
|
220
|
+
values={"lame": self._lame},
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
stress_rhs = fem.integrate(
|
|
224
|
+
nh_stress_form,
|
|
225
|
+
fields={"u_cur": self._u_field, "tau": tau_test},
|
|
226
|
+
values={"lame": self._lame},
|
|
227
|
+
output_dtype=wp.vec(length=stress_matrix.block_shape[0], dtype=wp.float64),
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
# Assemble system matrix
|
|
231
|
+
u_matrix = gradient_matrix @ tau_inv_mass_matrix @ stress_matrix
|
|
232
|
+
|
|
233
|
+
# Enforce boundary conditions (apply displacement only at first iteration)
|
|
234
|
+
u_rhs = -gradient_matrix @ (tau_inv_mass_matrix @ stress_rhs)
|
|
235
|
+
fem.project_linear_system(u_matrix, u_rhs, u_bd_matrix, u_bd_rhs if newton_iteration == 0 else None)
|
|
236
|
+
|
|
237
|
+
x = wp.zeros_like(u_rhs)
|
|
238
|
+
fem_example_utils.bsr_cg(u_matrix, b=u_rhs, x=x, quiet=self._quiet)
|
|
239
|
+
|
|
240
|
+
# Extract result -- cast to float32 and accumulate to displacement field
|
|
241
|
+
delta_u = wp.empty_like(self._u_field.dof_values)
|
|
242
|
+
wp.utils.array_cast(in_array=x, out_array=delta_u)
|
|
243
|
+
fem.linalg.array_axpy(x=delta_u, y=self._u_field.dof_values)
|
|
244
|
+
|
|
245
|
+
# Evaluate area conservation, should converge to 1.0 as Poisson ratio approaches 1.0
|
|
246
|
+
final_area = fem.integrate(
|
|
247
|
+
area_form, quadrature=fem.RegularQuadrature(domain, order=4), fields={"u_cur": self._u_field}
|
|
248
|
+
)
|
|
249
|
+
print(f"Area gain: {final_area} (using Poisson ratio={self._lame[0] / (self._lame[0] + 2.0 * self._lame[1])})")
|
|
250
|
+
|
|
251
|
+
def render(self):
|
|
252
|
+
self.renderer.add_field("solution", self._u_field)
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
if __name__ == "__main__":
|
|
256
|
+
import argparse
|
|
257
|
+
|
|
258
|
+
wp.set_module_options({"enable_backward": False})
|
|
259
|
+
|
|
260
|
+
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
261
|
+
parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
|
|
262
|
+
parser.add_argument("--resolution", type=int, default=25, help="Grid resolution.")
|
|
263
|
+
parser.add_argument("--degree", type=int, default=2, help="Polynomial degree of shape functions.")
|
|
264
|
+
parser.add_argument("--displacement", type=float, default=-0.5)
|
|
265
|
+
parser.add_argument("--poisson_ratio", type=float, default=0.99)
|
|
266
|
+
parser.add_argument("--mesh", choices=("grid", "tri", "quad"), default="grid", help="Mesh type")
|
|
267
|
+
parser.add_argument(
|
|
268
|
+
"--nonconforming_stresses", action="store_true", help="For grid, use non-conforming stresses (Q_d/P_d)"
|
|
269
|
+
)
|
|
270
|
+
parser.add_argument(
|
|
271
|
+
"--headless",
|
|
272
|
+
action="store_true",
|
|
273
|
+
help="Run in headless mode, suppressing the opening of any graphical windows.",
|
|
274
|
+
)
|
|
275
|
+
parser.add_argument("--quiet", action="store_true", help="Suppresses the printing out of iteration residuals.")
|
|
276
|
+
|
|
277
|
+
args = parser.parse_known_args()[0]
|
|
278
|
+
|
|
279
|
+
with wp.ScopedDevice(args.device):
|
|
280
|
+
example = Example(
|
|
281
|
+
quiet=args.quiet,
|
|
282
|
+
degree=args.degree,
|
|
283
|
+
resolution=args.resolution,
|
|
284
|
+
mesh=args.mesh,
|
|
285
|
+
displacement=args.displacement,
|
|
286
|
+
poisson_ratio=args.poisson_ratio,
|
|
287
|
+
nonconforming_stresses=args.nonconforming_stresses,
|
|
288
|
+
)
|
|
289
|
+
example.step()
|
|
290
|
+
example.render()
|
|
291
|
+
|
|
292
|
+
if not args.headless:
|
|
293
|
+
example.renderer.plot(options={"solution": {"displacement": {}}})
|