warp-lang 1.0.1__py3-none-manylinux2014_x86_64.whl → 1.1.0__py3-none-manylinux2014_x86_64.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 +108 -97
- warp/__init__.pyi +1 -1
- warp/bin/warp-clang.so +0 -0
- warp/bin/warp.so +0 -0
- warp/build.py +115 -113
- warp/build_dll.py +383 -375
- warp/builtins.py +3425 -3354
- warp/codegen.py +2878 -2792
- warp/config.py +40 -36
- warp/constants.py +45 -45
- warp/context.py +5194 -5102
- warp/dlpack.py +442 -442
- warp/examples/__init__.py +16 -16
- warp/examples/assets/bear.usd +0 -0
- warp/examples/assets/bunny.usd +0 -0
- warp/examples/assets/cartpole.urdf +110 -110
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/cube.usd +0 -0
- warp/examples/assets/nv_ant.xml +92 -92
- warp/examples/assets/nv_humanoid.xml +183 -183
- warp/examples/assets/quadruped.urdf +267 -267
- warp/examples/assets/rocks.nvdb +0 -0
- warp/examples/assets/rocks.usd +0 -0
- warp/examples/assets/sphere.usd +0 -0
- warp/examples/benchmarks/benchmark_api.py +383 -383
- warp/examples/benchmarks/benchmark_cloth.py +278 -279
- warp/examples/benchmarks/benchmark_cloth_cupy.py +88 -88
- warp/examples/benchmarks/benchmark_cloth_jax.py +97 -100
- warp/examples/benchmarks/benchmark_cloth_numba.py +146 -142
- warp/examples/benchmarks/benchmark_cloth_numpy.py +77 -77
- warp/examples/benchmarks/benchmark_cloth_pytorch.py +86 -86
- warp/examples/benchmarks/benchmark_cloth_taichi.py +112 -112
- warp/examples/benchmarks/benchmark_cloth_warp.py +146 -146
- warp/examples/benchmarks/benchmark_launches.py +295 -295
- warp/examples/browse.py +29 -28
- warp/examples/core/example_dem.py +234 -221
- warp/examples/core/example_fluid.py +293 -267
- warp/examples/core/example_graph_capture.py +144 -129
- warp/examples/core/example_marching_cubes.py +188 -176
- warp/examples/core/example_mesh.py +174 -154
- warp/examples/core/example_mesh_intersect.py +205 -193
- warp/examples/core/example_nvdb.py +176 -169
- warp/examples/core/example_raycast.py +105 -89
- warp/examples/core/example_raymarch.py +199 -178
- warp/examples/core/example_render_opengl.py +185 -141
- warp/examples/core/example_sph.py +405 -389
- warp/examples/core/example_torch.py +222 -181
- warp/examples/core/example_wave.py +263 -249
- warp/examples/fem/bsr_utils.py +378 -380
- warp/examples/fem/example_apic_fluid.py +407 -391
- warp/examples/fem/example_convection_diffusion.py +182 -168
- warp/examples/fem/example_convection_diffusion_dg.py +219 -209
- warp/examples/fem/example_convection_diffusion_dg0.py +204 -194
- warp/examples/fem/example_deformed_geometry.py +177 -159
- warp/examples/fem/example_diffusion.py +201 -173
- warp/examples/fem/example_diffusion_3d.py +177 -152
- warp/examples/fem/example_diffusion_mgpu.py +221 -214
- warp/examples/fem/example_mixed_elasticity.py +244 -222
- warp/examples/fem/example_navier_stokes.py +259 -243
- warp/examples/fem/example_stokes.py +220 -192
- warp/examples/fem/example_stokes_transfer.py +265 -249
- warp/examples/fem/mesh_utils.py +133 -109
- warp/examples/fem/plot_utils.py +292 -287
- warp/examples/optim/example_bounce.py +260 -248
- warp/examples/optim/example_cloth_throw.py +222 -210
- warp/examples/optim/example_diffray.py +566 -535
- warp/examples/optim/example_drone.py +864 -835
- warp/examples/optim/example_inverse_kinematics.py +176 -169
- warp/examples/optim/example_inverse_kinematics_torch.py +185 -170
- warp/examples/optim/example_spring_cage.py +239 -234
- warp/examples/optim/example_trajectory.py +223 -201
- warp/examples/optim/example_walker.py +306 -292
- warp/examples/sim/example_cartpole.py +139 -128
- warp/examples/sim/example_cloth.py +196 -184
- warp/examples/sim/example_granular.py +124 -113
- warp/examples/sim/example_granular_collision_sdf.py +197 -185
- warp/examples/sim/example_jacobian_ik.py +236 -213
- warp/examples/sim/example_particle_chain.py +118 -106
- warp/examples/sim/example_quadruped.py +193 -179
- warp/examples/sim/example_rigid_chain.py +197 -189
- warp/examples/sim/example_rigid_contact.py +189 -176
- warp/examples/sim/example_rigid_force.py +127 -126
- warp/examples/sim/example_rigid_gyroscopic.py +109 -97
- warp/examples/sim/example_rigid_soft_contact.py +134 -124
- warp/examples/sim/example_soft_body.py +190 -178
- warp/fabric.py +337 -335
- warp/fem/__init__.py +60 -27
- warp/fem/cache.py +401 -388
- warp/fem/dirichlet.py +178 -179
- warp/fem/domain.py +262 -263
- warp/fem/field/__init__.py +100 -101
- warp/fem/field/field.py +148 -149
- warp/fem/field/nodal_field.py +298 -299
- warp/fem/field/restriction.py +22 -21
- warp/fem/field/test.py +180 -181
- warp/fem/field/trial.py +183 -183
- warp/fem/geometry/__init__.py +15 -19
- warp/fem/geometry/closest_point.py +69 -70
- warp/fem/geometry/deformed_geometry.py +270 -271
- warp/fem/geometry/element.py +744 -744
- warp/fem/geometry/geometry.py +184 -186
- warp/fem/geometry/grid_2d.py +380 -373
- warp/fem/geometry/grid_3d.py +441 -435
- warp/fem/geometry/hexmesh.py +953 -953
- warp/fem/geometry/partition.py +374 -376
- warp/fem/geometry/quadmesh_2d.py +532 -532
- warp/fem/geometry/tetmesh.py +840 -840
- warp/fem/geometry/trimesh_2d.py +577 -577
- warp/fem/integrate.py +1630 -1615
- warp/fem/operator.py +190 -191
- warp/fem/polynomial.py +214 -213
- warp/fem/quadrature/__init__.py +2 -2
- warp/fem/quadrature/pic_quadrature.py +243 -245
- warp/fem/quadrature/quadrature.py +295 -294
- warp/fem/space/__init__.py +294 -292
- warp/fem/space/basis_space.py +488 -489
- warp/fem/space/collocated_function_space.py +100 -105
- warp/fem/space/dof_mapper.py +236 -236
- warp/fem/space/function_space.py +148 -145
- warp/fem/space/grid_2d_function_space.py +267 -267
- warp/fem/space/grid_3d_function_space.py +305 -306
- warp/fem/space/hexmesh_function_space.py +350 -352
- warp/fem/space/partition.py +350 -350
- warp/fem/space/quadmesh_2d_function_space.py +368 -369
- warp/fem/space/restriction.py +158 -160
- warp/fem/space/shape/__init__.py +13 -15
- warp/fem/space/shape/cube_shape_function.py +738 -738
- warp/fem/space/shape/shape_function.py +102 -103
- warp/fem/space/shape/square_shape_function.py +611 -611
- warp/fem/space/shape/tet_shape_function.py +565 -567
- warp/fem/space/shape/triangle_shape_function.py +429 -429
- warp/fem/space/tetmesh_function_space.py +294 -292
- warp/fem/space/topology.py +297 -295
- warp/fem/space/trimesh_2d_function_space.py +223 -221
- warp/fem/types.py +77 -77
- warp/fem/utils.py +495 -495
- warp/jax.py +166 -141
- warp/jax_experimental.py +341 -339
- warp/native/array.h +1072 -1025
- warp/native/builtin.h +1560 -1560
- warp/native/bvh.cpp +398 -398
- warp/native/bvh.cu +525 -525
- warp/native/bvh.h +429 -429
- warp/native/clang/clang.cpp +495 -464
- warp/native/crt.cpp +31 -31
- warp/native/crt.h +334 -334
- warp/native/cuda_crt.h +1049 -1049
- warp/native/cuda_util.cpp +549 -540
- warp/native/cuda_util.h +288 -203
- warp/native/cutlass_gemm.cpp +34 -34
- warp/native/cutlass_gemm.cu +372 -372
- warp/native/error.cpp +66 -66
- warp/native/error.h +27 -27
- warp/native/fabric.h +228 -228
- warp/native/hashgrid.cpp +301 -278
- warp/native/hashgrid.cu +78 -77
- warp/native/hashgrid.h +227 -227
- warp/native/initializer_array.h +32 -32
- warp/native/intersect.h +1204 -1204
- warp/native/intersect_adj.h +365 -365
- warp/native/intersect_tri.h +322 -322
- warp/native/marching.cpp +2 -2
- warp/native/marching.cu +497 -497
- warp/native/marching.h +2 -2
- warp/native/mat.h +1498 -1498
- warp/native/matnn.h +333 -333
- warp/native/mesh.cpp +203 -203
- warp/native/mesh.cu +293 -293
- warp/native/mesh.h +1887 -1887
- warp/native/nanovdb/NanoVDB.h +4782 -4782
- warp/native/nanovdb/PNanoVDB.h +2553 -2553
- warp/native/nanovdb/PNanoVDBWrite.h +294 -294
- warp/native/noise.h +850 -850
- warp/native/quat.h +1084 -1084
- warp/native/rand.h +299 -299
- warp/native/range.h +108 -108
- warp/native/reduce.cpp +156 -156
- warp/native/reduce.cu +348 -348
- warp/native/runlength_encode.cpp +61 -61
- warp/native/runlength_encode.cu +46 -46
- warp/native/scan.cpp +30 -30
- warp/native/scan.cu +36 -36
- warp/native/scan.h +7 -7
- warp/native/solid_angle.h +442 -442
- warp/native/sort.cpp +94 -94
- warp/native/sort.cu +97 -97
- warp/native/sort.h +14 -14
- warp/native/sparse.cpp +337 -337
- warp/native/sparse.cu +544 -544
- warp/native/spatial.h +630 -630
- warp/native/svd.h +562 -562
- warp/native/temp_buffer.h +30 -30
- warp/native/vec.h +1132 -1132
- warp/native/volume.cpp +297 -297
- warp/native/volume.cu +32 -32
- warp/native/volume.h +538 -538
- warp/native/volume_builder.cu +425 -425
- warp/native/volume_builder.h +19 -19
- warp/native/warp.cpp +1057 -1052
- warp/native/warp.cu +2943 -2828
- warp/native/warp.h +313 -305
- warp/optim/__init__.py +9 -9
- warp/optim/adam.py +120 -120
- warp/optim/linear.py +1104 -939
- warp/optim/sgd.py +104 -92
- warp/render/__init__.py +10 -10
- warp/render/render_opengl.py +3217 -3204
- warp/render/render_usd.py +768 -749
- warp/render/utils.py +152 -150
- warp/sim/__init__.py +52 -59
- warp/sim/articulation.py +685 -685
- warp/sim/collide.py +1594 -1590
- warp/sim/import_mjcf.py +489 -481
- warp/sim/import_snu.py +220 -221
- warp/sim/import_urdf.py +536 -516
- warp/sim/import_usd.py +887 -881
- warp/sim/inertia.py +316 -317
- warp/sim/integrator.py +234 -233
- warp/sim/integrator_euler.py +1956 -1956
- warp/sim/integrator_featherstone.py +1910 -1991
- warp/sim/integrator_xpbd.py +3294 -3312
- warp/sim/model.py +4473 -4314
- warp/sim/particles.py +113 -112
- warp/sim/render.py +417 -403
- warp/sim/utils.py +413 -410
- warp/sparse.py +1227 -1227
- warp/stubs.py +2109 -2469
- warp/tape.py +1162 -225
- warp/tests/__init__.py +1 -1
- warp/tests/__main__.py +4 -4
- warp/tests/assets/torus.usda +105 -105
- warp/tests/aux_test_class_kernel.py +26 -26
- warp/tests/aux_test_compile_consts_dummy.py +10 -10
- warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -21
- warp/tests/aux_test_dependent.py +22 -22
- warp/tests/aux_test_grad_customs.py +23 -23
- warp/tests/aux_test_reference.py +11 -11
- warp/tests/aux_test_reference_reference.py +10 -10
- warp/tests/aux_test_square.py +17 -17
- warp/tests/aux_test_unresolved_func.py +14 -14
- warp/tests/aux_test_unresolved_symbol.py +14 -14
- warp/tests/disabled_kinematics.py +239 -239
- warp/tests/run_coverage_serial.py +31 -31
- warp/tests/test_adam.py +157 -157
- warp/tests/test_arithmetic.py +1124 -1124
- warp/tests/test_array.py +2417 -2326
- warp/tests/test_array_reduce.py +150 -150
- warp/tests/test_async.py +668 -656
- warp/tests/test_atomic.py +141 -141
- warp/tests/test_bool.py +204 -149
- warp/tests/test_builtins_resolution.py +1292 -1292
- warp/tests/test_bvh.py +164 -171
- warp/tests/test_closest_point_edge_edge.py +228 -228
- warp/tests/test_codegen.py +566 -553
- warp/tests/test_compile_consts.py +97 -101
- warp/tests/test_conditional.py +246 -246
- warp/tests/test_copy.py +232 -215
- warp/tests/test_ctypes.py +632 -632
- warp/tests/test_dense.py +67 -67
- warp/tests/test_devices.py +91 -98
- warp/tests/test_dlpack.py +530 -529
- warp/tests/test_examples.py +400 -378
- warp/tests/test_fabricarray.py +955 -955
- warp/tests/test_fast_math.py +62 -54
- warp/tests/test_fem.py +1277 -1278
- warp/tests/test_fp16.py +130 -130
- warp/tests/test_func.py +338 -337
- warp/tests/test_generics.py +571 -571
- warp/tests/test_grad.py +746 -640
- warp/tests/test_grad_customs.py +333 -336
- warp/tests/test_hash_grid.py +210 -164
- warp/tests/test_import.py +39 -39
- warp/tests/test_indexedarray.py +1134 -1134
- warp/tests/test_intersect.py +67 -67
- warp/tests/test_jax.py +307 -307
- warp/tests/test_large.py +167 -164
- warp/tests/test_launch.py +354 -354
- warp/tests/test_lerp.py +261 -261
- warp/tests/test_linear_solvers.py +191 -171
- warp/tests/test_lvalue.py +421 -493
- warp/tests/test_marching_cubes.py +65 -65
- warp/tests/test_mat.py +1801 -1827
- warp/tests/test_mat_lite.py +115 -115
- warp/tests/test_mat_scalar_ops.py +2907 -2889
- warp/tests/test_math.py +126 -193
- warp/tests/test_matmul.py +500 -499
- warp/tests/test_matmul_lite.py +410 -410
- warp/tests/test_mempool.py +188 -190
- warp/tests/test_mesh.py +284 -324
- warp/tests/test_mesh_query_aabb.py +228 -241
- warp/tests/test_mesh_query_point.py +692 -702
- warp/tests/test_mesh_query_ray.py +292 -303
- warp/tests/test_mlp.py +276 -276
- warp/tests/test_model.py +110 -110
- warp/tests/test_modules_lite.py +39 -39
- warp/tests/test_multigpu.py +163 -163
- warp/tests/test_noise.py +248 -248
- warp/tests/test_operators.py +250 -250
- warp/tests/test_options.py +123 -125
- warp/tests/test_peer.py +133 -137
- warp/tests/test_pinned.py +78 -78
- warp/tests/test_print.py +54 -54
- warp/tests/test_quat.py +2086 -2086
- warp/tests/test_rand.py +288 -288
- warp/tests/test_reload.py +217 -217
- warp/tests/test_rounding.py +179 -179
- warp/tests/test_runlength_encode.py +190 -190
- warp/tests/test_sim_grad.py +243 -0
- warp/tests/test_sim_kinematics.py +91 -97
- warp/tests/test_smoothstep.py +168 -168
- warp/tests/test_snippet.py +305 -266
- warp/tests/test_sparse.py +468 -460
- warp/tests/test_spatial.py +2148 -2148
- warp/tests/test_streams.py +486 -473
- warp/tests/test_struct.py +710 -675
- warp/tests/test_tape.py +173 -148
- warp/tests/test_torch.py +743 -743
- warp/tests/test_transient_module.py +87 -87
- warp/tests/test_types.py +556 -659
- warp/tests/test_utils.py +490 -499
- warp/tests/test_vec.py +1264 -1268
- warp/tests/test_vec_lite.py +73 -73
- warp/tests/test_vec_scalar_ops.py +2099 -2099
- warp/tests/test_verify_fp.py +94 -94
- warp/tests/test_volume.py +737 -736
- warp/tests/test_volume_write.py +255 -265
- warp/tests/unittest_serial.py +37 -37
- warp/tests/unittest_suites.py +363 -359
- warp/tests/unittest_utils.py +603 -578
- warp/tests/unused_test_misc.py +71 -71
- warp/tests/walkthrough_debug.py +85 -85
- warp/thirdparty/appdirs.py +598 -598
- warp/thirdparty/dlpack.py +143 -143
- warp/thirdparty/unittest_parallel.py +566 -561
- warp/torch.py +321 -295
- warp/types.py +4504 -4450
- warp/utils.py +1008 -821
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/LICENSE.md +126 -126
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/METADATA +338 -400
- warp_lang-1.1.0.dist-info/RECORD +352 -0
- warp/examples/assets/cube.usda +0 -42
- warp/examples/assets/sphere.usda +0 -56
- warp/examples/assets/torus.usda +0 -105
- warp_lang-1.0.1.dist-info/RECORD +0 -352
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/WHEEL +0 -0
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/top_level.txt +0 -0
warp/fem/field/trial.py
CHANGED
|
@@ -1,183 +1,183 @@
|
|
|
1
|
-
import warp as wp
|
|
2
|
-
from warp.fem
|
|
3
|
-
from warp.fem.
|
|
4
|
-
from warp.fem.
|
|
5
|
-
from warp.fem import
|
|
6
|
-
|
|
7
|
-
from .field import SpaceField
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class TrialField(SpaceField):
|
|
11
|
-
"""Field defined over a domain that can be used as a trial function"""
|
|
12
|
-
|
|
13
|
-
def __init__(
|
|
14
|
-
self,
|
|
15
|
-
space: FunctionSpace,
|
|
16
|
-
space_partition: SpacePartition,
|
|
17
|
-
domain: GeometryDomain,
|
|
18
|
-
):
|
|
19
|
-
if domain.dimension == space.dimension - 1:
|
|
20
|
-
space = space.trace()
|
|
21
|
-
|
|
22
|
-
if domain.dimension != space.dimension:
|
|
23
|
-
raise ValueError("Incompatible space and domain dimensions")
|
|
24
|
-
|
|
25
|
-
if not space.topology.is_derived_from(space_partition.space_topology):
|
|
26
|
-
raise ValueError("Incompatible space and space partition topologies")
|
|
27
|
-
|
|
28
|
-
super().__init__(space, space_partition)
|
|
29
|
-
|
|
30
|
-
self.domain = domain
|
|
31
|
-
|
|
32
|
-
self.EvalArg = self.space.SpaceArg
|
|
33
|
-
self.ElementEvalArg = self._make_element_eval_arg()
|
|
34
|
-
|
|
35
|
-
self.eval_degree = self._make_eval_degree()
|
|
36
|
-
self.eval_inner = self._make_eval_inner()
|
|
37
|
-
self.eval_grad_inner = self._make_eval_grad_inner()
|
|
38
|
-
self.eval_div_inner = self._make_eval_div_inner()
|
|
39
|
-
self.eval_outer = self._make_eval_outer()
|
|
40
|
-
self.eval_grad_outer = self._make_eval_grad_outer()
|
|
41
|
-
self.eval_div_outer = self._make_eval_div_outer()
|
|
42
|
-
self.at_node = self._make_at_node()
|
|
43
|
-
|
|
44
|
-
def partition_node_count(self) -> int:
|
|
45
|
-
"""Returns the number of nodes in the associated space topology partition"""
|
|
46
|
-
return self.space_partition.node_count()
|
|
47
|
-
|
|
48
|
-
@property
|
|
49
|
-
def name(self) -> str:
|
|
50
|
-
return self.space.name + "Trial"
|
|
51
|
-
|
|
52
|
-
def eval_arg_value(self, device) -> wp.codegen.StructInstance:
|
|
53
|
-
return self.space.space_arg_value(device)
|
|
54
|
-
|
|
55
|
-
def _make_element_eval_arg(self):
|
|
56
|
-
@cache.dynamic_struct(suffix=self.name)
|
|
57
|
-
class ElementEvalArg:
|
|
58
|
-
elt_arg: self.domain.ElementArg
|
|
59
|
-
eval_arg: self.EvalArg
|
|
60
|
-
|
|
61
|
-
return ElementEvalArg
|
|
62
|
-
|
|
63
|
-
def _make_eval_inner(self):
|
|
64
|
-
@cache.dynamic_func(suffix=self.name)
|
|
65
|
-
def eval_trial_inner(args: self.ElementEvalArg, s: Sample):
|
|
66
|
-
weight = self.space.element_inner_weight(
|
|
67
|
-
args.elt_arg,
|
|
68
|
-
args.eval_arg,
|
|
69
|
-
s.element_index,
|
|
70
|
-
s.element_coords,
|
|
71
|
-
get_node_index_in_element(s.trial_dof),
|
|
72
|
-
)
|
|
73
|
-
return weight * self.space.unit_dof_value(args.elt_arg, args.eval_arg, s.trial_dof)
|
|
74
|
-
|
|
75
|
-
return eval_trial_inner
|
|
76
|
-
|
|
77
|
-
def _make_eval_grad_inner(self):
|
|
78
|
-
if not self.gradient_valid():
|
|
79
|
-
return None
|
|
80
|
-
|
|
81
|
-
@cache.dynamic_func(suffix=self.name)
|
|
82
|
-
def eval_nabla_trial_inner(args: self.ElementEvalArg, s: Sample):
|
|
83
|
-
nabla_weight = self.space.element_inner_weight_gradient(
|
|
84
|
-
args.elt_arg,
|
|
85
|
-
args.eval_arg,
|
|
86
|
-
s.element_index,
|
|
87
|
-
s.element_coords,
|
|
88
|
-
get_node_index_in_element(s.trial_dof),
|
|
89
|
-
)
|
|
90
|
-
grad_transform = self.space.element_inner_reference_gradient_transform(args.elt_arg, s)
|
|
91
|
-
return utils.generalized_outer(
|
|
92
|
-
self.space.unit_dof_value(args.elt_arg, args.eval_arg, s.trial_dof),
|
|
93
|
-
utils.apply_right(nabla_weight, grad_transform),
|
|
94
|
-
)
|
|
95
|
-
|
|
96
|
-
return eval_nabla_trial_inner
|
|
97
|
-
|
|
98
|
-
def _make_eval_div_inner(self):
|
|
99
|
-
if not self.divergence_valid():
|
|
100
|
-
return None
|
|
101
|
-
|
|
102
|
-
@cache.dynamic_func(suffix=self.name)
|
|
103
|
-
def eval_div_trial_inner(args: self.ElementEvalArg, s: Sample):
|
|
104
|
-
nabla_weight = self.space.element_inner_weight_gradient(
|
|
105
|
-
args.elt_arg,
|
|
106
|
-
args.eval_arg,
|
|
107
|
-
s.element_index,
|
|
108
|
-
s.element_coords,
|
|
109
|
-
get_node_index_in_element(s.trial_dof),
|
|
110
|
-
)
|
|
111
|
-
grad_transform = self.space.element_inner_reference_gradient_transform(args.elt_arg, s)
|
|
112
|
-
return utils.generalized_inner(
|
|
113
|
-
self.space.unit_dof_value(args.elt_arg, args.eval_arg, s.trial_dof),
|
|
114
|
-
utils.apply_right(nabla_weight, grad_transform),
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
return eval_div_trial_inner
|
|
118
|
-
|
|
119
|
-
def _make_eval_outer(self):
|
|
120
|
-
@cache.dynamic_func(suffix=self.name)
|
|
121
|
-
def eval_trial_outer(args: self.ElementEvalArg, s: Sample):
|
|
122
|
-
weight = self.space.element_outer_weight(
|
|
123
|
-
args.elt_arg,
|
|
124
|
-
args.eval_arg,
|
|
125
|
-
s.element_index,
|
|
126
|
-
s.element_coords,
|
|
127
|
-
get_node_index_in_element(s.trial_dof),
|
|
128
|
-
)
|
|
129
|
-
return weight * self.space.unit_dof_value(args.elt_arg, args.eval_arg, s.trial_dof)
|
|
130
|
-
|
|
131
|
-
return eval_trial_outer
|
|
132
|
-
|
|
133
|
-
def _make_eval_grad_outer(self):
|
|
134
|
-
if not self.gradient_valid():
|
|
135
|
-
return None
|
|
136
|
-
|
|
137
|
-
@cache.dynamic_func(suffix=self.name)
|
|
138
|
-
def eval_nabla_trial_outer(args: self.ElementEvalArg, s: Sample):
|
|
139
|
-
nabla_weight = self.space.element_outer_weight_gradient(
|
|
140
|
-
args.elt_arg,
|
|
141
|
-
args.eval_arg,
|
|
142
|
-
s.element_index,
|
|
143
|
-
s.element_coords,
|
|
144
|
-
get_node_index_in_element(s.trial_dof),
|
|
145
|
-
)
|
|
146
|
-
grad_transform = self.space.element_outer_reference_gradient_transform(args.elt_arg, s)
|
|
147
|
-
return utils.generalized_outer(
|
|
148
|
-
self.space.unit_dof_value(args.elt_arg, args.eval_arg, s.trial_dof),
|
|
149
|
-
utils.apply_right(nabla_weight, grad_transform),
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
return eval_nabla_trial_outer
|
|
153
|
-
|
|
154
|
-
def _make_eval_div_outer(self):
|
|
155
|
-
if not self.divergence_valid():
|
|
156
|
-
return None
|
|
157
|
-
|
|
158
|
-
@cache.dynamic_func(suffix=self.name)
|
|
159
|
-
def eval_div_trial_outer(args: self.ElementEvalArg, s: Sample):
|
|
160
|
-
nabla_weight = self.space.element_outer_weight_gradient(
|
|
161
|
-
args.elt_arg,
|
|
162
|
-
args.eval_arg,
|
|
163
|
-
s.element_index,
|
|
164
|
-
s.element_coords,
|
|
165
|
-
get_node_index_in_element(s.trial_dof),
|
|
166
|
-
)
|
|
167
|
-
grad_transform = self.space.element_outer_reference_gradient_transform(args.elt_arg, s)
|
|
168
|
-
return utils.generalized_inner(
|
|
169
|
-
self.space.unit_dof_value(args.elt_arg, args.eval_arg, s.trial_dof),
|
|
170
|
-
utils.apply_right(nabla_weight, grad_transform),
|
|
171
|
-
)
|
|
172
|
-
|
|
173
|
-
return eval_div_trial_outer
|
|
174
|
-
|
|
175
|
-
def _make_at_node(self):
|
|
176
|
-
@cache.dynamic_func(suffix=self.name)
|
|
177
|
-
def at_node(args: self.ElementEvalArg, s: Sample):
|
|
178
|
-
node_coords = self.space.node_coords_in_element(
|
|
179
|
-
args.elt_arg, args.eval_arg, s.element_index, get_node_index_in_element(s.trial_dof)
|
|
180
|
-
)
|
|
181
|
-
return Sample(s.element_index, node_coords, s.qp_index, s.qp_weight, s.test_dof, s.trial_dof)
|
|
182
|
-
|
|
183
|
-
return at_node
|
|
1
|
+
import warp as wp
|
|
2
|
+
from warp.fem import cache, utils
|
|
3
|
+
from warp.fem.domain import GeometryDomain
|
|
4
|
+
from warp.fem.space import FunctionSpace, SpacePartition
|
|
5
|
+
from warp.fem.types import Sample, get_node_index_in_element
|
|
6
|
+
|
|
7
|
+
from .field import SpaceField
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TrialField(SpaceField):
|
|
11
|
+
"""Field defined over a domain that can be used as a trial function"""
|
|
12
|
+
|
|
13
|
+
def __init__(
|
|
14
|
+
self,
|
|
15
|
+
space: FunctionSpace,
|
|
16
|
+
space_partition: SpacePartition,
|
|
17
|
+
domain: GeometryDomain,
|
|
18
|
+
):
|
|
19
|
+
if domain.dimension == space.dimension - 1:
|
|
20
|
+
space = space.trace()
|
|
21
|
+
|
|
22
|
+
if domain.dimension != space.dimension:
|
|
23
|
+
raise ValueError("Incompatible space and domain dimensions")
|
|
24
|
+
|
|
25
|
+
if not space.topology.is_derived_from(space_partition.space_topology):
|
|
26
|
+
raise ValueError("Incompatible space and space partition topologies")
|
|
27
|
+
|
|
28
|
+
super().__init__(space, space_partition)
|
|
29
|
+
|
|
30
|
+
self.domain = domain
|
|
31
|
+
|
|
32
|
+
self.EvalArg = self.space.SpaceArg
|
|
33
|
+
self.ElementEvalArg = self._make_element_eval_arg()
|
|
34
|
+
|
|
35
|
+
self.eval_degree = self._make_eval_degree()
|
|
36
|
+
self.eval_inner = self._make_eval_inner()
|
|
37
|
+
self.eval_grad_inner = self._make_eval_grad_inner()
|
|
38
|
+
self.eval_div_inner = self._make_eval_div_inner()
|
|
39
|
+
self.eval_outer = self._make_eval_outer()
|
|
40
|
+
self.eval_grad_outer = self._make_eval_grad_outer()
|
|
41
|
+
self.eval_div_outer = self._make_eval_div_outer()
|
|
42
|
+
self.at_node = self._make_at_node()
|
|
43
|
+
|
|
44
|
+
def partition_node_count(self) -> int:
|
|
45
|
+
"""Returns the number of nodes in the associated space topology partition"""
|
|
46
|
+
return self.space_partition.node_count()
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def name(self) -> str:
|
|
50
|
+
return self.space.name + "Trial"
|
|
51
|
+
|
|
52
|
+
def eval_arg_value(self, device) -> wp.codegen.StructInstance:
|
|
53
|
+
return self.space.space_arg_value(device)
|
|
54
|
+
|
|
55
|
+
def _make_element_eval_arg(self):
|
|
56
|
+
@cache.dynamic_struct(suffix=self.name)
|
|
57
|
+
class ElementEvalArg:
|
|
58
|
+
elt_arg: self.domain.ElementArg
|
|
59
|
+
eval_arg: self.EvalArg
|
|
60
|
+
|
|
61
|
+
return ElementEvalArg
|
|
62
|
+
|
|
63
|
+
def _make_eval_inner(self):
|
|
64
|
+
@cache.dynamic_func(suffix=self.name)
|
|
65
|
+
def eval_trial_inner(args: self.ElementEvalArg, s: Sample):
|
|
66
|
+
weight = self.space.element_inner_weight(
|
|
67
|
+
args.elt_arg,
|
|
68
|
+
args.eval_arg,
|
|
69
|
+
s.element_index,
|
|
70
|
+
s.element_coords,
|
|
71
|
+
get_node_index_in_element(s.trial_dof),
|
|
72
|
+
)
|
|
73
|
+
return weight * self.space.unit_dof_value(args.elt_arg, args.eval_arg, s.trial_dof)
|
|
74
|
+
|
|
75
|
+
return eval_trial_inner
|
|
76
|
+
|
|
77
|
+
def _make_eval_grad_inner(self):
|
|
78
|
+
if not self.gradient_valid():
|
|
79
|
+
return None
|
|
80
|
+
|
|
81
|
+
@cache.dynamic_func(suffix=self.name)
|
|
82
|
+
def eval_nabla_trial_inner(args: self.ElementEvalArg, s: Sample):
|
|
83
|
+
nabla_weight = self.space.element_inner_weight_gradient(
|
|
84
|
+
args.elt_arg,
|
|
85
|
+
args.eval_arg,
|
|
86
|
+
s.element_index,
|
|
87
|
+
s.element_coords,
|
|
88
|
+
get_node_index_in_element(s.trial_dof),
|
|
89
|
+
)
|
|
90
|
+
grad_transform = self.space.element_inner_reference_gradient_transform(args.elt_arg, s)
|
|
91
|
+
return utils.generalized_outer(
|
|
92
|
+
self.space.unit_dof_value(args.elt_arg, args.eval_arg, s.trial_dof),
|
|
93
|
+
utils.apply_right(nabla_weight, grad_transform),
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
return eval_nabla_trial_inner
|
|
97
|
+
|
|
98
|
+
def _make_eval_div_inner(self):
|
|
99
|
+
if not self.divergence_valid():
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
@cache.dynamic_func(suffix=self.name)
|
|
103
|
+
def eval_div_trial_inner(args: self.ElementEvalArg, s: Sample):
|
|
104
|
+
nabla_weight = self.space.element_inner_weight_gradient(
|
|
105
|
+
args.elt_arg,
|
|
106
|
+
args.eval_arg,
|
|
107
|
+
s.element_index,
|
|
108
|
+
s.element_coords,
|
|
109
|
+
get_node_index_in_element(s.trial_dof),
|
|
110
|
+
)
|
|
111
|
+
grad_transform = self.space.element_inner_reference_gradient_transform(args.elt_arg, s)
|
|
112
|
+
return utils.generalized_inner(
|
|
113
|
+
self.space.unit_dof_value(args.elt_arg, args.eval_arg, s.trial_dof),
|
|
114
|
+
utils.apply_right(nabla_weight, grad_transform),
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
return eval_div_trial_inner
|
|
118
|
+
|
|
119
|
+
def _make_eval_outer(self):
|
|
120
|
+
@cache.dynamic_func(suffix=self.name)
|
|
121
|
+
def eval_trial_outer(args: self.ElementEvalArg, s: Sample):
|
|
122
|
+
weight = self.space.element_outer_weight(
|
|
123
|
+
args.elt_arg,
|
|
124
|
+
args.eval_arg,
|
|
125
|
+
s.element_index,
|
|
126
|
+
s.element_coords,
|
|
127
|
+
get_node_index_in_element(s.trial_dof),
|
|
128
|
+
)
|
|
129
|
+
return weight * self.space.unit_dof_value(args.elt_arg, args.eval_arg, s.trial_dof)
|
|
130
|
+
|
|
131
|
+
return eval_trial_outer
|
|
132
|
+
|
|
133
|
+
def _make_eval_grad_outer(self):
|
|
134
|
+
if not self.gradient_valid():
|
|
135
|
+
return None
|
|
136
|
+
|
|
137
|
+
@cache.dynamic_func(suffix=self.name)
|
|
138
|
+
def eval_nabla_trial_outer(args: self.ElementEvalArg, s: Sample):
|
|
139
|
+
nabla_weight = self.space.element_outer_weight_gradient(
|
|
140
|
+
args.elt_arg,
|
|
141
|
+
args.eval_arg,
|
|
142
|
+
s.element_index,
|
|
143
|
+
s.element_coords,
|
|
144
|
+
get_node_index_in_element(s.trial_dof),
|
|
145
|
+
)
|
|
146
|
+
grad_transform = self.space.element_outer_reference_gradient_transform(args.elt_arg, s)
|
|
147
|
+
return utils.generalized_outer(
|
|
148
|
+
self.space.unit_dof_value(args.elt_arg, args.eval_arg, s.trial_dof),
|
|
149
|
+
utils.apply_right(nabla_weight, grad_transform),
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
return eval_nabla_trial_outer
|
|
153
|
+
|
|
154
|
+
def _make_eval_div_outer(self):
|
|
155
|
+
if not self.divergence_valid():
|
|
156
|
+
return None
|
|
157
|
+
|
|
158
|
+
@cache.dynamic_func(suffix=self.name)
|
|
159
|
+
def eval_div_trial_outer(args: self.ElementEvalArg, s: Sample):
|
|
160
|
+
nabla_weight = self.space.element_outer_weight_gradient(
|
|
161
|
+
args.elt_arg,
|
|
162
|
+
args.eval_arg,
|
|
163
|
+
s.element_index,
|
|
164
|
+
s.element_coords,
|
|
165
|
+
get_node_index_in_element(s.trial_dof),
|
|
166
|
+
)
|
|
167
|
+
grad_transform = self.space.element_outer_reference_gradient_transform(args.elt_arg, s)
|
|
168
|
+
return utils.generalized_inner(
|
|
169
|
+
self.space.unit_dof_value(args.elt_arg, args.eval_arg, s.trial_dof),
|
|
170
|
+
utils.apply_right(nabla_weight, grad_transform),
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
return eval_div_trial_outer
|
|
174
|
+
|
|
175
|
+
def _make_at_node(self):
|
|
176
|
+
@cache.dynamic_func(suffix=self.name)
|
|
177
|
+
def at_node(args: self.ElementEvalArg, s: Sample):
|
|
178
|
+
node_coords = self.space.node_coords_in_element(
|
|
179
|
+
args.elt_arg, args.eval_arg, s.element_index, get_node_index_in_element(s.trial_dof)
|
|
180
|
+
)
|
|
181
|
+
return Sample(s.element_index, node_coords, s.qp_index, s.qp_weight, s.test_dof, s.trial_dof)
|
|
182
|
+
|
|
183
|
+
return at_node
|
warp/fem/geometry/__init__.py
CHANGED
|
@@ -1,19 +1,15 @@
|
|
|
1
|
-
from .
|
|
2
|
-
from .
|
|
3
|
-
from .
|
|
4
|
-
|
|
5
|
-
from .
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
from .
|
|
14
|
-
from .
|
|
15
|
-
|
|
16
|
-
from .trimesh_2d import Trimesh2D
|
|
17
|
-
from .tetmesh import Tetmesh
|
|
18
|
-
from .quadmesh_2d import Quadmesh2D
|
|
19
|
-
from .hexmesh import Hexmesh
|
|
1
|
+
from .deformed_geometry import DeformedGeometry
|
|
2
|
+
from .element import Element
|
|
3
|
+
from .geometry import Geometry
|
|
4
|
+
from .grid_2d import Grid2D
|
|
5
|
+
from .grid_3d import Grid3D
|
|
6
|
+
from .hexmesh import Hexmesh
|
|
7
|
+
from .partition import (
|
|
8
|
+
ExplicitGeometryPartition,
|
|
9
|
+
GeometryPartition,
|
|
10
|
+
LinearGeometryPartition,
|
|
11
|
+
WholeGeometryPartition,
|
|
12
|
+
)
|
|
13
|
+
from .quadmesh_2d import Quadmesh2D
|
|
14
|
+
from .tetmesh import Tetmesh
|
|
15
|
+
from .trimesh_2d import Trimesh2D
|
|
@@ -1,70 +1,69 @@
|
|
|
1
|
-
from typing import Any
|
|
2
|
-
|
|
3
|
-
import warp as wp
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
return dmin, s123
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
import warp as wp
|
|
4
|
+
from warp.fem.types import Coords
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@wp.func
|
|
8
|
+
def project_on_seg_at_origin(q: Any, seg: Any, len_sq: float):
|
|
9
|
+
s = wp.clamp(wp.dot(q, seg) / len_sq, 0.0, 1.0)
|
|
10
|
+
return wp.length_sq(q - s * seg), s
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@wp.func
|
|
14
|
+
def project_on_tri_at_origin(q: Any, e1: Any, e2: Any):
|
|
15
|
+
e1e1 = wp.dot(e1, e1)
|
|
16
|
+
e1e2 = wp.dot(e1, e2)
|
|
17
|
+
e2e2 = wp.dot(e2, e2)
|
|
18
|
+
|
|
19
|
+
det = e1e1 * e2e2 - e1e2 * e1e2
|
|
20
|
+
|
|
21
|
+
if det > e1e1 * e2e2 * 1.0e-6:
|
|
22
|
+
e1p = wp.dot(e1, q)
|
|
23
|
+
e2p = wp.dot(e2, q)
|
|
24
|
+
|
|
25
|
+
s = (e2e2 * e1p - e1e2 * e2p) / det
|
|
26
|
+
t = (e1e1 * e2p - e1e2 * e1p) / det
|
|
27
|
+
|
|
28
|
+
if s >= 0.0 and t >= 0.0 and s + t <= 1.0:
|
|
29
|
+
# point inside triangle (distance can be non-zero in 3D case)
|
|
30
|
+
return wp.length_sq(q - s * e1 - t * e2), Coords(1.0 - s - t, s, t)
|
|
31
|
+
|
|
32
|
+
d1, s1 = project_on_seg_at_origin(q, e1, e1e1)
|
|
33
|
+
d2, s2 = project_on_seg_at_origin(q, e2, e2e2)
|
|
34
|
+
d12, s12 = project_on_seg_at_origin(q - e1, e2 - e1, wp.length_sq(e2 - e1))
|
|
35
|
+
|
|
36
|
+
if d1 <= d2:
|
|
37
|
+
if d1 <= d12:
|
|
38
|
+
return d1, Coords(1.0 - s1, s1, 0.0)
|
|
39
|
+
elif d2 <= d12:
|
|
40
|
+
return d2, Coords(1.0 - s2, 0.0, s2)
|
|
41
|
+
|
|
42
|
+
return d12, Coords(0.0, 1.0 - s12, s12)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@wp.func
|
|
46
|
+
def project_on_tet_at_origin(q: wp.vec3, e1: wp.vec3, e2: wp.vec3, e3: wp.vec3):
|
|
47
|
+
mat = wp.inverse(wp.mat33(e1, e2, e3))
|
|
48
|
+
coords = mat * q
|
|
49
|
+
|
|
50
|
+
if wp.min(coords) >= 0.0 and coords[0] + coords[1] + coords[2] <= 1.0:
|
|
51
|
+
return 0.0, coords
|
|
52
|
+
|
|
53
|
+
# Not inside tet, compare closest point on each tri
|
|
54
|
+
|
|
55
|
+
d12, s12 = project_on_tri_at_origin(q, e1, e2)
|
|
56
|
+
d23, s23 = project_on_tri_at_origin(q, e2, e3)
|
|
57
|
+
d31, s31 = project_on_tri_at_origin(q, e3, e1)
|
|
58
|
+
d123, s123 = project_on_tri_at_origin(q - e1, e2 - e1, e3 - e1)
|
|
59
|
+
|
|
60
|
+
dmin = wp.min(wp.vec4(d12, d23, d31, d123))
|
|
61
|
+
|
|
62
|
+
if dmin == d12:
|
|
63
|
+
return dmin, Coords(s12[1], s12[2], 0.0)
|
|
64
|
+
elif dmin == d23:
|
|
65
|
+
return dmin, Coords(0.0, s23[1], s23[2])
|
|
66
|
+
elif dmin == d31:
|
|
67
|
+
return dmin, Coords(s31[2], 0.0, s31[1])
|
|
68
|
+
else:
|
|
69
|
+
return dmin, s123
|