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
|
@@ -1,294 +1,295 @@
|
|
|
1
|
-
from typing import Any
|
|
2
|
-
|
|
3
|
-
import warp as wp
|
|
4
|
-
|
|
5
|
-
from warp.fem import
|
|
6
|
-
from warp.fem.types import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
arg
|
|
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
|
-
self.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
self.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
self.
|
|
99
|
-
self.
|
|
100
|
-
self.
|
|
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
|
-
self.
|
|
173
|
-
self.
|
|
174
|
-
self.
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
arg = self.
|
|
198
|
-
arg.
|
|
199
|
-
arg
|
|
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
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
self.
|
|
259
|
-
self.
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
arg
|
|
275
|
-
arg.
|
|
276
|
-
arg.
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
import warp as wp
|
|
4
|
+
from warp.fem import cache, domain
|
|
5
|
+
from warp.fem.space import FunctionSpace
|
|
6
|
+
from warp.fem.types import Coords, ElementIndex
|
|
7
|
+
|
|
8
|
+
from ..polynomial import Polynomial
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Quadrature:
|
|
12
|
+
"""Interface class for quadrature rules"""
|
|
13
|
+
|
|
14
|
+
@wp.struct
|
|
15
|
+
class Arg:
|
|
16
|
+
"""Structure containing arguments to be passed to device functions"""
|
|
17
|
+
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
def __init__(self, domain: domain.GeometryDomain):
|
|
21
|
+
self._domain = domain
|
|
22
|
+
|
|
23
|
+
@property
|
|
24
|
+
def domain(self):
|
|
25
|
+
"""Domain over which this quadrature is defined"""
|
|
26
|
+
return self._domain
|
|
27
|
+
|
|
28
|
+
def arg_value(self, device) -> "Arg":
|
|
29
|
+
"""
|
|
30
|
+
Value of the argument to be passed to device
|
|
31
|
+
"""
|
|
32
|
+
arg = RegularQuadrature.Arg()
|
|
33
|
+
return arg
|
|
34
|
+
|
|
35
|
+
def total_point_count(self):
|
|
36
|
+
"""Total number of quadrature points over the domain"""
|
|
37
|
+
raise NotImplementedError()
|
|
38
|
+
|
|
39
|
+
def points_per_element(self):
|
|
40
|
+
"""Number of points per element if constant, or ``None`` if varying"""
|
|
41
|
+
return None
|
|
42
|
+
|
|
43
|
+
@staticmethod
|
|
44
|
+
def point_count(elt_arg: "domain.GeometryDomain.ElementArg", qp_arg: Arg, element_index: ElementIndex):
|
|
45
|
+
"""Number of quadrature points for a given element"""
|
|
46
|
+
raise NotImplementedError()
|
|
47
|
+
|
|
48
|
+
@staticmethod
|
|
49
|
+
def point_coords(
|
|
50
|
+
elt_arg: "domain.GeometryDomain.ElementArg", qp_arg: Arg, element_index: ElementIndex, qp_index: int
|
|
51
|
+
):
|
|
52
|
+
"""Coordinates in element of the element's qp_index'th quadrature point"""
|
|
53
|
+
raise NotImplementedError()
|
|
54
|
+
|
|
55
|
+
@staticmethod
|
|
56
|
+
def point_weight(
|
|
57
|
+
elt_arg: "domain.GeometryDomain.ElementArg", qp_arg: Arg, element_index: ElementIndex, qp_index: int
|
|
58
|
+
):
|
|
59
|
+
"""Weight of the element's qp_index'th quadrature point"""
|
|
60
|
+
raise NotImplementedError()
|
|
61
|
+
|
|
62
|
+
@staticmethod
|
|
63
|
+
def point_index(
|
|
64
|
+
elt_arg: "domain.GeometryDomain.ElementArg", qp_arg: Arg, element_index: ElementIndex, qp_index: int
|
|
65
|
+
):
|
|
66
|
+
"""Global index of the element's qp_index'th quadrature point"""
|
|
67
|
+
raise NotImplementedError()
|
|
68
|
+
|
|
69
|
+
def __str__(self) -> str:
|
|
70
|
+
return self.name
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class RegularQuadrature(Quadrature):
|
|
74
|
+
"""Regular quadrature formula, using a constant set of quadrature points per element"""
|
|
75
|
+
|
|
76
|
+
def __init__(
|
|
77
|
+
self,
|
|
78
|
+
domain: domain.GeometryDomain,
|
|
79
|
+
order: int,
|
|
80
|
+
family: Polynomial = None,
|
|
81
|
+
):
|
|
82
|
+
super().__init__(domain)
|
|
83
|
+
|
|
84
|
+
self.family = family
|
|
85
|
+
self.order = order
|
|
86
|
+
|
|
87
|
+
self._element_quadrature = domain.reference_element().instantiate_quadrature(order, family)
|
|
88
|
+
|
|
89
|
+
self._N = wp.constant(len(self.points))
|
|
90
|
+
|
|
91
|
+
WeightVec = wp.vec(length=self._N, dtype=wp.float32)
|
|
92
|
+
CoordMat = wp.mat(shape=(self._N, 3), dtype=wp.float32)
|
|
93
|
+
|
|
94
|
+
self._POINTS = wp.constant(CoordMat(self.points))
|
|
95
|
+
self._WEIGHTS = wp.constant(WeightVec(self.weights))
|
|
96
|
+
|
|
97
|
+
self.point_count = self._make_point_count()
|
|
98
|
+
self.point_index = self._make_point_index()
|
|
99
|
+
self.point_coords = self._make_point_coords()
|
|
100
|
+
self.point_weight = self._make_point_weight()
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def name(self):
|
|
104
|
+
return f"{self.__class__.__name__}_{self.domain.name}_{self.family}_{self.order}"
|
|
105
|
+
|
|
106
|
+
def total_point_count(self):
|
|
107
|
+
return len(self.points) * self.domain.geometry_element_count()
|
|
108
|
+
|
|
109
|
+
def points_per_element(self):
|
|
110
|
+
return self._N
|
|
111
|
+
|
|
112
|
+
@property
|
|
113
|
+
def points(self):
|
|
114
|
+
return self._element_quadrature[0]
|
|
115
|
+
|
|
116
|
+
@property
|
|
117
|
+
def weights(self):
|
|
118
|
+
return self._element_quadrature[1]
|
|
119
|
+
|
|
120
|
+
def _make_point_count(self):
|
|
121
|
+
N = self._N
|
|
122
|
+
|
|
123
|
+
@cache.dynamic_func(suffix=self.name)
|
|
124
|
+
def point_count(elt_arg: self.domain.ElementArg, qp_arg: self.Arg, element_index: ElementIndex):
|
|
125
|
+
return N
|
|
126
|
+
|
|
127
|
+
return point_count
|
|
128
|
+
|
|
129
|
+
def _make_point_coords(self):
|
|
130
|
+
POINTS = self._POINTS
|
|
131
|
+
|
|
132
|
+
@cache.dynamic_func(suffix=self.name)
|
|
133
|
+
def point_coords(elt_arg: self.domain.ElementArg, qp_arg: self.Arg, element_index: ElementIndex, qp_index: int):
|
|
134
|
+
return Coords(POINTS[qp_index, 0], POINTS[qp_index, 1], POINTS[qp_index, 2])
|
|
135
|
+
|
|
136
|
+
return point_coords
|
|
137
|
+
|
|
138
|
+
def _make_point_weight(self):
|
|
139
|
+
WEIGHTS = self._WEIGHTS
|
|
140
|
+
|
|
141
|
+
@cache.dynamic_func(suffix=self.name)
|
|
142
|
+
def point_weight(elt_arg: self.domain.ElementArg, qp_arg: self.Arg, element_index: ElementIndex, qp_index: int):
|
|
143
|
+
return WEIGHTS[qp_index]
|
|
144
|
+
|
|
145
|
+
return point_weight
|
|
146
|
+
|
|
147
|
+
def _make_point_index(self):
|
|
148
|
+
N = self._N
|
|
149
|
+
|
|
150
|
+
@cache.dynamic_func(suffix=self.name)
|
|
151
|
+
def point_index(elt_arg: self.domain.ElementArg, qp_arg: self.Arg, element_index: ElementIndex, qp_index: int):
|
|
152
|
+
return N * element_index + qp_index
|
|
153
|
+
|
|
154
|
+
return point_index
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
class NodalQuadrature(Quadrature):
|
|
158
|
+
"""Quadrature using space node points as quadrature points
|
|
159
|
+
|
|
160
|
+
Note that in contrast to the `nodal=True` flag for :func:`integrate`, this quadrature odes not make any assumption
|
|
161
|
+
about orthogonality of shape functions, and is thus safe to use for arbitrary integrands.
|
|
162
|
+
"""
|
|
163
|
+
|
|
164
|
+
def __init__(self, domain: domain.GeometryDomain, space: FunctionSpace):
|
|
165
|
+
super().__init__(domain)
|
|
166
|
+
|
|
167
|
+
self._space = space
|
|
168
|
+
|
|
169
|
+
self.Arg = self._make_arg()
|
|
170
|
+
|
|
171
|
+
self.point_count = self._make_point_count()
|
|
172
|
+
self.point_index = self._make_point_index()
|
|
173
|
+
self.point_coords = self._make_point_coords()
|
|
174
|
+
self.point_weight = self._make_point_weight()
|
|
175
|
+
|
|
176
|
+
@property
|
|
177
|
+
def name(self):
|
|
178
|
+
return f"{self.__class__.__name__}_{self._space.name}"
|
|
179
|
+
|
|
180
|
+
def total_point_count(self):
|
|
181
|
+
return self._space.node_count()
|
|
182
|
+
|
|
183
|
+
def points_per_element(self):
|
|
184
|
+
return self._space.topology.NODES_PER_ELEMENT
|
|
185
|
+
|
|
186
|
+
def _make_arg(self):
|
|
187
|
+
@cache.dynamic_struct(suffix=self.name)
|
|
188
|
+
class Arg:
|
|
189
|
+
space_arg: self._space.SpaceArg
|
|
190
|
+
topo_arg: self._space.topology.TopologyArg
|
|
191
|
+
|
|
192
|
+
return Arg
|
|
193
|
+
|
|
194
|
+
@cache.cached_arg_value
|
|
195
|
+
def arg_value(self, device):
|
|
196
|
+
arg = self.Arg()
|
|
197
|
+
arg.space_arg = self._space.space_arg_value(device)
|
|
198
|
+
arg.topo_arg = self._space.topology.topo_arg_value(device)
|
|
199
|
+
return arg
|
|
200
|
+
|
|
201
|
+
def _make_point_count(self):
|
|
202
|
+
N = self._space.topology.NODES_PER_ELEMENT
|
|
203
|
+
|
|
204
|
+
@cache.dynamic_func(suffix=self.name)
|
|
205
|
+
def point_count(elt_arg: self.domain.ElementArg, qp_arg: self.Arg, element_index: ElementIndex):
|
|
206
|
+
return N
|
|
207
|
+
|
|
208
|
+
return point_count
|
|
209
|
+
|
|
210
|
+
def _make_point_coords(self):
|
|
211
|
+
@cache.dynamic_func(suffix=self.name)
|
|
212
|
+
def point_coords(elt_arg: self.domain.ElementArg, qp_arg: self.Arg, element_index: ElementIndex, qp_index: int):
|
|
213
|
+
return self._space.node_coords_in_element(elt_arg, qp_arg.space_arg, element_index, qp_index)
|
|
214
|
+
|
|
215
|
+
return point_coords
|
|
216
|
+
|
|
217
|
+
def _make_point_weight(self):
|
|
218
|
+
@cache.dynamic_func(suffix=self.name)
|
|
219
|
+
def point_weight(elt_arg: self.domain.ElementArg, qp_arg: self.Arg, element_index: ElementIndex, qp_index: int):
|
|
220
|
+
return self._space.node_quadrature_weight(elt_arg, qp_arg.space_arg, element_index, qp_index)
|
|
221
|
+
|
|
222
|
+
return point_weight
|
|
223
|
+
|
|
224
|
+
def _make_point_index(self):
|
|
225
|
+
@cache.dynamic_func(suffix=self.name)
|
|
226
|
+
def point_index(elt_arg: self.domain.ElementArg, qp_arg: self.Arg, element_index: ElementIndex, qp_index: int):
|
|
227
|
+
return self._space.topology.element_node_index(elt_arg, qp_arg.topo_arg, element_index, qp_index)
|
|
228
|
+
|
|
229
|
+
return point_index
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
class ExplicitQuadrature(Quadrature):
|
|
233
|
+
"""Quadrature using explicit per-cell points and weights. The number of quadrature points per cell is assumed
|
|
234
|
+
to be constant and deduced from the shape of the points and weights arrays.
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
domain: Domain of definition of the quadrature formula
|
|
238
|
+
points: 2d array of shape ``(domain.geometry_element-count(), points_per_cell)`` containing the coordinates of each quadrature point.
|
|
239
|
+
weights: 2d array of shape ``(domain.geometry_element-count(), points_per_cell)`` containing the weight for each quadrature point.
|
|
240
|
+
|
|
241
|
+
See also: :class:`PicQuadrature`
|
|
242
|
+
"""
|
|
243
|
+
|
|
244
|
+
@wp.struct
|
|
245
|
+
class Arg:
|
|
246
|
+
points_per_cell: int
|
|
247
|
+
points: wp.array2d(dtype=Coords)
|
|
248
|
+
weights: wp.array2d(dtype=float)
|
|
249
|
+
|
|
250
|
+
def __init__(
|
|
251
|
+
self, domain: domain.GeometryDomain, points: "wp.array2d(dtype=Coords)", weights: "wp.array2d(dtype=float)"
|
|
252
|
+
):
|
|
253
|
+
super().__init__(domain)
|
|
254
|
+
|
|
255
|
+
if points.shape != weights.shape:
|
|
256
|
+
raise ValueError("Points and weights arrays must have the same shape")
|
|
257
|
+
|
|
258
|
+
self._points_per_cell = points.shape[1]
|
|
259
|
+
self._points = points
|
|
260
|
+
self._weights = weights
|
|
261
|
+
|
|
262
|
+
@property
|
|
263
|
+
def name(self):
|
|
264
|
+
return f"{self.__class__.__name__}"
|
|
265
|
+
|
|
266
|
+
def total_point_count(self):
|
|
267
|
+
return self._weights.size
|
|
268
|
+
|
|
269
|
+
def points_per_element(self):
|
|
270
|
+
return self._points_per_cell
|
|
271
|
+
|
|
272
|
+
@cache.cached_arg_value
|
|
273
|
+
def arg_value(self, device):
|
|
274
|
+
arg = self.Arg()
|
|
275
|
+
arg.points_per_cell = self._points_per_cell
|
|
276
|
+
arg.points = self._points.to(device)
|
|
277
|
+
arg.weights = self._weights.to(device)
|
|
278
|
+
|
|
279
|
+
return arg
|
|
280
|
+
|
|
281
|
+
@wp.func
|
|
282
|
+
def point_count(elt_arg: Any, qp_arg: Arg, element_index: ElementIndex):
|
|
283
|
+
return qp_arg.points_per_cell
|
|
284
|
+
|
|
285
|
+
@wp.func
|
|
286
|
+
def point_coords(elt_arg: Any, qp_arg: Arg, element_index: ElementIndex, qp_index: int):
|
|
287
|
+
return qp_arg.points[element_index, qp_index]
|
|
288
|
+
|
|
289
|
+
@wp.func
|
|
290
|
+
def point_weight(elt_arg: Any, qp_arg: Arg, element_index: ElementIndex, qp_index: int):
|
|
291
|
+
return qp_arg.weights[element_index, qp_index]
|
|
292
|
+
|
|
293
|
+
@wp.func
|
|
294
|
+
def point_index(elt_arg: Any, qp_arg: Arg, element_index: ElementIndex, qp_index: int):
|
|
295
|
+
return qp_arg.points_per_cell * element_index + qp_index
|