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/basis_space.py
CHANGED
|
@@ -1,489 +1,488 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
|
-
|
|
3
|
-
import warp as wp
|
|
4
|
-
|
|
5
|
-
from warp.fem.
|
|
6
|
-
from warp.fem.
|
|
7
|
-
from warp.fem.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
from .topology import
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class
|
|
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
|
-
self.
|
|
95
|
-
self.
|
|
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
|
-
class
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
)
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
tri_indices
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
tet_indices
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
hex_indices
|
|
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
|
-
|
|
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
|
-
|
|
304
|
-
|
|
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
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
geo_cell_arg
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
geo_cell_arg
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
class
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
)
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
self.
|
|
416
|
-
self.
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
self.
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
return trace_node_quadrature_weight
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
import warp as wp
|
|
4
|
+
from warp.fem import cache
|
|
5
|
+
from warp.fem.geometry import Geometry
|
|
6
|
+
from warp.fem.quadrature import Quadrature
|
|
7
|
+
from warp.fem.types import Coords, ElementIndex, make_free_sample
|
|
8
|
+
|
|
9
|
+
from .shape import ShapeFunction
|
|
10
|
+
from .topology import DiscontinuousSpaceTopology, SpaceTopology
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class BasisSpace:
|
|
14
|
+
"""Interface class for defining a scalar-valued basis over a geometry.
|
|
15
|
+
|
|
16
|
+
A basis space makes it easy to define multiple function spaces sharing the same basis (and thus nodes) but with different valuation functions;
|
|
17
|
+
however, it is not a required ingredient of a function space.
|
|
18
|
+
|
|
19
|
+
See also: :func:`make_polynomial_basis_space`, :func:`make_collocated_function_space`
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
@wp.struct
|
|
23
|
+
class BasisArg:
|
|
24
|
+
"""Argument structure to be passed to device functions"""
|
|
25
|
+
|
|
26
|
+
pass
|
|
27
|
+
|
|
28
|
+
def __init__(self, topology: SpaceTopology):
|
|
29
|
+
self._topology = topology
|
|
30
|
+
|
|
31
|
+
self.NODES_PER_ELEMENT = self._topology.NODES_PER_ELEMENT
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def topology(self) -> SpaceTopology:
|
|
35
|
+
"""Underlying topology of the basis space"""
|
|
36
|
+
return self._topology
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def geometry(self) -> Geometry:
|
|
40
|
+
"""Underlying geometry of the basis space"""
|
|
41
|
+
return self._topology.geometry
|
|
42
|
+
|
|
43
|
+
def basis_arg_value(self, device) -> "BasisArg":
|
|
44
|
+
"""Value for the argument structure to be passed to device functions"""
|
|
45
|
+
return BasisSpace.BasisArg()
|
|
46
|
+
|
|
47
|
+
# Helpers for generating node positions
|
|
48
|
+
|
|
49
|
+
def node_positions(self, out: Optional[wp.array] = None) -> wp.array:
|
|
50
|
+
"""Returns a temporary array containing the world position for each node"""
|
|
51
|
+
|
|
52
|
+
NODES_PER_ELEMENT = self.NODES_PER_ELEMENT
|
|
53
|
+
|
|
54
|
+
pos_type = cache.cached_vec_type(length=self.geometry.dimension, dtype=float)
|
|
55
|
+
|
|
56
|
+
node_coords_in_element = self.make_node_coords_in_element()
|
|
57
|
+
|
|
58
|
+
@cache.dynamic_kernel(suffix=self.name, kernel_options={"max_unroll": 4, "enable_backward": False})
|
|
59
|
+
def fill_node_positions(
|
|
60
|
+
geo_cell_arg: self.geometry.CellArg,
|
|
61
|
+
basis_arg: self.BasisArg,
|
|
62
|
+
topo_arg: self.topology.TopologyArg,
|
|
63
|
+
node_positions: wp.array(dtype=pos_type),
|
|
64
|
+
):
|
|
65
|
+
element_index = wp.tid()
|
|
66
|
+
|
|
67
|
+
for n in range(NODES_PER_ELEMENT):
|
|
68
|
+
node_index = self.topology.element_node_index(geo_cell_arg, topo_arg, element_index, n)
|
|
69
|
+
coords = node_coords_in_element(geo_cell_arg, basis_arg, element_index, n)
|
|
70
|
+
|
|
71
|
+
sample = make_free_sample(element_index, coords)
|
|
72
|
+
pos = self.geometry.cell_position(geo_cell_arg, sample)
|
|
73
|
+
|
|
74
|
+
node_positions[node_index] = pos
|
|
75
|
+
|
|
76
|
+
shape = (self.topology.node_count(),)
|
|
77
|
+
if out is None:
|
|
78
|
+
node_positions = wp.empty(
|
|
79
|
+
shape=shape,
|
|
80
|
+
dtype=pos_type,
|
|
81
|
+
)
|
|
82
|
+
else:
|
|
83
|
+
if out.shape != shape or not wp.types.types_equal(pos_type, out.dtype):
|
|
84
|
+
raise ValueError(
|
|
85
|
+
f"Out node positions array must have shape {shape} and data type {wp.types.type_repr(pos_type)}"
|
|
86
|
+
)
|
|
87
|
+
node_positions = out
|
|
88
|
+
|
|
89
|
+
wp.launch(
|
|
90
|
+
dim=self.geometry.cell_count(),
|
|
91
|
+
kernel=fill_node_positions,
|
|
92
|
+
inputs=[
|
|
93
|
+
self.geometry.cell_arg_value(device=node_positions.device),
|
|
94
|
+
self.basis_arg_value(device=node_positions.device),
|
|
95
|
+
self.topology.topo_arg_value(device=node_positions.device),
|
|
96
|
+
node_positions,
|
|
97
|
+
],
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
return node_positions
|
|
101
|
+
|
|
102
|
+
def make_node_coords_in_element(self):
|
|
103
|
+
raise NotImplementedError()
|
|
104
|
+
|
|
105
|
+
def make_node_quadrature_weight(self):
|
|
106
|
+
raise NotImplementedError()
|
|
107
|
+
|
|
108
|
+
def make_element_inner_weight(self):
|
|
109
|
+
raise NotImplementedError()
|
|
110
|
+
|
|
111
|
+
def make_element_outer_weight(self):
|
|
112
|
+
return self.make_element_inner_weight()
|
|
113
|
+
|
|
114
|
+
def make_element_inner_weight_gradient(self):
|
|
115
|
+
raise NotImplementedError()
|
|
116
|
+
|
|
117
|
+
def make_element_outer_weight_gradient(self):
|
|
118
|
+
return self.make_element_inner_weight_gradient()
|
|
119
|
+
|
|
120
|
+
def make_trace_node_quadrature_weight(self):
|
|
121
|
+
raise NotImplementedError()
|
|
122
|
+
|
|
123
|
+
def trace(self) -> "TraceBasisSpace":
|
|
124
|
+
return TraceBasisSpace(self)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class ShapeBasisSpace(BasisSpace):
|
|
128
|
+
"""Base class for defining shape-function-based basis spaces."""
|
|
129
|
+
|
|
130
|
+
def __init__(self, topology: SpaceTopology, shape: ShapeFunction):
|
|
131
|
+
super().__init__(topology)
|
|
132
|
+
self._shape = shape
|
|
133
|
+
|
|
134
|
+
self.ORDER = self._shape.ORDER
|
|
135
|
+
|
|
136
|
+
if hasattr(shape, "element_node_triangulation"):
|
|
137
|
+
self.node_triangulation = self._node_triangulation
|
|
138
|
+
if hasattr(shape, "element_node_tets"):
|
|
139
|
+
self.node_tets = self._node_tets
|
|
140
|
+
if hasattr(shape, "element_node_hexes"):
|
|
141
|
+
self.node_hexes = self._node_hexes
|
|
142
|
+
|
|
143
|
+
@property
|
|
144
|
+
def shape(self) -> ShapeFunction:
|
|
145
|
+
"""Shape functions used for defining individual element basis"""
|
|
146
|
+
return self._shape
|
|
147
|
+
|
|
148
|
+
@property
|
|
149
|
+
def name(self):
|
|
150
|
+
return f"{self.topology.name}_{self._shape.name}"
|
|
151
|
+
|
|
152
|
+
def make_node_coords_in_element(self):
|
|
153
|
+
shape_node_coords_in_element = self._shape.make_node_coords_in_element()
|
|
154
|
+
|
|
155
|
+
@cache.dynamic_func(suffix=self.name)
|
|
156
|
+
def node_coords_in_element(
|
|
157
|
+
elt_arg: self.geometry.CellArg,
|
|
158
|
+
basis_arg: self.BasisArg,
|
|
159
|
+
element_index: ElementIndex,
|
|
160
|
+
node_index_in_elt: int,
|
|
161
|
+
):
|
|
162
|
+
return shape_node_coords_in_element(node_index_in_elt)
|
|
163
|
+
|
|
164
|
+
return node_coords_in_element
|
|
165
|
+
|
|
166
|
+
def make_node_quadrature_weight(self):
|
|
167
|
+
shape_node_quadrature_weight = self._shape.make_node_quadrature_weight()
|
|
168
|
+
|
|
169
|
+
@cache.dynamic_func(suffix=self.name)
|
|
170
|
+
def node_quadrature_weight(
|
|
171
|
+
elt_arg: self.geometry.CellArg,
|
|
172
|
+
basis_arg: self.BasisArg,
|
|
173
|
+
element_index: ElementIndex,
|
|
174
|
+
node_index_in_elt: int,
|
|
175
|
+
):
|
|
176
|
+
return shape_node_quadrature_weight(node_index_in_elt)
|
|
177
|
+
|
|
178
|
+
return node_quadrature_weight
|
|
179
|
+
|
|
180
|
+
def make_element_inner_weight(self):
|
|
181
|
+
shape_element_inner_weight = self._shape.make_element_inner_weight()
|
|
182
|
+
|
|
183
|
+
@cache.dynamic_func(suffix=self.name)
|
|
184
|
+
def element_inner_weight(
|
|
185
|
+
elt_arg: self.geometry.CellArg,
|
|
186
|
+
basis_arg: self.BasisArg,
|
|
187
|
+
element_index: ElementIndex,
|
|
188
|
+
coords: Coords,
|
|
189
|
+
node_index_in_elt: int,
|
|
190
|
+
):
|
|
191
|
+
return shape_element_inner_weight(coords, node_index_in_elt)
|
|
192
|
+
|
|
193
|
+
return element_inner_weight
|
|
194
|
+
|
|
195
|
+
def make_element_inner_weight_gradient(self):
|
|
196
|
+
shape_element_inner_weight_gradient = self._shape.make_element_inner_weight_gradient()
|
|
197
|
+
|
|
198
|
+
@cache.dynamic_func(suffix=self.name)
|
|
199
|
+
def element_inner_weight_gradient(
|
|
200
|
+
elt_arg: self.geometry.CellArg,
|
|
201
|
+
basis_arg: self.BasisArg,
|
|
202
|
+
element_index: ElementIndex,
|
|
203
|
+
coords: Coords,
|
|
204
|
+
node_index_in_elt: int,
|
|
205
|
+
):
|
|
206
|
+
return shape_element_inner_weight_gradient(coords, node_index_in_elt)
|
|
207
|
+
|
|
208
|
+
return element_inner_weight_gradient
|
|
209
|
+
|
|
210
|
+
def make_trace_node_quadrature_weight(self, trace_basis):
|
|
211
|
+
shape_trace_node_quadrature_weight = self._shape.make_trace_node_quadrature_weight()
|
|
212
|
+
|
|
213
|
+
@cache.dynamic_func(suffix=self.name)
|
|
214
|
+
def trace_node_quadrature_weight(
|
|
215
|
+
geo_side_arg: trace_basis.geometry.SideArg,
|
|
216
|
+
basis_arg: trace_basis.BasisArg,
|
|
217
|
+
element_index: ElementIndex,
|
|
218
|
+
node_index_in_elt: int,
|
|
219
|
+
):
|
|
220
|
+
neighbour_elem, index_in_neighbour = trace_basis.topology.neighbor_cell_index(
|
|
221
|
+
geo_side_arg, element_index, node_index_in_elt
|
|
222
|
+
)
|
|
223
|
+
return shape_trace_node_quadrature_weight(index_in_neighbour)
|
|
224
|
+
|
|
225
|
+
return trace_node_quadrature_weight
|
|
226
|
+
|
|
227
|
+
def _node_triangulation(self):
|
|
228
|
+
element_node_indices = self._topology.element_node_indices().numpy()
|
|
229
|
+
element_triangles = self._shape.element_node_triangulation()
|
|
230
|
+
|
|
231
|
+
tri_indices = element_node_indices[:, element_triangles].reshape(-1, 3)
|
|
232
|
+
return tri_indices
|
|
233
|
+
|
|
234
|
+
def _node_tets(self):
|
|
235
|
+
element_node_indices = self._topology.element_node_indices().numpy()
|
|
236
|
+
element_tets = self._shape.element_node_tets()
|
|
237
|
+
|
|
238
|
+
tet_indices = element_node_indices[:, element_tets].reshape(-1, 4)
|
|
239
|
+
return tet_indices
|
|
240
|
+
|
|
241
|
+
def _node_hexes(self):
|
|
242
|
+
element_node_indices = self._topology.element_node_indices().numpy()
|
|
243
|
+
element_hexes = self._shape.element_node_hexes()
|
|
244
|
+
|
|
245
|
+
hex_indices = element_node_indices[:, element_hexes].reshape(-1, 8)
|
|
246
|
+
return hex_indices
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
class TraceBasisSpace(BasisSpace):
|
|
250
|
+
"""Auto-generated trace space evaluating the cell-defined basis on the geometry sides"""
|
|
251
|
+
|
|
252
|
+
def __init__(self, basis: BasisSpace):
|
|
253
|
+
super().__init__(basis.topology.trace())
|
|
254
|
+
|
|
255
|
+
self.ORDER = basis.ORDER
|
|
256
|
+
|
|
257
|
+
self._basis = basis
|
|
258
|
+
self.BasisArg = self._basis.BasisArg
|
|
259
|
+
self.basis_arg_value = self._basis.basis_arg_value
|
|
260
|
+
|
|
261
|
+
@property
|
|
262
|
+
def name(self):
|
|
263
|
+
return f"{self._basis.name}_Trace"
|
|
264
|
+
|
|
265
|
+
def make_node_coords_in_element(self):
|
|
266
|
+
node_coords_in_cell = self._basis.make_node_coords_in_element()
|
|
267
|
+
|
|
268
|
+
@cache.dynamic_func(suffix=self._basis.name)
|
|
269
|
+
def trace_node_coords_in_element(
|
|
270
|
+
geo_side_arg: self.geometry.SideArg,
|
|
271
|
+
basis_arg: self.BasisArg,
|
|
272
|
+
element_index: ElementIndex,
|
|
273
|
+
node_index_in_elt: int,
|
|
274
|
+
):
|
|
275
|
+
neighbour_elem, index_in_neighbour = self.topology.neighbor_cell_index(
|
|
276
|
+
geo_side_arg, element_index, node_index_in_elt
|
|
277
|
+
)
|
|
278
|
+
geo_cell_arg = self.geometry.side_to_cell_arg(geo_side_arg)
|
|
279
|
+
neighbour_coords = node_coords_in_cell(
|
|
280
|
+
geo_cell_arg,
|
|
281
|
+
basis_arg,
|
|
282
|
+
neighbour_elem,
|
|
283
|
+
index_in_neighbour,
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
return self.geometry.side_from_cell_coords(geo_side_arg, element_index, neighbour_elem, neighbour_coords)
|
|
287
|
+
|
|
288
|
+
return trace_node_coords_in_element
|
|
289
|
+
|
|
290
|
+
def make_node_quadrature_weight(self):
|
|
291
|
+
return self._basis.make_trace_node_quadrature_weight(self)
|
|
292
|
+
|
|
293
|
+
def make_element_inner_weight(self):
|
|
294
|
+
cell_inner_weight = self._basis.make_element_inner_weight()
|
|
295
|
+
|
|
296
|
+
@cache.dynamic_func(suffix=self._basis.name)
|
|
297
|
+
def trace_element_inner_weight(
|
|
298
|
+
geo_side_arg: self.geometry.SideArg,
|
|
299
|
+
basis_arg: self.BasisArg,
|
|
300
|
+
element_index: ElementIndex,
|
|
301
|
+
coords: Coords,
|
|
302
|
+
node_index_in_elt: int,
|
|
303
|
+
):
|
|
304
|
+
cell_index, index_in_cell = self.topology.inner_cell_index(geo_side_arg, element_index, node_index_in_elt)
|
|
305
|
+
if index_in_cell < 0:
|
|
306
|
+
return 0.0
|
|
307
|
+
|
|
308
|
+
cell_coords = self.geometry.side_inner_cell_coords(geo_side_arg, element_index, coords)
|
|
309
|
+
|
|
310
|
+
geo_cell_arg = self.geometry.side_to_cell_arg(geo_side_arg)
|
|
311
|
+
return cell_inner_weight(
|
|
312
|
+
geo_cell_arg,
|
|
313
|
+
basis_arg,
|
|
314
|
+
cell_index,
|
|
315
|
+
cell_coords,
|
|
316
|
+
index_in_cell,
|
|
317
|
+
)
|
|
318
|
+
|
|
319
|
+
return trace_element_inner_weight
|
|
320
|
+
|
|
321
|
+
def make_element_outer_weight(self):
|
|
322
|
+
cell_outer_weight = self._basis.make_element_outer_weight()
|
|
323
|
+
|
|
324
|
+
@cache.dynamic_func(suffix=self._basis.name)
|
|
325
|
+
def trace_element_outer_weight(
|
|
326
|
+
geo_side_arg: self.geometry.SideArg,
|
|
327
|
+
basis_arg: self.BasisArg,
|
|
328
|
+
element_index: ElementIndex,
|
|
329
|
+
coords: Coords,
|
|
330
|
+
node_index_in_elt: int,
|
|
331
|
+
):
|
|
332
|
+
cell_index, index_in_cell = self.topology.outer_cell_index(geo_side_arg, element_index, node_index_in_elt)
|
|
333
|
+
if index_in_cell < 0:
|
|
334
|
+
return 0.0
|
|
335
|
+
|
|
336
|
+
cell_coords = self.geometry.side_outer_cell_coords(geo_side_arg, element_index, coords)
|
|
337
|
+
|
|
338
|
+
geo_cell_arg = self.geometry.side_to_cell_arg(geo_side_arg)
|
|
339
|
+
return cell_outer_weight(
|
|
340
|
+
geo_cell_arg,
|
|
341
|
+
basis_arg,
|
|
342
|
+
cell_index,
|
|
343
|
+
cell_coords,
|
|
344
|
+
index_in_cell,
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
return trace_element_outer_weight
|
|
348
|
+
|
|
349
|
+
def make_element_inner_weight_gradient(self):
|
|
350
|
+
cell_inner_weight_gradient = self._basis.make_element_inner_weight_gradient()
|
|
351
|
+
grad_vec_type = wp.vec(length=self.geometry.dimension, dtype=float)
|
|
352
|
+
|
|
353
|
+
@cache.dynamic_func(suffix=self._basis.name)
|
|
354
|
+
def trace_element_inner_weight_gradient(
|
|
355
|
+
geo_side_arg: self.geometry.SideArg,
|
|
356
|
+
basis_arg: self.BasisArg,
|
|
357
|
+
element_index: ElementIndex,
|
|
358
|
+
coords: Coords,
|
|
359
|
+
node_index_in_elt: int,
|
|
360
|
+
):
|
|
361
|
+
cell_index, index_in_cell = self.topology.inner_cell_index(geo_side_arg, element_index, node_index_in_elt)
|
|
362
|
+
if index_in_cell < 0:
|
|
363
|
+
return grad_vec_type(0.0)
|
|
364
|
+
|
|
365
|
+
cell_coords = self.geometry.side_inner_cell_coords(geo_side_arg, element_index, coords)
|
|
366
|
+
geo_cell_arg = self.geometry.side_to_cell_arg(geo_side_arg)
|
|
367
|
+
return cell_inner_weight_gradient(geo_cell_arg, basis_arg, cell_index, cell_coords, index_in_cell)
|
|
368
|
+
|
|
369
|
+
return trace_element_inner_weight_gradient
|
|
370
|
+
|
|
371
|
+
def make_element_outer_weight_gradient(self):
|
|
372
|
+
cell_outer_weight_gradient = self._basis.make_element_outer_weight_gradient()
|
|
373
|
+
grad_vec_type = wp.vec(length=self.geometry.dimension, dtype=float)
|
|
374
|
+
|
|
375
|
+
@cache.dynamic_func(suffix=self._basis.name)
|
|
376
|
+
def trace_element_outer_weight_gradient(
|
|
377
|
+
geo_side_arg: self.geometry.SideArg,
|
|
378
|
+
basis_arg: self.BasisArg,
|
|
379
|
+
element_index: ElementIndex,
|
|
380
|
+
coords: Coords,
|
|
381
|
+
node_index_in_elt: int,
|
|
382
|
+
):
|
|
383
|
+
cell_index, index_in_cell = self.topology.outer_cell_index(geo_side_arg, element_index, node_index_in_elt)
|
|
384
|
+
if index_in_cell < 0:
|
|
385
|
+
return grad_vec_type(0.0)
|
|
386
|
+
|
|
387
|
+
cell_coords = self.geometry.side_outer_cell_coords(geo_side_arg, element_index, coords)
|
|
388
|
+
geo_cell_arg = self.geometry.side_to_cell_arg(geo_side_arg)
|
|
389
|
+
return cell_outer_weight_gradient(geo_cell_arg, basis_arg, cell_index, cell_coords, index_in_cell)
|
|
390
|
+
|
|
391
|
+
return trace_element_outer_weight_gradient
|
|
392
|
+
|
|
393
|
+
def __eq__(self, other: "TraceBasisSpace") -> bool:
|
|
394
|
+
return self._topo == other._topo
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
class PointBasisSpace(BasisSpace):
|
|
398
|
+
"""An unstructured :class:`BasisSpace` that is non-zero at a finite set of points only.
|
|
399
|
+
|
|
400
|
+
The node locations and nodal quadrature weights are defined by a :class:`Quadrature` formula.
|
|
401
|
+
"""
|
|
402
|
+
|
|
403
|
+
def __init__(self, quadrature: Quadrature):
|
|
404
|
+
self._quadrature = quadrature
|
|
405
|
+
|
|
406
|
+
if quadrature.points_per_element() is None:
|
|
407
|
+
raise NotImplementedError("Varying number of points per element is not supported yet")
|
|
408
|
+
|
|
409
|
+
topology = DiscontinuousSpaceTopology(
|
|
410
|
+
geometry=quadrature.domain.geometry, nodes_per_element=quadrature.points_per_element()
|
|
411
|
+
)
|
|
412
|
+
super().__init__(topology)
|
|
413
|
+
|
|
414
|
+
self.BasisArg = quadrature.Arg
|
|
415
|
+
self.basis_arg_value = quadrature.arg_value
|
|
416
|
+
self.ORDER = 0
|
|
417
|
+
|
|
418
|
+
self.make_element_outer_weight = self.make_element_inner_weight
|
|
419
|
+
self.make_element_outer_weight_gradient = self.make_element_outer_weight_gradient
|
|
420
|
+
|
|
421
|
+
@property
|
|
422
|
+
def name(self):
|
|
423
|
+
return f"{self._quadrature.name}_Point"
|
|
424
|
+
|
|
425
|
+
def make_node_coords_in_element(self):
|
|
426
|
+
@cache.dynamic_func(suffix=self.name)
|
|
427
|
+
def node_coords_in_element(
|
|
428
|
+
elt_arg: self._quadrature.domain.ElementArg,
|
|
429
|
+
basis_arg: self.BasisArg,
|
|
430
|
+
element_index: ElementIndex,
|
|
431
|
+
node_index_in_elt: int,
|
|
432
|
+
):
|
|
433
|
+
return self._quadrature.point_coords(elt_arg, basis_arg, element_index, node_index_in_elt)
|
|
434
|
+
|
|
435
|
+
return node_coords_in_element
|
|
436
|
+
|
|
437
|
+
def make_node_quadrature_weight(self):
|
|
438
|
+
@cache.dynamic_func(suffix=self.name)
|
|
439
|
+
def node_quadrature_weight(
|
|
440
|
+
elt_arg: self._quadrature.domain.ElementArg,
|
|
441
|
+
basis_arg: self.BasisArg,
|
|
442
|
+
element_index: ElementIndex,
|
|
443
|
+
node_index_in_elt: int,
|
|
444
|
+
):
|
|
445
|
+
return self._quadrature.point_weight(elt_arg, basis_arg, element_index, node_index_in_elt)
|
|
446
|
+
|
|
447
|
+
return node_quadrature_weight
|
|
448
|
+
|
|
449
|
+
def make_element_inner_weight(self):
|
|
450
|
+
@cache.dynamic_func(suffix=self.name)
|
|
451
|
+
def element_inner_weight(
|
|
452
|
+
elt_arg: self._quadrature.domain.ElementArg,
|
|
453
|
+
basis_arg: self.BasisArg,
|
|
454
|
+
element_index: ElementIndex,
|
|
455
|
+
coords: Coords,
|
|
456
|
+
node_index_in_elt: int,
|
|
457
|
+
):
|
|
458
|
+
qp_coord = self._quadrature.point_coords(elt_arg, basis_arg, element_index, node_index_in_elt)
|
|
459
|
+
return wp.select(wp.length_sq(coords - qp_coord) < 0.001, 0.0, 1.0)
|
|
460
|
+
|
|
461
|
+
return element_inner_weight
|
|
462
|
+
|
|
463
|
+
def make_element_inner_weight_gradient(self):
|
|
464
|
+
gradient_vec = cache.cached_vec_type(length=self.geometry.dimension, dtype=float)
|
|
465
|
+
|
|
466
|
+
@cache.dynamic_func(suffix=self.name)
|
|
467
|
+
def element_inner_weight_gradient(
|
|
468
|
+
elt_arg: self._quadrature.domain.ElementArg,
|
|
469
|
+
basis_arg: self.BasisArg,
|
|
470
|
+
element_index: ElementIndex,
|
|
471
|
+
coords: Coords,
|
|
472
|
+
node_index_in_elt: int,
|
|
473
|
+
):
|
|
474
|
+
return gradient_vec(0.0)
|
|
475
|
+
|
|
476
|
+
return element_inner_weight_gradient
|
|
477
|
+
|
|
478
|
+
def make_trace_node_quadrature_weight(self, trace_basis):
|
|
479
|
+
@cache.dynamic_func(suffix=self.name)
|
|
480
|
+
def trace_node_quadrature_weight(
|
|
481
|
+
elt_arg: trace_basis.geometry.SideArg,
|
|
482
|
+
basis_arg: trace_basis.BasisArg,
|
|
483
|
+
element_index: ElementIndex,
|
|
484
|
+
node_index_in_elt: int,
|
|
485
|
+
):
|
|
486
|
+
return 0.0
|
|
487
|
+
|
|
488
|
+
return trace_node_quadrature_weight
|