warp-lang 1.0.1__py3-none-manylinux2014_aarch64.whl → 1.1.0__py3-none-manylinux2014_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of warp-lang might be problematic. Click here for more details.
- warp/__init__.py +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/geometry/partition.py
CHANGED
|
@@ -1,376 +1,374 @@
|
|
|
1
|
-
from typing import Any
|
|
2
|
-
|
|
3
|
-
import warp as wp
|
|
4
|
-
|
|
5
|
-
from warp.fem.types import
|
|
6
|
-
from warp.fem.utils import masked_indices
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
geometry
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
self.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
self.
|
|
96
|
-
|
|
97
|
-
self.
|
|
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
|
-
arg =
|
|
162
|
-
arg.
|
|
163
|
-
arg
|
|
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
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
)
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
self.
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
arg =
|
|
304
|
-
arg
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
self._cell_mask,
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
arg =
|
|
362
|
-
arg
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
def _cell_inclusion_test(mask: wp.array(dtype=int), cell_index: int):
|
|
376
|
-
return mask[cell_index] > 0
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
import warp as wp
|
|
4
|
+
from warp.fem.cache import TemporaryStore, borrow_temporary, cached_arg_value
|
|
5
|
+
from warp.fem.types import NULL_ELEMENT_INDEX, ElementIndex
|
|
6
|
+
from warp.fem.utils import masked_indices
|
|
7
|
+
|
|
8
|
+
from .geometry import Geometry
|
|
9
|
+
|
|
10
|
+
wp.set_module_options({"enable_backward": False})
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class GeometryPartition:
|
|
14
|
+
"""Base class for geometry partitions, i.e. subset of cells and sides"""
|
|
15
|
+
|
|
16
|
+
class CellArg:
|
|
17
|
+
pass
|
|
18
|
+
|
|
19
|
+
class SideArg:
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
def __init__(self, geometry: Geometry):
|
|
23
|
+
self.geometry = geometry
|
|
24
|
+
|
|
25
|
+
def cell_count(self) -> int:
|
|
26
|
+
"""Number of cells that are 'owned' by this partition"""
|
|
27
|
+
raise NotImplementedError()
|
|
28
|
+
|
|
29
|
+
def side_count(self) -> int:
|
|
30
|
+
"""Number of sides that are 'owned' by this partition"""
|
|
31
|
+
raise NotImplementedError()
|
|
32
|
+
|
|
33
|
+
def boundary_side_count(self) -> int:
|
|
34
|
+
"""Number of geo-boundary sides that are 'owned' by this partition"""
|
|
35
|
+
raise NotImplementedError()
|
|
36
|
+
|
|
37
|
+
def frontier_side_count(self) -> int:
|
|
38
|
+
"""Number of sides with neighbors owned by this and another partition"""
|
|
39
|
+
raise NotImplementedError()
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def name(self) -> str:
|
|
43
|
+
return f"{self.geometry.name}_{self.__class__.__name__}"
|
|
44
|
+
|
|
45
|
+
def __str__(self) -> str:
|
|
46
|
+
return self.name
|
|
47
|
+
|
|
48
|
+
def cell_arg_value(self, device):
|
|
49
|
+
raise NotImplementedError()
|
|
50
|
+
|
|
51
|
+
def side_arg_value(self, device):
|
|
52
|
+
raise NotImplementedError()
|
|
53
|
+
|
|
54
|
+
@staticmethod
|
|
55
|
+
def cell_index(args: CellArg, partition_cell_index: int):
|
|
56
|
+
"""Index in the geometry of a partition cell"""
|
|
57
|
+
raise NotImplementedError()
|
|
58
|
+
|
|
59
|
+
@staticmethod
|
|
60
|
+
def partition_cell_index(args: CellArg, cell_index: int):
|
|
61
|
+
"""Index of a geometry cell in the partition (or ``NULL_ELEMENT_INDEX``)"""
|
|
62
|
+
raise NotImplementedError()
|
|
63
|
+
|
|
64
|
+
@staticmethod
|
|
65
|
+
def side_index(args: SideArg, partition_side_index: int):
|
|
66
|
+
"""Partition side to side index"""
|
|
67
|
+
raise NotImplementedError()
|
|
68
|
+
|
|
69
|
+
@staticmethod
|
|
70
|
+
def boundary_side_index(args: SideArg, boundary_side_index: int):
|
|
71
|
+
"""Boundary side to side index"""
|
|
72
|
+
raise NotImplementedError()
|
|
73
|
+
|
|
74
|
+
@staticmethod
|
|
75
|
+
def frontier_side_index(args: SideArg, frontier_side_index: int):
|
|
76
|
+
"""Frontier side to side index"""
|
|
77
|
+
raise NotImplementedError()
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class WholeGeometryPartition(GeometryPartition):
|
|
81
|
+
"""Trivial (NOP) partition"""
|
|
82
|
+
|
|
83
|
+
def __init__(
|
|
84
|
+
self,
|
|
85
|
+
geometry: Geometry,
|
|
86
|
+
):
|
|
87
|
+
super().__init__(geometry)
|
|
88
|
+
|
|
89
|
+
self.SideArg = geometry.SideIndexArg
|
|
90
|
+
self.side_arg_value = geometry.side_index_arg_value
|
|
91
|
+
|
|
92
|
+
self.cell_index = WholeGeometryPartition._identity_element_index
|
|
93
|
+
self.partition_cell_index = WholeGeometryPartition._identity_element_index
|
|
94
|
+
|
|
95
|
+
self.side_index = WholeGeometryPartition._identity_element_index
|
|
96
|
+
self.boundary_side_index = geometry.boundary_side_index
|
|
97
|
+
self.frontier_side_index = WholeGeometryPartition._identity_element_index
|
|
98
|
+
|
|
99
|
+
def __eq__(self, other: GeometryPartition) -> bool:
|
|
100
|
+
# Ensures that two whole partition instances of the same geometry are considered equal
|
|
101
|
+
return isinstance(other, WholeGeometryPartition) and self.geometry == other.geometry
|
|
102
|
+
|
|
103
|
+
def cell_count(self) -> int:
|
|
104
|
+
return self.geometry.cell_count()
|
|
105
|
+
|
|
106
|
+
def side_count(self) -> int:
|
|
107
|
+
return self.geometry.side_count()
|
|
108
|
+
|
|
109
|
+
def boundary_side_count(self) -> int:
|
|
110
|
+
return self.geometry.boundary_side_count()
|
|
111
|
+
|
|
112
|
+
def frontier_side_count(self) -> int:
|
|
113
|
+
return 0
|
|
114
|
+
|
|
115
|
+
@wp.struct
|
|
116
|
+
class CellArg:
|
|
117
|
+
pass
|
|
118
|
+
|
|
119
|
+
def cell_arg_value(self, device):
|
|
120
|
+
arg = WholeGeometryPartition.CellArg()
|
|
121
|
+
return arg
|
|
122
|
+
|
|
123
|
+
@wp.func
|
|
124
|
+
def _identity_element_index(args: Any, idx: ElementIndex):
|
|
125
|
+
return idx
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def name(self) -> str:
|
|
129
|
+
return self.geometry.name
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class CellBasedGeometryPartition(GeometryPartition):
|
|
133
|
+
"""Geometry partition based on a subset of cells. Interior, boundary and frontier sides are automatically categorized."""
|
|
134
|
+
|
|
135
|
+
def __init__(
|
|
136
|
+
self,
|
|
137
|
+
geometry: Geometry,
|
|
138
|
+
device=None,
|
|
139
|
+
):
|
|
140
|
+
super().__init__(geometry)
|
|
141
|
+
|
|
142
|
+
@wp.struct
|
|
143
|
+
class SideArg:
|
|
144
|
+
partition_side_indices: wp.array(dtype=int)
|
|
145
|
+
boundary_side_indices: wp.array(dtype=int)
|
|
146
|
+
frontier_side_indices: wp.array(dtype=int)
|
|
147
|
+
|
|
148
|
+
def side_count(self) -> int:
|
|
149
|
+
return self._partition_side_indices.array.shape[0]
|
|
150
|
+
|
|
151
|
+
def boundary_side_count(self) -> int:
|
|
152
|
+
return self._boundary_side_indices.array.shape[0]
|
|
153
|
+
|
|
154
|
+
def frontier_side_count(self) -> int:
|
|
155
|
+
return self._frontier_side_indices.array.shape[0]
|
|
156
|
+
|
|
157
|
+
@cached_arg_value
|
|
158
|
+
def side_arg_value(self, device):
|
|
159
|
+
arg = LinearGeometryPartition.SideArg()
|
|
160
|
+
arg.partition_side_indices = self._partition_side_indices.array.to(device)
|
|
161
|
+
arg.boundary_side_indices = self._boundary_side_indices.array.to(device)
|
|
162
|
+
arg.frontier_side_indices = self._frontier_side_indices.array.to(device)
|
|
163
|
+
return arg
|
|
164
|
+
|
|
165
|
+
@wp.func
|
|
166
|
+
def side_index(args: SideArg, partition_side_index: int):
|
|
167
|
+
"""partition side to side index"""
|
|
168
|
+
return args.partition_side_indices[partition_side_index]
|
|
169
|
+
|
|
170
|
+
@wp.func
|
|
171
|
+
def boundary_side_index(args: SideArg, boundary_side_index: int):
|
|
172
|
+
"""Boundary side to side index"""
|
|
173
|
+
return args.boundary_side_indices[boundary_side_index]
|
|
174
|
+
|
|
175
|
+
@wp.func
|
|
176
|
+
def frontier_side_index(args: SideArg, frontier_side_index: int):
|
|
177
|
+
"""Frontier side to side index"""
|
|
178
|
+
return args.frontier_side_indices[frontier_side_index]
|
|
179
|
+
|
|
180
|
+
def compute_side_indices_from_cells(
|
|
181
|
+
self, cell_arg_value: Any, cell_inclusion_test_func: wp.Function, device, temporary_store: TemporaryStore = None
|
|
182
|
+
):
|
|
183
|
+
from warp.fem import cache
|
|
184
|
+
|
|
185
|
+
cell_arg_type = next(iter(cell_inclusion_test_func.input_types.values()))
|
|
186
|
+
|
|
187
|
+
@cache.dynamic_kernel(suffix=f"{self.geometry.name}_{cell_inclusion_test_func.key}")
|
|
188
|
+
def count_sides(
|
|
189
|
+
geo_arg: self.geometry.SideArg,
|
|
190
|
+
cell_arg_value: cell_arg_type,
|
|
191
|
+
partition_side_mask: wp.array(dtype=int),
|
|
192
|
+
boundary_side_mask: wp.array(dtype=int),
|
|
193
|
+
frontier_side_mask: wp.array(dtype=int),
|
|
194
|
+
):
|
|
195
|
+
side_index = wp.tid()
|
|
196
|
+
inner_cell_index = self.geometry.side_inner_cell_index(geo_arg, side_index)
|
|
197
|
+
outer_cell_index = self.geometry.side_outer_cell_index(geo_arg, side_index)
|
|
198
|
+
|
|
199
|
+
inner_in = cell_inclusion_test_func(cell_arg_value, inner_cell_index)
|
|
200
|
+
outer_in = cell_inclusion_test_func(cell_arg_value, outer_cell_index)
|
|
201
|
+
|
|
202
|
+
if inner_in:
|
|
203
|
+
# Inner neighbor in partition; count as partition side
|
|
204
|
+
partition_side_mask[side_index] = 1
|
|
205
|
+
|
|
206
|
+
# Inner and outer element as the same -- this is a boundary side
|
|
207
|
+
if inner_cell_index == outer_cell_index:
|
|
208
|
+
boundary_side_mask[side_index] = 1
|
|
209
|
+
|
|
210
|
+
if inner_in != outer_in:
|
|
211
|
+
# Exactly one neighbor in partition; count as frontier side
|
|
212
|
+
frontier_side_mask[side_index] = 1
|
|
213
|
+
|
|
214
|
+
partition_side_mask = borrow_temporary(
|
|
215
|
+
temporary_store,
|
|
216
|
+
shape=(self.geometry.side_count(),),
|
|
217
|
+
dtype=int,
|
|
218
|
+
device=device,
|
|
219
|
+
)
|
|
220
|
+
boundary_side_mask = borrow_temporary(
|
|
221
|
+
temporary_store,
|
|
222
|
+
shape=(self.geometry.side_count(),),
|
|
223
|
+
dtype=int,
|
|
224
|
+
device=device,
|
|
225
|
+
)
|
|
226
|
+
frontier_side_mask = borrow_temporary(
|
|
227
|
+
temporary_store,
|
|
228
|
+
shape=(self.geometry.side_count(),),
|
|
229
|
+
dtype=int,
|
|
230
|
+
device=device,
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
partition_side_mask.array.zero_()
|
|
234
|
+
boundary_side_mask.array.zero_()
|
|
235
|
+
frontier_side_mask.array.zero_()
|
|
236
|
+
|
|
237
|
+
wp.launch(
|
|
238
|
+
dim=partition_side_mask.array.shape[0],
|
|
239
|
+
kernel=count_sides,
|
|
240
|
+
inputs=[
|
|
241
|
+
self.geometry.side_arg_value(device),
|
|
242
|
+
cell_arg_value,
|
|
243
|
+
partition_side_mask.array,
|
|
244
|
+
boundary_side_mask.array,
|
|
245
|
+
frontier_side_mask.array,
|
|
246
|
+
],
|
|
247
|
+
device=device,
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
# Convert counts to indices
|
|
251
|
+
self._partition_side_indices, _ = masked_indices(partition_side_mask.array, temporary_store=temporary_store)
|
|
252
|
+
self._boundary_side_indices, _ = masked_indices(boundary_side_mask.array, temporary_store=temporary_store)
|
|
253
|
+
self._frontier_side_indices, _ = masked_indices(frontier_side_mask.array, temporary_store=temporary_store)
|
|
254
|
+
|
|
255
|
+
partition_side_mask.release()
|
|
256
|
+
boundary_side_mask.release()
|
|
257
|
+
frontier_side_mask.release()
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
class LinearGeometryPartition(CellBasedGeometryPartition):
|
|
261
|
+
def __init__(
|
|
262
|
+
self,
|
|
263
|
+
geometry: Geometry,
|
|
264
|
+
partition_rank: int,
|
|
265
|
+
partition_count: int,
|
|
266
|
+
device=None,
|
|
267
|
+
temporary_store: TemporaryStore = None,
|
|
268
|
+
):
|
|
269
|
+
"""Creates a geometry partition by uniformly partionning cell indices
|
|
270
|
+
|
|
271
|
+
Args:
|
|
272
|
+
geometry: the geometry to partition
|
|
273
|
+
partition_rank: the index of the partition being created
|
|
274
|
+
partition_count: the number of partitions that will be created over the geometry
|
|
275
|
+
device: Warp device on which to perform and store computations
|
|
276
|
+
"""
|
|
277
|
+
super().__init__(geometry)
|
|
278
|
+
|
|
279
|
+
total_cell_count = geometry.cell_count()
|
|
280
|
+
|
|
281
|
+
cells_per_partition = (total_cell_count + partition_count - 1) // partition_count
|
|
282
|
+
self.cell_begin = cells_per_partition * partition_rank
|
|
283
|
+
self.cell_end = min(self.cell_begin + cells_per_partition, total_cell_count)
|
|
284
|
+
|
|
285
|
+
super().compute_side_indices_from_cells(
|
|
286
|
+
self.cell_arg_value(device),
|
|
287
|
+
LinearGeometryPartition._cell_inclusion_test,
|
|
288
|
+
device,
|
|
289
|
+
temporary_store=temporary_store,
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
def cell_count(self) -> int:
|
|
293
|
+
return self.cell_end - self.cell_begin
|
|
294
|
+
|
|
295
|
+
@wp.struct
|
|
296
|
+
class CellArg:
|
|
297
|
+
cell_begin: int
|
|
298
|
+
cell_end: int
|
|
299
|
+
|
|
300
|
+
def cell_arg_value(self, device):
|
|
301
|
+
arg = LinearGeometryPartition.CellArg()
|
|
302
|
+
arg.cell_begin = self.cell_begin
|
|
303
|
+
arg.cell_end = self.cell_end
|
|
304
|
+
return arg
|
|
305
|
+
|
|
306
|
+
@wp.func
|
|
307
|
+
def cell_index(args: CellArg, partition_cell_index: int):
|
|
308
|
+
"""Partition cell to cell index"""
|
|
309
|
+
return args.cell_begin + partition_cell_index
|
|
310
|
+
|
|
311
|
+
@wp.func
|
|
312
|
+
def partition_cell_index(args: CellArg, cell_index: int):
|
|
313
|
+
"""Partition cell to cell index"""
|
|
314
|
+
if cell_index > args.cell_end:
|
|
315
|
+
return NULL_ELEMENT_INDEX
|
|
316
|
+
|
|
317
|
+
partition_cell_index = cell_index - args.cell_begin
|
|
318
|
+
if partition_cell_index < 0:
|
|
319
|
+
return NULL_ELEMENT_INDEX
|
|
320
|
+
|
|
321
|
+
return partition_cell_index
|
|
322
|
+
|
|
323
|
+
@wp.func
|
|
324
|
+
def _cell_inclusion_test(arg: CellArg, cell_index: int):
|
|
325
|
+
return cell_index >= arg.cell_begin and cell_index < arg.cell_end
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
class ExplicitGeometryPartition(CellBasedGeometryPartition):
|
|
329
|
+
def __init__(self, geometry: Geometry, cell_mask: "wp.array(dtype=int)", temporary_store: TemporaryStore = None):
|
|
330
|
+
"""Creates a geometry partition by uniformly partionning cell indices
|
|
331
|
+
|
|
332
|
+
Args:
|
|
333
|
+
geometry: the geometry to partition
|
|
334
|
+
cell_mask: warp array of length ``geometry.cell_count()`` indicating which cells are selected. Array values must be either ``1`` (selected) or ``0`` (not selected).
|
|
335
|
+
"""
|
|
336
|
+
|
|
337
|
+
super().__init__(geometry)
|
|
338
|
+
|
|
339
|
+
self._cell_mask = cell_mask
|
|
340
|
+
self._cells, self._partition_cells = masked_indices(self._cell_mask, temporary_store=temporary_store)
|
|
341
|
+
|
|
342
|
+
super().compute_side_indices_from_cells(
|
|
343
|
+
self._cell_mask,
|
|
344
|
+
ExplicitGeometryPartition._cell_inclusion_test,
|
|
345
|
+
self._cell_mask.device,
|
|
346
|
+
temporary_store=temporary_store,
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
def cell_count(self) -> int:
|
|
350
|
+
return self._cells.array.shape[0]
|
|
351
|
+
|
|
352
|
+
@wp.struct
|
|
353
|
+
class CellArg:
|
|
354
|
+
cell_index: wp.array(dtype=int)
|
|
355
|
+
partition_cell_index: wp.array(dtype=int)
|
|
356
|
+
|
|
357
|
+
@cached_arg_value
|
|
358
|
+
def cell_arg_value(self, device):
|
|
359
|
+
arg = ExplicitGeometryPartition.CellArg()
|
|
360
|
+
arg.cell_index = self._cells.array.to(device)
|
|
361
|
+
arg.partition_cell_index = self._partition_cells.array.to(device)
|
|
362
|
+
return arg
|
|
363
|
+
|
|
364
|
+
@wp.func
|
|
365
|
+
def cell_index(args: CellArg, partition_cell_index: int):
|
|
366
|
+
return args.cell_index[partition_cell_index]
|
|
367
|
+
|
|
368
|
+
@wp.func
|
|
369
|
+
def partition_cell_index(args: CellArg, cell_index: int):
|
|
370
|
+
return args.partition_cell_index[cell_index]
|
|
371
|
+
|
|
372
|
+
@wp.func
|
|
373
|
+
def _cell_inclusion_test(mask: wp.array(dtype=int), cell_index: int):
|
|
374
|
+
return mask[cell_index] > 0
|