warp-lang 1.9.1__py3-none-manylinux_2_34_aarch64.whl → 1.10.0__py3-none-manylinux_2_34_aarch64.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 +882 -305
- warp/_src/__init__.py +14 -0
- warp/_src/autograd.py +1077 -0
- warp/_src/build.py +620 -0
- warp/_src/build_dll.py +642 -0
- warp/{builtins.py → _src/builtins.py} +1435 -379
- warp/_src/codegen.py +4361 -0
- warp/{config.py → _src/config.py} +178 -169
- warp/_src/constants.py +59 -0
- warp/_src/context.py +8352 -0
- warp/_src/dlpack.py +464 -0
- warp/_src/fabric.py +362 -0
- warp/_src/fem/__init__.py +14 -0
- warp/_src/fem/adaptivity.py +510 -0
- warp/_src/fem/cache.py +689 -0
- warp/_src/fem/dirichlet.py +190 -0
- warp/{fem → _src/fem}/domain.py +42 -30
- warp/_src/fem/field/__init__.py +131 -0
- warp/_src/fem/field/field.py +703 -0
- warp/{fem → _src/fem}/field/nodal_field.py +32 -15
- warp/{fem → _src/fem}/field/restriction.py +3 -1
- warp/{fem → _src/fem}/field/virtual.py +55 -27
- warp/_src/fem/geometry/__init__.py +32 -0
- warp/{fem → _src/fem}/geometry/adaptive_nanogrid.py +79 -163
- warp/_src/fem/geometry/closest_point.py +99 -0
- warp/{fem → _src/fem}/geometry/deformed_geometry.py +16 -22
- warp/{fem → _src/fem}/geometry/element.py +34 -10
- warp/{fem → _src/fem}/geometry/geometry.py +50 -20
- warp/{fem → _src/fem}/geometry/grid_2d.py +14 -23
- warp/{fem → _src/fem}/geometry/grid_3d.py +14 -23
- warp/{fem → _src/fem}/geometry/hexmesh.py +42 -63
- warp/{fem → _src/fem}/geometry/nanogrid.py +256 -247
- warp/{fem → _src/fem}/geometry/partition.py +123 -63
- warp/{fem → _src/fem}/geometry/quadmesh.py +28 -45
- warp/{fem → _src/fem}/geometry/tetmesh.py +42 -63
- warp/{fem → _src/fem}/geometry/trimesh.py +28 -45
- warp/{fem → _src/fem}/integrate.py +166 -158
- warp/_src/fem/linalg.py +385 -0
- warp/_src/fem/operator.py +398 -0
- warp/_src/fem/polynomial.py +231 -0
- warp/{fem → _src/fem}/quadrature/pic_quadrature.py +17 -20
- warp/{fem → _src/fem}/quadrature/quadrature.py +97 -47
- warp/_src/fem/space/__init__.py +248 -0
- warp/{fem → _src/fem}/space/basis_function_space.py +22 -11
- warp/_src/fem/space/basis_space.py +681 -0
- warp/{fem → _src/fem}/space/dof_mapper.py +5 -3
- warp/{fem → _src/fem}/space/function_space.py +16 -13
- warp/{fem → _src/fem}/space/grid_2d_function_space.py +6 -7
- warp/{fem → _src/fem}/space/grid_3d_function_space.py +6 -4
- warp/{fem → _src/fem}/space/hexmesh_function_space.py +6 -10
- warp/{fem → _src/fem}/space/nanogrid_function_space.py +5 -9
- warp/{fem → _src/fem}/space/partition.py +119 -60
- warp/{fem → _src/fem}/space/quadmesh_function_space.py +6 -10
- warp/{fem → _src/fem}/space/restriction.py +68 -33
- warp/_src/fem/space/shape/__init__.py +152 -0
- warp/{fem → _src/fem}/space/shape/cube_shape_function.py +11 -9
- warp/{fem → _src/fem}/space/shape/shape_function.py +10 -9
- warp/{fem → _src/fem}/space/shape/square_shape_function.py +8 -6
- warp/{fem → _src/fem}/space/shape/tet_shape_function.py +5 -3
- warp/{fem → _src/fem}/space/shape/triangle_shape_function.py +5 -3
- warp/{fem → _src/fem}/space/tetmesh_function_space.py +5 -9
- warp/_src/fem/space/topology.py +461 -0
- warp/{fem → _src/fem}/space/trimesh_function_space.py +5 -9
- warp/_src/fem/types.py +114 -0
- warp/_src/fem/utils.py +488 -0
- warp/_src/jax.py +188 -0
- warp/_src/jax_experimental/__init__.py +14 -0
- warp/_src/jax_experimental/custom_call.py +389 -0
- warp/_src/jax_experimental/ffi.py +1286 -0
- warp/_src/jax_experimental/xla_ffi.py +658 -0
- warp/_src/marching_cubes.py +710 -0
- warp/_src/math.py +416 -0
- warp/_src/optim/__init__.py +14 -0
- warp/_src/optim/adam.py +165 -0
- warp/_src/optim/linear.py +1608 -0
- warp/_src/optim/sgd.py +114 -0
- warp/_src/paddle.py +408 -0
- warp/_src/render/__init__.py +14 -0
- warp/_src/render/imgui_manager.py +291 -0
- warp/_src/render/render_opengl.py +3638 -0
- warp/_src/render/render_usd.py +939 -0
- warp/_src/render/utils.py +162 -0
- warp/_src/sparse.py +2718 -0
- warp/_src/tape.py +1208 -0
- warp/{thirdparty → _src/thirdparty}/unittest_parallel.py +9 -2
- warp/_src/torch.py +393 -0
- warp/_src/types.py +5888 -0
- warp/_src/utils.py +1695 -0
- warp/autograd.py +12 -1054
- warp/bin/warp-clang.so +0 -0
- warp/bin/warp.so +0 -0
- warp/build.py +8 -588
- warp/build_dll.py +6 -721
- warp/codegen.py +6 -4251
- warp/constants.py +6 -39
- warp/context.py +12 -8062
- 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 +1 -1
- 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 -365
- warp/jax_experimental/ffi.py +17 -873
- warp/jax_experimental/xla_ffi.py +5 -605
- warp/marching_cubes.py +5 -689
- warp/math.py +16 -393
- warp/native/array.h +385 -37
- warp/native/builtin.h +314 -37
- 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/sparse.cu +7 -3
- warp/native/spatial.h +12 -0
- warp/native/tile.h +681 -89
- warp/native/tile_radix_sort.h +3 -3
- warp/native/tile_reduce.h +394 -46
- warp/native/tile_scan.h +4 -4
- warp/native/vec.h +469 -0
- 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 +57 -29
- warp/native/warp.cu +521 -250
- warp/native/warp.h +11 -8
- 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 -3618
- warp/render/render_usd.py +6 -919
- 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_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 +18 -17
- warp/tests/interop/test_jax.py +772 -49
- 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 +578 -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 +33 -14
- 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 +56 -10
- 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 +35 -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_types.py +27 -15
- 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 +178 -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 -5764
- warp/utils.py +10 -1659
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0.dist-info}/METADATA +46 -99
- warp_lang-1.10.0.dist-info/RECORD +468 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
- warp/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.1.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.1.dist-info → warp_lang-1.10.0.dist-info}/WHEEL +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0.dist-info}/licenses/LICENSE.md +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0.dist-info}/top_level.txt +0 -0
|
@@ -16,13 +16,15 @@
|
|
|
16
16
|
from typing import Any, ClassVar
|
|
17
17
|
|
|
18
18
|
import warp as wp
|
|
19
|
-
from warp.fem import cache
|
|
20
|
-
from warp.fem.space import
|
|
21
|
-
from warp.fem.types import NULL_NODE_INDEX, ElementIndex, Sample
|
|
22
|
-
from warp.fem.utils import type_zero_element
|
|
19
|
+
from warp._src.fem import cache
|
|
20
|
+
from warp._src.fem.space import FunctionSpace, SpacePartition
|
|
21
|
+
from warp._src.fem.types import NULL_NODE_INDEX, ElementIndex, Sample
|
|
22
|
+
from warp._src.fem.utils import type_zero_element
|
|
23
23
|
|
|
24
24
|
from .field import DiscreteField
|
|
25
25
|
|
|
26
|
+
_wp_module_name_ = "warp.fem.field.nodal_field"
|
|
27
|
+
|
|
26
28
|
|
|
27
29
|
class NodalFieldBase(DiscreteField):
|
|
28
30
|
"""Base class for nodal field and nodal field traces. Does not hold values"""
|
|
@@ -47,7 +49,7 @@ class NodalFieldBase(DiscreteField):
|
|
|
47
49
|
"at_node": lambda obj: obj._make_at_node(),
|
|
48
50
|
}
|
|
49
51
|
|
|
50
|
-
def __init__(self, space:
|
|
52
|
+
def __init__(self, space: FunctionSpace, space_partition: SpacePartition):
|
|
51
53
|
super().__init__(space, space_partition)
|
|
52
54
|
cache.setup_dynamic_attributes(self)
|
|
53
55
|
|
|
@@ -325,10 +327,10 @@ class NodalFieldBase(DiscreteField):
|
|
|
325
327
|
class NodalField(NodalFieldBase):
|
|
326
328
|
"""A field holding values for all degrees of freedom at each node of the underlying function space partition
|
|
327
329
|
|
|
328
|
-
See also: warp.fem.space.
|
|
330
|
+
See also: warp.fem.space.FunctionSpace.make_field
|
|
329
331
|
"""
|
|
330
332
|
|
|
331
|
-
def __init__(self, space:
|
|
333
|
+
def __init__(self, space: FunctionSpace, space_partition: SpacePartition):
|
|
332
334
|
if space.topology != space_partition.space_topology:
|
|
333
335
|
raise ValueError("Incompatible space and space partition topologies")
|
|
334
336
|
|
|
@@ -336,10 +338,9 @@ class NodalField(NodalFieldBase):
|
|
|
336
338
|
|
|
337
339
|
self._dof_values = wp.zeros(n=self.space_partition.node_count(), dtype=self.dof_dtype)
|
|
338
340
|
|
|
341
|
+
@cache.cached_arg_value
|
|
339
342
|
def eval_arg_value(self, device):
|
|
340
|
-
|
|
341
|
-
self.fill_eval_arg(arg, device)
|
|
342
|
-
return arg
|
|
343
|
+
return super().eval_arg_value(device)
|
|
343
344
|
|
|
344
345
|
def fill_eval_arg(self, arg, device):
|
|
345
346
|
arg.dof_values = self._dof_values.to(device)
|
|
@@ -347,6 +348,25 @@ class NodalField(NodalFieldBase):
|
|
|
347
348
|
self.space_partition.fill_partition_arg(arg.partition_arg, device)
|
|
348
349
|
self.space.topology.fill_topo_arg(arg.topology_arg, device)
|
|
349
350
|
|
|
351
|
+
def rebind(self, space: FunctionSpace, space_partition: SpacePartition):
|
|
352
|
+
"""Rebind the field to a new space partition and space.
|
|
353
|
+
The new space partition and space must be of similar types as the current ones
|
|
354
|
+
"""
|
|
355
|
+
|
|
356
|
+
if space_partition.name != self.space_partition.name or space.name != self.space.name:
|
|
357
|
+
raise ValueError("Incompatible space and/or space partition")
|
|
358
|
+
|
|
359
|
+
self._space = space
|
|
360
|
+
self._space_partition = space_partition
|
|
361
|
+
|
|
362
|
+
node_count = space_partition.node_count()
|
|
363
|
+
if node_count < self._dof_values.shape[0]:
|
|
364
|
+
self._dof_values = self._dof_values[:node_count]
|
|
365
|
+
elif node_count > self._dof_values.shape[0]:
|
|
366
|
+
self._dof_values = wp.empty(n=node_count, dtype=self.dof_dtype)
|
|
367
|
+
|
|
368
|
+
self.eval_arg_value.invalidate(self)
|
|
369
|
+
|
|
350
370
|
@property
|
|
351
371
|
def dof_values(self) -> wp.array:
|
|
352
372
|
"""Returns a warp array containing the values at all degrees of freedom of the underlying space partition"""
|
|
@@ -365,16 +385,13 @@ class NodalField(NodalFieldBase):
|
|
|
365
385
|
else:
|
|
366
386
|
self._dof_values = wp.array(values, dtype=self.dof_dtype)
|
|
367
387
|
|
|
388
|
+
self.eval_arg_value.invalidate(self)
|
|
389
|
+
|
|
368
390
|
class Trace(NodalFieldBase):
|
|
369
391
|
def __init__(self, field):
|
|
370
392
|
self._field = field
|
|
371
393
|
super().__init__(field.space.trace(), field.space_partition)
|
|
372
394
|
|
|
373
|
-
def eval_arg_value(self, device):
|
|
374
|
-
arg = self.EvalArg()
|
|
375
|
-
self.fill_eval_arg(arg, device)
|
|
376
|
-
return arg
|
|
377
|
-
|
|
378
395
|
def fill_eval_arg(self, arg, device):
|
|
379
396
|
arg.dof_values = self._field.dof_values.to(device)
|
|
380
397
|
self.space.fill_space_arg(arg.space_arg, device)
|
|
@@ -13,10 +13,12 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
-
from warp.fem.space import SpaceRestriction
|
|
16
|
+
from warp._src.fem.space import SpaceRestriction
|
|
17
17
|
|
|
18
18
|
from .field import DiscreteField
|
|
19
19
|
|
|
20
|
+
_wp_module_name_ = "warp.fem.field.restriction"
|
|
21
|
+
|
|
20
22
|
|
|
21
23
|
class FieldRestriction:
|
|
22
24
|
"""Restriction of a discrete field to a given GeometryDomain"""
|
|
@@ -13,16 +13,17 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
+
from functools import cached_property
|
|
16
17
|
from typing import Any, ClassVar, Dict, Optional, Set
|
|
17
18
|
|
|
18
19
|
import warp as wp
|
|
19
|
-
import warp.fem.operator as operator
|
|
20
|
-
from warp.fem import cache
|
|
21
|
-
from warp.fem.domain import GeometryDomain
|
|
22
|
-
from warp.fem.linalg import basis_coefficient, generalized_inner, generalized_outer
|
|
23
|
-
from warp.fem.quadrature import Quadrature
|
|
24
|
-
from warp.fem.space import FunctionSpace, SpacePartition, SpaceRestriction
|
|
25
|
-
from warp.fem.types import (
|
|
20
|
+
import warp._src.fem.operator as operator
|
|
21
|
+
from warp._src.fem import cache
|
|
22
|
+
from warp._src.fem.domain import GeometryDomain
|
|
23
|
+
from warp._src.fem.linalg import basis_coefficient, generalized_inner, generalized_outer
|
|
24
|
+
from warp._src.fem.quadrature import Quadrature
|
|
25
|
+
from warp._src.fem.space import FunctionSpace, SpacePartition, SpaceRestriction
|
|
26
|
+
from warp._src.fem.types import (
|
|
26
27
|
NULL_ELEMENT_INDEX,
|
|
27
28
|
NULL_NODE_INDEX,
|
|
28
29
|
DofIndex,
|
|
@@ -32,10 +33,12 @@ from warp.fem.types import (
|
|
|
32
33
|
get_node_coord,
|
|
33
34
|
get_node_index_in_element,
|
|
34
35
|
)
|
|
35
|
-
from warp.fem.utils import type_zero_element
|
|
36
|
+
from warp._src.fem.utils import type_zero_element
|
|
36
37
|
|
|
37
38
|
from .field import SpaceField
|
|
38
39
|
|
|
40
|
+
_wp_module_name_ = "warp.fem.field.virtual"
|
|
41
|
+
|
|
39
42
|
|
|
40
43
|
class AdjointField(SpaceField):
|
|
41
44
|
"""Adjoint of a discrete field with respect to its degrees of freedom"""
|
|
@@ -55,28 +58,44 @@ class AdjointField(SpaceField):
|
|
|
55
58
|
"node_index": lambda obj: obj._make_node_index(),
|
|
56
59
|
}
|
|
57
60
|
|
|
58
|
-
def __init__(self, space: FunctionSpace, space_partition: SpacePartition):
|
|
61
|
+
def __init__(self, space: FunctionSpace, space_partition: SpacePartition, domain: GeometryDomain):
|
|
59
62
|
super().__init__(space, space_partition=space_partition)
|
|
60
63
|
|
|
61
64
|
self.node_dof_count = self.space.NODE_DOF_COUNT
|
|
62
65
|
self.value_dof_count = self.space.VALUE_DOF_COUNT
|
|
66
|
+
self.domain = domain
|
|
63
67
|
|
|
64
68
|
cache.setup_dynamic_attributes(self)
|
|
65
69
|
|
|
66
|
-
@
|
|
70
|
+
@cached_property
|
|
67
71
|
def name(self) -> str:
|
|
68
72
|
return f"{self.__class__.__name__}{self.space.name}{self._space_partition.name}"
|
|
69
73
|
|
|
70
74
|
@cache.cached_arg_value
|
|
71
75
|
def eval_arg_value(self, device):
|
|
72
|
-
|
|
73
|
-
self.fill_eval_arg(arg, device)
|
|
74
|
-
return arg
|
|
76
|
+
return super().eval_arg_value(device)
|
|
75
77
|
|
|
76
78
|
def fill_eval_arg(self, arg, device):
|
|
77
79
|
self.space.fill_space_arg(arg.space_arg, device)
|
|
78
80
|
self.space.topology.fill_topo_arg(arg.topo_arg, device)
|
|
79
81
|
|
|
82
|
+
def rebind(self, space: FunctionSpace, space_partition: SpacePartition, domain: GeometryDomain):
|
|
83
|
+
"""Rebind the field to a new space partition, space and domain.
|
|
84
|
+
The new space topology and space must be of similar types as the current ones
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
if (
|
|
88
|
+
space_partition.space_topology.name != self.space_partition.space_topology.name
|
|
89
|
+
or space.name != self.space.name
|
|
90
|
+
):
|
|
91
|
+
raise ValueError("Incompatible space and/or space partition")
|
|
92
|
+
|
|
93
|
+
self._space = space
|
|
94
|
+
self._space_partition = space_partition
|
|
95
|
+
self.domain = domain
|
|
96
|
+
|
|
97
|
+
self.eval_arg_value.invalidate(self)
|
|
98
|
+
|
|
80
99
|
def _make_eval_arg(self):
|
|
81
100
|
@cache.dynamic_struct(suffix=self.name)
|
|
82
101
|
class EvalArg:
|
|
@@ -254,7 +273,7 @@ class TestField(AdjointField):
|
|
|
254
273
|
defined for a different value type than the test function value type, as long as the node topology is similar.
|
|
255
274
|
"""
|
|
256
275
|
|
|
257
|
-
def __init__(self,
|
|
276
|
+
def __init__(self, space: FunctionSpace, space_restriction: SpaceRestriction):
|
|
258
277
|
if space_restriction.domain.dimension == space.dimension - 1:
|
|
259
278
|
space = space.trace()
|
|
260
279
|
|
|
@@ -264,10 +283,17 @@ class TestField(AdjointField):
|
|
|
264
283
|
if space.topology != space_restriction.space_topology:
|
|
265
284
|
raise ValueError("Incompatible space and space partition topologies")
|
|
266
285
|
|
|
267
|
-
super().__init__(space, space_restriction.space_partition)
|
|
286
|
+
super().__init__(space, space_restriction.space_partition, space_restriction.domain)
|
|
268
287
|
|
|
269
288
|
self.space_restriction = space_restriction
|
|
270
|
-
|
|
289
|
+
|
|
290
|
+
def rebind(self, space: FunctionSpace, space_restriction: SpaceRestriction):
|
|
291
|
+
"""Rebind the test field to a new space restriction and space.
|
|
292
|
+
The new space restriction and space must be of a similar type as the current ones
|
|
293
|
+
"""
|
|
294
|
+
|
|
295
|
+
super().rebind(space, space_restriction.space_partition, space_restriction.domain)
|
|
296
|
+
self.space_restriction = space_restriction
|
|
271
297
|
|
|
272
298
|
@wp.func
|
|
273
299
|
def _get_dof(s: Sample):
|
|
@@ -292,8 +318,7 @@ class TrialField(AdjointField):
|
|
|
292
318
|
if not space.topology.is_derived_from(space_partition.space_topology):
|
|
293
319
|
raise ValueError("Incompatible space and space partition topologies")
|
|
294
320
|
|
|
295
|
-
super().__init__(space, space_partition)
|
|
296
|
-
self.domain = domain
|
|
321
|
+
super().__init__(space, space_partition, domain)
|
|
297
322
|
|
|
298
323
|
def partition_node_count(self) -> int:
|
|
299
324
|
"""Returns the number of nodes in the associated space topology partition"""
|
|
@@ -410,14 +435,11 @@ class LocalAdjointField(SpaceField):
|
|
|
410
435
|
def name(self) -> str:
|
|
411
436
|
return f"{self.global_field.name}_Taylor{self._dof_suffix}"
|
|
412
437
|
|
|
413
|
-
def eval_arg_value(self, device):
|
|
414
|
-
return LocalAdjointField.EvalArg()
|
|
415
|
-
|
|
416
438
|
def fill_eval_arg(self, arg, device):
|
|
417
439
|
pass
|
|
418
440
|
|
|
419
441
|
def _make_element_eval_arg(self):
|
|
420
|
-
from warp.fem import cache
|
|
442
|
+
from warp._src.fem import cache
|
|
421
443
|
|
|
422
444
|
@cache.dynamic_struct(suffix=self.name)
|
|
423
445
|
class ElementEvalArg:
|
|
@@ -631,7 +653,7 @@ def make_linear_dispatch_kernel(
|
|
|
631
653
|
return qp, elem_offset, qp_point_count, element_index, test_element_index
|
|
632
654
|
|
|
633
655
|
@cache.dynamic_kernel(
|
|
634
|
-
|
|
656
|
+
(test.name, quadrature.name, cache.pod_type_key(accumulate_dtype), tile_size),
|
|
635
657
|
kernel_options=kernel_options,
|
|
636
658
|
)
|
|
637
659
|
def dispatch_linear_kernel_fn(
|
|
@@ -646,6 +668,9 @@ def make_linear_dispatch_kernel(
|
|
|
646
668
|
local_node_index, lane = wp.tid()
|
|
647
669
|
|
|
648
670
|
node_index = space_restriction.node_partition_index(test_arg, local_node_index)
|
|
671
|
+
if node_index == NULL_NODE_INDEX:
|
|
672
|
+
return
|
|
673
|
+
|
|
649
674
|
element_beg, element_end = space_restriction.node_element_range(test_arg, node_index)
|
|
650
675
|
|
|
651
676
|
val_sum = res_vec()
|
|
@@ -816,7 +841,7 @@ def make_bilinear_dispatch_kernel(
|
|
|
816
841
|
val_t = cache.cached_mat_type(shape=(test.node_dof_count, trial.node_dof_count), dtype=accumulate_dtype)
|
|
817
842
|
|
|
818
843
|
@cache.dynamic_kernel(
|
|
819
|
-
|
|
844
|
+
(trial.name, test.name, quadrature.name, cache.pod_type_key(accumulate_dtype), tile_size),
|
|
820
845
|
kernel_options=kernel_options,
|
|
821
846
|
)
|
|
822
847
|
def dispatch_bilinear_kernel_fn(
|
|
@@ -841,9 +866,12 @@ def make_bilinear_dispatch_kernel(
|
|
|
841
866
|
element_index = domain.element_index(domain_index_arg, test_element_index.domain_element_index)
|
|
842
867
|
test_node = test_element_index.node_index_in_element
|
|
843
868
|
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
869
|
+
if element_index == NULL_ELEMENT_INDEX:
|
|
870
|
+
element_trial_node_count = 0
|
|
871
|
+
else:
|
|
872
|
+
element_trial_node_count = trial.space.topology.element_node_count(
|
|
873
|
+
domain_arg, trial_topology_arg, element_index
|
|
874
|
+
)
|
|
847
875
|
|
|
848
876
|
if trial_node >= element_trial_node_count:
|
|
849
877
|
block_offset = test_node_offset * MAX_NODES_PER_ELEMENT + trial_node
|
|
@@ -0,0 +1,32 @@
|
|
|
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 .adaptive_nanogrid import AdaptiveNanogrid
|
|
17
|
+
from .deformed_geometry import DeformedGeometry
|
|
18
|
+
from .element import Element
|
|
19
|
+
from .geometry import Geometry
|
|
20
|
+
from .grid_2d import Grid2D
|
|
21
|
+
from .grid_3d import Grid3D
|
|
22
|
+
from .hexmesh import Hexmesh
|
|
23
|
+
from .nanogrid import Nanogrid
|
|
24
|
+
from .partition import (
|
|
25
|
+
ExplicitGeometryPartition,
|
|
26
|
+
GeometryPartition,
|
|
27
|
+
LinearGeometryPartition,
|
|
28
|
+
WholeGeometryPartition,
|
|
29
|
+
)
|
|
30
|
+
from .quadmesh import Quadmesh, Quadmesh2D, Quadmesh3D
|
|
31
|
+
from .tetmesh import Tetmesh
|
|
32
|
+
from .trimesh import Trimesh, Trimesh2D, Trimesh3D
|