warp-lang 1.6.1__py3-none-win_amd64.whl → 1.7.0__py3-none-win_amd64.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 +21 -7
- warp/autograd.py +14 -6
- warp/bin/warp-clang.dll +0 -0
- warp/bin/warp.dll +0 -0
- warp/build.py +424 -6
- warp/build_dll.py +20 -20
- warp/builtins.py +467 -368
- warp/codegen.py +193 -125
- warp/config.py +56 -12
- warp/constants.py +14 -6
- warp/context.py +524 -277
- warp/dlpack.py +22 -12
- warp/examples/__init__.py +14 -6
- warp/examples/assets/nonuniform.usd +0 -0
- warp/examples/assets/nvidia_logo.png +0 -0
- warp/examples/benchmarks/benchmark_api.py +14 -6
- warp/examples/benchmarks/benchmark_cloth.py +14 -6
- warp/examples/benchmarks/benchmark_cloth_cupy.py +14 -6
- warp/examples/benchmarks/benchmark_cloth_jax.py +14 -6
- warp/examples/benchmarks/benchmark_cloth_numba.py +15 -0
- warp/examples/benchmarks/benchmark_cloth_numpy.py +14 -6
- warp/examples/benchmarks/benchmark_cloth_paddle.py +14 -6
- warp/examples/benchmarks/benchmark_cloth_pytorch.py +14 -6
- warp/examples/benchmarks/benchmark_cloth_taichi.py +14 -6
- warp/examples/benchmarks/benchmark_cloth_warp.py +14 -6
- warp/examples/benchmarks/benchmark_gemm.py +82 -48
- warp/examples/benchmarks/benchmark_interop_paddle.py +14 -6
- warp/examples/benchmarks/benchmark_interop_torch.py +14 -6
- warp/examples/benchmarks/benchmark_launches.py +14 -6
- warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
- warp/examples/browse.py +14 -6
- warp/examples/core/example_cupy.py +14 -6
- warp/examples/core/example_dem.py +14 -6
- warp/examples/core/example_fluid.py +14 -6
- warp/examples/core/example_graph_capture.py +14 -6
- warp/examples/core/example_marching_cubes.py +14 -6
- warp/examples/core/example_mesh.py +14 -6
- warp/examples/core/example_mesh_intersect.py +14 -6
- warp/examples/core/example_nvdb.py +14 -6
- warp/examples/core/example_raycast.py +14 -6
- warp/examples/core/example_raymarch.py +14 -6
- warp/examples/core/example_render_opengl.py +14 -6
- warp/examples/core/example_sample_mesh.py +300 -0
- warp/examples/core/example_sph.py +14 -6
- warp/examples/core/example_torch.py +14 -6
- warp/examples/core/example_wave.py +14 -6
- warp/examples/fem/example_adaptive_grid.py +14 -6
- warp/examples/fem/example_apic_fluid.py +15 -7
- warp/examples/fem/example_burgers.py +16 -8
- warp/examples/fem/example_convection_diffusion.py +14 -6
- warp/examples/fem/example_convection_diffusion_dg.py +14 -6
- warp/examples/fem/example_deformed_geometry.py +15 -7
- warp/examples/fem/example_diffusion.py +14 -6
- warp/examples/fem/example_diffusion_3d.py +14 -6
- warp/examples/fem/example_diffusion_mgpu.py +14 -6
- warp/examples/fem/example_distortion_energy.py +15 -7
- warp/examples/fem/example_magnetostatics.py +20 -12
- warp/examples/fem/example_mixed_elasticity.py +14 -6
- warp/examples/fem/example_navier_stokes.py +14 -6
- warp/examples/fem/example_nonconforming_contact.py +14 -6
- warp/examples/fem/example_stokes.py +14 -6
- warp/examples/fem/example_stokes_transfer.py +14 -6
- warp/examples/fem/example_streamlines.py +14 -6
- warp/examples/fem/utils.py +24 -3
- warp/examples/interop/example_jax_callable.py +116 -0
- warp/examples/interop/example_jax_ffi_callback.py +132 -0
- warp/examples/interop/example_jax_kernel.py +205 -0
- warp/examples/optim/example_bounce.py +14 -6
- warp/examples/optim/example_cloth_throw.py +14 -6
- warp/examples/optim/example_diffray.py +14 -6
- warp/examples/optim/example_drone.py +14 -6
- warp/examples/optim/example_fluid_checkpoint.py +497 -0
- warp/examples/optim/example_inverse_kinematics.py +14 -6
- warp/examples/optim/example_inverse_kinematics_torch.py +14 -6
- warp/examples/optim/example_softbody_properties.py +14 -6
- warp/examples/optim/example_spring_cage.py +14 -6
- warp/examples/optim/example_trajectory.py +14 -6
- warp/examples/sim/example_cartpole.py +14 -6
- warp/examples/sim/example_cloth.py +14 -6
- warp/examples/sim/example_cloth_self_contact.py +14 -6
- warp/examples/sim/example_granular.py +14 -6
- warp/examples/sim/example_granular_collision_sdf.py +14 -6
- warp/examples/sim/example_jacobian_ik.py +14 -6
- warp/examples/sim/example_particle_chain.py +14 -6
- warp/examples/sim/example_quadruped.py +14 -6
- warp/examples/sim/example_rigid_chain.py +14 -6
- warp/examples/sim/example_rigid_contact.py +14 -6
- warp/examples/sim/example_rigid_force.py +14 -6
- warp/examples/sim/example_rigid_gyroscopic.py +14 -6
- warp/examples/sim/example_rigid_soft_contact.py +14 -6
- warp/examples/sim/example_soft_body.py +14 -6
- warp/examples/tile/example_tile_cholesky.py +14 -6
- warp/examples/tile/example_tile_convolution.py +14 -6
- warp/examples/tile/example_tile_fft.py +14 -6
- warp/examples/tile/example_tile_filtering.py +14 -6
- warp/examples/tile/example_tile_matmul.py +16 -10
- warp/examples/tile/example_tile_mlp.py +14 -6
- warp/examples/tile/example_tile_nbody.py +14 -6
- warp/examples/tile/example_tile_walker.py +14 -6
- warp/fabric.py +15 -0
- warp/fem/__init__.py +26 -1
- warp/fem/adaptivity.py +19 -4
- warp/fem/cache.py +15 -0
- warp/fem/dirichlet.py +15 -0
- warp/fem/domain.py +15 -0
- warp/fem/field/__init__.py +15 -0
- warp/fem/field/field.py +15 -0
- warp/fem/field/nodal_field.py +37 -68
- warp/fem/field/restriction.py +15 -0
- warp/fem/field/virtual.py +77 -23
- warp/fem/geometry/__init__.py +15 -0
- warp/fem/geometry/adaptive_nanogrid.py +24 -10
- warp/fem/geometry/closest_point.py +16 -1
- warp/fem/geometry/deformed_geometry.py +20 -2
- warp/fem/geometry/element.py +15 -0
- warp/fem/geometry/geometry.py +20 -0
- warp/fem/geometry/grid_2d.py +27 -12
- warp/fem/geometry/grid_3d.py +27 -15
- warp/fem/geometry/hexmesh.py +20 -7
- warp/fem/geometry/nanogrid.py +24 -11
- warp/fem/geometry/partition.py +15 -0
- warp/fem/geometry/quadmesh.py +28 -13
- warp/fem/geometry/tetmesh.py +18 -4
- warp/fem/geometry/trimesh.py +18 -8
- warp/fem/integrate.py +277 -93
- warp/fem/linalg.py +20 -5
- warp/fem/operator.py +15 -0
- warp/fem/polynomial.py +15 -0
- warp/fem/quadrature/__init__.py +15 -0
- warp/fem/quadrature/pic_quadrature.py +52 -22
- warp/fem/quadrature/quadrature.py +209 -25
- warp/fem/space/__init__.py +16 -1
- warp/fem/space/basis_function_space.py +19 -2
- warp/fem/space/basis_space.py +40 -18
- warp/fem/space/dof_mapper.py +15 -0
- warp/fem/space/function_space.py +15 -0
- warp/fem/space/grid_2d_function_space.py +15 -0
- warp/fem/space/grid_3d_function_space.py +15 -0
- warp/fem/space/hexmesh_function_space.py +17 -2
- warp/fem/space/nanogrid_function_space.py +15 -0
- warp/fem/space/partition.py +21 -2
- warp/fem/space/quadmesh_function_space.py +23 -8
- warp/fem/space/restriction.py +15 -0
- warp/fem/space/shape/__init__.py +15 -0
- warp/fem/space/shape/cube_shape_function.py +38 -23
- warp/fem/space/shape/shape_function.py +15 -0
- warp/fem/space/shape/square_shape_function.py +27 -12
- warp/fem/space/shape/tet_shape_function.py +15 -0
- warp/fem/space/shape/triangle_shape_function.py +16 -1
- warp/fem/space/tetmesh_function_space.py +18 -3
- warp/fem/space/topology.py +15 -0
- warp/fem/space/trimesh_function_space.py +17 -2
- warp/fem/types.py +15 -0
- warp/fem/utils.py +27 -6
- warp/jax.py +28 -7
- warp/jax_experimental/__init__.py +16 -0
- warp/{jax_experimental.py → jax_experimental/custom_call.py} +28 -33
- warp/jax_experimental/ffi.py +698 -0
- warp/jax_experimental/xla_ffi.py +602 -0
- warp/math.py +103 -6
- warp/native/array.h +28 -6
- warp/native/builtin.h +44 -9
- warp/native/bvh.cpp +18 -7
- warp/native/bvh.cu +57 -20
- warp/native/bvh.h +17 -7
- warp/native/clang/clang.cpp +45 -9
- warp/native/coloring.cpp +15 -6
- warp/native/crt.cpp +15 -6
- warp/native/crt.h +15 -6
- warp/native/cuda_crt.h +15 -6
- warp/native/cuda_util.cpp +29 -6
- warp/native/cuda_util.h +17 -6
- warp/native/error.cpp +15 -6
- warp/native/error.h +15 -6
- warp/native/exports.h +85 -63
- warp/native/fabric.h +15 -6
- warp/native/hashgrid.cpp +15 -6
- warp/native/hashgrid.cu +15 -6
- warp/native/hashgrid.h +15 -6
- warp/native/initializer_array.h +15 -6
- warp/native/intersect.h +41 -32
- warp/native/intersect_adj.h +48 -39
- warp/native/intersect_tri.h +17 -0
- warp/native/marching.cpp +16 -0
- warp/native/marching.cu +16 -7
- warp/native/marching.h +17 -0
- warp/native/mat.h +528 -15
- warp/native/mathdx.cpp +15 -6
- warp/native/matnn.h +15 -6
- warp/native/mesh.cpp +15 -6
- warp/native/mesh.cu +15 -6
- warp/native/mesh.h +25 -16
- warp/native/noise.h +15 -6
- warp/native/quat.h +114 -17
- warp/native/rand.h +21 -6
- warp/native/range.h +15 -6
- warp/native/reduce.cpp +15 -6
- warp/native/reduce.cu +15 -6
- warp/native/runlength_encode.cpp +15 -6
- warp/native/runlength_encode.cu +15 -6
- warp/native/scan.cpp +15 -6
- warp/native/scan.cu +15 -6
- warp/native/scan.h +15 -6
- warp/native/solid_angle.h +17 -0
- warp/native/sort.cpp +137 -65
- warp/native/sort.cu +167 -21
- warp/native/sort.h +23 -7
- warp/native/sparse.cpp +58 -28
- warp/native/sparse.cu +67 -23
- warp/native/spatial.h +15 -6
- warp/native/svd.h +131 -6
- warp/native/temp_buffer.h +15 -6
- warp/native/tile.h +316 -111
- warp/native/tile_reduce.h +61 -9
- warp/native/vec.h +83 -13
- warp/native/volume.cpp +100 -119
- warp/native/volume.cu +15 -6
- warp/native/volume.h +15 -6
- warp/native/volume_builder.cu +40 -16
- warp/native/volume_builder.h +21 -6
- warp/native/volume_impl.h +15 -6
- warp/native/warp.cpp +20 -12
- warp/native/warp.cu +114 -16
- warp/native/warp.h +34 -16
- warp/optim/__init__.py +14 -6
- warp/optim/adam.py +14 -6
- warp/optim/linear.py +25 -10
- warp/optim/sgd.py +14 -6
- warp/paddle.py +14 -6
- warp/render/__init__.py +14 -6
- warp/render/render_opengl.py +14 -6
- warp/render/render_usd.py +14 -6
- warp/render/utils.py +14 -6
- warp/sim/__init__.py +14 -7
- warp/sim/articulation.py +18 -10
- warp/sim/collide.py +35 -16
- warp/sim/graph_coloring.py +14 -6
- warp/sim/import_mjcf.py +463 -162
- warp/sim/import_snu.py +14 -7
- warp/sim/import_urdf.py +46 -18
- warp/sim/import_usd.py +14 -7
- warp/sim/inertia.py +14 -6
- warp/sim/integrator.py +14 -6
- warp/sim/integrator_euler.py +19 -11
- warp/sim/integrator_featherstone.py +17 -16
- warp/sim/integrator_vbd.py +222 -8
- warp/sim/integrator_xpbd.py +19 -11
- warp/sim/model.py +56 -19
- warp/sim/particles.py +14 -6
- warp/sim/render.py +14 -6
- warp/sim/utils.py +17 -2
- warp/sparse.py +657 -555
- warp/stubs.py +231 -19
- warp/tape.py +14 -6
- warp/tests/aux_test_class_kernel.py +14 -6
- warp/tests/aux_test_compile_consts_dummy.py +14 -6
- warp/tests/aux_test_conditional_unequal_types_kernels.py +14 -6
- warp/tests/aux_test_dependent.py +14 -6
- warp/tests/aux_test_grad_customs.py +14 -6
- warp/tests/aux_test_instancing_gc.py +14 -6
- warp/tests/aux_test_module_unload.py +14 -6
- warp/tests/aux_test_name_clash1.py +14 -6
- warp/tests/aux_test_name_clash2.py +14 -6
- warp/tests/aux_test_unresolved_func.py +14 -6
- warp/tests/aux_test_unresolved_symbol.py +14 -6
- warp/tests/cuda/__init__.py +0 -0
- warp/tests/{test_async.py → cuda/test_async.py} +14 -6
- warp/tests/{test_ipc.py → cuda/test_ipc.py} +14 -6
- warp/tests/{test_mempool.py → cuda/test_mempool.py} +53 -6
- warp/tests/{test_multigpu.py → cuda/test_multigpu.py} +14 -6
- warp/tests/{test_peer.py → cuda/test_peer.py} +14 -6
- warp/tests/{test_pinned.py → cuda/test_pinned.py} +14 -6
- warp/tests/{test_streams.py → cuda/test_streams.py} +85 -6
- warp/tests/geometry/__init__.py +0 -0
- warp/tests/{test_bvh.py → geometry/test_bvh.py} +14 -6
- warp/tests/{test_hash_grid.py → geometry/test_hash_grid.py} +14 -6
- warp/tests/{test_marching_cubes.py → geometry/test_marching_cubes.py} +14 -6
- warp/tests/{test_mesh.py → geometry/test_mesh.py} +14 -6
- warp/tests/{test_mesh_query_aabb.py → geometry/test_mesh_query_aabb.py} +14 -6
- warp/tests/{test_mesh_query_point.py → geometry/test_mesh_query_point.py} +80 -69
- warp/tests/{test_mesh_query_ray.py → geometry/test_mesh_query_ray.py} +15 -7
- warp/tests/{test_volume.py → geometry/test_volume.py} +55 -12
- warp/tests/{test_volume_write.py → geometry/test_volume_write.py} +14 -6
- warp/tests/interop/__init__.py +0 -0
- warp/tests/{test_dlpack.py → interop/test_dlpack.py} +42 -11
- warp/tests/{test_jax.py → interop/test_jax.py} +14 -6
- warp/tests/{test_paddle.py → interop/test_paddle.py} +14 -6
- warp/tests/{test_torch.py → interop/test_torch.py} +14 -6
- warp/tests/run_coverage_serial.py +14 -6
- warp/tests/sim/__init__.py +0 -0
- warp/tests/{disabled_kinematics.py → sim/disabled_kinematics.py} +23 -16
- warp/tests/{flaky_test_sim_grad.py → sim/flaky_test_sim_grad.py} +14 -6
- warp/tests/{test_collision.py → sim/test_collision.py} +16 -8
- warp/tests/{test_coloring.py → sim/test_coloring.py} +14 -7
- warp/tests/{test_model.py → sim/test_model.py} +55 -7
- warp/tests/{test_sim_grad_bounce_linear.py → sim/test_sim_grad_bounce_linear.py} +14 -6
- warp/tests/{test_sim_kinematics.py → sim/test_sim_kinematics.py} +16 -7
- warp/tests/sim/test_vbd.py +597 -0
- warp/tests/test_adam.py +14 -6
- warp/tests/test_arithmetic.py +14 -6
- warp/tests/test_array.py +14 -6
- warp/tests/test_array_reduce.py +14 -6
- warp/tests/test_assert.py +14 -6
- warp/tests/test_atomic.py +14 -6
- warp/tests/test_bool.py +15 -7
- warp/tests/test_builtins_resolution.py +14 -6
- warp/tests/test_closest_point_edge_edge.py +14 -6
- warp/tests/test_codegen.py +14 -6
- warp/tests/test_codegen_instancing.py +14 -6
- warp/tests/test_compile_consts.py +14 -6
- warp/tests/test_conditional.py +14 -6
- warp/tests/test_context.py +14 -6
- warp/tests/test_copy.py +14 -6
- warp/tests/test_ctypes.py +14 -6
- warp/tests/test_dense.py +14 -6
- warp/tests/test_devices.py +14 -6
- warp/tests/test_examples.py +42 -42
- warp/tests/test_fabricarray.py +14 -6
- warp/tests/test_fast_math.py +14 -6
- warp/tests/test_fem.py +37 -10
- warp/tests/test_fp16.py +14 -6
- warp/tests/test_func.py +14 -6
- warp/tests/test_future_annotations.py +14 -6
- warp/tests/test_generics.py +14 -6
- warp/tests/test_grad.py +14 -6
- warp/tests/test_grad_customs.py +14 -6
- warp/tests/test_grad_debug.py +14 -6
- warp/tests/test_implicit_init.py +14 -6
- warp/tests/test_import.py +14 -6
- warp/tests/test_indexedarray.py +14 -6
- warp/tests/test_intersect.py +14 -6
- warp/tests/test_iter.py +14 -6
- warp/tests/test_large.py +14 -6
- warp/tests/test_launch.py +14 -6
- warp/tests/test_lerp.py +14 -6
- warp/tests/test_linear_solvers.py +15 -11
- warp/tests/test_lvalue.py +14 -6
- warp/tests/test_mat.py +247 -85
- warp/tests/test_mat_lite.py +14 -6
- warp/tests/test_mat_scalar_ops.py +18 -10
- warp/tests/test_math.py +14 -6
- warp/tests/test_mlp.py +14 -6
- warp/tests/test_module_hashing.py +14 -6
- warp/tests/test_modules_lite.py +14 -6
- warp/tests/test_noise.py +14 -6
- warp/tests/test_operators.py +14 -6
- warp/tests/test_options.py +14 -6
- warp/tests/test_overwrite.py +15 -60
- warp/tests/test_print.py +14 -6
- warp/tests/test_quat.py +81 -52
- warp/tests/test_rand.py +58 -43
- warp/tests/test_reload.py +14 -6
- warp/tests/test_rounding.py +14 -6
- warp/tests/test_runlength_encode.py +14 -6
- warp/tests/test_scalar_ops.py +14 -6
- warp/tests/test_smoothstep.py +14 -6
- warp/tests/test_snippet.py +15 -0
- warp/tests/test_sparse.py +61 -12
- warp/tests/test_spatial.py +89 -6
- warp/tests/test_special_values.py +14 -6
- warp/tests/test_static.py +15 -7
- warp/tests/test_struct.py +14 -6
- warp/tests/test_tape.py +14 -6
- warp/tests/test_transient_module.py +14 -6
- warp/tests/test_triangle_closest_point.py +14 -6
- warp/tests/test_types.py +14 -6
- warp/tests/test_utils.py +98 -10
- warp/tests/test_vec.py +60 -40
- warp/tests/test_vec_lite.py +14 -6
- warp/tests/test_vec_scalar_ops.py +14 -6
- warp/tests/test_verify_fp.py +14 -6
- warp/tests/tile/__init__.py +0 -0
- warp/tests/{test_tile.py → tile/test_tile.py} +150 -57
- warp/tests/{test_tile_load.py → tile/test_tile_load.py} +15 -7
- warp/tests/{test_tile_mathdx.py → tile/test_tile_mathdx.py} +23 -12
- warp/tests/{test_tile_mlp.py → tile/test_tile_mlp.py} +39 -20
- warp/tests/{test_tile_reduce.py → tile/test_tile_reduce.py} +74 -7
- warp/tests/{test_tile_shared_memory.py → tile/test_tile_shared_memory.py} +14 -6
- warp/tests/{test_tile_view.py → tile/test_tile_view.py} +15 -7
- warp/tests/unittest_serial.py +15 -6
- warp/tests/unittest_suites.py +59 -65
- warp/tests/unittest_utils.py +16 -7
- warp/tests/walkthrough_debug.py +14 -6
- warp/thirdparty/unittest_parallel.py +15 -8
- warp/torch.py +14 -6
- warp/types.py +124 -664
- warp/utils.py +151 -78
- {warp_lang-1.6.1.dist-info → warp_lang-1.7.0.dist-info}/METADATA +39 -12
- warp_lang-1.7.0.dist-info/RECORD +429 -0
- {warp_lang-1.6.1.dist-info → warp_lang-1.7.0.dist-info}/WHEEL +1 -1
- warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
- warp/examples/optim/example_walker.py +0 -309
- warp/native/cutlass_gemm.cpp +0 -34
- warp/native/cutlass_gemm.cu +0 -373
- warp/tests/test_matmul.py +0 -503
- warp/tests/test_matmul_lite.py +0 -403
- warp/tests/test_vbd.py +0 -378
- warp/tests/unused_test_misc.py +0 -69
- warp_lang-1.6.1.dist-info/LICENSE.md +0 -126
- warp_lang-1.6.1.dist-info/RECORD +0 -419
- {warp_lang-1.6.1.dist-info → warp_lang-1.7.0.dist-info}/top_level.txt +0 -0
|
@@ -1,3 +1,18 @@
|
|
|
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
|
+
|
|
1
16
|
from typing import Optional
|
|
2
17
|
|
|
3
18
|
import numpy as np
|
|
@@ -15,7 +30,6 @@ from .nanogrid import (
|
|
|
15
30
|
_extract_axis_flag,
|
|
16
31
|
_get_boundary_mask,
|
|
17
32
|
_make_face_flags,
|
|
18
|
-
_mat32,
|
|
19
33
|
)
|
|
20
34
|
|
|
21
35
|
_FACE_LEVEL_BIT = wp.constant(wp.uint8(4)) # follows nanogrid.FACE_OUTER_OFFSET_BIT
|
|
@@ -199,9 +213,9 @@ class AdaptiveNanogrid(Geometry):
|
|
|
199
213
|
coords = uvw - wp.vec3(ijk)
|
|
200
214
|
|
|
201
215
|
if wp.min(coords) == 0.0 or wp.max(coords) == 1.0:
|
|
202
|
-
il = wp.
|
|
203
|
-
jl = wp.
|
|
204
|
-
kl = wp.
|
|
216
|
+
il = wp.where(coords[0] > 0.5, 0, -1)
|
|
217
|
+
jl = wp.where(coords[1] > 0.5, 0, -1)
|
|
218
|
+
kl = wp.where(coords[2] > 0.5, 0, -1)
|
|
205
219
|
|
|
206
220
|
for n in range(8):
|
|
207
221
|
ni = n >> 2
|
|
@@ -316,7 +330,7 @@ class AdaptiveNanogrid(Geometry):
|
|
|
316
330
|
flip = Nanogrid._get_face_inner_offset(flags)
|
|
317
331
|
scale = AdaptiveNanogrid._get_face_scale(flags)
|
|
318
332
|
v1, v2 = Nanogrid._face_tangent_vecs(args.cell_arg.cell_grid, axis, flip)
|
|
319
|
-
return
|
|
333
|
+
return wp.matrix_from_cols(v1, v2) * scale
|
|
320
334
|
|
|
321
335
|
@wp.func
|
|
322
336
|
def side_inner_inverse_deformation_gradient(args: SideArg, s: Sample):
|
|
@@ -432,10 +446,10 @@ class AdaptiveNanogrid(Geometry):
|
|
|
432
446
|
and wp.max(same_level_cell_coords) <= 1.0
|
|
433
447
|
)
|
|
434
448
|
|
|
435
|
-
return wp.
|
|
449
|
+
return wp.where(
|
|
436
450
|
on_side,
|
|
437
|
-
Coords(OUTSIDE),
|
|
438
451
|
Coords(same_level_cell_coords[(axis + 1) % 3], same_level_cell_coords[(axis + 2) % 3], 0.0),
|
|
452
|
+
Coords(OUTSIDE),
|
|
439
453
|
)
|
|
440
454
|
|
|
441
455
|
def _build_face_grid(self, temporary_store: Optional[cache.TemporaryStore] = None):
|
|
@@ -512,7 +526,7 @@ class AdaptiveNanogrid(Geometry):
|
|
|
512
526
|
for ax in range(3):
|
|
513
527
|
coord = ijk[ax]
|
|
514
528
|
level_flag = ((level >> ax) & 1) << _GRID_LEVEL_BIT
|
|
515
|
-
ijk[ax] = wp.
|
|
529
|
+
ijk[ax] = wp.where(coord < 0, coord & ~level_flag, coord | level_flag)
|
|
516
530
|
|
|
517
531
|
return _add_axis_flag(ijk, axis)
|
|
518
532
|
|
|
@@ -830,8 +844,8 @@ def _build_face_indices_and_flags(
|
|
|
830
844
|
|
|
831
845
|
plus_cell_index, minus_cell_index = _find_face_neighbours(cell_grid, ijk, axis, level_count, cell_level)
|
|
832
846
|
|
|
833
|
-
inner_cell = wp.
|
|
834
|
-
outer_cell = wp.
|
|
847
|
+
inner_cell = wp.where(minus_cell_index == -1, plus_cell_index, minus_cell_index)
|
|
848
|
+
outer_cell = wp.where(plus_cell_index == -1, minus_cell_index, plus_cell_index)
|
|
835
849
|
|
|
836
850
|
face_level = wp.min(cell_level[inner_cell], cell_level[outer_cell])
|
|
837
851
|
|
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
1
16
|
from typing import Any
|
|
2
17
|
|
|
3
18
|
import warp as wp
|
|
@@ -44,7 +59,7 @@ def project_on_tri_at_origin(q: Any, e1: Any, e2: Any):
|
|
|
44
59
|
|
|
45
60
|
@wp.func
|
|
46
61
|
def project_on_tet_at_origin(q: wp.vec3, e1: wp.vec3, e2: wp.vec3, e3: wp.vec3):
|
|
47
|
-
mat = wp.inverse(wp.
|
|
62
|
+
mat = wp.inverse(wp.matrix_from_cols(e1, e2, e3))
|
|
48
63
|
coords = mat * q
|
|
49
64
|
|
|
50
65
|
if wp.min(coords) >= 0.0 and coords[0] + coords[1] + coords[2] <= 1.0:
|
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
1
16
|
import warp as wp
|
|
2
17
|
from warp.fem import cache
|
|
3
18
|
from warp.fem.types import Coords, ElementIndex, Sample
|
|
@@ -31,7 +46,6 @@ class DeformedGeometry(Geometry):
|
|
|
31
46
|
self._relative = relative
|
|
32
47
|
|
|
33
48
|
self.field: GeometryField = field
|
|
34
|
-
self.base = self.field.geometry
|
|
35
49
|
self.dimension = self.base.dimension
|
|
36
50
|
|
|
37
51
|
self.CellArg = self.field.ElementEvalArg
|
|
@@ -66,9 +80,13 @@ class DeformedGeometry(Geometry):
|
|
|
66
80
|
self._make_default_dependent_implementations()
|
|
67
81
|
|
|
68
82
|
@property
|
|
69
|
-
def name(self):
|
|
83
|
+
def name(self) -> str:
|
|
70
84
|
return f"DefGeo_{self.field.name}_{'rel' if self._relative else 'abs'}"
|
|
71
85
|
|
|
86
|
+
@property
|
|
87
|
+
def base(self) -> Geometry:
|
|
88
|
+
return self.field.geometry.base
|
|
89
|
+
|
|
72
90
|
# Geometry device interface
|
|
73
91
|
|
|
74
92
|
@cache.cached_arg_value
|
warp/fem/geometry/element.py
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
1
16
|
from typing import List, Tuple
|
|
2
17
|
|
|
3
18
|
from warp.fem.polynomial import Polynomial, quadrature_1d
|
warp/fem/geometry/geometry.py
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
1
16
|
from typing import Any
|
|
2
17
|
|
|
3
18
|
import warp as wp
|
|
@@ -43,6 +58,11 @@ class Geometry:
|
|
|
43
58
|
"""Manifold dimension of the geometry cells"""
|
|
44
59
|
return self.reference_cell().dimension
|
|
45
60
|
|
|
61
|
+
@property
|
|
62
|
+
def base(self) -> "Geometry":
|
|
63
|
+
"""Returns the base geometry from which this geometry derives its topology. Usually `self`"""
|
|
64
|
+
return self
|
|
65
|
+
|
|
46
66
|
@property
|
|
47
67
|
def name(self) -> str:
|
|
48
68
|
return self.__class__.__name__
|
warp/fem/geometry/grid_2d.py
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
1
16
|
from typing import Optional
|
|
2
17
|
|
|
3
18
|
import warp as wp
|
|
@@ -158,7 +173,7 @@ class Grid2D(Geometry):
|
|
|
158
173
|
return Grid2D.Side(axis, origin)
|
|
159
174
|
|
|
160
175
|
axis_side_index = side_index - 2 * arg.cell_count
|
|
161
|
-
axis = wp.
|
|
176
|
+
axis = wp.where(axis_side_index < arg.axis_offsets[1], 0, 1)
|
|
162
177
|
|
|
163
178
|
altitude = arg.cell_arg.res[Grid2D.ROTATION[axis, 0]]
|
|
164
179
|
longitude = axis_side_index - arg.axis_offsets[axis]
|
|
@@ -258,7 +273,7 @@ class Grid2D(Geometry):
|
|
|
258
273
|
def side_position(args: SideArg, s: Sample):
|
|
259
274
|
side = Grid2D.get_side(args, s.element_index)
|
|
260
275
|
|
|
261
|
-
coord = wp.
|
|
276
|
+
coord = wp.where((side.origin[0] == 0) == (side.axis == 0), s.element_coords[0], 1.0 - s.element_coords[0])
|
|
262
277
|
|
|
263
278
|
local_pos = wp.vec2(
|
|
264
279
|
float(side.origin[0]),
|
|
@@ -273,7 +288,7 @@ class Grid2D(Geometry):
|
|
|
273
288
|
def side_deformation_gradient(args: SideArg, s: Sample):
|
|
274
289
|
side = Grid2D.get_side(args, s.element_index)
|
|
275
290
|
|
|
276
|
-
sign = wp.
|
|
291
|
+
sign = wp.where((side.origin[0] == 0) == (side.axis == 0), 1.0, -1.0)
|
|
277
292
|
|
|
278
293
|
return wp.cw_mul(Grid2D._rotate(side.axis, wp.vec2(0.0, sign)), args.cell_arg.cell_size)
|
|
279
294
|
|
|
@@ -301,7 +316,7 @@ class Grid2D(Geometry):
|
|
|
301
316
|
def side_normal(args: SideArg, s: Sample):
|
|
302
317
|
side = Grid2D.get_side(args, s.element_index)
|
|
303
318
|
|
|
304
|
-
sign = wp.
|
|
319
|
+
sign = wp.where(side.origin[0] == 0, -1.0, 1.0)
|
|
305
320
|
|
|
306
321
|
local_n = wp.vec2(sign, 0.0)
|
|
307
322
|
return Grid2D._rotate(side.axis, local_n)
|
|
@@ -310,7 +325,7 @@ class Grid2D(Geometry):
|
|
|
310
325
|
def side_inner_cell_index(arg: SideArg, side_index: ElementIndex):
|
|
311
326
|
side = Grid2D.get_side(arg, side_index)
|
|
312
327
|
|
|
313
|
-
inner_alt = wp.
|
|
328
|
+
inner_alt = wp.where(side.origin[0] == 0, 0, side.origin[0] - 1)
|
|
314
329
|
|
|
315
330
|
inner_origin = wp.vec2i(inner_alt, side.origin[1])
|
|
316
331
|
|
|
@@ -322,8 +337,8 @@ class Grid2D(Geometry):
|
|
|
322
337
|
side = Grid2D.get_side(arg, side_index)
|
|
323
338
|
|
|
324
339
|
alt_axis = Grid2D.ROTATION[side.axis, 0]
|
|
325
|
-
outer_alt = wp.
|
|
326
|
-
side.origin[0] == arg.cell_arg.res[alt_axis],
|
|
340
|
+
outer_alt = wp.where(
|
|
341
|
+
side.origin[0] == arg.cell_arg.res[alt_axis], arg.cell_arg.res[alt_axis] - 1, side.origin[0]
|
|
327
342
|
)
|
|
328
343
|
|
|
329
344
|
outer_origin = wp.vec2i(outer_alt, side.origin[1])
|
|
@@ -335,9 +350,9 @@ class Grid2D(Geometry):
|
|
|
335
350
|
def side_inner_cell_coords(args: SideArg, side_index: ElementIndex, side_coords: Coords):
|
|
336
351
|
side = Grid2D.get_side(args, side_index)
|
|
337
352
|
|
|
338
|
-
inner_alt = wp.
|
|
353
|
+
inner_alt = wp.where(side.origin[0] == 0, 0.0, 1.0)
|
|
339
354
|
|
|
340
|
-
side_coord = wp.
|
|
355
|
+
side_coord = wp.where((side.origin[0] == 0) == (side.axis == 0), side_coords[0], 1.0 - side_coords[0])
|
|
341
356
|
|
|
342
357
|
coords = Grid2D._rotate(side.axis, wp.vec2(inner_alt, side_coord))
|
|
343
358
|
return Coords(coords[0], coords[1], 0.0)
|
|
@@ -347,9 +362,9 @@ class Grid2D(Geometry):
|
|
|
347
362
|
side = Grid2D.get_side(args, side_index)
|
|
348
363
|
|
|
349
364
|
alt_axis = Grid2D.ROTATION[side.axis, 0]
|
|
350
|
-
outer_alt = wp.
|
|
365
|
+
outer_alt = wp.where(side.origin[0] == args.cell_arg.res[alt_axis], 1.0, 0.0)
|
|
351
366
|
|
|
352
|
-
side_coord = wp.
|
|
367
|
+
side_coord = wp.where((side.origin[0] == 0) == (side.axis == 0), side_coords[0], 1.0 - side_coords[0])
|
|
353
368
|
|
|
354
369
|
coords = Grid2D._rotate(side.axis, wp.vec2(outer_alt, side_coord))
|
|
355
370
|
return Coords(coords[0], coords[1], 0.0)
|
|
@@ -367,7 +382,7 @@ class Grid2D(Geometry):
|
|
|
367
382
|
if float(side.origin[0] - cell[side.axis]) == element_coords[side.axis]:
|
|
368
383
|
long_axis = Grid2D.ROTATION[side.axis, 1]
|
|
369
384
|
axis_coord = element_coords[long_axis]
|
|
370
|
-
side_coord = wp.
|
|
385
|
+
side_coord = wp.where((side.origin[0] == 0) == (side.axis == 0), axis_coord, 1.0 - axis_coord)
|
|
371
386
|
return Coords(side_coord, 0.0, 0.0)
|
|
372
387
|
|
|
373
388
|
return Coords(OUTSIDE)
|
warp/fem/geometry/grid_3d.py
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
1
16
|
from typing import Any, Optional
|
|
2
17
|
|
|
3
18
|
import warp as wp
|
|
@@ -15,9 +30,6 @@ class Grid3DCellArg:
|
|
|
15
30
|
origin: wp.vec3
|
|
16
31
|
|
|
17
32
|
|
|
18
|
-
_mat32 = wp.mat(shape=(3, 2), dtype=float)
|
|
19
|
-
|
|
20
|
-
|
|
21
33
|
class Grid3D(Geometry):
|
|
22
34
|
"""Three-dimensional regular grid geometry"""
|
|
23
35
|
|
|
@@ -316,7 +328,7 @@ class Grid3D(Geometry):
|
|
|
316
328
|
def side_position(args: SideArg, s: Sample):
|
|
317
329
|
side = Grid3D.get_side(args, s.element_index)
|
|
318
330
|
|
|
319
|
-
coord0 = wp.
|
|
331
|
+
coord0 = wp.where(side.origin[0] == 0, 1.0 - s.element_coords[0], s.element_coords[0])
|
|
320
332
|
|
|
321
333
|
local_pos = wp.vec3(
|
|
322
334
|
float(side.origin[0]),
|
|
@@ -332,9 +344,9 @@ class Grid3D(Geometry):
|
|
|
332
344
|
def side_deformation_gradient(args: SideArg, s: Sample):
|
|
333
345
|
side = Grid3D.get_side(args, s.element_index)
|
|
334
346
|
|
|
335
|
-
sign = wp.
|
|
347
|
+
sign = wp.where(side.origin[0] == 0, -1.0, 1.0)
|
|
336
348
|
|
|
337
|
-
return
|
|
349
|
+
return wp.matrix_from_cols(
|
|
338
350
|
wp.cw_mul(Grid3D._local_to_world(side.axis, wp.vec3(0.0, sign, 0.0)), args.cell_arg.cell_size),
|
|
339
351
|
wp.cw_mul(Grid3D._local_to_world(side.axis, wp.vec3(0.0, 0.0, 1.0)), args.cell_arg.cell_size),
|
|
340
352
|
)
|
|
@@ -364,7 +376,7 @@ class Grid3D(Geometry):
|
|
|
364
376
|
def side_normal(args: SideArg, s: Sample):
|
|
365
377
|
side = Grid3D.get_side(args, s.element_index)
|
|
366
378
|
|
|
367
|
-
sign = wp.
|
|
379
|
+
sign = wp.where(side.origin[0] == 0, -1.0, 1.0)
|
|
368
380
|
|
|
369
381
|
local_n = wp.vec3(sign, 0.0, 0.0)
|
|
370
382
|
return Grid3D._local_to_world(side.axis, local_n)
|
|
@@ -373,7 +385,7 @@ class Grid3D(Geometry):
|
|
|
373
385
|
def side_inner_cell_index(arg: SideArg, side_index: ElementIndex):
|
|
374
386
|
side = Grid3D.get_side(arg, side_index)
|
|
375
387
|
|
|
376
|
-
inner_alt = wp.
|
|
388
|
+
inner_alt = wp.where(side.origin[0] == 0, 0, side.origin[0] - 1)
|
|
377
389
|
|
|
378
390
|
inner_origin = wp.vec3i(inner_alt, side.origin[1], side.origin[2])
|
|
379
391
|
|
|
@@ -386,8 +398,8 @@ class Grid3D(Geometry):
|
|
|
386
398
|
|
|
387
399
|
alt_axis = Grid3D._local_to_world_axis(side.axis, 0)
|
|
388
400
|
|
|
389
|
-
outer_alt = wp.
|
|
390
|
-
side.origin[0] == arg.cell_arg.res[alt_axis],
|
|
401
|
+
outer_alt = wp.where(
|
|
402
|
+
side.origin[0] == arg.cell_arg.res[alt_axis], arg.cell_arg.res[alt_axis] - 1, side.origin[0]
|
|
391
403
|
)
|
|
392
404
|
|
|
393
405
|
outer_origin = wp.vec3i(outer_alt, side.origin[1], side.origin[2])
|
|
@@ -399,9 +411,9 @@ class Grid3D(Geometry):
|
|
|
399
411
|
def side_inner_cell_coords(args: SideArg, side_index: ElementIndex, side_coords: Coords):
|
|
400
412
|
side = Grid3D.get_side(args, side_index)
|
|
401
413
|
|
|
402
|
-
inner_alt = wp.
|
|
414
|
+
inner_alt = wp.where(side.origin[0] == 0, 0.0, 1.0)
|
|
403
415
|
|
|
404
|
-
side_coord0 = wp.
|
|
416
|
+
side_coord0 = wp.where(side.origin[0] == 0, 1.0 - side_coords[0], side_coords[0])
|
|
405
417
|
|
|
406
418
|
return Grid3D._local_to_world(side.axis, wp.vec3(inner_alt, side_coord0, side_coords[1]))
|
|
407
419
|
|
|
@@ -410,9 +422,9 @@ class Grid3D(Geometry):
|
|
|
410
422
|
side = Grid3D.get_side(args, side_index)
|
|
411
423
|
|
|
412
424
|
alt_axis = Grid3D._local_to_world_axis(side.axis, 0)
|
|
413
|
-
outer_alt = wp.
|
|
425
|
+
outer_alt = wp.where(side.origin[0] == args.cell_arg.res[alt_axis], 1.0, 0.0)
|
|
414
426
|
|
|
415
|
-
side_coord0 = wp.
|
|
427
|
+
side_coord0 = wp.where(side.origin[0] == 0, 1.0 - side_coords[0], side_coords[0])
|
|
416
428
|
|
|
417
429
|
return Grid3D._local_to_world(side.axis, wp.vec3(outer_alt, side_coord0, side_coords[1]))
|
|
418
430
|
|
|
@@ -430,7 +442,7 @@ class Grid3D(Geometry):
|
|
|
430
442
|
long_axis = Grid3D._local_to_world_axis(side.axis, 1)
|
|
431
443
|
lat_axis = Grid3D._local_to_world_axis(side.axis, 2)
|
|
432
444
|
long_coord = element_coords[long_axis]
|
|
433
|
-
long_coord = wp.
|
|
445
|
+
long_coord = wp.where(side.origin[0] == 0, 1.0 - long_coord, long_coord)
|
|
434
446
|
return Coords(long_coord, element_coords[lat_axis], 0.0)
|
|
435
447
|
|
|
436
448
|
return Coords(OUTSIDE)
|
warp/fem/geometry/hexmesh.py
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
1
16
|
from typing import Optional
|
|
2
17
|
|
|
3
18
|
import warp as wp
|
|
@@ -31,8 +46,6 @@ class HexmeshSideArg:
|
|
|
31
46
|
face_hex_face_orientation: wp.array(dtype=wp.vec4i)
|
|
32
47
|
|
|
33
48
|
|
|
34
|
-
_mat32 = wp.mat(shape=(3, 2), dtype=float)
|
|
35
|
-
|
|
36
49
|
FACE_VERTEX_INDICES = wp.constant(
|
|
37
50
|
wp.mat(shape=(6, 4), dtype=int)(
|
|
38
51
|
[
|
|
@@ -307,7 +320,7 @@ class Hexmesh(Geometry):
|
|
|
307
320
|
def side_deformation_gradient(args: SideArg, s: Sample):
|
|
308
321
|
"""Transposed side deformation gradient at `coords`"""
|
|
309
322
|
v1, v2 = Hexmesh._side_deformation_vecs(args, s.element_index, s.element_coords)
|
|
310
|
-
return
|
|
323
|
+
return wp.matrix_from_cols(v1, v2)
|
|
311
324
|
|
|
312
325
|
@wp.func
|
|
313
326
|
def side_inner_cell_index(arg: SideArg, side_index: ElementIndex):
|
|
@@ -327,7 +340,7 @@ class Hexmesh(Geometry):
|
|
|
327
340
|
)
|
|
328
341
|
|
|
329
342
|
normal_coord = hex_coords[_FACE_COORD_INDICES[face_index, 2]]
|
|
330
|
-
normal_coord = wp.
|
|
343
|
+
normal_coord = wp.where(_FACE_COORD_INDICES[face_index, 3] == 0, -normal_coord, normal_coord - 1.0)
|
|
331
344
|
|
|
332
345
|
return face_coords, normal_coord
|
|
333
346
|
|
|
@@ -338,7 +351,7 @@ class Hexmesh(Geometry):
|
|
|
338
351
|
hex_coords = Coords()
|
|
339
352
|
hex_coords[_FACE_COORD_INDICES[face_index, 0]] = face_coords[0]
|
|
340
353
|
hex_coords[_FACE_COORD_INDICES[face_index, 1]] = face_coords[1]
|
|
341
|
-
hex_coords[_FACE_COORD_INDICES[face_index, 2]] = wp.
|
|
354
|
+
hex_coords[_FACE_COORD_INDICES[face_index, 2]] = wp.where(_FACE_COORD_INDICES[face_index, 3] == 0, 0.0, 1.0)
|
|
342
355
|
|
|
343
356
|
return hex_coords
|
|
344
357
|
|
|
@@ -387,8 +400,8 @@ class Hexmesh(Geometry):
|
|
|
387
400
|
face_orientation = args.face_hex_face_orientation[side_index][3]
|
|
388
401
|
|
|
389
402
|
face_coords, normal_coord = Hexmesh._hex_local_face_coords(hex_coords, local_face_index)
|
|
390
|
-
return wp.
|
|
391
|
-
normal_coord == 0.0,
|
|
403
|
+
return wp.where(
|
|
404
|
+
normal_coord == 0.0, Hexmesh._local_to_oriented_face_coords(face_orientation, face_coords), Coords(OUTSIDE)
|
|
392
405
|
)
|
|
393
406
|
|
|
394
407
|
@wp.func
|
warp/fem/geometry/nanogrid.py
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
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
|
+
|
|
1
16
|
from typing import Optional
|
|
2
17
|
|
|
3
18
|
import numpy as np
|
|
@@ -18,13 +33,11 @@ FACE_AXIS_MASK = wp.constant(wp.uint8((1 << 2) - 1))
|
|
|
18
33
|
FACE_INNER_OFFSET_BIT = wp.constant(wp.uint8(2))
|
|
19
34
|
FACE_OUTER_OFFSET_BIT = wp.constant(wp.uint8(3))
|
|
20
35
|
|
|
21
|
-
_mat32 = wp.mat(shape=(3, 2), dtype=float)
|
|
22
|
-
|
|
23
36
|
|
|
24
37
|
@wp.func
|
|
25
38
|
def _add_axis_flag(ijk: wp.vec3i, axis: int):
|
|
26
39
|
coord = ijk[axis]
|
|
27
|
-
ijk[axis] = wp.
|
|
40
|
+
ijk[axis] = wp.where(coord < 0, coord & (~GRID_AXIS_FLAG), coord | GRID_AXIS_FLAG)
|
|
28
41
|
return ijk
|
|
29
42
|
|
|
30
43
|
|
|
@@ -176,9 +189,9 @@ class Nanogrid(Geometry):
|
|
|
176
189
|
coords = uvw - wp.vec3(ijk)
|
|
177
190
|
if cell_index == -1:
|
|
178
191
|
if wp.min(coords) == 0.0 or wp.max(coords) == 1.0:
|
|
179
|
-
il = wp.
|
|
180
|
-
jl = wp.
|
|
181
|
-
kl = wp.
|
|
192
|
+
il = wp.where(coords[0] > 0.5, 0, -1)
|
|
193
|
+
jl = wp.where(coords[1] > 0.5, 0, -1)
|
|
194
|
+
kl = wp.where(coords[2] > 0.5, 0, -1)
|
|
182
195
|
|
|
183
196
|
for n in range(8):
|
|
184
197
|
ni = n >> 2
|
|
@@ -312,7 +325,7 @@ class Nanogrid(Geometry):
|
|
|
312
325
|
axis = Nanogrid._get_face_axis(flags)
|
|
313
326
|
flip = Nanogrid._get_face_inner_offset(flags)
|
|
314
327
|
v1, v2 = Nanogrid._face_tangent_vecs(args.cell_arg.cell_grid, axis, flip)
|
|
315
|
-
return
|
|
328
|
+
return wp.matrix_from_cols(v1, v2)
|
|
316
329
|
|
|
317
330
|
@wp.func
|
|
318
331
|
def side_inner_inverse_deformation_gradient(args: SideArg, s: Sample):
|
|
@@ -394,8 +407,8 @@ class Nanogrid(Geometry):
|
|
|
394
407
|
|
|
395
408
|
on_side = float(side_ijk[axis] - cell_ijk[axis]) == element_coords[axis]
|
|
396
409
|
|
|
397
|
-
return wp.
|
|
398
|
-
on_side, Coords(
|
|
410
|
+
return wp.where(
|
|
411
|
+
on_side, Coords(element_coords[(axis + 1) % 3], element_coords[(axis + 2) % 3], 0.0), Coords(OUTSIDE)
|
|
399
412
|
)
|
|
400
413
|
|
|
401
414
|
@wp.func
|
|
@@ -523,8 +536,8 @@ def _build_edge_grid(cell_ijk, grid: wp.Volume, temporary_store: cache.Temporary
|
|
|
523
536
|
|
|
524
537
|
@wp.func
|
|
525
538
|
def _make_face_flags(axis: int, plus_cell_index: int, minus_cell_index: int):
|
|
526
|
-
plus_boundary = wp.uint8(wp.
|
|
527
|
-
minus_boundary = wp.uint8(wp.
|
|
539
|
+
plus_boundary = wp.uint8(wp.where(plus_cell_index == -1, 1, 0)) << FACE_OUTER_OFFSET_BIT
|
|
540
|
+
minus_boundary = wp.uint8(wp.where(minus_cell_index == -1, 1, 0)) << FACE_INNER_OFFSET_BIT
|
|
528
541
|
|
|
529
542
|
return wp.uint8(axis) | plus_boundary | minus_boundary
|
|
530
543
|
|
warp/fem/geometry/partition.py
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
1
16
|
from typing import Any
|
|
2
17
|
|
|
3
18
|
import warp as wp
|
warp/fem/geometry/quadmesh.py
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
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
|
+
|
|
1
16
|
from typing import Optional
|
|
2
17
|
|
|
3
18
|
import warp as wp
|
|
@@ -150,13 +165,13 @@ class Quadmesh(Geometry):
|
|
|
150
165
|
s = side_coords[0]
|
|
151
166
|
|
|
152
167
|
if vs == quad_vidx[0]:
|
|
153
|
-
return wp.
|
|
168
|
+
return wp.where(ve == quad_vidx[1], Coords(s, 0.0, 0.0), Coords(0.0, s, 0.0))
|
|
154
169
|
elif vs == quad_vidx[1]:
|
|
155
|
-
return wp.
|
|
170
|
+
return wp.where(ve == quad_vidx[2], Coords(1.0, s, 0.0), Coords(1.0 - s, 0.0, 0.0))
|
|
156
171
|
elif vs == quad_vidx[2]:
|
|
157
|
-
return wp.
|
|
172
|
+
return wp.where(ve == quad_vidx[3], Coords(1.0 - s, 1.0, 0.0), Coords(1.0, 1.0 - s, 0.0))
|
|
158
173
|
|
|
159
|
-
return wp.
|
|
174
|
+
return wp.where(ve == quad_vidx[0], Coords(0.0, 1.0 - s, 0.0), Coords(s, 1.0, 0.0))
|
|
160
175
|
|
|
161
176
|
@wp.func
|
|
162
177
|
def _quad_to_edge_coords(
|
|
@@ -175,18 +190,18 @@ class Quadmesh(Geometry):
|
|
|
175
190
|
cy = quad_coords[1]
|
|
176
191
|
|
|
177
192
|
if vs == quad_vidx[0]:
|
|
178
|
-
oc = wp.
|
|
179
|
-
ec = wp.
|
|
193
|
+
oc = wp.where(ve == quad_vidx[1], cy, cx)
|
|
194
|
+
ec = wp.where(ve == quad_vidx[1], cx, cy)
|
|
180
195
|
elif vs == quad_vidx[1]:
|
|
181
|
-
oc = wp.
|
|
182
|
-
ec = wp.
|
|
196
|
+
oc = wp.where(ve == quad_vidx[2], 1.0 - cx, cy)
|
|
197
|
+
ec = wp.where(ve == quad_vidx[2], cy, 1.0 - cx)
|
|
183
198
|
elif vs == quad_vidx[2]:
|
|
184
|
-
oc = wp.
|
|
185
|
-
ec = wp.
|
|
199
|
+
oc = wp.where(ve == quad_vidx[3], 1.0 - cy, 1.0 - cx)
|
|
200
|
+
ec = wp.where(ve == quad_vidx[3], 1.0 - cx, 1.0 - cy)
|
|
186
201
|
else:
|
|
187
|
-
oc = wp.
|
|
188
|
-
ec = wp.
|
|
189
|
-
return wp.
|
|
202
|
+
oc = wp.where(ve == quad_vidx[0], cx, 1.0 - cy)
|
|
203
|
+
ec = wp.where(ve == quad_vidx[0], 1.0 - cy, cx)
|
|
204
|
+
return wp.where(oc == 0.0, Coords(ec, 0.0, 0.0), Coords(OUTSIDE))
|
|
190
205
|
|
|
191
206
|
@wp.func
|
|
192
207
|
def boundary_side_index(args: SideIndexArg, boundary_side_index: int):
|