warp-lang 1.0.2__py3-none-manylinux2014_x86_64.whl → 1.2.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 +88 -113
- warp/build_dll.py +383 -375
- warp/builtins.py +3693 -3354
- warp/codegen.py +2925 -2792
- warp/config.py +40 -36
- warp/constants.py +49 -45
- warp/context.py +5409 -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 +381 -383
- warp/examples/benchmarks/benchmark_cloth.py +278 -277
- 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 +145 -146
- warp/examples/benchmarks/benchmark_launches.py +293 -295
- warp/examples/browse.py +29 -29
- warp/examples/core/example_dem.py +232 -219
- warp/examples/core/example_fluid.py +291 -267
- warp/examples/core/example_graph_capture.py +142 -126
- warp/examples/core/example_marching_cubes.py +186 -174
- warp/examples/core/example_mesh.py +172 -155
- warp/examples/core/example_mesh_intersect.py +203 -193
- warp/examples/core/example_nvdb.py +174 -170
- warp/examples/core/example_raycast.py +103 -90
- warp/examples/core/example_raymarch.py +197 -178
- warp/examples/core/example_render_opengl.py +183 -141
- warp/examples/core/example_sph.py +403 -387
- warp/examples/core/example_torch.py +219 -181
- warp/examples/core/example_wave.py +261 -248
- warp/examples/fem/bsr_utils.py +378 -380
- warp/examples/fem/example_apic_fluid.py +432 -389
- warp/examples/fem/example_burgers.py +262 -0
- warp/examples/fem/example_convection_diffusion.py +180 -168
- warp/examples/fem/example_convection_diffusion_dg.py +217 -209
- warp/examples/fem/example_deformed_geometry.py +175 -159
- warp/examples/fem/example_diffusion.py +199 -173
- warp/examples/fem/example_diffusion_3d.py +178 -152
- warp/examples/fem/example_diffusion_mgpu.py +219 -214
- warp/examples/fem/example_mixed_elasticity.py +242 -222
- warp/examples/fem/example_navier_stokes.py +257 -243
- warp/examples/fem/example_stokes.py +218 -192
- warp/examples/fem/example_stokes_transfer.py +263 -249
- warp/examples/fem/mesh_utils.py +133 -109
- warp/examples/fem/plot_utils.py +292 -287
- warp/examples/optim/example_bounce.py +258 -246
- warp/examples/optim/example_cloth_throw.py +220 -209
- warp/examples/optim/example_diffray.py +564 -536
- warp/examples/optim/example_drone.py +862 -835
- warp/examples/optim/example_inverse_kinematics.py +174 -168
- warp/examples/optim/example_inverse_kinematics_torch.py +183 -169
- warp/examples/optim/example_spring_cage.py +237 -231
- warp/examples/optim/example_trajectory.py +221 -199
- warp/examples/optim/example_walker.py +304 -293
- warp/examples/sim/example_cartpole.py +137 -129
- warp/examples/sim/example_cloth.py +194 -186
- warp/examples/sim/example_granular.py +122 -111
- warp/examples/sim/example_granular_collision_sdf.py +195 -186
- warp/examples/sim/example_jacobian_ik.py +234 -214
- warp/examples/sim/example_particle_chain.py +116 -105
- warp/examples/sim/example_quadruped.py +191 -180
- warp/examples/sim/example_rigid_chain.py +195 -187
- warp/examples/sim/example_rigid_contact.py +187 -177
- warp/examples/sim/example_rigid_force.py +125 -125
- warp/examples/sim/example_rigid_gyroscopic.py +107 -95
- warp/examples/sim/example_rigid_soft_contact.py +132 -122
- warp/examples/sim/example_soft_body.py +188 -177
- warp/fabric.py +337 -335
- warp/fem/__init__.py +61 -27
- warp/fem/cache.py +403 -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 +16 -19
- warp/fem/geometry/closest_point.py +69 -70
- warp/fem/geometry/deformed_geometry.py +270 -271
- warp/fem/geometry/element.py +748 -744
- warp/fem/geometry/geometry.py +184 -186
- warp/fem/geometry/grid_2d.py +380 -373
- warp/fem/geometry/grid_3d.py +437 -435
- warp/fem/geometry/hexmesh.py +953 -953
- warp/fem/geometry/nanogrid.py +455 -0
- 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 +1684 -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 +179 -292
- warp/fem/space/basis_space.py +522 -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 +148 -267
- warp/fem/space/grid_3d_function_space.py +167 -306
- warp/fem/space/hexmesh_function_space.py +253 -352
- warp/fem/space/nanogrid_function_space.py +202 -0
- warp/fem/space/partition.py +350 -350
- warp/fem/space/quadmesh_2d_function_space.py +261 -369
- warp/fem/space/restriction.py +161 -160
- warp/fem/space/shape/__init__.py +90 -15
- warp/fem/space/shape/cube_shape_function.py +728 -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 +224 -292
- warp/fem/space/topology.py +297 -295
- warp/fem/space/trimesh_2d_function_space.py +153 -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 +1081 -1025
- warp/native/builtin.h +1603 -1560
- warp/native/bvh.cpp +402 -398
- warp/native/bvh.cu +533 -525
- warp/native/bvh.h +430 -429
- warp/native/clang/clang.cpp +496 -464
- warp/native/crt.cpp +42 -32
- warp/native/crt.h +352 -335
- 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/exports.h +187 -0
- 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 +1545 -1498
- warp/native/matnn.h +333 -333
- warp/native/mesh.cpp +203 -203
- warp/native/mesh.cu +292 -293
- warp/native/mesh.h +1887 -1887
- warp/native/nanovdb/GridHandle.h +366 -0
- warp/native/nanovdb/HostBuffer.h +590 -0
- warp/native/nanovdb/NanoVDB.h +6624 -4782
- warp/native/nanovdb/PNanoVDB.h +3390 -2553
- warp/native/noise.h +850 -850
- warp/native/quat.h +1112 -1085
- warp/native/rand.h +303 -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 +1177 -1133
- warp/native/volume.cpp +529 -297
- warp/native/volume.cu +58 -32
- warp/native/volume.h +960 -538
- warp/native/volume_builder.cu +446 -425
- warp/native/volume_builder.h +34 -19
- warp/native/volume_impl.h +61 -0
- warp/native/warp.cpp +1057 -1052
- warp/native/warp.cu +2949 -2828
- warp/native/warp.h +321 -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 +3356 -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 +1917 -1991
- warp/sim/integrator_xpbd.py +3288 -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 +1289 -1227
- warp/stubs.py +2192 -2469
- warp/tape.py +1162 -225
- warp/tests/__init__.py +1 -1
- warp/tests/__main__.py +4 -4
- warp/tests/assets/test_index_grid.nvdb +0 -0
- 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 +20 -22
- warp/tests/aux_test_grad_customs.py +21 -23
- warp/tests/aux_test_reference.py +9 -11
- warp/tests/aux_test_reference_reference.py +8 -10
- warp/tests/aux_test_square.py +15 -17
- warp/tests/aux_test_unresolved_func.py +14 -14
- warp/tests/aux_test_unresolved_symbol.py +14 -14
- warp/tests/disabled_kinematics.py +237 -239
- warp/tests/run_coverage_serial.py +31 -31
- warp/tests/test_adam.py +155 -157
- warp/tests/test_arithmetic.py +1088 -1124
- warp/tests/test_array.py +2415 -2326
- warp/tests/test_array_reduce.py +148 -150
- warp/tests/test_async.py +666 -656
- warp/tests/test_atomic.py +139 -141
- warp/tests/test_bool.py +212 -149
- warp/tests/test_builtins_resolution.py +1290 -1292
- warp/tests/test_bvh.py +162 -171
- warp/tests/test_closest_point_edge_edge.py +227 -228
- warp/tests/test_codegen.py +562 -553
- warp/tests/test_compile_consts.py +217 -101
- warp/tests/test_conditional.py +244 -246
- warp/tests/test_copy.py +230 -215
- warp/tests/test_ctypes.py +630 -632
- warp/tests/test_dense.py +65 -67
- warp/tests/test_devices.py +89 -98
- warp/tests/test_dlpack.py +528 -529
- warp/tests/test_examples.py +403 -378
- warp/tests/test_fabricarray.py +952 -955
- warp/tests/test_fast_math.py +60 -54
- warp/tests/test_fem.py +1298 -1278
- warp/tests/test_fp16.py +128 -130
- warp/tests/test_func.py +336 -337
- warp/tests/test_generics.py +596 -571
- warp/tests/test_grad.py +885 -640
- warp/tests/test_grad_customs.py +331 -336
- warp/tests/test_hash_grid.py +208 -164
- warp/tests/test_import.py +37 -39
- warp/tests/test_indexedarray.py +1132 -1134
- warp/tests/test_intersect.py +65 -67
- warp/tests/test_jax.py +305 -307
- warp/tests/test_large.py +169 -164
- warp/tests/test_launch.py +352 -354
- warp/tests/test_lerp.py +217 -261
- warp/tests/test_linear_solvers.py +189 -171
- warp/tests/test_lvalue.py +419 -493
- warp/tests/test_marching_cubes.py +63 -65
- warp/tests/test_mat.py +1799 -1827
- warp/tests/test_mat_lite.py +113 -115
- warp/tests/test_mat_scalar_ops.py +2905 -2889
- warp/tests/test_math.py +124 -193
- warp/tests/test_matmul.py +498 -499
- warp/tests/test_matmul_lite.py +408 -410
- warp/tests/test_mempool.py +186 -190
- warp/tests/test_mesh.py +281 -324
- warp/tests/test_mesh_query_aabb.py +226 -241
- warp/tests/test_mesh_query_point.py +690 -702
- warp/tests/test_mesh_query_ray.py +290 -303
- warp/tests/test_mlp.py +274 -276
- warp/tests/test_model.py +108 -110
- warp/tests/test_module_hashing.py +111 -0
- warp/tests/test_modules_lite.py +36 -39
- warp/tests/test_multigpu.py +161 -163
- warp/tests/test_noise.py +244 -248
- warp/tests/test_operators.py +248 -250
- warp/tests/test_options.py +121 -125
- warp/tests/test_peer.py +131 -137
- warp/tests/test_pinned.py +76 -78
- warp/tests/test_print.py +52 -54
- warp/tests/test_quat.py +2084 -2086
- warp/tests/test_rand.py +324 -288
- warp/tests/test_reload.py +207 -217
- warp/tests/test_rounding.py +177 -179
- warp/tests/test_runlength_encode.py +188 -190
- warp/tests/test_sim_grad.py +241 -0
- warp/tests/test_sim_kinematics.py +89 -97
- warp/tests/test_smoothstep.py +166 -168
- warp/tests/test_snippet.py +303 -266
- warp/tests/test_sparse.py +466 -460
- warp/tests/test_spatial.py +2146 -2148
- warp/tests/test_special_values.py +362 -0
- warp/tests/test_streams.py +484 -473
- warp/tests/test_struct.py +708 -675
- warp/tests/test_tape.py +171 -148
- warp/tests/test_torch.py +741 -743
- warp/tests/test_transient_module.py +85 -87
- warp/tests/test_types.py +554 -659
- warp/tests/test_utils.py +488 -499
- warp/tests/test_vec.py +1262 -1268
- warp/tests/test_vec_lite.py +71 -73
- warp/tests/test_vec_scalar_ops.py +2097 -2099
- warp/tests/test_verify_fp.py +92 -94
- warp/tests/test_volume.py +961 -736
- warp/tests/test_volume_write.py +338 -265
- warp/tests/unittest_serial.py +38 -37
- warp/tests/unittest_suites.py +367 -359
- warp/tests/unittest_utils.py +434 -578
- warp/tests/unused_test_misc.py +69 -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 +563 -561
- warp/torch.py +321 -295
- warp/types.py +4941 -4450
- warp/utils.py +1008 -821
- {warp_lang-1.0.2.dist-info → warp_lang-1.2.0.dist-info}/LICENSE.md +126 -126
- {warp_lang-1.0.2.dist-info → warp_lang-1.2.0.dist-info}/METADATA +365 -400
- warp_lang-1.2.0.dist-info/RECORD +359 -0
- warp/examples/assets/cube.usda +0 -42
- warp/examples/assets/sphere.usda +0 -56
- warp/examples/assets/torus.usda +0 -105
- warp/examples/fem/example_convection_diffusion_dg0.py +0 -194
- warp/native/nanovdb/PNanoVDBWrite.h +0 -295
- warp_lang-1.0.2.dist-info/RECORD +0 -352
- {warp_lang-1.0.2.dist-info → warp_lang-1.2.0.dist-info}/WHEEL +0 -0
- {warp_lang-1.0.2.dist-info → warp_lang-1.2.0.dist-info}/top_level.txt +0 -0
warp/fem/space/dof_mapper.py
CHANGED
|
@@ -1,236 +1,236 @@
|
|
|
1
|
-
|
|
2
|
-
from enum import Enum
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
import warp as wp
|
|
6
|
-
import warp.types
|
|
7
|
-
|
|
8
|
-
vec6 = wp.types.vector(length=6, dtype=wp.float32)
|
|
9
|
-
|
|
10
|
-
_SQRT_2 = wp.constant(math.sqrt(2.0))
|
|
11
|
-
_SQRT_3 = wp.constant(math.sqrt(3.0))
|
|
12
|
-
_SQRT_1_2 = wp.constant(math.sqrt(1.0 / 2.0))
|
|
13
|
-
_SQRT_1_3 = wp.constant(math.sqrt(1.0 / 3.0))
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class DofMapper:
|
|
17
|
-
"""Base class from mapping node degrees of freedom to function values"""
|
|
18
|
-
|
|
19
|
-
value_dtype: type
|
|
20
|
-
dof_dtype: type
|
|
21
|
-
DOF_SIZE: int
|
|
22
|
-
|
|
23
|
-
@wp.func
|
|
24
|
-
def dof_to_value(dof: Any):
|
|
25
|
-
raise NotImplementedError
|
|
26
|
-
|
|
27
|
-
@wp.func
|
|
28
|
-
def value_to_dof(val: Any):
|
|
29
|
-
raise NotImplementedError
|
|
30
|
-
|
|
31
|
-
def __str__(self):
|
|
32
|
-
return f"{self.value_dtype.__name__}_{self.DOF_SIZE}"
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
class IdentityMapper(DofMapper):
|
|
36
|
-
"""Identity mapper"""
|
|
37
|
-
|
|
38
|
-
def __init__(self, dtype: type):
|
|
39
|
-
if dtype == float:
|
|
40
|
-
dtype = wp.float32
|
|
41
|
-
|
|
42
|
-
self.value_dtype = dtype
|
|
43
|
-
self.dof_dtype = dtype
|
|
44
|
-
|
|
45
|
-
size = warp.types.type_length(dtype)
|
|
46
|
-
self.DOF_SIZE = wp.constant(size)
|
|
47
|
-
|
|
48
|
-
@wp.func
|
|
49
|
-
def dof_to_value(dof: Any):
|
|
50
|
-
return dof
|
|
51
|
-
|
|
52
|
-
@wp.func
|
|
53
|
-
def value_to_dof(val: Any):
|
|
54
|
-
return val
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
class SymmetricTensorMapper(DofMapper):
|
|
58
|
-
"""Orthonormal isomorphism from R^{n (n+1)} to nxn symmetric tensors,
|
|
59
|
-
using usual L2 norm for vectors and half Frobenius norm, (tau : tau)/2 for tensors.
|
|
60
|
-
"""
|
|
61
|
-
|
|
62
|
-
class Mapping(Enum):
|
|
63
|
-
VOIGT = 0
|
|
64
|
-
"""Voigt ordering of vector coefficients:
|
|
65
|
-
first the three diagonal terms, then off-diagonal coefficients"""
|
|
66
|
-
DB16 = 1
|
|
67
|
-
"""Ordering that also separates normal from tangential coefficients:
|
|
68
|
-
first trace, then other diagonal terms, then off-diagonal coefficients.
|
|
69
|
-
See [Daviet and Bertails-Descoubes 2016]"""
|
|
70
|
-
|
|
71
|
-
def __init__(self, dtype: type, mapping: Mapping = Mapping.VOIGT):
|
|
72
|
-
self.value_dtype = dtype
|
|
73
|
-
self.mapping = mapping
|
|
74
|
-
|
|
75
|
-
if dtype == wp.mat22:
|
|
76
|
-
self.dof_dtype = wp.vec3
|
|
77
|
-
self.DOF_SIZE = wp.constant(3)
|
|
78
|
-
if mapping == SymmetricTensorMapper.Mapping.VOIGT:
|
|
79
|
-
self.dof_to_value = SymmetricTensorMapper.dof_to_value_2d_voigt
|
|
80
|
-
self.value_to_dof = SymmetricTensorMapper.value_to_dof_2d_voigt
|
|
81
|
-
else:
|
|
82
|
-
self.dof_to_value = SymmetricTensorMapper.dof_to_value_2d
|
|
83
|
-
self.value_to_dof = SymmetricTensorMapper.value_to_dof_2d
|
|
84
|
-
elif dtype == wp.mat33:
|
|
85
|
-
self.dof_dtype = vec6
|
|
86
|
-
self.DOF_SIZE = wp.constant(6)
|
|
87
|
-
if mapping == SymmetricTensorMapper.Mapping.VOIGT:
|
|
88
|
-
self.dof_to_value = SymmetricTensorMapper.dof_to_value_3d_voigt
|
|
89
|
-
self.value_to_dof = SymmetricTensorMapper.value_to_dof_3d_voigt
|
|
90
|
-
else:
|
|
91
|
-
self.dof_to_value = SymmetricTensorMapper.dof_to_value_3d
|
|
92
|
-
self.value_to_dof = SymmetricTensorMapper.value_to_dof_3d
|
|
93
|
-
else:
|
|
94
|
-
raise ValueError("Unsupported value dtype: ", dtype)
|
|
95
|
-
|
|
96
|
-
def __str__(self):
|
|
97
|
-
return f"{self.mapping}_{self.DOF_SIZE}"
|
|
98
|
-
|
|
99
|
-
@wp.func
|
|
100
|
-
def dof_to_value_2d(dof: wp.vec3):
|
|
101
|
-
a = dof[0]
|
|
102
|
-
b = dof[1]
|
|
103
|
-
c = dof[2]
|
|
104
|
-
return wp.mat22(a + b, c, c, a - b)
|
|
105
|
-
|
|
106
|
-
@wp.func
|
|
107
|
-
def value_to_dof_2d(val: wp.mat22):
|
|
108
|
-
a = 0.5 * (val[0, 0] + val[1, 1])
|
|
109
|
-
b = 0.5 * (val[0, 0] - val[1, 1])
|
|
110
|
-
c = 0.5 * (val[0, 1] + val[1, 0])
|
|
111
|
-
return wp.vec3(a, b, c)
|
|
112
|
-
|
|
113
|
-
@wp.func
|
|
114
|
-
def dof_to_value_2d_voigt(dof: wp.vec3):
|
|
115
|
-
a = _SQRT_2 * dof[0]
|
|
116
|
-
b = _SQRT_2 * dof[1]
|
|
117
|
-
c = dof[2]
|
|
118
|
-
return wp.mat22(a, c, c, b)
|
|
119
|
-
|
|
120
|
-
@wp.func
|
|
121
|
-
def value_to_dof_2d_voigt(val: wp.mat22):
|
|
122
|
-
a = _SQRT_1_2 * val[0, 0]
|
|
123
|
-
b = _SQRT_1_2 * val[1, 1]
|
|
124
|
-
c = 0.5 * (val[0, 1] + val[1, 0])
|
|
125
|
-
return wp.vec3(a, b, c)
|
|
126
|
-
|
|
127
|
-
@wp.func
|
|
128
|
-
def dof_to_value_3d(dof: vec6):
|
|
129
|
-
a = dof[0] * _SQRT_2 * _SQRT_1_3
|
|
130
|
-
b = dof[1]
|
|
131
|
-
c = dof[2] * _SQRT_1_3
|
|
132
|
-
d = dof[3]
|
|
133
|
-
e = dof[4]
|
|
134
|
-
f = dof[5]
|
|
135
|
-
return wp.mat33(
|
|
136
|
-
a + b - c,
|
|
137
|
-
f,
|
|
138
|
-
e,
|
|
139
|
-
f,
|
|
140
|
-
a - b - c,
|
|
141
|
-
d,
|
|
142
|
-
e,
|
|
143
|
-
d,
|
|
144
|
-
a + 2.0 * c,
|
|
145
|
-
)
|
|
146
|
-
|
|
147
|
-
@wp.func
|
|
148
|
-
def value_to_dof_3d(val: wp.mat33):
|
|
149
|
-
a = (val[0, 0] + val[1, 1] + val[2, 2]) * _SQRT_1_3 * _SQRT_1_2
|
|
150
|
-
b = 0.5 * (val[0, 0] - val[1, 1])
|
|
151
|
-
c = 0.5 * (val[2, 2] - (val[0, 0] + val[1, 1] + val[2, 2]) / 3.0) * _SQRT_3
|
|
152
|
-
|
|
153
|
-
d = 0.5 * (val[2, 1] + val[1, 2])
|
|
154
|
-
e = 0.5 * (val[0, 2] + val[2, 0])
|
|
155
|
-
f = 0.5 * (val[1, 0] + val[0, 1])
|
|
156
|
-
|
|
157
|
-
return vec6(a, b, c, d, e, f)
|
|
158
|
-
|
|
159
|
-
@wp.func
|
|
160
|
-
def dof_to_value_3d_voigt(dof: vec6):
|
|
161
|
-
a = _SQRT_2 * dof[0]
|
|
162
|
-
b = _SQRT_2 * dof[1]
|
|
163
|
-
c = _SQRT_2 * dof[2]
|
|
164
|
-
d = dof[3]
|
|
165
|
-
e = dof[4]
|
|
166
|
-
f = dof[5]
|
|
167
|
-
return wp.mat33(
|
|
168
|
-
a,
|
|
169
|
-
f,
|
|
170
|
-
e,
|
|
171
|
-
f,
|
|
172
|
-
b,
|
|
173
|
-
d,
|
|
174
|
-
e,
|
|
175
|
-
d,
|
|
176
|
-
c,
|
|
177
|
-
)
|
|
178
|
-
|
|
179
|
-
@wp.func
|
|
180
|
-
def value_to_dof_3d_voigt(val: wp.mat33):
|
|
181
|
-
a = _SQRT_1_2 * val[0, 0]
|
|
182
|
-
b = _SQRT_1_2 * val[1, 1]
|
|
183
|
-
c = _SQRT_1_2 * val[2, 2]
|
|
184
|
-
|
|
185
|
-
d = 0.5 * (val[2, 1] + val[1, 2])
|
|
186
|
-
e = 0.5 * (val[0, 2] + val[2, 0])
|
|
187
|
-
f = 0.5 * (val[1, 0] + val[0, 1])
|
|
188
|
-
|
|
189
|
-
return vec6(a, b, c, d, e, f)
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
class SkewSymmetricTensorMapper(DofMapper):
|
|
193
|
-
"""Orthonormal isomorphism from R^{n (n-1)} to nxn skew-symmetric tensors,
|
|
194
|
-
using usual L2 norm for vectors and half Frobenius norm, (tau : tau)/2 for tensors.
|
|
195
|
-
"""
|
|
196
|
-
|
|
197
|
-
def __init__(self, dtype: type):
|
|
198
|
-
self.value_dtype = dtype
|
|
199
|
-
|
|
200
|
-
if dtype == wp.mat22:
|
|
201
|
-
self.dof_dtype = float
|
|
202
|
-
self.DOF_SIZE = wp.constant(1)
|
|
203
|
-
self.dof_to_value = SkewSymmetricTensorMapper.dof_to_value_2d
|
|
204
|
-
self.value_to_dof = SkewSymmetricTensorMapper.value_to_dof_2d
|
|
205
|
-
elif dtype == wp.mat33:
|
|
206
|
-
self.dof_dtype = wp.vec3
|
|
207
|
-
self.DOF_SIZE = wp.constant(3)
|
|
208
|
-
self.dof_to_value = SkewSymmetricTensorMapper.dof_to_value_3d
|
|
209
|
-
self.value_to_dof = SkewSymmetricTensorMapper.value_to_dof_3d
|
|
210
|
-
else:
|
|
211
|
-
raise ValueError("Unsupported value dtype: ", dtype)
|
|
212
|
-
|
|
213
|
-
def __str__(self):
|
|
214
|
-
return f"{self.__class__.__name__}_{self.DOF_SIZE}"
|
|
215
|
-
|
|
216
|
-
@wp.func
|
|
217
|
-
def dof_to_value_2d(dof: float):
|
|
218
|
-
return wp.mat22(0.0, -dof, dof, 0.0)
|
|
219
|
-
|
|
220
|
-
@wp.func
|
|
221
|
-
def value_to_dof_2d(val: wp.mat22):
|
|
222
|
-
return 0.5 * (val[1, 0] - val[0, 1])
|
|
223
|
-
|
|
224
|
-
@wp.func
|
|
225
|
-
def dof_to_value_3d(dof: wp.vec3):
|
|
226
|
-
a = dof[0]
|
|
227
|
-
b = dof[1]
|
|
228
|
-
c = dof[2]
|
|
229
|
-
return wp.mat33(0.0, -c, b, c, 0.0, -a, -b, a, 0.0)
|
|
230
|
-
|
|
231
|
-
@wp.func
|
|
232
|
-
def value_to_dof_3d(val: wp.mat33):
|
|
233
|
-
a = 0.5 * (val[2, 1] - val[1, 2])
|
|
234
|
-
b = 0.5 * (val[0, 2] - val[2, 0])
|
|
235
|
-
c = 0.5 * (val[1, 0] - val[0, 1])
|
|
236
|
-
return wp.vec3(a, b, c)
|
|
1
|
+
import math
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
import warp as wp
|
|
6
|
+
import warp.types
|
|
7
|
+
|
|
8
|
+
vec6 = wp.types.vector(length=6, dtype=wp.float32)
|
|
9
|
+
|
|
10
|
+
_SQRT_2 = wp.constant(math.sqrt(2.0))
|
|
11
|
+
_SQRT_3 = wp.constant(math.sqrt(3.0))
|
|
12
|
+
_SQRT_1_2 = wp.constant(math.sqrt(1.0 / 2.0))
|
|
13
|
+
_SQRT_1_3 = wp.constant(math.sqrt(1.0 / 3.0))
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class DofMapper:
|
|
17
|
+
"""Base class from mapping node degrees of freedom to function values"""
|
|
18
|
+
|
|
19
|
+
value_dtype: type
|
|
20
|
+
dof_dtype: type
|
|
21
|
+
DOF_SIZE: int
|
|
22
|
+
|
|
23
|
+
@wp.func
|
|
24
|
+
def dof_to_value(dof: Any):
|
|
25
|
+
raise NotImplementedError
|
|
26
|
+
|
|
27
|
+
@wp.func
|
|
28
|
+
def value_to_dof(val: Any):
|
|
29
|
+
raise NotImplementedError
|
|
30
|
+
|
|
31
|
+
def __str__(self):
|
|
32
|
+
return f"{self.value_dtype.__name__}_{self.DOF_SIZE}"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class IdentityMapper(DofMapper):
|
|
36
|
+
"""Identity mapper"""
|
|
37
|
+
|
|
38
|
+
def __init__(self, dtype: type):
|
|
39
|
+
if dtype == float:
|
|
40
|
+
dtype = wp.float32
|
|
41
|
+
|
|
42
|
+
self.value_dtype = dtype
|
|
43
|
+
self.dof_dtype = dtype
|
|
44
|
+
|
|
45
|
+
size = warp.types.type_length(dtype)
|
|
46
|
+
self.DOF_SIZE = wp.constant(size)
|
|
47
|
+
|
|
48
|
+
@wp.func
|
|
49
|
+
def dof_to_value(dof: Any):
|
|
50
|
+
return dof
|
|
51
|
+
|
|
52
|
+
@wp.func
|
|
53
|
+
def value_to_dof(val: Any):
|
|
54
|
+
return val
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class SymmetricTensorMapper(DofMapper):
|
|
58
|
+
"""Orthonormal isomorphism from R^{n (n+1)} to nxn symmetric tensors,
|
|
59
|
+
using usual L2 norm for vectors and half Frobenius norm, (tau : tau)/2 for tensors.
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
class Mapping(Enum):
|
|
63
|
+
VOIGT = 0
|
|
64
|
+
"""Voigt ordering of vector coefficients:
|
|
65
|
+
first the three diagonal terms, then off-diagonal coefficients"""
|
|
66
|
+
DB16 = 1
|
|
67
|
+
"""Ordering that also separates normal from tangential coefficients:
|
|
68
|
+
first trace, then other diagonal terms, then off-diagonal coefficients.
|
|
69
|
+
See [Daviet and Bertails-Descoubes 2016]"""
|
|
70
|
+
|
|
71
|
+
def __init__(self, dtype: type, mapping: Mapping = Mapping.VOIGT):
|
|
72
|
+
self.value_dtype = dtype
|
|
73
|
+
self.mapping = mapping
|
|
74
|
+
|
|
75
|
+
if dtype == wp.mat22:
|
|
76
|
+
self.dof_dtype = wp.vec3
|
|
77
|
+
self.DOF_SIZE = wp.constant(3)
|
|
78
|
+
if mapping == SymmetricTensorMapper.Mapping.VOIGT:
|
|
79
|
+
self.dof_to_value = SymmetricTensorMapper.dof_to_value_2d_voigt
|
|
80
|
+
self.value_to_dof = SymmetricTensorMapper.value_to_dof_2d_voigt
|
|
81
|
+
else:
|
|
82
|
+
self.dof_to_value = SymmetricTensorMapper.dof_to_value_2d
|
|
83
|
+
self.value_to_dof = SymmetricTensorMapper.value_to_dof_2d
|
|
84
|
+
elif dtype == wp.mat33:
|
|
85
|
+
self.dof_dtype = vec6
|
|
86
|
+
self.DOF_SIZE = wp.constant(6)
|
|
87
|
+
if mapping == SymmetricTensorMapper.Mapping.VOIGT:
|
|
88
|
+
self.dof_to_value = SymmetricTensorMapper.dof_to_value_3d_voigt
|
|
89
|
+
self.value_to_dof = SymmetricTensorMapper.value_to_dof_3d_voigt
|
|
90
|
+
else:
|
|
91
|
+
self.dof_to_value = SymmetricTensorMapper.dof_to_value_3d
|
|
92
|
+
self.value_to_dof = SymmetricTensorMapper.value_to_dof_3d
|
|
93
|
+
else:
|
|
94
|
+
raise ValueError("Unsupported value dtype: ", dtype)
|
|
95
|
+
|
|
96
|
+
def __str__(self):
|
|
97
|
+
return f"{self.mapping}_{self.DOF_SIZE}"
|
|
98
|
+
|
|
99
|
+
@wp.func
|
|
100
|
+
def dof_to_value_2d(dof: wp.vec3):
|
|
101
|
+
a = dof[0]
|
|
102
|
+
b = dof[1]
|
|
103
|
+
c = dof[2]
|
|
104
|
+
return wp.mat22(a + b, c, c, a - b)
|
|
105
|
+
|
|
106
|
+
@wp.func
|
|
107
|
+
def value_to_dof_2d(val: wp.mat22):
|
|
108
|
+
a = 0.5 * (val[0, 0] + val[1, 1])
|
|
109
|
+
b = 0.5 * (val[0, 0] - val[1, 1])
|
|
110
|
+
c = 0.5 * (val[0, 1] + val[1, 0])
|
|
111
|
+
return wp.vec3(a, b, c)
|
|
112
|
+
|
|
113
|
+
@wp.func
|
|
114
|
+
def dof_to_value_2d_voigt(dof: wp.vec3):
|
|
115
|
+
a = _SQRT_2 * dof[0]
|
|
116
|
+
b = _SQRT_2 * dof[1]
|
|
117
|
+
c = dof[2]
|
|
118
|
+
return wp.mat22(a, c, c, b)
|
|
119
|
+
|
|
120
|
+
@wp.func
|
|
121
|
+
def value_to_dof_2d_voigt(val: wp.mat22):
|
|
122
|
+
a = _SQRT_1_2 * val[0, 0]
|
|
123
|
+
b = _SQRT_1_2 * val[1, 1]
|
|
124
|
+
c = 0.5 * (val[0, 1] + val[1, 0])
|
|
125
|
+
return wp.vec3(a, b, c)
|
|
126
|
+
|
|
127
|
+
@wp.func
|
|
128
|
+
def dof_to_value_3d(dof: vec6):
|
|
129
|
+
a = dof[0] * _SQRT_2 * _SQRT_1_3
|
|
130
|
+
b = dof[1]
|
|
131
|
+
c = dof[2] * _SQRT_1_3
|
|
132
|
+
d = dof[3]
|
|
133
|
+
e = dof[4]
|
|
134
|
+
f = dof[5]
|
|
135
|
+
return wp.mat33(
|
|
136
|
+
a + b - c,
|
|
137
|
+
f,
|
|
138
|
+
e,
|
|
139
|
+
f,
|
|
140
|
+
a - b - c,
|
|
141
|
+
d,
|
|
142
|
+
e,
|
|
143
|
+
d,
|
|
144
|
+
a + 2.0 * c,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
@wp.func
|
|
148
|
+
def value_to_dof_3d(val: wp.mat33):
|
|
149
|
+
a = (val[0, 0] + val[1, 1] + val[2, 2]) * _SQRT_1_3 * _SQRT_1_2
|
|
150
|
+
b = 0.5 * (val[0, 0] - val[1, 1])
|
|
151
|
+
c = 0.5 * (val[2, 2] - (val[0, 0] + val[1, 1] + val[2, 2]) / 3.0) * _SQRT_3
|
|
152
|
+
|
|
153
|
+
d = 0.5 * (val[2, 1] + val[1, 2])
|
|
154
|
+
e = 0.5 * (val[0, 2] + val[2, 0])
|
|
155
|
+
f = 0.5 * (val[1, 0] + val[0, 1])
|
|
156
|
+
|
|
157
|
+
return vec6(a, b, c, d, e, f)
|
|
158
|
+
|
|
159
|
+
@wp.func
|
|
160
|
+
def dof_to_value_3d_voigt(dof: vec6):
|
|
161
|
+
a = _SQRT_2 * dof[0]
|
|
162
|
+
b = _SQRT_2 * dof[1]
|
|
163
|
+
c = _SQRT_2 * dof[2]
|
|
164
|
+
d = dof[3]
|
|
165
|
+
e = dof[4]
|
|
166
|
+
f = dof[5]
|
|
167
|
+
return wp.mat33(
|
|
168
|
+
a,
|
|
169
|
+
f,
|
|
170
|
+
e,
|
|
171
|
+
f,
|
|
172
|
+
b,
|
|
173
|
+
d,
|
|
174
|
+
e,
|
|
175
|
+
d,
|
|
176
|
+
c,
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
@wp.func
|
|
180
|
+
def value_to_dof_3d_voigt(val: wp.mat33):
|
|
181
|
+
a = _SQRT_1_2 * val[0, 0]
|
|
182
|
+
b = _SQRT_1_2 * val[1, 1]
|
|
183
|
+
c = _SQRT_1_2 * val[2, 2]
|
|
184
|
+
|
|
185
|
+
d = 0.5 * (val[2, 1] + val[1, 2])
|
|
186
|
+
e = 0.5 * (val[0, 2] + val[2, 0])
|
|
187
|
+
f = 0.5 * (val[1, 0] + val[0, 1])
|
|
188
|
+
|
|
189
|
+
return vec6(a, b, c, d, e, f)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class SkewSymmetricTensorMapper(DofMapper):
|
|
193
|
+
"""Orthonormal isomorphism from R^{n (n-1)} to nxn skew-symmetric tensors,
|
|
194
|
+
using usual L2 norm for vectors and half Frobenius norm, (tau : tau)/2 for tensors.
|
|
195
|
+
"""
|
|
196
|
+
|
|
197
|
+
def __init__(self, dtype: type):
|
|
198
|
+
self.value_dtype = dtype
|
|
199
|
+
|
|
200
|
+
if dtype == wp.mat22:
|
|
201
|
+
self.dof_dtype = float
|
|
202
|
+
self.DOF_SIZE = wp.constant(1)
|
|
203
|
+
self.dof_to_value = SkewSymmetricTensorMapper.dof_to_value_2d
|
|
204
|
+
self.value_to_dof = SkewSymmetricTensorMapper.value_to_dof_2d
|
|
205
|
+
elif dtype == wp.mat33:
|
|
206
|
+
self.dof_dtype = wp.vec3
|
|
207
|
+
self.DOF_SIZE = wp.constant(3)
|
|
208
|
+
self.dof_to_value = SkewSymmetricTensorMapper.dof_to_value_3d
|
|
209
|
+
self.value_to_dof = SkewSymmetricTensorMapper.value_to_dof_3d
|
|
210
|
+
else:
|
|
211
|
+
raise ValueError("Unsupported value dtype: ", dtype)
|
|
212
|
+
|
|
213
|
+
def __str__(self):
|
|
214
|
+
return f"{self.__class__.__name__}_{self.DOF_SIZE}"
|
|
215
|
+
|
|
216
|
+
@wp.func
|
|
217
|
+
def dof_to_value_2d(dof: float):
|
|
218
|
+
return wp.mat22(0.0, -dof, dof, 0.0)
|
|
219
|
+
|
|
220
|
+
@wp.func
|
|
221
|
+
def value_to_dof_2d(val: wp.mat22):
|
|
222
|
+
return 0.5 * (val[1, 0] - val[0, 1])
|
|
223
|
+
|
|
224
|
+
@wp.func
|
|
225
|
+
def dof_to_value_3d(dof: wp.vec3):
|
|
226
|
+
a = dof[0]
|
|
227
|
+
b = dof[1]
|
|
228
|
+
c = dof[2]
|
|
229
|
+
return wp.mat33(0.0, -c, b, c, 0.0, -a, -b, a, 0.0)
|
|
230
|
+
|
|
231
|
+
@wp.func
|
|
232
|
+
def value_to_dof_3d(val: wp.mat33):
|
|
233
|
+
a = 0.5 * (val[2, 1] - val[1, 2])
|
|
234
|
+
b = 0.5 * (val[0, 2] - val[2, 0])
|
|
235
|
+
c = 0.5 * (val[1, 0] - val[0, 1])
|
|
236
|
+
return wp.vec3(a, b, c)
|