warp-lang 1.0.2__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 -277
- warp/examples/benchmarks/benchmark_cloth_cupy.py +88 -88
- warp/examples/benchmarks/benchmark_cloth_jax.py +97 -100
- warp/examples/benchmarks/benchmark_cloth_numba.py +146 -142
- warp/examples/benchmarks/benchmark_cloth_numpy.py +77 -77
- warp/examples/benchmarks/benchmark_cloth_pytorch.py +86 -86
- warp/examples/benchmarks/benchmark_cloth_taichi.py +112 -112
- warp/examples/benchmarks/benchmark_cloth_warp.py +146 -146
- warp/examples/benchmarks/benchmark_launches.py +295 -295
- warp/examples/browse.py +29 -29
- warp/examples/core/example_dem.py +234 -219
- warp/examples/core/example_fluid.py +293 -267
- warp/examples/core/example_graph_capture.py +144 -126
- warp/examples/core/example_marching_cubes.py +188 -174
- warp/examples/core/example_mesh.py +174 -155
- warp/examples/core/example_mesh_intersect.py +205 -193
- warp/examples/core/example_nvdb.py +176 -170
- warp/examples/core/example_raycast.py +105 -90
- warp/examples/core/example_raymarch.py +199 -178
- warp/examples/core/example_render_opengl.py +185 -141
- warp/examples/core/example_sph.py +405 -387
- warp/examples/core/example_torch.py +222 -181
- warp/examples/core/example_wave.py +263 -248
- warp/examples/fem/bsr_utils.py +378 -380
- warp/examples/fem/example_apic_fluid.py +407 -389
- 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 -246
- warp/examples/optim/example_cloth_throw.py +222 -209
- warp/examples/optim/example_diffray.py +566 -536
- warp/examples/optim/example_drone.py +864 -835
- warp/examples/optim/example_inverse_kinematics.py +176 -168
- warp/examples/optim/example_inverse_kinematics_torch.py +185 -169
- warp/examples/optim/example_spring_cage.py +239 -231
- warp/examples/optim/example_trajectory.py +223 -199
- warp/examples/optim/example_walker.py +306 -293
- warp/examples/sim/example_cartpole.py +139 -129
- warp/examples/sim/example_cloth.py +196 -186
- warp/examples/sim/example_granular.py +124 -111
- warp/examples/sim/example_granular_collision_sdf.py +197 -186
- warp/examples/sim/example_jacobian_ik.py +236 -214
- warp/examples/sim/example_particle_chain.py +118 -105
- warp/examples/sim/example_quadruped.py +193 -180
- warp/examples/sim/example_rigid_chain.py +197 -187
- warp/examples/sim/example_rigid_contact.py +189 -177
- warp/examples/sim/example_rigid_force.py +127 -125
- warp/examples/sim/example_rigid_gyroscopic.py +109 -95
- warp/examples/sim/example_rigid_soft_contact.py +134 -122
- warp/examples/sim/example_soft_body.py +190 -177
- 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.2.dist-info → warp_lang-1.1.0.dist-info}/LICENSE.md +126 -126
- {warp_lang-1.0.2.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.2.dist-info/RECORD +0 -352
- {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/WHEEL +0 -0
- {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/top_level.txt +0 -0
warp/fem/space/__init__.py
CHANGED
|
@@ -1,292 +1,294 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import warp.fem.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
from .
|
|
11
|
-
from .
|
|
12
|
-
|
|
13
|
-
from .
|
|
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
|
-
|
|
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
|
-
if
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
return
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
return
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
return
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
return
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
return
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
return
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
return
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
return
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
return
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
return
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
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
|
-
|
|
1
|
+
# isort: skip_file
|
|
2
|
+
|
|
3
|
+
from enum import Enum
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
import warp.fem.domain as _domain
|
|
7
|
+
import warp.fem.geometry as _geometry
|
|
8
|
+
import warp.fem.polynomial as _polynomial
|
|
9
|
+
|
|
10
|
+
from .function_space import FunctionSpace
|
|
11
|
+
from .topology import SpaceTopology
|
|
12
|
+
from .basis_space import BasisSpace, PointBasisSpace
|
|
13
|
+
from .collocated_function_space import CollocatedFunctionSpace
|
|
14
|
+
|
|
15
|
+
from .grid_2d_function_space import (
|
|
16
|
+
GridPiecewiseConstantBasis,
|
|
17
|
+
GridBipolynomialBasisSpace,
|
|
18
|
+
GridDGBipolynomialBasisSpace,
|
|
19
|
+
GridSerendipityBasisSpace,
|
|
20
|
+
GridDGSerendipityBasisSpace,
|
|
21
|
+
GridDGPolynomialBasisSpace,
|
|
22
|
+
)
|
|
23
|
+
from .grid_3d_function_space import (
|
|
24
|
+
GridTripolynomialBasisSpace,
|
|
25
|
+
GridDGTripolynomialBasisSpace,
|
|
26
|
+
Grid3DPiecewiseConstantBasis,
|
|
27
|
+
Grid3DSerendipityBasisSpace,
|
|
28
|
+
Grid3DDGSerendipityBasisSpace,
|
|
29
|
+
Grid3DDGPolynomialBasisSpace,
|
|
30
|
+
)
|
|
31
|
+
from .trimesh_2d_function_space import (
|
|
32
|
+
Trimesh2DPiecewiseConstantBasis,
|
|
33
|
+
Trimesh2DPolynomialBasisSpace,
|
|
34
|
+
Trimesh2DDGPolynomialBasisSpace,
|
|
35
|
+
Trimesh2DNonConformingPolynomialBasisSpace,
|
|
36
|
+
)
|
|
37
|
+
from .tetmesh_function_space import (
|
|
38
|
+
TetmeshPiecewiseConstantBasis,
|
|
39
|
+
TetmeshPolynomialBasisSpace,
|
|
40
|
+
TetmeshDGPolynomialBasisSpace,
|
|
41
|
+
TetmeshNonConformingPolynomialBasisSpace,
|
|
42
|
+
)
|
|
43
|
+
from .quadmesh_2d_function_space import (
|
|
44
|
+
Quadmesh2DPiecewiseConstantBasis,
|
|
45
|
+
Quadmesh2DBipolynomialBasisSpace,
|
|
46
|
+
Quadmesh2DDGBipolynomialBasisSpace,
|
|
47
|
+
Quadmesh2DSerendipityBasisSpace,
|
|
48
|
+
Quadmesh2DDGSerendipityBasisSpace,
|
|
49
|
+
Quadmesh2DPolynomialBasisSpace,
|
|
50
|
+
)
|
|
51
|
+
from .hexmesh_function_space import (
|
|
52
|
+
HexmeshPiecewiseConstantBasis,
|
|
53
|
+
HexmeshTripolynomialBasisSpace,
|
|
54
|
+
HexmeshDGTripolynomialBasisSpace,
|
|
55
|
+
HexmeshSerendipityBasisSpace,
|
|
56
|
+
HexmeshDGSerendipityBasisSpace,
|
|
57
|
+
HexmeshPolynomialBasisSpace,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
from .partition import SpacePartition, make_space_partition
|
|
61
|
+
from .restriction import SpaceRestriction
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
from .dof_mapper import DofMapper, IdentityMapper, SymmetricTensorMapper, SkewSymmetricTensorMapper
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def make_space_restriction(
|
|
68
|
+
space: Optional[FunctionSpace] = None,
|
|
69
|
+
space_partition: Optional[SpacePartition] = None,
|
|
70
|
+
domain: Optional[_domain.GeometryDomain] = None,
|
|
71
|
+
space_topology: Optional[SpaceTopology] = None,
|
|
72
|
+
device=None,
|
|
73
|
+
temporary_store: "Optional[warp.fem.cache.TemporaryStore]" = None, # noqa: F821
|
|
74
|
+
) -> SpaceRestriction:
|
|
75
|
+
"""
|
|
76
|
+
Restricts a function space partition to a Domain, i.e. a subset of its elements.
|
|
77
|
+
|
|
78
|
+
One of `space_partition`, `space_topology`, or `space` must be provided (and will be considered in that order).
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
space: (deprecated) if neither `space_partition` nor `space_topology` are provided, the space defining the topology to restrict
|
|
82
|
+
space_partition: the subset of nodes from the space topology to consider
|
|
83
|
+
domain: the domain to restrict the space to, defaults to all cells of the space geometry or partition.
|
|
84
|
+
space_topology: the space topology to be restricted, if `space_partition` is ``None``.
|
|
85
|
+
device: device on which to perform and store computations
|
|
86
|
+
temporary_store: shared pool from which to allocate temporary arrays
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
if space_partition is None:
|
|
90
|
+
if space_topology is None:
|
|
91
|
+
assert space is not None
|
|
92
|
+
space_topology = space.topology
|
|
93
|
+
|
|
94
|
+
if domain is None:
|
|
95
|
+
domain = _domain.Cells(geometry=space_topology.geometry)
|
|
96
|
+
|
|
97
|
+
space_partition = make_space_partition(
|
|
98
|
+
space_topology=space_topology, geometry_partition=domain.geometry_partition
|
|
99
|
+
)
|
|
100
|
+
elif domain is None:
|
|
101
|
+
domain = _domain.Cells(geometry=space_partition.geo_partition)
|
|
102
|
+
|
|
103
|
+
return SpaceRestriction(
|
|
104
|
+
space_partition=space_partition, domain=domain, device=device, temporary_store=temporary_store
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class ElementBasis(Enum):
|
|
109
|
+
"""Choice of basis function to equip individual elements"""
|
|
110
|
+
|
|
111
|
+
LAGRANGE = 0
|
|
112
|
+
"""Lagrange basis functions :math:`P_k` for simplices, tensor products :math:`Q_k` for squares and cubes"""
|
|
113
|
+
SERENDIPITY = 1
|
|
114
|
+
"""Serendipity elements :math:`S_k`, corresponding to Lagrange nodes with interior points removed (for degree <= 3)"""
|
|
115
|
+
NONCONFORMING_POLYNOMIAL = 2
|
|
116
|
+
"""Simplex Lagrange basis functions :math:`P_{kd}` embedded into non conforming reference elements (e.g. squares or cubes). Discontinuous only."""
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def make_polynomial_basis_space(
|
|
120
|
+
geo: _geometry.Geometry,
|
|
121
|
+
degree: int = 1,
|
|
122
|
+
element_basis: Optional[ElementBasis] = None,
|
|
123
|
+
discontinuous: bool = False,
|
|
124
|
+
family: Optional[_polynomial.Polynomial] = None,
|
|
125
|
+
) -> BasisSpace:
|
|
126
|
+
"""
|
|
127
|
+
Equips a geometry with a polynomial basis.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
geo: the Geometry on which to build the space
|
|
131
|
+
degree: polynomial degree of the per-element shape functions
|
|
132
|
+
discontinuous: if True, use Discontinuous Galerkin shape functions. Discontinuous is implied if degree is 0, i.e, piecewise-constant shape functions.
|
|
133
|
+
element_basis: type of basis function for the individual elements
|
|
134
|
+
family: Polynomial family used to generate the shape function basis. If not provided, a reasonable basis is chosen.
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
the constructed basis space
|
|
138
|
+
"""
|
|
139
|
+
|
|
140
|
+
base_geo = geo.base if isinstance(geo, _geometry.DeformedGeometry) else geo
|
|
141
|
+
|
|
142
|
+
if element_basis is None:
|
|
143
|
+
element_basis = ElementBasis.LAGRANGE
|
|
144
|
+
|
|
145
|
+
if isinstance(base_geo, _geometry.Grid2D):
|
|
146
|
+
if degree == 0:
|
|
147
|
+
return GridPiecewiseConstantBasis(geo)
|
|
148
|
+
|
|
149
|
+
if element_basis == ElementBasis.SERENDIPITY and degree > 1:
|
|
150
|
+
if discontinuous:
|
|
151
|
+
return GridDGSerendipityBasisSpace(geo, degree=degree, family=family)
|
|
152
|
+
else:
|
|
153
|
+
return GridSerendipityBasisSpace(geo, degree=degree, family=family)
|
|
154
|
+
|
|
155
|
+
if element_basis == ElementBasis.NONCONFORMING_POLYNOMIAL:
|
|
156
|
+
return GridDGPolynomialBasisSpace(geo, degree=degree)
|
|
157
|
+
|
|
158
|
+
if discontinuous:
|
|
159
|
+
return GridDGBipolynomialBasisSpace(geo, degree=degree, family=family)
|
|
160
|
+
else:
|
|
161
|
+
return GridBipolynomialBasisSpace(geo, degree=degree, family=family)
|
|
162
|
+
|
|
163
|
+
if isinstance(base_geo, _geometry.Grid3D):
|
|
164
|
+
if degree == 0:
|
|
165
|
+
return Grid3DPiecewiseConstantBasis(geo)
|
|
166
|
+
|
|
167
|
+
if element_basis == ElementBasis.SERENDIPITY and degree > 1:
|
|
168
|
+
if discontinuous:
|
|
169
|
+
return Grid3DDGSerendipityBasisSpace(geo, degree=degree, family=family)
|
|
170
|
+
else:
|
|
171
|
+
return Grid3DSerendipityBasisSpace(geo, degree=degree, family=family)
|
|
172
|
+
|
|
173
|
+
if element_basis == ElementBasis.NONCONFORMING_POLYNOMIAL:
|
|
174
|
+
return Grid3DDGPolynomialBasisSpace(geo, degree=degree)
|
|
175
|
+
|
|
176
|
+
if discontinuous:
|
|
177
|
+
return GridDGTripolynomialBasisSpace(geo, degree=degree, family=family)
|
|
178
|
+
else:
|
|
179
|
+
return GridTripolynomialBasisSpace(geo, degree=degree, family=family)
|
|
180
|
+
|
|
181
|
+
if isinstance(base_geo, _geometry.Trimesh2D):
|
|
182
|
+
if degree == 0:
|
|
183
|
+
return Trimesh2DPiecewiseConstantBasis(geo)
|
|
184
|
+
|
|
185
|
+
if element_basis == ElementBasis.SERENDIPITY and degree > 2:
|
|
186
|
+
raise NotImplementedError("Serendipity variant not implemented yet")
|
|
187
|
+
|
|
188
|
+
if element_basis == ElementBasis.NONCONFORMING_POLYNOMIAL:
|
|
189
|
+
return Trimesh2DNonConformingPolynomialBasisSpace(geo, degree=degree)
|
|
190
|
+
|
|
191
|
+
if discontinuous:
|
|
192
|
+
return Trimesh2DDGPolynomialBasisSpace(geo, degree=degree)
|
|
193
|
+
else:
|
|
194
|
+
return Trimesh2DPolynomialBasisSpace(geo, degree=degree)
|
|
195
|
+
|
|
196
|
+
if isinstance(base_geo, _geometry.Tetmesh):
|
|
197
|
+
if degree == 0:
|
|
198
|
+
return TetmeshPiecewiseConstantBasis(geo)
|
|
199
|
+
|
|
200
|
+
if element_basis == ElementBasis.SERENDIPITY and degree > 2:
|
|
201
|
+
raise NotImplementedError("Serendipity variant not implemented yet")
|
|
202
|
+
|
|
203
|
+
if element_basis == ElementBasis.NONCONFORMING_POLYNOMIAL:
|
|
204
|
+
return TetmeshNonConformingPolynomialBasisSpace(geo, degree=degree)
|
|
205
|
+
|
|
206
|
+
if discontinuous:
|
|
207
|
+
return TetmeshDGPolynomialBasisSpace(geo, degree=degree)
|
|
208
|
+
else:
|
|
209
|
+
return TetmeshPolynomialBasisSpace(geo, degree=degree)
|
|
210
|
+
|
|
211
|
+
if isinstance(base_geo, _geometry.Quadmesh2D):
|
|
212
|
+
if degree == 0:
|
|
213
|
+
return Quadmesh2DPiecewiseConstantBasis(geo)
|
|
214
|
+
|
|
215
|
+
if element_basis == ElementBasis.SERENDIPITY and degree > 1:
|
|
216
|
+
if discontinuous:
|
|
217
|
+
return Quadmesh2DDGSerendipityBasisSpace(geo, degree=degree, family=family)
|
|
218
|
+
else:
|
|
219
|
+
return Quadmesh2DSerendipityBasisSpace(geo, degree=degree, family=family)
|
|
220
|
+
|
|
221
|
+
if element_basis == ElementBasis.NONCONFORMING_POLYNOMIAL:
|
|
222
|
+
return Quadmesh2DPolynomialBasisSpace(geo, degree=degree)
|
|
223
|
+
|
|
224
|
+
if discontinuous:
|
|
225
|
+
return Quadmesh2DDGBipolynomialBasisSpace(geo, degree=degree, family=family)
|
|
226
|
+
else:
|
|
227
|
+
return Quadmesh2DBipolynomialBasisSpace(geo, degree=degree, family=family)
|
|
228
|
+
|
|
229
|
+
if isinstance(base_geo, _geometry.Hexmesh):
|
|
230
|
+
if degree == 0:
|
|
231
|
+
return HexmeshPiecewiseConstantBasis(geo)
|
|
232
|
+
|
|
233
|
+
if element_basis == ElementBasis.SERENDIPITY and degree > 1:
|
|
234
|
+
if discontinuous:
|
|
235
|
+
return HexmeshDGSerendipityBasisSpace(geo, degree=degree, family=family)
|
|
236
|
+
else:
|
|
237
|
+
return HexmeshSerendipityBasisSpace(geo, degree=degree, family=family)
|
|
238
|
+
|
|
239
|
+
if element_basis == ElementBasis.NONCONFORMING_POLYNOMIAL:
|
|
240
|
+
return HexmeshPolynomialBasisSpace(geo, degree=degree)
|
|
241
|
+
|
|
242
|
+
if discontinuous:
|
|
243
|
+
return HexmeshDGTripolynomialBasisSpace(geo, degree=degree, family=family)
|
|
244
|
+
else:
|
|
245
|
+
return HexmeshTripolynomialBasisSpace(geo, degree=degree, family=family)
|
|
246
|
+
|
|
247
|
+
raise NotImplementedError()
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def make_collocated_function_space(
|
|
251
|
+
basis_space: BasisSpace, dtype: type = float, dof_mapper: Optional[DofMapper] = None
|
|
252
|
+
) -> CollocatedFunctionSpace:
|
|
253
|
+
"""
|
|
254
|
+
Constructs a function space from a basis space and a value type, such that all degrees of freedom of the value type are stored at each of the basis nodes.
|
|
255
|
+
|
|
256
|
+
Args:
|
|
257
|
+
geo: the Geometry on which to build the space
|
|
258
|
+
dtype: value type the function space. If ``dof_mapper`` is provided, the value type from the DofMapper will be used instead.
|
|
259
|
+
dof_mapper: mapping from node degrees of freedom to function values, defaults to Identity. Useful for reduced coordinates, e.g. :py:class:`SymmetricTensorMapper` maps 2x2 (resp 3x3) symmetric tensors to 3 (resp 6) degrees of freedom.
|
|
260
|
+
|
|
261
|
+
Returns:
|
|
262
|
+
the constructed function space
|
|
263
|
+
"""
|
|
264
|
+
return CollocatedFunctionSpace(basis_space, dtype=dtype, dof_mapper=dof_mapper)
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def make_polynomial_space(
|
|
268
|
+
geo: _geometry.Geometry,
|
|
269
|
+
dtype: type = float,
|
|
270
|
+
dof_mapper: Optional[DofMapper] = None,
|
|
271
|
+
degree: int = 1,
|
|
272
|
+
element_basis: Optional[ElementBasis] = None,
|
|
273
|
+
discontinuous: bool = False,
|
|
274
|
+
family: Optional[_polynomial.Polynomial] = None,
|
|
275
|
+
) -> CollocatedFunctionSpace:
|
|
276
|
+
"""
|
|
277
|
+
Equips a geometry with a collocated, polynomial function space.
|
|
278
|
+
Equivalent to successive calls to :func:`make_polynomial_basis_space` and `make_collocated_function_space`.
|
|
279
|
+
|
|
280
|
+
Args:
|
|
281
|
+
geo: the Geometry on which to build the space
|
|
282
|
+
dtype: value type the function space. If ``dof_mapper`` is provided, the value type from the DofMapper will be used instead.
|
|
283
|
+
dof_mapper: mapping from node degrees of freedom to function values, defaults to Identity. Useful for reduced coordinates, e.g. :py:class:`SymmetricTensorMapper` maps 2x2 (resp 3x3) symmetric tensors to 3 (resp 6) degrees of freedom.
|
|
284
|
+
degree: polynomial degree of the per-element shape functions
|
|
285
|
+
discontinuous: if True, use Discontinuous Galerkin shape functions. Discontinuous is implied if degree is 0, i.e, piecewise-constant shape functions.
|
|
286
|
+
element_basis: type of basis function for the individual elements
|
|
287
|
+
family: Polynomial family used to generate the shape function basis. If not provided, a reasonable basis is chosen.
|
|
288
|
+
|
|
289
|
+
Returns:
|
|
290
|
+
the constructed function space
|
|
291
|
+
"""
|
|
292
|
+
|
|
293
|
+
basis_space = make_polynomial_basis_space(geo, degree, element_basis, discontinuous, family)
|
|
294
|
+
return CollocatedFunctionSpace(basis_space, dtype=dtype, dof_mapper=dof_mapper)
|