warp-lang 1.9.0__py3-none-win_amd64.whl → 1.10.0rc2__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 +301 -287
- warp/__init__.pyi +2220 -313
- warp/_src/__init__.py +14 -0
- warp/_src/autograd.py +1075 -0
- warp/_src/build.py +618 -0
- warp/_src/build_dll.py +640 -0
- warp/{builtins.py → _src/builtins.py} +1497 -226
- warp/_src/codegen.py +4359 -0
- warp/{config.py → _src/config.py} +178 -169
- warp/_src/constants.py +57 -0
- warp/_src/context.py +8294 -0
- warp/_src/dlpack.py +462 -0
- warp/_src/fabric.py +355 -0
- warp/_src/fem/__init__.py +14 -0
- warp/_src/fem/adaptivity.py +508 -0
- warp/_src/fem/cache.py +687 -0
- warp/_src/fem/dirichlet.py +188 -0
- warp/{fem → _src/fem}/domain.py +40 -30
- warp/_src/fem/field/__init__.py +131 -0
- warp/_src/fem/field/field.py +701 -0
- warp/{fem → _src/fem}/field/nodal_field.py +30 -15
- warp/{fem → _src/fem}/field/restriction.py +1 -1
- warp/{fem → _src/fem}/field/virtual.py +53 -27
- warp/_src/fem/geometry/__init__.py +32 -0
- warp/{fem → _src/fem}/geometry/adaptive_nanogrid.py +77 -163
- warp/_src/fem/geometry/closest_point.py +97 -0
- warp/{fem → _src/fem}/geometry/deformed_geometry.py +14 -22
- warp/{fem → _src/fem}/geometry/element.py +32 -10
- warp/{fem → _src/fem}/geometry/geometry.py +48 -20
- warp/{fem → _src/fem}/geometry/grid_2d.py +12 -23
- warp/{fem → _src/fem}/geometry/grid_3d.py +12 -23
- warp/{fem → _src/fem}/geometry/hexmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/nanogrid.py +255 -248
- warp/{fem → _src/fem}/geometry/partition.py +121 -63
- warp/{fem → _src/fem}/geometry/quadmesh.py +26 -45
- warp/{fem → _src/fem}/geometry/tetmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/trimesh.py +26 -45
- warp/{fem → _src/fem}/integrate.py +164 -158
- warp/_src/fem/linalg.py +383 -0
- warp/_src/fem/operator.py +396 -0
- warp/_src/fem/polynomial.py +229 -0
- warp/{fem → _src/fem}/quadrature/pic_quadrature.py +15 -20
- warp/{fem → _src/fem}/quadrature/quadrature.py +95 -47
- warp/_src/fem/space/__init__.py +248 -0
- warp/{fem → _src/fem}/space/basis_function_space.py +20 -11
- warp/_src/fem/space/basis_space.py +679 -0
- warp/{fem → _src/fem}/space/dof_mapper.py +3 -3
- warp/{fem → _src/fem}/space/function_space.py +14 -13
- warp/{fem → _src/fem}/space/grid_2d_function_space.py +4 -7
- warp/{fem → _src/fem}/space/grid_3d_function_space.py +4 -4
- warp/{fem → _src/fem}/space/hexmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/nanogrid_function_space.py +3 -9
- warp/{fem → _src/fem}/space/partition.py +117 -60
- warp/{fem → _src/fem}/space/quadmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/restriction.py +66 -33
- warp/_src/fem/space/shape/__init__.py +152 -0
- warp/{fem → _src/fem}/space/shape/cube_shape_function.py +9 -9
- warp/{fem → _src/fem}/space/shape/shape_function.py +8 -9
- warp/{fem → _src/fem}/space/shape/square_shape_function.py +6 -6
- warp/{fem → _src/fem}/space/shape/tet_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/shape/triangle_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/tetmesh_function_space.py +3 -9
- warp/_src/fem/space/topology.py +459 -0
- warp/{fem → _src/fem}/space/trimesh_function_space.py +3 -9
- warp/_src/fem/types.py +112 -0
- warp/_src/fem/utils.py +486 -0
- warp/_src/jax.py +186 -0
- warp/_src/jax_experimental/__init__.py +14 -0
- warp/_src/jax_experimental/custom_call.py +387 -0
- warp/_src/jax_experimental/ffi.py +1284 -0
- warp/_src/jax_experimental/xla_ffi.py +656 -0
- warp/_src/marching_cubes.py +708 -0
- warp/_src/math.py +414 -0
- warp/_src/optim/__init__.py +14 -0
- warp/_src/optim/adam.py +163 -0
- warp/_src/optim/linear.py +1606 -0
- warp/_src/optim/sgd.py +112 -0
- warp/_src/paddle.py +406 -0
- warp/_src/render/__init__.py +14 -0
- warp/_src/render/imgui_manager.py +289 -0
- warp/_src/render/render_opengl.py +3636 -0
- warp/_src/render/render_usd.py +937 -0
- warp/_src/render/utils.py +160 -0
- warp/_src/sparse.py +2716 -0
- warp/_src/tape.py +1206 -0
- warp/{thirdparty → _src/thirdparty}/unittest_parallel.py +9 -2
- warp/_src/torch.py +391 -0
- warp/_src/types.py +5870 -0
- warp/_src/utils.py +1693 -0
- warp/autograd.py +12 -1054
- warp/bin/warp-clang.dll +0 -0
- warp/bin/warp.dll +0 -0
- warp/build.py +8 -588
- warp/build_dll.py +6 -471
- warp/codegen.py +6 -4246
- warp/constants.py +6 -39
- warp/context.py +12 -7851
- warp/dlpack.py +6 -444
- warp/examples/distributed/example_jacobi_mpi.py +4 -5
- warp/examples/fem/example_adaptive_grid.py +1 -1
- warp/examples/fem/example_apic_fluid.py +1 -1
- warp/examples/fem/example_burgers.py +8 -8
- warp/examples/fem/example_diffusion.py +1 -1
- warp/examples/fem/example_distortion_energy.py +1 -1
- warp/examples/fem/example_mixed_elasticity.py +2 -2
- warp/examples/fem/example_navier_stokes.py +1 -1
- warp/examples/fem/example_nonconforming_contact.py +7 -7
- warp/examples/fem/example_stokes.py +1 -1
- warp/examples/fem/example_stokes_transfer.py +1 -1
- warp/examples/fem/utils.py +2 -2
- warp/examples/interop/example_jax_callable.py +1 -1
- warp/examples/interop/example_jax_ffi_callback.py +1 -1
- warp/examples/interop/example_jax_kernel.py +3 -2
- warp/examples/tile/example_tile_mcgp.py +191 -0
- warp/fabric.py +6 -337
- warp/fem/__init__.py +159 -97
- warp/fem/adaptivity.py +7 -489
- warp/fem/cache.py +9 -648
- warp/fem/dirichlet.py +6 -184
- warp/fem/field/__init__.py +8 -109
- warp/fem/field/field.py +7 -652
- warp/fem/geometry/__init__.py +7 -18
- warp/fem/geometry/closest_point.py +11 -77
- warp/fem/linalg.py +18 -366
- warp/fem/operator.py +11 -369
- warp/fem/polynomial.py +9 -209
- warp/fem/space/__init__.py +5 -211
- warp/fem/space/basis_space.py +6 -662
- warp/fem/space/shape/__init__.py +41 -118
- warp/fem/space/topology.py +6 -437
- warp/fem/types.py +6 -81
- warp/fem/utils.py +11 -444
- warp/jax.py +8 -165
- warp/jax_experimental/__init__.py +14 -1
- warp/jax_experimental/custom_call.py +8 -342
- warp/jax_experimental/ffi.py +17 -853
- warp/jax_experimental/xla_ffi.py +5 -596
- warp/marching_cubes.py +5 -689
- warp/math.py +16 -393
- warp/native/array.h +385 -37
- warp/native/builtin.h +316 -39
- warp/native/bvh.cpp +43 -9
- warp/native/bvh.cu +62 -27
- warp/native/bvh.h +310 -309
- warp/native/clang/clang.cpp +102 -97
- warp/native/coloring.cpp +0 -1
- warp/native/crt.h +208 -0
- warp/native/exports.h +156 -0
- warp/native/hashgrid.cu +2 -0
- warp/native/intersect.h +24 -1
- warp/native/intersect_tri.h +44 -35
- warp/native/mat.h +1456 -276
- warp/native/mesh.cpp +4 -4
- warp/native/mesh.cu +4 -2
- warp/native/mesh.h +176 -61
- warp/native/quat.h +0 -52
- warp/native/scan.cu +2 -0
- warp/native/sort.cu +22 -13
- warp/native/sort.h +2 -0
- warp/native/sparse.cu +7 -3
- warp/native/spatial.h +12 -0
- warp/native/tile.h +837 -70
- warp/native/tile_radix_sort.h +1 -1
- warp/native/tile_reduce.h +394 -46
- warp/native/tile_scan.h +4 -4
- warp/native/vec.h +469 -53
- warp/native/version.h +23 -0
- warp/native/volume.cpp +1 -1
- warp/native/volume.cu +1 -0
- warp/native/volume.h +1 -1
- warp/native/volume_builder.cu +2 -0
- warp/native/warp.cpp +60 -32
- warp/native/warp.cu +313 -201
- warp/native/warp.h +14 -11
- warp/optim/__init__.py +6 -3
- warp/optim/adam.py +6 -145
- warp/optim/linear.py +14 -1585
- warp/optim/sgd.py +6 -94
- warp/paddle.py +6 -388
- warp/render/__init__.py +8 -4
- warp/render/imgui_manager.py +7 -267
- warp/render/render_opengl.py +6 -3616
- warp/render/render_usd.py +6 -918
- warp/render/utils.py +6 -142
- warp/sparse.py +37 -2563
- warp/tape.py +6 -1188
- warp/tests/__main__.py +1 -1
- warp/tests/cuda/test_async.py +4 -4
- warp/tests/cuda/test_conditional_captures.py +1 -1
- warp/tests/cuda/test_multigpu.py +1 -1
- warp/tests/cuda/test_streams.py +58 -1
- warp/tests/geometry/test_bvh.py +157 -22
- warp/tests/geometry/test_hash_grid.py +38 -0
- warp/tests/geometry/test_marching_cubes.py +0 -1
- warp/tests/geometry/test_mesh.py +5 -3
- warp/tests/geometry/test_mesh_query_aabb.py +5 -12
- warp/tests/geometry/test_mesh_query_point.py +5 -2
- warp/tests/geometry/test_mesh_query_ray.py +15 -3
- warp/tests/geometry/test_volume_write.py +5 -5
- warp/tests/interop/test_dlpack.py +14 -14
- warp/tests/interop/test_jax.py +1382 -79
- warp/tests/interop/test_paddle.py +1 -1
- warp/tests/test_adam.py +0 -1
- warp/tests/test_arithmetic.py +9 -9
- warp/tests/test_array.py +529 -100
- warp/tests/test_array_reduce.py +3 -3
- warp/tests/test_atomic.py +12 -8
- warp/tests/test_atomic_bitwise.py +209 -0
- warp/tests/test_atomic_cas.py +4 -4
- warp/tests/test_bool.py +2 -2
- warp/tests/test_builtins_resolution.py +5 -571
- warp/tests/test_codegen.py +34 -15
- warp/tests/test_conditional.py +1 -1
- warp/tests/test_context.py +6 -6
- warp/tests/test_copy.py +242 -161
- warp/tests/test_ctypes.py +3 -3
- warp/tests/test_devices.py +24 -2
- warp/tests/test_examples.py +16 -84
- warp/tests/test_fabricarray.py +35 -35
- warp/tests/test_fast_math.py +0 -2
- warp/tests/test_fem.py +60 -14
- warp/tests/test_fixedarray.py +3 -3
- warp/tests/test_func.py +8 -5
- warp/tests/test_generics.py +1 -1
- warp/tests/test_indexedarray.py +24 -24
- warp/tests/test_intersect.py +39 -9
- warp/tests/test_large.py +1 -1
- warp/tests/test_lerp.py +3 -1
- warp/tests/test_linear_solvers.py +1 -1
- warp/tests/test_map.py +49 -4
- warp/tests/test_mat.py +52 -62
- warp/tests/test_mat_constructors.py +4 -5
- warp/tests/test_mat_lite.py +1 -1
- warp/tests/test_mat_scalar_ops.py +121 -121
- warp/tests/test_math.py +34 -0
- warp/tests/test_module_aot.py +4 -4
- warp/tests/test_modules_lite.py +28 -2
- warp/tests/test_print.py +11 -11
- warp/tests/test_quat.py +93 -58
- warp/tests/test_runlength_encode.py +1 -1
- warp/tests/test_scalar_ops.py +38 -10
- warp/tests/test_smoothstep.py +1 -1
- warp/tests/test_sparse.py +126 -15
- warp/tests/test_spatial.py +105 -87
- warp/tests/test_special_values.py +6 -6
- warp/tests/test_static.py +7 -7
- warp/tests/test_struct.py +13 -2
- warp/tests/test_triangle_closest_point.py +48 -1
- warp/tests/test_tuple.py +96 -0
- warp/tests/test_types.py +82 -9
- warp/tests/test_utils.py +52 -52
- warp/tests/test_vec.py +29 -29
- warp/tests/test_vec_constructors.py +5 -5
- warp/tests/test_vec_scalar_ops.py +97 -97
- warp/tests/test_version.py +75 -0
- warp/tests/tile/test_tile.py +239 -0
- warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
- warp/tests/tile/test_tile_cholesky.py +7 -4
- warp/tests/tile/test_tile_load.py +26 -2
- warp/tests/tile/test_tile_mathdx.py +3 -3
- warp/tests/tile/test_tile_matmul.py +1 -1
- warp/tests/tile/test_tile_mlp.py +2 -4
- warp/tests/tile/test_tile_reduce.py +214 -13
- warp/tests/unittest_suites.py +6 -14
- warp/tests/unittest_utils.py +10 -9
- warp/tests/walkthrough_debug.py +3 -1
- warp/torch.py +6 -373
- warp/types.py +29 -5750
- warp/utils.py +10 -1659
- {warp_lang-1.9.0.dist-info → warp_lang-1.10.0rc2.dist-info}/METADATA +47 -103
- warp_lang-1.10.0rc2.dist-info/RECORD +468 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
- warp/examples/assets/cartpole.urdf +0 -110
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/nv_ant.xml +0 -92
- warp/examples/assets/nv_humanoid.xml +0 -183
- warp/examples/assets/quadruped.urdf +0 -268
- warp/examples/optim/example_bounce.py +0 -266
- warp/examples/optim/example_cloth_throw.py +0 -228
- warp/examples/optim/example_drone.py +0 -870
- warp/examples/optim/example_inverse_kinematics.py +0 -182
- warp/examples/optim/example_inverse_kinematics_torch.py +0 -191
- warp/examples/optim/example_softbody_properties.py +0 -400
- warp/examples/optim/example_spring_cage.py +0 -245
- warp/examples/optim/example_trajectory.py +0 -227
- warp/examples/sim/example_cartpole.py +0 -143
- warp/examples/sim/example_cloth.py +0 -225
- warp/examples/sim/example_cloth_self_contact.py +0 -316
- warp/examples/sim/example_granular.py +0 -130
- warp/examples/sim/example_granular_collision_sdf.py +0 -202
- warp/examples/sim/example_jacobian_ik.py +0 -244
- warp/examples/sim/example_particle_chain.py +0 -124
- warp/examples/sim/example_quadruped.py +0 -203
- warp/examples/sim/example_rigid_chain.py +0 -203
- warp/examples/sim/example_rigid_contact.py +0 -195
- warp/examples/sim/example_rigid_force.py +0 -133
- warp/examples/sim/example_rigid_gyroscopic.py +0 -115
- warp/examples/sim/example_rigid_soft_contact.py +0 -140
- warp/examples/sim/example_soft_body.py +0 -196
- warp/examples/tile/example_tile_walker.py +0 -327
- warp/sim/__init__.py +0 -74
- warp/sim/articulation.py +0 -793
- warp/sim/collide.py +0 -2570
- warp/sim/graph_coloring.py +0 -307
- warp/sim/import_mjcf.py +0 -791
- warp/sim/import_snu.py +0 -227
- warp/sim/import_urdf.py +0 -579
- warp/sim/import_usd.py +0 -898
- warp/sim/inertia.py +0 -357
- warp/sim/integrator.py +0 -245
- warp/sim/integrator_euler.py +0 -2000
- warp/sim/integrator_featherstone.py +0 -2101
- warp/sim/integrator_vbd.py +0 -2487
- warp/sim/integrator_xpbd.py +0 -3295
- warp/sim/model.py +0 -4821
- warp/sim/particles.py +0 -121
- warp/sim/render.py +0 -431
- warp/sim/utils.py +0 -431
- warp/tests/sim/disabled_kinematics.py +0 -244
- warp/tests/sim/test_cloth.py +0 -863
- warp/tests/sim/test_collision.py +0 -743
- warp/tests/sim/test_coloring.py +0 -347
- warp/tests/sim/test_inertia.py +0 -161
- warp/tests/sim/test_model.py +0 -226
- warp/tests/sim/test_sim_grad.py +0 -287
- warp/tests/sim/test_sim_grad_bounce_linear.py +0 -212
- warp/tests/sim/test_sim_kinematics.py +0 -98
- warp/thirdparty/__init__.py +0 -0
- warp_lang-1.9.0.dist-info/RECORD +0 -456
- /warp/{fem → _src/fem}/quadrature/__init__.py +0 -0
- /warp/{tests/sim → _src/thirdparty}/__init__.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/appdirs.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/dlpack.py +0 -0
- {warp_lang-1.9.0.dist-info → warp_lang-1.10.0rc2.dist-info}/WHEEL +0 -0
- {warp_lang-1.9.0.dist-info → warp_lang-1.10.0rc2.dist-info}/licenses/LICENSE.md +0 -0
- {warp_lang-1.9.0.dist-info → warp_lang-1.10.0rc2.dist-info}/top_level.txt +0 -0
|
@@ -15,22 +15,11 @@
|
|
|
15
15
|
|
|
16
16
|
from typing import Optional
|
|
17
17
|
|
|
18
|
-
import numpy as np
|
|
19
|
-
|
|
20
18
|
import warp as wp
|
|
21
|
-
from warp.fem import cache, utils
|
|
22
|
-
from warp.fem.types import OUTSIDE, Coords, ElementIndex, Sample, make_free_sample
|
|
23
|
-
|
|
24
|
-
from .
|
|
25
|
-
from .geometry import Geometry
|
|
26
|
-
from .nanogrid import (
|
|
27
|
-
Nanogrid,
|
|
28
|
-
_add_axis_flag,
|
|
29
|
-
_build_node_grid,
|
|
30
|
-
_extract_axis_flag,
|
|
31
|
-
_get_boundary_mask,
|
|
32
|
-
_make_face_flags,
|
|
33
|
-
)
|
|
19
|
+
from warp._src.fem import cache, utils
|
|
20
|
+
from warp._src.fem.types import OUTSIDE, Coords, ElementIndex, Sample, make_free_sample
|
|
21
|
+
|
|
22
|
+
from .nanogrid import NanogridBase
|
|
34
23
|
|
|
35
24
|
_FACE_LEVEL_BIT = wp.constant(wp.uint8(4)) # follows nanogrid.FACE_OUTER_OFFSET_BIT
|
|
36
25
|
_GRID_LEVEL_BIT = wp.constant(wp.int32(19)) # follows nanogrid.GRID_AXIS_FLAG
|
|
@@ -57,7 +46,7 @@ class AdaptiveNanogridSideArg:
|
|
|
57
46
|
face_areas: wp.vec3
|
|
58
47
|
|
|
59
48
|
|
|
60
|
-
class AdaptiveNanogrid(
|
|
49
|
+
class AdaptiveNanogrid(NanogridBase):
|
|
61
50
|
"""Adaptive sparse grid"""
|
|
62
51
|
|
|
63
52
|
dimension = 3
|
|
@@ -86,61 +75,24 @@ class AdaptiveNanogrid(Geometry):
|
|
|
86
75
|
raise ValueError("Too many refinement levels, max 8 supported")
|
|
87
76
|
|
|
88
77
|
self.level_count = level_count
|
|
89
|
-
self._cell_grid = cell_grid
|
|
90
78
|
self._cell_level = cell_level
|
|
91
79
|
|
|
92
|
-
device =
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
self._cell_grid_info = self._cell_grid.get_grid_info()
|
|
80
|
+
device = cell_grid.device
|
|
81
|
+
cell_ijk = wp.array(dtype=wp.vec3i, shape=(cell_grid.get_voxel_count(),), device=device)
|
|
82
|
+
cell_grid.get_voxels(out=cell_ijk)
|
|
96
83
|
|
|
97
|
-
|
|
98
|
-
node_count =
|
|
99
|
-
|
|
100
|
-
|
|
84
|
+
node_grid = _build_node_grid(cell_ijk, cell_level, cell_grid, temporary_store)
|
|
85
|
+
node_count = node_grid.get_voxel_count()
|
|
86
|
+
node_ijk = wp.array(shape=(node_count,), dtype=wp.vec3i, device=device)
|
|
87
|
+
node_grid.get_voxels(out=node_ijk)
|
|
101
88
|
|
|
102
|
-
|
|
103
|
-
self._face_ijk = None
|
|
89
|
+
super().__init__(cell_grid, cell_ijk, node_grid, node_ijk)
|
|
104
90
|
|
|
105
91
|
self._stacked_edge_grid = None
|
|
106
92
|
self._stacked_edge_count = 0
|
|
107
93
|
self._stacked_face_grid = None
|
|
108
94
|
self._stacked_face_count = 0
|
|
109
95
|
|
|
110
|
-
transform = self.transform
|
|
111
|
-
self._inverse_transform = wp.mat33f(np.linalg.inv(transform))
|
|
112
|
-
self._cell_volume = abs(np.linalg.det(transform))
|
|
113
|
-
self._face_areas = wp.vec3(
|
|
114
|
-
tuple(np.linalg.norm(np.cross(transform[:, k - 2], transform[:, k - 1])) for k in range(3))
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
@property
|
|
118
|
-
def cell_grid(self) -> wp.Volume:
|
|
119
|
-
return self._cell_grid
|
|
120
|
-
|
|
121
|
-
@property
|
|
122
|
-
def vertex_grid(self) -> wp.Volume:
|
|
123
|
-
return self._node_grid
|
|
124
|
-
|
|
125
|
-
@property
|
|
126
|
-
def face_grid(self) -> wp.Volume:
|
|
127
|
-
self._ensure_face_grid()
|
|
128
|
-
return self._face_grid
|
|
129
|
-
|
|
130
|
-
def cell_count(self):
|
|
131
|
-
return self._cell_ijk.shape[0]
|
|
132
|
-
|
|
133
|
-
def vertex_count(self):
|
|
134
|
-
return self._node_ijk.shape[0]
|
|
135
|
-
|
|
136
|
-
def side_count(self):
|
|
137
|
-
self._ensure_face_grid()
|
|
138
|
-
return self._face_ijk.shape[0]
|
|
139
|
-
|
|
140
|
-
def boundary_side_count(self):
|
|
141
|
-
self._ensure_face_grid()
|
|
142
|
-
return self._boundary_face_indices.shape[0]
|
|
143
|
-
|
|
144
96
|
@property
|
|
145
97
|
def stacked_face_grid(self) -> wp.Volume:
|
|
146
98
|
self._ensure_stacked_face_grid()
|
|
@@ -159,24 +111,8 @@ class AdaptiveNanogrid(Geometry):
|
|
|
159
111
|
self._ensure_stacked_edge_grid()
|
|
160
112
|
return self._stacked_edge_count
|
|
161
113
|
|
|
162
|
-
def reference_cell(self) -> Cube:
|
|
163
|
-
return Cube()
|
|
164
|
-
|
|
165
|
-
def reference_side(self) -> Square:
|
|
166
|
-
return Square()
|
|
167
|
-
|
|
168
|
-
@property
|
|
169
|
-
def transform(self):
|
|
170
|
-
return np.array(self._cell_grid_info.transform_matrix).reshape(3, 3)
|
|
171
|
-
|
|
172
114
|
CellArg = AdaptiveNanogridCellArg
|
|
173
115
|
|
|
174
|
-
@cache.cached_arg_value
|
|
175
|
-
def cell_arg_value(self, device) -> CellArg:
|
|
176
|
-
args = self.CellArg()
|
|
177
|
-
self.fill_cell_arg(args, device)
|
|
178
|
-
return args
|
|
179
|
-
|
|
180
116
|
def fill_cell_arg(self, arg: CellArg, device):
|
|
181
117
|
arg.cell_grid = self._cell_grid.id
|
|
182
118
|
arg.cell_ijk = self._cell_ijk
|
|
@@ -242,9 +178,6 @@ class AdaptiveNanogrid(Geometry):
|
|
|
242
178
|
dist, coords = AdaptiveNanogrid._cell_closest_point_local(args, cell_index, uvw)
|
|
243
179
|
return coords, dist
|
|
244
180
|
|
|
245
|
-
def make_filtered_cell_lookup(self, filter_func: wp.Function = None):
|
|
246
|
-
return Nanogrid._make_filtered_cell_lookup(self, filter_func)
|
|
247
|
-
|
|
248
181
|
@wp.func
|
|
249
182
|
def cell_measure(args: CellArg, s: Sample):
|
|
250
183
|
scale = AdaptiveNanogrid._cell_scale(args, s.element_index)
|
|
@@ -254,23 +187,12 @@ class AdaptiveNanogrid(Geometry):
|
|
|
254
187
|
def cell_normal(args: CellArg, s: Sample):
|
|
255
188
|
return wp.vec3(0.0)
|
|
256
189
|
|
|
257
|
-
SideIndexArg = Nanogrid.SideIndexArg
|
|
258
|
-
side_index_arg_value = Nanogrid.side_index_arg_value
|
|
259
|
-
fill_side_index_arg = Nanogrid.fill_side_index_arg
|
|
260
|
-
|
|
261
190
|
SideArg = AdaptiveNanogridSideArg
|
|
262
191
|
|
|
263
192
|
@wp.func
|
|
264
193
|
def side_to_cell_arg(side_arg: SideArg):
|
|
265
194
|
return side_arg.cell_arg
|
|
266
195
|
|
|
267
|
-
@cache.cached_arg_value
|
|
268
|
-
def side_arg_value(self, device) -> SideArg:
|
|
269
|
-
args = self.SideArg()
|
|
270
|
-
self.fill_side_arg(args, device)
|
|
271
|
-
|
|
272
|
-
return args
|
|
273
|
-
|
|
274
196
|
def fill_side_arg(self, arg: SideArg, device):
|
|
275
197
|
self._ensure_face_grid()
|
|
276
198
|
|
|
@@ -280,10 +202,6 @@ class AdaptiveNanogrid(Geometry):
|
|
|
280
202
|
arg.face_cell_indices = self._face_cell_indices.to(device)
|
|
281
203
|
arg.face_areas = self._face_areas
|
|
282
204
|
|
|
283
|
-
@wp.func
|
|
284
|
-
def boundary_side_index(args: SideIndexArg, boundary_side_index: int):
|
|
285
|
-
return args.boundary_face_indices[boundary_side_index]
|
|
286
|
-
|
|
287
205
|
@wp.func
|
|
288
206
|
def _get_face_level(flags: wp.uint8):
|
|
289
207
|
return wp.int32(flags >> _FACE_LEVEL_BIT)
|
|
@@ -296,11 +214,11 @@ class AdaptiveNanogrid(Geometry):
|
|
|
296
214
|
def side_position(args: SideArg, s: Sample):
|
|
297
215
|
ijk = args.face_ijk[s.element_index]
|
|
298
216
|
flags = args.face_flags[s.element_index]
|
|
299
|
-
axis =
|
|
300
|
-
flip =
|
|
217
|
+
axis = NanogridBase._get_face_axis(flags)
|
|
218
|
+
flip = NanogridBase._get_face_inner_offset(flags)
|
|
301
219
|
scale = AdaptiveNanogrid._get_face_scale(flags)
|
|
302
220
|
|
|
303
|
-
uvw = wp.vec3(ijk) + scale *
|
|
221
|
+
uvw = wp.vec3(ijk) + scale * NanogridBase._side_to_cell_coords(axis, flip, 0.0, s.element_coords)
|
|
304
222
|
|
|
305
223
|
cell_grid = args.cell_arg.cell_grid
|
|
306
224
|
return wp.volume_index_to_world(cell_grid, uvw - wp.vec3(0.5))
|
|
@@ -308,10 +226,10 @@ class AdaptiveNanogrid(Geometry):
|
|
|
308
226
|
@wp.func
|
|
309
227
|
def side_deformation_gradient(args: SideArg, s: Sample):
|
|
310
228
|
flags = args.face_flags[s.element_index]
|
|
311
|
-
axis =
|
|
312
|
-
flip =
|
|
229
|
+
axis = NanogridBase._get_face_axis(flags)
|
|
230
|
+
flip = NanogridBase._get_face_inner_offset(flags)
|
|
313
231
|
scale = AdaptiveNanogrid._get_face_scale(flags)
|
|
314
|
-
v1, v2 =
|
|
232
|
+
v1, v2 = NanogridBase._face_tangent_vecs(args.cell_arg.cell_grid, axis, flip)
|
|
315
233
|
return wp.matrix_from_cols(v1, v2) * scale
|
|
316
234
|
|
|
317
235
|
@wp.func
|
|
@@ -327,24 +245,24 @@ class AdaptiveNanogrid(Geometry):
|
|
|
327
245
|
@wp.func
|
|
328
246
|
def side_measure(args: SideArg, s: Sample):
|
|
329
247
|
flags = args.face_flags[s.element_index]
|
|
330
|
-
axis =
|
|
248
|
+
axis = NanogridBase._get_face_axis(flags)
|
|
331
249
|
scale = AdaptiveNanogrid._get_face_scale(flags)
|
|
332
250
|
return args.face_areas[axis] * scale * scale
|
|
333
251
|
|
|
334
252
|
@wp.func
|
|
335
253
|
def side_measure_ratio(args: SideArg, s: Sample):
|
|
336
254
|
flags = args.face_flags[s.element_index]
|
|
337
|
-
axis =
|
|
255
|
+
axis = NanogridBase._get_face_axis(flags)
|
|
338
256
|
scale = AdaptiveNanogrid._get_face_scale(flags)
|
|
339
257
|
return args.face_areas[axis] / (args.cell_arg.cell_volume * scale)
|
|
340
258
|
|
|
341
259
|
@wp.func
|
|
342
260
|
def side_normal(args: SideArg, s: Sample):
|
|
343
261
|
flags = args.face_flags[s.element_index]
|
|
344
|
-
axis =
|
|
345
|
-
flip =
|
|
262
|
+
axis = NanogridBase._get_face_axis(flags)
|
|
263
|
+
flip = NanogridBase._get_face_inner_offset(flags)
|
|
346
264
|
|
|
347
|
-
v1, v2 =
|
|
265
|
+
v1, v2 = NanogridBase._face_tangent_vecs(args.cell_arg.cell_grid, axis, flip)
|
|
348
266
|
return wp.cross(v1, v2) / args.face_areas[axis]
|
|
349
267
|
|
|
350
268
|
@wp.func
|
|
@@ -368,11 +286,11 @@ class AdaptiveNanogrid(Geometry):
|
|
|
368
286
|
@wp.func
|
|
369
287
|
def side_inner_cell_coords(args: SideArg, side_index: ElementIndex, side_coords: Coords):
|
|
370
288
|
flags = args.face_flags[side_index]
|
|
371
|
-
axis =
|
|
372
|
-
flip =
|
|
373
|
-
offset =
|
|
289
|
+
axis = NanogridBase._get_face_axis(flags)
|
|
290
|
+
flip = NanogridBase._get_face_inner_offset(flags)
|
|
291
|
+
offset = NanogridBase._get_face_inner_offset(flags)
|
|
374
292
|
|
|
375
|
-
same_level_cell_coords =
|
|
293
|
+
same_level_cell_coords = NanogridBase._side_to_cell_coords(axis, flip, 1.0 - float(offset), side_coords)
|
|
376
294
|
same_level_cell_ijk = args.face_ijk[side_index]
|
|
377
295
|
side_level = AdaptiveNanogrid._get_face_level(flags)
|
|
378
296
|
same_level_cell_ijk[axis] += (offset - 1) << side_level
|
|
@@ -388,11 +306,11 @@ class AdaptiveNanogrid(Geometry):
|
|
|
388
306
|
@wp.func
|
|
389
307
|
def side_outer_cell_coords(args: SideArg, side_index: ElementIndex, side_coords: Coords):
|
|
390
308
|
flags = args.face_flags[side_index]
|
|
391
|
-
axis =
|
|
392
|
-
flip =
|
|
393
|
-
offset =
|
|
309
|
+
axis = NanogridBase._get_face_axis(flags)
|
|
310
|
+
flip = NanogridBase._get_face_inner_offset(flags)
|
|
311
|
+
offset = NanogridBase._get_face_outer_offset(flags)
|
|
394
312
|
|
|
395
|
-
same_level_cell_coords =
|
|
313
|
+
same_level_cell_coords = NanogridBase._side_to_cell_coords(axis, flip, float(offset), side_coords)
|
|
396
314
|
same_level_cell_ijk = args.face_ijk[side_index]
|
|
397
315
|
side_level = AdaptiveNanogrid._get_face_level(flags)
|
|
398
316
|
same_level_cell_ijk[axis] -= offset << side_level
|
|
@@ -413,8 +331,8 @@ class AdaptiveNanogrid(Geometry):
|
|
|
413
331
|
element_coords: Coords,
|
|
414
332
|
):
|
|
415
333
|
flags = args.face_flags[side_index]
|
|
416
|
-
axis =
|
|
417
|
-
flip =
|
|
334
|
+
axis = NanogridBase._get_face_axis(flags)
|
|
335
|
+
flip = NanogridBase._get_face_inner_offset(flags)
|
|
418
336
|
side_level = AdaptiveNanogrid._get_face_level(flags)
|
|
419
337
|
cell_level = int(args.cell_arg.cell_level[element_index])
|
|
420
338
|
|
|
@@ -431,7 +349,7 @@ class AdaptiveNanogrid(Geometry):
|
|
|
431
349
|
and wp.max(same_level_cell_coords) <= 1.0
|
|
432
350
|
)
|
|
433
351
|
|
|
434
|
-
return wp.where(on_side,
|
|
352
|
+
return wp.where(on_side, NanogridBase._cell_to_side_coords(axis, flip, same_level_cell_coords), Coords(OUTSIDE))
|
|
435
353
|
|
|
436
354
|
@wp.func
|
|
437
355
|
def side_coordinates(args: SideArg, side_index: int, pos: wp.vec3):
|
|
@@ -442,10 +360,10 @@ class AdaptiveNanogrid(Geometry):
|
|
|
442
360
|
|
|
443
361
|
flags = args.face_flags[side_index]
|
|
444
362
|
side_level = AdaptiveNanogrid._get_face_level(flags)
|
|
445
|
-
axis =
|
|
446
|
-
flip =
|
|
363
|
+
axis = NanogridBase._get_face_axis(flags)
|
|
364
|
+
flip = NanogridBase._get_face_inner_offset(flags)
|
|
447
365
|
|
|
448
|
-
return
|
|
366
|
+
return NanogridBase._cell_to_side_coords(axis, flip, fine_cell_coords / float(1 << side_level))
|
|
449
367
|
|
|
450
368
|
@wp.func
|
|
451
369
|
def side_closest_point(args: SideArg, side_index: int, pos: wp.vec3):
|
|
@@ -454,10 +372,12 @@ class AdaptiveNanogrid(Geometry):
|
|
|
454
372
|
proj_coords = Coords(wp.clamp(coords[0], 0.0, 1.0), wp.clamp(coords[1], 0.0, 1.0), 0.0)
|
|
455
373
|
|
|
456
374
|
flags = args.face_flags[side_index]
|
|
457
|
-
axis =
|
|
458
|
-
flip =
|
|
375
|
+
axis = NanogridBase._get_face_axis(flags)
|
|
376
|
+
flip = NanogridBase._get_face_inner_offset(flags)
|
|
459
377
|
side_level = AdaptiveNanogrid._get_face_level(flags)
|
|
460
|
-
cell_coord_offset =
|
|
378
|
+
cell_coord_offset = NanogridBase._side_to_cell_coords(axis, flip, 0, coords - proj_coords) * float(
|
|
379
|
+
1 << side_level
|
|
380
|
+
)
|
|
461
381
|
|
|
462
382
|
return proj_coords, wp.length_sq(wp.volume_index_to_world_dir(args.cell_grid, cell_coord_offset))
|
|
463
383
|
|
|
@@ -492,16 +412,12 @@ class AdaptiveNanogrid(Geometry):
|
|
|
492
412
|
self._face_ijk,
|
|
493
413
|
self._face_cell_indices,
|
|
494
414
|
self._face_flags,
|
|
495
|
-
boundary_face_mask
|
|
415
|
+
boundary_face_mask,
|
|
496
416
|
],
|
|
497
417
|
)
|
|
498
|
-
boundary_face_indices, _ = utils.masked_indices(boundary_face_mask
|
|
418
|
+
boundary_face_indices, _ = utils.masked_indices(boundary_face_mask)
|
|
499
419
|
self._boundary_face_indices = boundary_face_indices.detach()
|
|
500
420
|
|
|
501
|
-
def _ensure_face_grid(self):
|
|
502
|
-
if self._face_ijk is None:
|
|
503
|
-
self._build_face_grid()
|
|
504
|
-
|
|
505
421
|
def _ensure_stacked_edge_grid(self):
|
|
506
422
|
if self._stacked_edge_grid is None:
|
|
507
423
|
self._stacked_edge_grid = _build_stacked_edge_grid(
|
|
@@ -537,7 +453,7 @@ class AdaptiveNanogrid(Geometry):
|
|
|
537
453
|
level_flag = ((level >> ax) & 1) << _GRID_LEVEL_BIT
|
|
538
454
|
ijk[ax] = wp.where(coord < 0, coord & ~level_flag, coord | level_flag)
|
|
539
455
|
|
|
540
|
-
return _add_axis_flag(ijk, axis)
|
|
456
|
+
return NanogridBase._add_axis_flag(ijk, axis)
|
|
541
457
|
|
|
542
458
|
@wp.func
|
|
543
459
|
def find_cell(
|
|
@@ -576,15 +492,15 @@ def _cell_face_indices(
|
|
|
576
492
|
):
|
|
577
493
|
cell = wp.tid()
|
|
578
494
|
ijk = cell_ijk[cell]
|
|
579
|
-
node_ijk[cell, 0] = _add_axis_flag(ijk, 0)
|
|
580
|
-
node_ijk[cell, 1] = _add_axis_flag(ijk, 1)
|
|
581
|
-
node_ijk[cell, 2] = _add_axis_flag(ijk, 2)
|
|
495
|
+
node_ijk[cell, 0] = NanogridBase._add_axis_flag(ijk, 0)
|
|
496
|
+
node_ijk[cell, 1] = NanogridBase._add_axis_flag(ijk, 1)
|
|
497
|
+
node_ijk[cell, 2] = NanogridBase._add_axis_flag(ijk, 2)
|
|
582
498
|
|
|
583
499
|
offset = 1 << int(cell_level[cell])
|
|
584
500
|
|
|
585
|
-
node_ijk[cell, 3] = _add_axis_flag(ijk + wp.vec3i(offset, 0, 0), 0)
|
|
586
|
-
node_ijk[cell, 4] = _add_axis_flag(ijk + wp.vec3i(0, offset, 0), 1)
|
|
587
|
-
node_ijk[cell, 5] = _add_axis_flag(ijk + wp.vec3i(0, 0, offset), 2)
|
|
501
|
+
node_ijk[cell, 3] = NanogridBase._add_axis_flag(ijk + wp.vec3i(offset, 0, 0), 0)
|
|
502
|
+
node_ijk[cell, 4] = NanogridBase._add_axis_flag(ijk + wp.vec3i(0, offset, 0), 1)
|
|
503
|
+
node_ijk[cell, 5] = NanogridBase._add_axis_flag(ijk + wp.vec3i(0, 0, offset), 2)
|
|
588
504
|
|
|
589
505
|
|
|
590
506
|
@wp.kernel
|
|
@@ -640,12 +556,12 @@ def _build_node_grid(cell_ijk, cell_level, cell_grid: wp.Volume, temporary_store
|
|
|
640
556
|
cell_nodes = cache.borrow_temporary(temporary_store, shape=(cell_count, 8), dtype=wp.vec3i, device=cell_ijk.device)
|
|
641
557
|
wp.launch(
|
|
642
558
|
_cell_node_indices,
|
|
643
|
-
dim=cell_nodes.
|
|
644
|
-
inputs=[cell_ijk, cell_level, cell_nodes
|
|
559
|
+
dim=cell_nodes.shape,
|
|
560
|
+
inputs=[cell_ijk, cell_level, cell_nodes],
|
|
645
561
|
device=cell_ijk.device,
|
|
646
562
|
)
|
|
647
563
|
node_grid = wp.Volume.allocate_by_voxels(
|
|
648
|
-
cell_nodes.
|
|
564
|
+
cell_nodes.flatten(), voxel_size=cell_grid.get_voxel_size()[0], device=cell_ijk.device
|
|
649
565
|
)
|
|
650
566
|
|
|
651
567
|
return node_grid
|
|
@@ -655,11 +571,9 @@ def _build_cell_face_grid(cell_ijk, cell_level, grid: wp.Volume, temporary_store
|
|
|
655
571
|
cell_count = cell_ijk.shape[0]
|
|
656
572
|
|
|
657
573
|
cell_faces = cache.borrow_temporary(temporary_store, shape=(cell_count, 6), dtype=wp.vec3i, device=cell_ijk.device)
|
|
658
|
-
wp.launch(
|
|
659
|
-
_cell_face_indices, dim=cell_count, inputs=[cell_ijk, cell_level, cell_faces.array], device=cell_ijk.device
|
|
660
|
-
)
|
|
574
|
+
wp.launch(_cell_face_indices, dim=cell_count, inputs=[cell_ijk, cell_level, cell_faces], device=cell_ijk.device)
|
|
661
575
|
face_grid = wp.Volume.allocate_by_voxels(
|
|
662
|
-
cell_faces.
|
|
576
|
+
cell_faces.flatten(), voxel_size=grid.get_voxel_size()[0], device=cell_ijk.device
|
|
663
577
|
)
|
|
664
578
|
|
|
665
579
|
return face_grid
|
|
@@ -680,8 +594,8 @@ def _build_completed_face_grid(
|
|
|
680
594
|
additional_face_count = cache.borrow_temporary(temporary_store, shape=1, dtype=int, device=device)
|
|
681
595
|
|
|
682
596
|
# Count the number of supplemental faces we need to add at resolution boundaries
|
|
683
|
-
cell_face_grid.get_voxels(out=cell_face_ijk
|
|
684
|
-
additional_face_count.
|
|
597
|
+
cell_face_grid.get_voxels(out=cell_face_ijk)
|
|
598
|
+
additional_face_count.zero_()
|
|
685
599
|
wp.launch(
|
|
686
600
|
_count_multires_faces,
|
|
687
601
|
dim=cell_face_count,
|
|
@@ -690,15 +604,15 @@ def _build_completed_face_grid(
|
|
|
690
604
|
cell_grid.id,
|
|
691
605
|
level_count,
|
|
692
606
|
cell_level,
|
|
693
|
-
cell_face_ijk
|
|
694
|
-
additional_face_count
|
|
607
|
+
cell_face_ijk,
|
|
608
|
+
additional_face_count,
|
|
695
609
|
],
|
|
696
610
|
)
|
|
697
611
|
|
|
698
612
|
# Cat these new faces with the original ones
|
|
699
|
-
cat_face_count = cell_face_count + int(additional_face_count.
|
|
613
|
+
cat_face_count = cell_face_count + int(additional_face_count.numpy()[0])
|
|
700
614
|
cat_face_ijk = cache.borrow_temporary(temporary_store, shape=(cat_face_count,), dtype=wp.vec3i, device=device)
|
|
701
|
-
wp.copy(src=cell_face_ijk
|
|
615
|
+
wp.copy(src=cell_face_ijk, dest=cat_face_ijk, dest_offset=cat_face_count - cell_face_count)
|
|
702
616
|
|
|
703
617
|
wp.launch(
|
|
704
618
|
_fill_multires_faces,
|
|
@@ -708,15 +622,15 @@ def _build_completed_face_grid(
|
|
|
708
622
|
cell_grid.id,
|
|
709
623
|
level_count,
|
|
710
624
|
cell_level,
|
|
711
|
-
cell_face_ijk
|
|
712
|
-
additional_face_count
|
|
713
|
-
cat_face_ijk
|
|
625
|
+
cell_face_ijk,
|
|
626
|
+
additional_face_count,
|
|
627
|
+
cat_face_ijk,
|
|
714
628
|
],
|
|
715
629
|
)
|
|
716
630
|
|
|
717
631
|
# Now recreate a new grid with all those faces
|
|
718
632
|
face_grid = wp.Volume.allocate_by_voxels(
|
|
719
|
-
cat_face_ijk.
|
|
633
|
+
cat_face_ijk.flatten(), voxel_size=cell_face_grid.get_voxel_size(), device=device
|
|
720
634
|
)
|
|
721
635
|
|
|
722
636
|
return face_grid
|
|
@@ -729,11 +643,11 @@ def _build_stacked_face_grid(cell_ijk, cell_level, grid: wp.Volume, temporary_st
|
|
|
729
643
|
wp.launch(
|
|
730
644
|
_cell_stacked_face_indices,
|
|
731
645
|
dim=cell_count,
|
|
732
|
-
inputs=[cell_ijk, cell_level, cell_faces
|
|
646
|
+
inputs=[cell_ijk, cell_level, cell_faces],
|
|
733
647
|
device=cell_ijk.device,
|
|
734
648
|
)
|
|
735
649
|
face_grid = wp.Volume.allocate_by_voxels(
|
|
736
|
-
cell_faces.
|
|
650
|
+
cell_faces.flatten(), voxel_size=grid.get_voxel_size()[0], device=cell_ijk.device
|
|
737
651
|
)
|
|
738
652
|
|
|
739
653
|
return face_grid
|
|
@@ -746,11 +660,11 @@ def _build_stacked_edge_grid(cell_ijk, cell_level, grid: wp.Volume, temporary_st
|
|
|
746
660
|
wp.launch(
|
|
747
661
|
_cell_stacked_edge_indices,
|
|
748
662
|
dim=cell_count,
|
|
749
|
-
inputs=[cell_ijk, cell_level, cell_edges
|
|
663
|
+
inputs=[cell_ijk, cell_level, cell_edges],
|
|
750
664
|
device=cell_ijk.device,
|
|
751
665
|
)
|
|
752
666
|
edge_grid = wp.Volume.allocate_by_voxels(
|
|
753
|
-
cell_edges.
|
|
667
|
+
cell_edges.flatten(), voxel_size=grid.get_voxel_size()[0], device=cell_ijk.device
|
|
754
668
|
)
|
|
755
669
|
|
|
756
670
|
return edge_grid
|
|
@@ -782,7 +696,7 @@ def _count_multires_faces(
|
|
|
782
696
|
):
|
|
783
697
|
face = wp.tid()
|
|
784
698
|
|
|
785
|
-
axis, ijk = _extract_axis_flag(face_ijk[face])
|
|
699
|
+
axis, ijk = NanogridBase._extract_axis_flag(face_ijk[face])
|
|
786
700
|
|
|
787
701
|
plus_cell_index, minus_cell_index = _find_face_neighbours(cell_grid, ijk, axis, level_count, cell_level)
|
|
788
702
|
|
|
@@ -809,7 +723,7 @@ def _fill_multires_faces(
|
|
|
809
723
|
):
|
|
810
724
|
face = wp.tid()
|
|
811
725
|
|
|
812
|
-
axis, ijk = _extract_axis_flag(face_ijk[face])
|
|
726
|
+
axis, ijk = NanogridBase._extract_axis_flag(face_ijk[face])
|
|
813
727
|
plus_cell_index, minus_cell_index = _find_face_neighbours(cell_grid, ijk, axis, level_count, cell_level)
|
|
814
728
|
|
|
815
729
|
if plus_cell_index == -1 or minus_cell_index == -1:
|
|
@@ -834,7 +748,7 @@ def _fill_multires_faces(
|
|
|
834
748
|
f_ijk = base_ijk
|
|
835
749
|
f_ijk[(axis + 1) % 3] |= (f & side_mask) << fine_level
|
|
836
750
|
f_ijk[(axis + 2) % 3] |= (f >> level_diff) << fine_level
|
|
837
|
-
added_ijk[offset + f] = _add_axis_flag(f_ijk, axis)
|
|
751
|
+
added_ijk[offset + f] = NanogridBase._add_axis_flag(f_ijk, axis)
|
|
838
752
|
|
|
839
753
|
|
|
840
754
|
@wp.kernel
|
|
@@ -849,7 +763,7 @@ def _build_face_indices_and_flags(
|
|
|
849
763
|
):
|
|
850
764
|
face = wp.tid()
|
|
851
765
|
|
|
852
|
-
axis, ijk = _extract_axis_flag(face_ijk[face])
|
|
766
|
+
axis, ijk = NanogridBase._extract_axis_flag(face_ijk[face])
|
|
853
767
|
|
|
854
768
|
plus_cell_index, minus_cell_index = _find_face_neighbours(cell_grid, ijk, axis, level_count, cell_level)
|
|
855
769
|
|
|
@@ -859,8 +773,8 @@ def _build_face_indices_and_flags(
|
|
|
859
773
|
face_level = wp.min(cell_level[inner_cell], cell_level[outer_cell])
|
|
860
774
|
|
|
861
775
|
face_ijk[face] = ijk
|
|
862
|
-
flags = _make_face_flags(axis, plus_cell_index, minus_cell_index) | (face_level << _FACE_LEVEL_BIT)
|
|
776
|
+
flags = NanogridBase._make_face_flags(axis, plus_cell_index, minus_cell_index) | (face_level << _FACE_LEVEL_BIT)
|
|
863
777
|
face_flags[face] = flags
|
|
864
|
-
boundary_face_mask[face] = _get_boundary_mask(flags)
|
|
778
|
+
boundary_face_mask[face] = NanogridBase._get_boundary_mask(flags)
|
|
865
779
|
|
|
866
780
|
face_cell_indices[face] = wp.vec2i(inner_cell, outer_cell)
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
from typing import Any
|
|
17
|
+
|
|
18
|
+
import warp as wp
|
|
19
|
+
from warp._src.fem.types import Coords
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@wp.func
|
|
23
|
+
def project_on_seg_at_origin(q: Any, seg: Any, len_sq: float):
|
|
24
|
+
s = wp.clamp(wp.dot(q, seg) / len_sq, 0.0, 1.0)
|
|
25
|
+
return wp.length_sq(q - s * seg), s
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@wp.func
|
|
29
|
+
def project_on_tri_at_origin(q: Any, e1: Any, e2: Any):
|
|
30
|
+
e1e1 = wp.dot(e1, e1)
|
|
31
|
+
e1e2 = wp.dot(e1, e2)
|
|
32
|
+
e2e2 = wp.dot(e2, e2)
|
|
33
|
+
|
|
34
|
+
det = e1e1 * e2e2 - e1e2 * e1e2
|
|
35
|
+
|
|
36
|
+
if det > e1e1 * e2e2 * 1.0e-6:
|
|
37
|
+
e1p = wp.dot(e1, q)
|
|
38
|
+
e2p = wp.dot(e2, q)
|
|
39
|
+
|
|
40
|
+
s = (e2e2 * e1p - e1e2 * e2p) / det
|
|
41
|
+
t = (e1e1 * e2p - e1e2 * e1p) / det
|
|
42
|
+
|
|
43
|
+
if s >= 0.0 and t >= 0.0 and s + t <= 1.0:
|
|
44
|
+
# point inside triangle (distance can be non-zero in 3D case)
|
|
45
|
+
return wp.length_sq(q - s * e1 - t * e2), Coords(1.0 - s - t, s, t)
|
|
46
|
+
|
|
47
|
+
d1, s1 = project_on_seg_at_origin(q, e1, e1e1)
|
|
48
|
+
d2, s2 = project_on_seg_at_origin(q, e2, e2e2)
|
|
49
|
+
d12, s12 = project_on_seg_at_origin(q - e1, e2 - e1, wp.length_sq(e2 - e1))
|
|
50
|
+
|
|
51
|
+
if d1 <= d2:
|
|
52
|
+
if d1 <= d12:
|
|
53
|
+
return d1, Coords(1.0 - s1, s1, 0.0)
|
|
54
|
+
elif d2 <= d12:
|
|
55
|
+
return d2, Coords(1.0 - s2, 0.0, s2)
|
|
56
|
+
|
|
57
|
+
return d12, Coords(0.0, 1.0 - s12, s12)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@wp.func
|
|
61
|
+
def project_on_tet_at_origin(q: wp.vec3, e1: wp.vec3, e2: wp.vec3, e3: wp.vec3):
|
|
62
|
+
mat = wp.inverse(wp.matrix_from_cols(e1, e2, e3))
|
|
63
|
+
coords = mat * q
|
|
64
|
+
|
|
65
|
+
if wp.min(coords) >= 0.0 and coords[0] + coords[1] + coords[2] <= 1.0:
|
|
66
|
+
return 0.0, coords
|
|
67
|
+
|
|
68
|
+
# Not inside tet, compare closest point on each tri
|
|
69
|
+
|
|
70
|
+
d12, s12 = project_on_tri_at_origin(q, e1, e2)
|
|
71
|
+
d23, s23 = project_on_tri_at_origin(q, e2, e3)
|
|
72
|
+
d31, s31 = project_on_tri_at_origin(q, e3, e1)
|
|
73
|
+
d123, s123 = project_on_tri_at_origin(q - e1, e2 - e1, e3 - e1)
|
|
74
|
+
|
|
75
|
+
dmin = wp.min(wp.vec4(d12, d23, d31, d123))
|
|
76
|
+
|
|
77
|
+
if dmin == d12:
|
|
78
|
+
return dmin, Coords(s12[1], s12[2], 0.0)
|
|
79
|
+
elif dmin == d23:
|
|
80
|
+
return dmin, Coords(0.0, s23[1], s23[2])
|
|
81
|
+
elif dmin == d31:
|
|
82
|
+
return dmin, Coords(s31[2], 0.0, s31[1])
|
|
83
|
+
else:
|
|
84
|
+
return dmin, s123
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
@wp.func
|
|
88
|
+
def project_on_box_at_origin(coords: wp.vec3, sizes: wp.vec3):
|
|
89
|
+
proj_coords = wp.min(wp.max(coords, wp.vec3(0.0)), sizes)
|
|
90
|
+
return wp.length_sq(coords - proj_coords), wp.cw_div(proj_coords, sizes)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@wp.func
|
|
94
|
+
def project_on_box_at_origin(coords: wp.vec2, sizes: wp.vec2):
|
|
95
|
+
proj_coords = wp.min(wp.max(coords, wp.vec2(0.0)), sizes)
|
|
96
|
+
norm_coords = wp.cw_div(proj_coords, sizes)
|
|
97
|
+
return wp.length_sq(coords - proj_coords), Coords(norm_coords[0], norm_coords[1], 0.0)
|
|
@@ -16,9 +16,10 @@
|
|
|
16
16
|
from typing import ClassVar
|
|
17
17
|
|
|
18
18
|
import warp as wp
|
|
19
|
-
from warp.fem import cache
|
|
20
|
-
from warp.fem.polynomial import Polynomial
|
|
21
|
-
from warp.fem.types import Coords, ElementIndex, Sample, make_free_sample
|
|
19
|
+
from warp._src.fem import cache
|
|
20
|
+
from warp._src.fem.polynomial import Polynomial
|
|
21
|
+
from warp._src.fem.types import Coords, ElementIndex, Sample, make_free_sample
|
|
22
|
+
from warp._src.types import type_is_vector, type_size
|
|
22
23
|
|
|
23
24
|
from .geometry import Geometry
|
|
24
25
|
|
|
@@ -54,16 +55,17 @@ class DeformedGeometry(Geometry):
|
|
|
54
55
|
"""Constructs a Deformed Geometry from a displacement or absolute position field defined over a base geometry.
|
|
55
56
|
The deformation field does not need to be isoparameteric.
|
|
56
57
|
|
|
57
|
-
See also: :meth:`warp.fem.
|
|
58
|
+
See also: :meth:`warp.fem.GeometryField.make_deformed_geometry`
|
|
58
59
|
"""
|
|
59
60
|
|
|
60
|
-
from warp.fem.field import
|
|
61
|
+
from warp._src.fem.field import GeometryField
|
|
61
62
|
|
|
62
|
-
if
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
if field.dtype is not None and (
|
|
64
|
+
not type_is_vector(field.dtype) or type_size(field.dtype) != field.geometry.dimension
|
|
65
|
+
):
|
|
66
|
+
raise ValueError(
|
|
67
|
+
"Invalid value type for position field, must be vector-valued with same dimension as underlying geometry"
|
|
68
|
+
)
|
|
67
69
|
if field.eval_grad_inner is None:
|
|
68
70
|
raise ValueError("Gradient evaluation is not supported on the passed field")
|
|
69
71
|
|
|
@@ -113,11 +115,6 @@ class DeformedGeometry(Geometry):
|
|
|
113
115
|
|
|
114
116
|
return CellArg
|
|
115
117
|
|
|
116
|
-
def cell_arg_value(self, device) -> "DeformedGeometry.CellArg":
|
|
117
|
-
args = self.CellArg()
|
|
118
|
-
self.fill_cell_arg(args, device)
|
|
119
|
-
return args
|
|
120
|
-
|
|
121
118
|
def fill_cell_arg(self, args: "DeformedGeometry.CellArg", device):
|
|
122
119
|
self.base.fill_cell_arg(args.base_arg, device)
|
|
123
120
|
self.field.fill_eval_arg(args.field_arg, device)
|
|
@@ -161,11 +158,6 @@ class DeformedGeometry(Geometry):
|
|
|
161
158
|
|
|
162
159
|
return SideArg
|
|
163
160
|
|
|
164
|
-
def side_arg_value(self, device) -> "DeformedGeometry.SideArg":
|
|
165
|
-
args = self.SideArg()
|
|
166
|
-
self.fill_side_arg(args, device)
|
|
167
|
-
return args
|
|
168
|
-
|
|
169
161
|
def fill_side_arg(self, args: "DeformedGeometry.SideArg", device):
|
|
170
162
|
self.base.fill_side_arg(args.base_arg, device)
|
|
171
163
|
self.field.fill_eval_arg(args.field_arg, device)
|
|
@@ -259,11 +251,11 @@ class DeformedGeometry(Geometry):
|
|
|
259
251
|
return cell_bvh_id
|
|
260
252
|
|
|
261
253
|
def _make_cell_bounds(self):
|
|
262
|
-
points, _weights = self.reference_cell().instantiate_quadrature(
|
|
254
|
+
points, _weights = self.reference_cell().prototype.instantiate_quadrature(
|
|
263
255
|
order=self.field.degree, family=Polynomial.LOBATTO_GAUSS_LEGENDRE
|
|
264
256
|
)
|
|
265
257
|
|
|
266
|
-
points =
|
|
258
|
+
points = wp.matrix_from_rows(*points)
|
|
267
259
|
point_count = len(points)
|
|
268
260
|
|
|
269
261
|
@cache.dynamic_func(suffix=self.name)
|