warp-lang 1.0.1__py3-none-macosx_10_13_universal2.whl → 1.1.0__py3-none-macosx_10_13_universal2.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/libwarp-clang.dylib +0 -0
- warp/bin/libwarp.dylib +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
|
@@ -1,221 +1,223 @@
|
|
|
1
|
-
import warp as wp
|
|
2
|
-
|
|
3
|
-
from warp.fem.
|
|
4
|
-
from warp.fem.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
from .
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
self.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
arg
|
|
38
|
-
|
|
39
|
-
arg.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
self._mesh.
|
|
56
|
-
self.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
1
|
+
import warp as wp
|
|
2
|
+
from warp.fem import cache
|
|
3
|
+
from warp.fem.geometry import Trimesh2D
|
|
4
|
+
from warp.fem.types import Coords, ElementIndex
|
|
5
|
+
|
|
6
|
+
from .basis_space import ShapeBasisSpace, TraceBasisSpace
|
|
7
|
+
from .shape import (
|
|
8
|
+
ConstantShapeFunction,
|
|
9
|
+
ShapeFunction,
|
|
10
|
+
Triangle2DNonConformingPolynomialShapeFunctions,
|
|
11
|
+
Triangle2DPolynomialShapeFunctions,
|
|
12
|
+
)
|
|
13
|
+
from .topology import DiscontinuousSpaceTopologyMixin, SpaceTopology, forward_base_topology
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@wp.struct
|
|
17
|
+
class Trimesh2DTopologyArg:
|
|
18
|
+
edge_vertex_indices: wp.array(dtype=wp.vec2i)
|
|
19
|
+
tri_edge_indices: wp.array2d(dtype=int)
|
|
20
|
+
|
|
21
|
+
vertex_count: int
|
|
22
|
+
edge_count: int
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class Trimesh2DSpaceTopology(SpaceTopology):
|
|
26
|
+
TopologyArg = Trimesh2DTopologyArg
|
|
27
|
+
|
|
28
|
+
def __init__(self, mesh: Trimesh2D, shape: ShapeFunction):
|
|
29
|
+
super().__init__(mesh, shape.NODES_PER_ELEMENT)
|
|
30
|
+
self._mesh = mesh
|
|
31
|
+
self._shape = shape
|
|
32
|
+
|
|
33
|
+
self._compute_tri_edge_indices()
|
|
34
|
+
|
|
35
|
+
@cache.cached_arg_value
|
|
36
|
+
def topo_arg_value(self, device):
|
|
37
|
+
arg = Trimesh2DTopologyArg()
|
|
38
|
+
arg.tri_edge_indices = self._tri_edge_indices.to(device)
|
|
39
|
+
arg.edge_vertex_indices = self._mesh.edge_vertex_indices.to(device)
|
|
40
|
+
|
|
41
|
+
arg.vertex_count = self._mesh.vertex_count()
|
|
42
|
+
arg.edge_count = self._mesh.side_count()
|
|
43
|
+
return arg
|
|
44
|
+
|
|
45
|
+
def _compute_tri_edge_indices(self):
|
|
46
|
+
self._tri_edge_indices = wp.empty(
|
|
47
|
+
dtype=int, device=self._mesh.tri_vertex_indices.device, shape=(self._mesh.cell_count(), 3)
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
wp.launch(
|
|
51
|
+
kernel=Trimesh2DSpaceTopology._compute_tri_edge_indices_kernel,
|
|
52
|
+
dim=self._mesh.edge_tri_indices.shape,
|
|
53
|
+
device=self._mesh.tri_vertex_indices.device,
|
|
54
|
+
inputs=[
|
|
55
|
+
self._mesh.edge_tri_indices,
|
|
56
|
+
self._mesh.edge_vertex_indices,
|
|
57
|
+
self._mesh.tri_vertex_indices,
|
|
58
|
+
self._tri_edge_indices,
|
|
59
|
+
],
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
@wp.func
|
|
63
|
+
def _find_edge_index_in_tri(
|
|
64
|
+
edge_vtx: wp.vec2i,
|
|
65
|
+
tri_vtx: wp.vec3i,
|
|
66
|
+
):
|
|
67
|
+
for k in range(2):
|
|
68
|
+
if (edge_vtx[0] == tri_vtx[k] and edge_vtx[1] == tri_vtx[k + 1]) or (
|
|
69
|
+
edge_vtx[1] == tri_vtx[k] and edge_vtx[0] == tri_vtx[k + 1]
|
|
70
|
+
):
|
|
71
|
+
return k
|
|
72
|
+
return 2
|
|
73
|
+
|
|
74
|
+
@wp.kernel
|
|
75
|
+
def _compute_tri_edge_indices_kernel(
|
|
76
|
+
edge_tri_indices: wp.array(dtype=wp.vec2i),
|
|
77
|
+
edge_vertex_indices: wp.array(dtype=wp.vec2i),
|
|
78
|
+
tri_vertex_indices: wp.array2d(dtype=int),
|
|
79
|
+
tri_edge_indices: wp.array2d(dtype=int),
|
|
80
|
+
):
|
|
81
|
+
e = wp.tid()
|
|
82
|
+
|
|
83
|
+
edge_vtx = edge_vertex_indices[e]
|
|
84
|
+
edge_tris = edge_tri_indices[e]
|
|
85
|
+
|
|
86
|
+
t0 = edge_tris[0]
|
|
87
|
+
t0_vtx = wp.vec3i(tri_vertex_indices[t0, 0], tri_vertex_indices[t0, 1], tri_vertex_indices[t0, 2])
|
|
88
|
+
t0_edge = Trimesh2DSpaceTopology._find_edge_index_in_tri(edge_vtx, t0_vtx)
|
|
89
|
+
tri_edge_indices[t0, t0_edge] = e
|
|
90
|
+
|
|
91
|
+
t1 = edge_tris[1]
|
|
92
|
+
if t1 != t0:
|
|
93
|
+
t1_vtx = wp.vec3i(tri_vertex_indices[t1, 0], tri_vertex_indices[t1, 1], tri_vertex_indices[t1, 2])
|
|
94
|
+
t1_edge = Trimesh2DSpaceTopology._find_edge_index_in_tri(edge_vtx, t1_vtx)
|
|
95
|
+
tri_edge_indices[t1, t1_edge] = e
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class Trimesh2DDiscontinuousSpaceTopology(
|
|
99
|
+
DiscontinuousSpaceTopologyMixin,
|
|
100
|
+
SpaceTopology,
|
|
101
|
+
):
|
|
102
|
+
def __init__(self, mesh: Trimesh2D, shape: ShapeFunction):
|
|
103
|
+
super().__init__(mesh, shape.NODES_PER_ELEMENT)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class Trimesh2DBasisSpace(ShapeBasisSpace):
|
|
107
|
+
def __init__(self, topology: Trimesh2DSpaceTopology, shape: ShapeFunction):
|
|
108
|
+
super().__init__(topology, shape)
|
|
109
|
+
|
|
110
|
+
self._mesh: Trimesh2D = topology.geometry
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class Trimesh2DPiecewiseConstantBasis(Trimesh2DBasisSpace):
|
|
114
|
+
def __init__(self, mesh: Trimesh2D):
|
|
115
|
+
shape = ConstantShapeFunction(mesh.reference_cell(), space_dimension=2)
|
|
116
|
+
topology = Trimesh2DDiscontinuousSpaceTopology(mesh, shape)
|
|
117
|
+
super().__init__(shape=shape, topology=topology)
|
|
118
|
+
|
|
119
|
+
class Trace(TraceBasisSpace):
|
|
120
|
+
@wp.func
|
|
121
|
+
def _node_coords_in_element(
|
|
122
|
+
side_arg: Trimesh2D.SideArg,
|
|
123
|
+
basis_arg: Trimesh2DBasisSpace.BasisArg,
|
|
124
|
+
element_index: ElementIndex,
|
|
125
|
+
node_index_in_element: int,
|
|
126
|
+
):
|
|
127
|
+
return Coords(0.5, 0.0, 0.0)
|
|
128
|
+
|
|
129
|
+
def make_node_coords_in_element(self):
|
|
130
|
+
return self._node_coords_in_element
|
|
131
|
+
|
|
132
|
+
def trace(self):
|
|
133
|
+
return Trimesh2DPiecewiseConstantBasis.Trace(self)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class Trimesh2DPolynomialSpaceTopology(Trimesh2DSpaceTopology):
|
|
137
|
+
def __init__(self, mesh: Trimesh2D, shape: Triangle2DPolynomialShapeFunctions):
|
|
138
|
+
super().__init__(mesh, shape)
|
|
139
|
+
|
|
140
|
+
self.element_node_index = self._make_element_node_index()
|
|
141
|
+
|
|
142
|
+
def node_count(self) -> int:
|
|
143
|
+
INTERIOR_NODES_PER_SIDE = max(0, self._shape.ORDER - 1)
|
|
144
|
+
INTERIOR_NODES_PER_CELL = max(0, self._shape.ORDER - 2) * max(0, self._shape.ORDER - 1) // 2
|
|
145
|
+
|
|
146
|
+
return (
|
|
147
|
+
self._mesh.vertex_count()
|
|
148
|
+
+ self._mesh.side_count() * INTERIOR_NODES_PER_SIDE
|
|
149
|
+
+ self._mesh.cell_count() * INTERIOR_NODES_PER_CELL
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
def _make_element_node_index(self):
|
|
153
|
+
INTERIOR_NODES_PER_SIDE = wp.constant(max(0, self._shape.ORDER - 1))
|
|
154
|
+
INTERIOR_NODES_PER_CELL = wp.constant(max(0, self._shape.ORDER - 2) * max(0, self._shape.ORDER - 1) // 2)
|
|
155
|
+
|
|
156
|
+
@cache.dynamic_func(suffix=self.name)
|
|
157
|
+
def element_node_index(
|
|
158
|
+
geo_arg: Trimesh2D.CellArg,
|
|
159
|
+
topo_arg: Trimesh2DTopologyArg,
|
|
160
|
+
element_index: ElementIndex,
|
|
161
|
+
node_index_in_elt: int,
|
|
162
|
+
):
|
|
163
|
+
node_type, type_index = self._shape.node_type_and_type_index(node_index_in_elt)
|
|
164
|
+
|
|
165
|
+
if node_type == Triangle2DPolynomialShapeFunctions.VERTEX:
|
|
166
|
+
return geo_arg.tri_vertex_indices[element_index][type_index]
|
|
167
|
+
|
|
168
|
+
global_offset = topo_arg.vertex_count
|
|
169
|
+
|
|
170
|
+
if node_type == Triangle2DPolynomialShapeFunctions.EDGE:
|
|
171
|
+
edge = type_index // INTERIOR_NODES_PER_SIDE
|
|
172
|
+
edge_node = type_index - INTERIOR_NODES_PER_SIDE * edge
|
|
173
|
+
|
|
174
|
+
global_edge_index = topo_arg.tri_edge_indices[element_index][edge]
|
|
175
|
+
|
|
176
|
+
if (
|
|
177
|
+
topo_arg.edge_vertex_indices[global_edge_index][0]
|
|
178
|
+
!= geo_arg.tri_vertex_indices[element_index][edge]
|
|
179
|
+
):
|
|
180
|
+
edge_node = INTERIOR_NODES_PER_SIDE - 1 - edge_node
|
|
181
|
+
|
|
182
|
+
return global_offset + INTERIOR_NODES_PER_SIDE * global_edge_index + edge_node
|
|
183
|
+
|
|
184
|
+
global_offset += INTERIOR_NODES_PER_SIDE * topo_arg.edge_count
|
|
185
|
+
return global_offset + INTERIOR_NODES_PER_CELL * element_index + type_index
|
|
186
|
+
|
|
187
|
+
return element_node_index
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
class Trimesh2DPolynomialBasisSpace(Trimesh2DBasisSpace):
|
|
191
|
+
def __init__(
|
|
192
|
+
self,
|
|
193
|
+
mesh: Trimesh2D,
|
|
194
|
+
degree: int,
|
|
195
|
+
):
|
|
196
|
+
shape = Triangle2DPolynomialShapeFunctions(degree)
|
|
197
|
+
topology = forward_base_topology(Trimesh2DPolynomialSpaceTopology, mesh, shape)
|
|
198
|
+
|
|
199
|
+
super().__init__(topology, shape)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
class Trimesh2DDGPolynomialBasisSpace(Trimesh2DBasisSpace):
|
|
203
|
+
def __init__(
|
|
204
|
+
self,
|
|
205
|
+
mesh: Trimesh2D,
|
|
206
|
+
degree: int,
|
|
207
|
+
):
|
|
208
|
+
shape = Triangle2DPolynomialShapeFunctions(degree)
|
|
209
|
+
topology = Trimesh2DDiscontinuousSpaceTopology(mesh, shape)
|
|
210
|
+
|
|
211
|
+
super().__init__(topology, shape)
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
class Trimesh2DNonConformingPolynomialBasisSpace(Trimesh2DBasisSpace):
|
|
215
|
+
def __init__(
|
|
216
|
+
self,
|
|
217
|
+
mesh: Trimesh2D,
|
|
218
|
+
degree: int,
|
|
219
|
+
):
|
|
220
|
+
shape = Triangle2DNonConformingPolynomialShapeFunctions(degree)
|
|
221
|
+
topology = Trimesh2DDiscontinuousSpaceTopology(mesh, shape)
|
|
222
|
+
|
|
223
|
+
super().__init__(topology, shape)
|
warp/fem/types.py
CHANGED
|
@@ -1,77 +1,77 @@
|
|
|
1
|
-
import warp as wp
|
|
2
|
-
|
|
3
|
-
# kept to avoid breaking existing example code, no longer used internally
|
|
4
|
-
vec2i = wp.vec2i
|
|
5
|
-
vec3i = wp.vec3i
|
|
6
|
-
vec4i = wp.vec4i
|
|
7
|
-
|
|
8
|
-
Coords = wp.vec3
|
|
9
|
-
OUTSIDE = wp.constant(-1.0e8)
|
|
10
|
-
|
|
11
|
-
ElementIndex = int
|
|
12
|
-
QuadraturePointIndex = int
|
|
13
|
-
NodeIndex = int
|
|
14
|
-
|
|
15
|
-
NULL_ELEMENT_INDEX = wp.constant(-1)
|
|
16
|
-
NULL_QP_INDEX = wp.constant(-1)
|
|
17
|
-
NULL_NODE_INDEX = wp.constant(-1)
|
|
18
|
-
|
|
19
|
-
DofIndex = wp.vec2i
|
|
20
|
-
"""Opaque descriptor for indexing degrees of freedom within elements"""
|
|
21
|
-
NULL_DOF_INDEX = wp.constant(DofIndex(-1, -1))
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
@wp.func
|
|
25
|
-
def get_node_index_in_element(dof_idx: DofIndex):
|
|
26
|
-
return dof_idx[0]
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
@wp.func
|
|
30
|
-
def get_node_coord(dof_idx: DofIndex):
|
|
31
|
-
return dof_idx[1]
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
@wp.struct
|
|
35
|
-
class NodeElementIndex:
|
|
36
|
-
domain_element_index: ElementIndex
|
|
37
|
-
node_index_in_element: int
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
@wp.struct
|
|
41
|
-
class Sample:
|
|
42
|
-
"""Per-sample point context for evaluating fields and related operators in integrands"""
|
|
43
|
-
|
|
44
|
-
element_index: ElementIndex
|
|
45
|
-
"""Index of the geometry element the sample point is in"""
|
|
46
|
-
element_coords: Coords
|
|
47
|
-
"""Coordinates of the sample point inside the element"""
|
|
48
|
-
qp_index: QuadraturePointIndex = NULL_QP_INDEX
|
|
49
|
-
"""If the sample corresponds to a quadrature point, its global index"""
|
|
50
|
-
qp_weight: float = 0.0
|
|
51
|
-
"""If the sample corresponds to a quadrature point, its weight"""
|
|
52
|
-
test_dof: DofIndex = NULL_DOF_INDEX
|
|
53
|
-
"""For linear of bilinear form assembly, index of the test degree-of-freedom currently being considered"""
|
|
54
|
-
trial_dof: DofIndex = NULL_DOF_INDEX
|
|
55
|
-
"""For bilinear form assembly, index of the trial degree-of-freedom currently being considered"""
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
@wp.func
|
|
59
|
-
def make_free_sample(element_index: ElementIndex, element_coords: Coords):
|
|
60
|
-
"""Returns a :class:`Sample` that is not associated to any quadrature point or dof"""
|
|
61
|
-
return Sample(element_index, element_coords, NULL_QP_INDEX, 0.0, NULL_DOF_INDEX, NULL_DOF_INDEX)
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
class Field:
|
|
65
|
-
"""
|
|
66
|
-
Tag for field-like integrand arguments
|
|
67
|
-
"""
|
|
68
|
-
|
|
69
|
-
call_operator: "warp.fem.operator.Operator" = None # Set in operator.py
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
class Domain:
|
|
73
|
-
"""
|
|
74
|
-
Tag for domain-like integrand arguments
|
|
75
|
-
"""
|
|
76
|
-
|
|
77
|
-
call_operator: "warp.fem.operator.Operator" = None # Set in operator.py
|
|
1
|
+
import warp as wp
|
|
2
|
+
|
|
3
|
+
# kept to avoid breaking existing example code, no longer used internally
|
|
4
|
+
vec2i = wp.vec2i
|
|
5
|
+
vec3i = wp.vec3i
|
|
6
|
+
vec4i = wp.vec4i
|
|
7
|
+
|
|
8
|
+
Coords = wp.vec3
|
|
9
|
+
OUTSIDE = wp.constant(-1.0e8)
|
|
10
|
+
|
|
11
|
+
ElementIndex = int
|
|
12
|
+
QuadraturePointIndex = int
|
|
13
|
+
NodeIndex = int
|
|
14
|
+
|
|
15
|
+
NULL_ELEMENT_INDEX = wp.constant(-1)
|
|
16
|
+
NULL_QP_INDEX = wp.constant(-1)
|
|
17
|
+
NULL_NODE_INDEX = wp.constant(-1)
|
|
18
|
+
|
|
19
|
+
DofIndex = wp.vec2i
|
|
20
|
+
"""Opaque descriptor for indexing degrees of freedom within elements"""
|
|
21
|
+
NULL_DOF_INDEX = wp.constant(DofIndex(-1, -1))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@wp.func
|
|
25
|
+
def get_node_index_in_element(dof_idx: DofIndex):
|
|
26
|
+
return dof_idx[0]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@wp.func
|
|
30
|
+
def get_node_coord(dof_idx: DofIndex):
|
|
31
|
+
return dof_idx[1]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@wp.struct
|
|
35
|
+
class NodeElementIndex:
|
|
36
|
+
domain_element_index: ElementIndex
|
|
37
|
+
node_index_in_element: int
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@wp.struct
|
|
41
|
+
class Sample:
|
|
42
|
+
"""Per-sample point context for evaluating fields and related operators in integrands"""
|
|
43
|
+
|
|
44
|
+
element_index: ElementIndex
|
|
45
|
+
"""Index of the geometry element the sample point is in"""
|
|
46
|
+
element_coords: Coords
|
|
47
|
+
"""Coordinates of the sample point inside the element"""
|
|
48
|
+
qp_index: QuadraturePointIndex = NULL_QP_INDEX
|
|
49
|
+
"""If the sample corresponds to a quadrature point, its global index"""
|
|
50
|
+
qp_weight: float = 0.0
|
|
51
|
+
"""If the sample corresponds to a quadrature point, its weight"""
|
|
52
|
+
test_dof: DofIndex = NULL_DOF_INDEX
|
|
53
|
+
"""For linear of bilinear form assembly, index of the test degree-of-freedom currently being considered"""
|
|
54
|
+
trial_dof: DofIndex = NULL_DOF_INDEX
|
|
55
|
+
"""For bilinear form assembly, index of the trial degree-of-freedom currently being considered"""
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@wp.func
|
|
59
|
+
def make_free_sample(element_index: ElementIndex, element_coords: Coords):
|
|
60
|
+
"""Returns a :class:`Sample` that is not associated to any quadrature point or dof"""
|
|
61
|
+
return Sample(element_index, element_coords, NULL_QP_INDEX, 0.0, NULL_DOF_INDEX, NULL_DOF_INDEX)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class Field:
|
|
65
|
+
"""
|
|
66
|
+
Tag for field-like integrand arguments
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
call_operator: "warp.fem.operator.Operator" = None # noqa: F821 Set in operator.py
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class Domain:
|
|
73
|
+
"""
|
|
74
|
+
Tag for domain-like integrand arguments
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
call_operator: "warp.fem.operator.Operator" = None # noqa: F821 Set in operator.py
|