warp-lang 1.7.0__py3-none-manylinux_2_28_x86_64.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.

Files changed (429) hide show
  1. warp/__init__.py +139 -0
  2. warp/__init__.pyi +1 -0
  3. warp/autograd.py +1142 -0
  4. warp/bin/warp-clang.so +0 -0
  5. warp/bin/warp.so +0 -0
  6. warp/build.py +557 -0
  7. warp/build_dll.py +405 -0
  8. warp/builtins.py +6855 -0
  9. warp/codegen.py +3969 -0
  10. warp/config.py +158 -0
  11. warp/constants.py +57 -0
  12. warp/context.py +6812 -0
  13. warp/dlpack.py +462 -0
  14. warp/examples/__init__.py +24 -0
  15. warp/examples/assets/bear.usd +0 -0
  16. warp/examples/assets/bunny.usd +0 -0
  17. warp/examples/assets/cartpole.urdf +110 -0
  18. warp/examples/assets/crazyflie.usd +0 -0
  19. warp/examples/assets/cube.usd +0 -0
  20. warp/examples/assets/nonuniform.usd +0 -0
  21. warp/examples/assets/nv_ant.xml +92 -0
  22. warp/examples/assets/nv_humanoid.xml +183 -0
  23. warp/examples/assets/nvidia_logo.png +0 -0
  24. warp/examples/assets/pixel.jpg +0 -0
  25. warp/examples/assets/quadruped.urdf +268 -0
  26. warp/examples/assets/rocks.nvdb +0 -0
  27. warp/examples/assets/rocks.usd +0 -0
  28. warp/examples/assets/sphere.usd +0 -0
  29. warp/examples/assets/square_cloth.usd +0 -0
  30. warp/examples/benchmarks/benchmark_api.py +389 -0
  31. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  32. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  33. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  34. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  35. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  36. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  37. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  38. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  39. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  40. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  41. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  42. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  43. warp/examples/benchmarks/benchmark_launches.py +301 -0
  44. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  45. warp/examples/browse.py +37 -0
  46. warp/examples/core/example_cupy.py +86 -0
  47. warp/examples/core/example_dem.py +241 -0
  48. warp/examples/core/example_fluid.py +299 -0
  49. warp/examples/core/example_graph_capture.py +150 -0
  50. warp/examples/core/example_marching_cubes.py +194 -0
  51. warp/examples/core/example_mesh.py +180 -0
  52. warp/examples/core/example_mesh_intersect.py +211 -0
  53. warp/examples/core/example_nvdb.py +182 -0
  54. warp/examples/core/example_raycast.py +111 -0
  55. warp/examples/core/example_raymarch.py +205 -0
  56. warp/examples/core/example_render_opengl.py +193 -0
  57. warp/examples/core/example_sample_mesh.py +300 -0
  58. warp/examples/core/example_sph.py +411 -0
  59. warp/examples/core/example_torch.py +211 -0
  60. warp/examples/core/example_wave.py +269 -0
  61. warp/examples/fem/example_adaptive_grid.py +286 -0
  62. warp/examples/fem/example_apic_fluid.py +423 -0
  63. warp/examples/fem/example_burgers.py +261 -0
  64. warp/examples/fem/example_convection_diffusion.py +178 -0
  65. warp/examples/fem/example_convection_diffusion_dg.py +204 -0
  66. warp/examples/fem/example_deformed_geometry.py +172 -0
  67. warp/examples/fem/example_diffusion.py +196 -0
  68. warp/examples/fem/example_diffusion_3d.py +225 -0
  69. warp/examples/fem/example_diffusion_mgpu.py +220 -0
  70. warp/examples/fem/example_distortion_energy.py +228 -0
  71. warp/examples/fem/example_magnetostatics.py +240 -0
  72. warp/examples/fem/example_mixed_elasticity.py +291 -0
  73. warp/examples/fem/example_navier_stokes.py +261 -0
  74. warp/examples/fem/example_nonconforming_contact.py +298 -0
  75. warp/examples/fem/example_stokes.py +213 -0
  76. warp/examples/fem/example_stokes_transfer.py +262 -0
  77. warp/examples/fem/example_streamlines.py +352 -0
  78. warp/examples/fem/utils.py +1000 -0
  79. warp/examples/interop/example_jax_callable.py +116 -0
  80. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  81. warp/examples/interop/example_jax_kernel.py +205 -0
  82. warp/examples/optim/example_bounce.py +266 -0
  83. warp/examples/optim/example_cloth_throw.py +228 -0
  84. warp/examples/optim/example_diffray.py +561 -0
  85. warp/examples/optim/example_drone.py +870 -0
  86. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  87. warp/examples/optim/example_inverse_kinematics.py +182 -0
  88. warp/examples/optim/example_inverse_kinematics_torch.py +191 -0
  89. warp/examples/optim/example_softbody_properties.py +400 -0
  90. warp/examples/optim/example_spring_cage.py +245 -0
  91. warp/examples/optim/example_trajectory.py +227 -0
  92. warp/examples/sim/example_cartpole.py +143 -0
  93. warp/examples/sim/example_cloth.py +225 -0
  94. warp/examples/sim/example_cloth_self_contact.py +322 -0
  95. warp/examples/sim/example_granular.py +130 -0
  96. warp/examples/sim/example_granular_collision_sdf.py +202 -0
  97. warp/examples/sim/example_jacobian_ik.py +244 -0
  98. warp/examples/sim/example_particle_chain.py +124 -0
  99. warp/examples/sim/example_quadruped.py +203 -0
  100. warp/examples/sim/example_rigid_chain.py +203 -0
  101. warp/examples/sim/example_rigid_contact.py +195 -0
  102. warp/examples/sim/example_rigid_force.py +133 -0
  103. warp/examples/sim/example_rigid_gyroscopic.py +115 -0
  104. warp/examples/sim/example_rigid_soft_contact.py +140 -0
  105. warp/examples/sim/example_soft_body.py +196 -0
  106. warp/examples/tile/example_tile_cholesky.py +87 -0
  107. warp/examples/tile/example_tile_convolution.py +66 -0
  108. warp/examples/tile/example_tile_fft.py +55 -0
  109. warp/examples/tile/example_tile_filtering.py +113 -0
  110. warp/examples/tile/example_tile_matmul.py +85 -0
  111. warp/examples/tile/example_tile_mlp.py +383 -0
  112. warp/examples/tile/example_tile_nbody.py +199 -0
  113. warp/examples/tile/example_tile_walker.py +327 -0
  114. warp/fabric.py +355 -0
  115. warp/fem/__init__.py +106 -0
  116. warp/fem/adaptivity.py +508 -0
  117. warp/fem/cache.py +572 -0
  118. warp/fem/dirichlet.py +202 -0
  119. warp/fem/domain.py +411 -0
  120. warp/fem/field/__init__.py +125 -0
  121. warp/fem/field/field.py +619 -0
  122. warp/fem/field/nodal_field.py +326 -0
  123. warp/fem/field/restriction.py +37 -0
  124. warp/fem/field/virtual.py +848 -0
  125. warp/fem/geometry/__init__.py +32 -0
  126. warp/fem/geometry/adaptive_nanogrid.py +857 -0
  127. warp/fem/geometry/closest_point.py +84 -0
  128. warp/fem/geometry/deformed_geometry.py +221 -0
  129. warp/fem/geometry/element.py +776 -0
  130. warp/fem/geometry/geometry.py +362 -0
  131. warp/fem/geometry/grid_2d.py +392 -0
  132. warp/fem/geometry/grid_3d.py +452 -0
  133. warp/fem/geometry/hexmesh.py +911 -0
  134. warp/fem/geometry/nanogrid.py +571 -0
  135. warp/fem/geometry/partition.py +389 -0
  136. warp/fem/geometry/quadmesh.py +663 -0
  137. warp/fem/geometry/tetmesh.py +855 -0
  138. warp/fem/geometry/trimesh.py +806 -0
  139. warp/fem/integrate.py +2335 -0
  140. warp/fem/linalg.py +419 -0
  141. warp/fem/operator.py +293 -0
  142. warp/fem/polynomial.py +229 -0
  143. warp/fem/quadrature/__init__.py +17 -0
  144. warp/fem/quadrature/pic_quadrature.py +299 -0
  145. warp/fem/quadrature/quadrature.py +591 -0
  146. warp/fem/space/__init__.py +228 -0
  147. warp/fem/space/basis_function_space.py +468 -0
  148. warp/fem/space/basis_space.py +667 -0
  149. warp/fem/space/dof_mapper.py +251 -0
  150. warp/fem/space/function_space.py +309 -0
  151. warp/fem/space/grid_2d_function_space.py +177 -0
  152. warp/fem/space/grid_3d_function_space.py +227 -0
  153. warp/fem/space/hexmesh_function_space.py +257 -0
  154. warp/fem/space/nanogrid_function_space.py +201 -0
  155. warp/fem/space/partition.py +367 -0
  156. warp/fem/space/quadmesh_function_space.py +223 -0
  157. warp/fem/space/restriction.py +179 -0
  158. warp/fem/space/shape/__init__.py +143 -0
  159. warp/fem/space/shape/cube_shape_function.py +1105 -0
  160. warp/fem/space/shape/shape_function.py +133 -0
  161. warp/fem/space/shape/square_shape_function.py +926 -0
  162. warp/fem/space/shape/tet_shape_function.py +834 -0
  163. warp/fem/space/shape/triangle_shape_function.py +672 -0
  164. warp/fem/space/tetmesh_function_space.py +271 -0
  165. warp/fem/space/topology.py +424 -0
  166. warp/fem/space/trimesh_function_space.py +194 -0
  167. warp/fem/types.py +99 -0
  168. warp/fem/utils.py +420 -0
  169. warp/jax.py +187 -0
  170. warp/jax_experimental/__init__.py +16 -0
  171. warp/jax_experimental/custom_call.py +351 -0
  172. warp/jax_experimental/ffi.py +698 -0
  173. warp/jax_experimental/xla_ffi.py +602 -0
  174. warp/math.py +244 -0
  175. warp/native/array.h +1145 -0
  176. warp/native/builtin.h +1800 -0
  177. warp/native/bvh.cpp +492 -0
  178. warp/native/bvh.cu +791 -0
  179. warp/native/bvh.h +554 -0
  180. warp/native/clang/clang.cpp +536 -0
  181. warp/native/coloring.cpp +613 -0
  182. warp/native/crt.cpp +51 -0
  183. warp/native/crt.h +362 -0
  184. warp/native/cuda_crt.h +1058 -0
  185. warp/native/cuda_util.cpp +646 -0
  186. warp/native/cuda_util.h +307 -0
  187. warp/native/error.cpp +77 -0
  188. warp/native/error.h +36 -0
  189. warp/native/exports.h +1878 -0
  190. warp/native/fabric.h +245 -0
  191. warp/native/hashgrid.cpp +311 -0
  192. warp/native/hashgrid.cu +87 -0
  193. warp/native/hashgrid.h +240 -0
  194. warp/native/initializer_array.h +41 -0
  195. warp/native/intersect.h +1230 -0
  196. warp/native/intersect_adj.h +375 -0
  197. warp/native/intersect_tri.h +339 -0
  198. warp/native/marching.cpp +19 -0
  199. warp/native/marching.cu +514 -0
  200. warp/native/marching.h +19 -0
  201. warp/native/mat.h +2220 -0
  202. warp/native/mathdx.cpp +87 -0
  203. warp/native/matnn.h +343 -0
  204. warp/native/mesh.cpp +266 -0
  205. warp/native/mesh.cu +404 -0
  206. warp/native/mesh.h +1980 -0
  207. warp/native/nanovdb/GridHandle.h +366 -0
  208. warp/native/nanovdb/HostBuffer.h +590 -0
  209. warp/native/nanovdb/NanoVDB.h +6624 -0
  210. warp/native/nanovdb/PNanoVDB.h +3390 -0
  211. warp/native/noise.h +859 -0
  212. warp/native/quat.h +1371 -0
  213. warp/native/rand.h +342 -0
  214. warp/native/range.h +139 -0
  215. warp/native/reduce.cpp +174 -0
  216. warp/native/reduce.cu +364 -0
  217. warp/native/runlength_encode.cpp +79 -0
  218. warp/native/runlength_encode.cu +61 -0
  219. warp/native/scan.cpp +47 -0
  220. warp/native/scan.cu +53 -0
  221. warp/native/scan.h +23 -0
  222. warp/native/solid_angle.h +466 -0
  223. warp/native/sort.cpp +251 -0
  224. warp/native/sort.cu +277 -0
  225. warp/native/sort.h +33 -0
  226. warp/native/sparse.cpp +378 -0
  227. warp/native/sparse.cu +524 -0
  228. warp/native/spatial.h +657 -0
  229. warp/native/svd.h +702 -0
  230. warp/native/temp_buffer.h +46 -0
  231. warp/native/tile.h +2584 -0
  232. warp/native/tile_reduce.h +264 -0
  233. warp/native/vec.h +1426 -0
  234. warp/native/volume.cpp +501 -0
  235. warp/native/volume.cu +67 -0
  236. warp/native/volume.h +969 -0
  237. warp/native/volume_builder.cu +477 -0
  238. warp/native/volume_builder.h +52 -0
  239. warp/native/volume_impl.h +70 -0
  240. warp/native/warp.cpp +1082 -0
  241. warp/native/warp.cu +3636 -0
  242. warp/native/warp.h +381 -0
  243. warp/optim/__init__.py +17 -0
  244. warp/optim/adam.py +163 -0
  245. warp/optim/linear.py +1137 -0
  246. warp/optim/sgd.py +112 -0
  247. warp/paddle.py +407 -0
  248. warp/render/__init__.py +18 -0
  249. warp/render/render_opengl.py +3518 -0
  250. warp/render/render_usd.py +784 -0
  251. warp/render/utils.py +160 -0
  252. warp/sim/__init__.py +65 -0
  253. warp/sim/articulation.py +793 -0
  254. warp/sim/collide.py +2395 -0
  255. warp/sim/graph_coloring.py +300 -0
  256. warp/sim/import_mjcf.py +790 -0
  257. warp/sim/import_snu.py +227 -0
  258. warp/sim/import_urdf.py +579 -0
  259. warp/sim/import_usd.py +894 -0
  260. warp/sim/inertia.py +324 -0
  261. warp/sim/integrator.py +242 -0
  262. warp/sim/integrator_euler.py +1997 -0
  263. warp/sim/integrator_featherstone.py +2101 -0
  264. warp/sim/integrator_vbd.py +2048 -0
  265. warp/sim/integrator_xpbd.py +3292 -0
  266. warp/sim/model.py +4791 -0
  267. warp/sim/particles.py +121 -0
  268. warp/sim/render.py +427 -0
  269. warp/sim/utils.py +428 -0
  270. warp/sparse.py +2057 -0
  271. warp/stubs.py +3333 -0
  272. warp/tape.py +1203 -0
  273. warp/tests/__init__.py +1 -0
  274. warp/tests/__main__.py +4 -0
  275. warp/tests/assets/curlnoise_golden.npy +0 -0
  276. warp/tests/assets/mlp_golden.npy +0 -0
  277. warp/tests/assets/pixel.npy +0 -0
  278. warp/tests/assets/pnoise_golden.npy +0 -0
  279. warp/tests/assets/spiky.usd +0 -0
  280. warp/tests/assets/test_grid.nvdb +0 -0
  281. warp/tests/assets/test_index_grid.nvdb +0 -0
  282. warp/tests/assets/test_int32_grid.nvdb +0 -0
  283. warp/tests/assets/test_vec_grid.nvdb +0 -0
  284. warp/tests/assets/torus.nvdb +0 -0
  285. warp/tests/assets/torus.usda +105 -0
  286. warp/tests/aux_test_class_kernel.py +34 -0
  287. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  288. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  289. warp/tests/aux_test_dependent.py +29 -0
  290. warp/tests/aux_test_grad_customs.py +29 -0
  291. warp/tests/aux_test_instancing_gc.py +26 -0
  292. warp/tests/aux_test_module_unload.py +23 -0
  293. warp/tests/aux_test_name_clash1.py +40 -0
  294. warp/tests/aux_test_name_clash2.py +40 -0
  295. warp/tests/aux_test_reference.py +9 -0
  296. warp/tests/aux_test_reference_reference.py +8 -0
  297. warp/tests/aux_test_square.py +16 -0
  298. warp/tests/aux_test_unresolved_func.py +22 -0
  299. warp/tests/aux_test_unresolved_symbol.py +22 -0
  300. warp/tests/cuda/__init__.py +0 -0
  301. warp/tests/cuda/test_async.py +676 -0
  302. warp/tests/cuda/test_ipc.py +124 -0
  303. warp/tests/cuda/test_mempool.py +233 -0
  304. warp/tests/cuda/test_multigpu.py +169 -0
  305. warp/tests/cuda/test_peer.py +139 -0
  306. warp/tests/cuda/test_pinned.py +84 -0
  307. warp/tests/cuda/test_streams.py +634 -0
  308. warp/tests/geometry/__init__.py +0 -0
  309. warp/tests/geometry/test_bvh.py +200 -0
  310. warp/tests/geometry/test_hash_grid.py +221 -0
  311. warp/tests/geometry/test_marching_cubes.py +74 -0
  312. warp/tests/geometry/test_mesh.py +316 -0
  313. warp/tests/geometry/test_mesh_query_aabb.py +399 -0
  314. warp/tests/geometry/test_mesh_query_point.py +932 -0
  315. warp/tests/geometry/test_mesh_query_ray.py +311 -0
  316. warp/tests/geometry/test_volume.py +1103 -0
  317. warp/tests/geometry/test_volume_write.py +346 -0
  318. warp/tests/interop/__init__.py +0 -0
  319. warp/tests/interop/test_dlpack.py +729 -0
  320. warp/tests/interop/test_jax.py +371 -0
  321. warp/tests/interop/test_paddle.py +800 -0
  322. warp/tests/interop/test_torch.py +1001 -0
  323. warp/tests/run_coverage_serial.py +39 -0
  324. warp/tests/sim/__init__.py +0 -0
  325. warp/tests/sim/disabled_kinematics.py +244 -0
  326. warp/tests/sim/flaky_test_sim_grad.py +290 -0
  327. warp/tests/sim/test_collision.py +604 -0
  328. warp/tests/sim/test_coloring.py +258 -0
  329. warp/tests/sim/test_model.py +224 -0
  330. warp/tests/sim/test_sim_grad_bounce_linear.py +212 -0
  331. warp/tests/sim/test_sim_kinematics.py +98 -0
  332. warp/tests/sim/test_vbd.py +597 -0
  333. warp/tests/test_adam.py +163 -0
  334. warp/tests/test_arithmetic.py +1096 -0
  335. warp/tests/test_array.py +2972 -0
  336. warp/tests/test_array_reduce.py +156 -0
  337. warp/tests/test_assert.py +250 -0
  338. warp/tests/test_atomic.py +153 -0
  339. warp/tests/test_bool.py +220 -0
  340. warp/tests/test_builtins_resolution.py +1298 -0
  341. warp/tests/test_closest_point_edge_edge.py +327 -0
  342. warp/tests/test_codegen.py +810 -0
  343. warp/tests/test_codegen_instancing.py +1495 -0
  344. warp/tests/test_compile_consts.py +215 -0
  345. warp/tests/test_conditional.py +252 -0
  346. warp/tests/test_context.py +42 -0
  347. warp/tests/test_copy.py +238 -0
  348. warp/tests/test_ctypes.py +638 -0
  349. warp/tests/test_dense.py +73 -0
  350. warp/tests/test_devices.py +97 -0
  351. warp/tests/test_examples.py +482 -0
  352. warp/tests/test_fabricarray.py +996 -0
  353. warp/tests/test_fast_math.py +74 -0
  354. warp/tests/test_fem.py +2003 -0
  355. warp/tests/test_fp16.py +136 -0
  356. warp/tests/test_func.py +454 -0
  357. warp/tests/test_future_annotations.py +98 -0
  358. warp/tests/test_generics.py +656 -0
  359. warp/tests/test_grad.py +893 -0
  360. warp/tests/test_grad_customs.py +339 -0
  361. warp/tests/test_grad_debug.py +341 -0
  362. warp/tests/test_implicit_init.py +411 -0
  363. warp/tests/test_import.py +45 -0
  364. warp/tests/test_indexedarray.py +1140 -0
  365. warp/tests/test_intersect.py +73 -0
  366. warp/tests/test_iter.py +76 -0
  367. warp/tests/test_large.py +177 -0
  368. warp/tests/test_launch.py +411 -0
  369. warp/tests/test_lerp.py +151 -0
  370. warp/tests/test_linear_solvers.py +193 -0
  371. warp/tests/test_lvalue.py +427 -0
  372. warp/tests/test_mat.py +2089 -0
  373. warp/tests/test_mat_lite.py +122 -0
  374. warp/tests/test_mat_scalar_ops.py +2913 -0
  375. warp/tests/test_math.py +178 -0
  376. warp/tests/test_mlp.py +282 -0
  377. warp/tests/test_module_hashing.py +258 -0
  378. warp/tests/test_modules_lite.py +44 -0
  379. warp/tests/test_noise.py +252 -0
  380. warp/tests/test_operators.py +299 -0
  381. warp/tests/test_options.py +129 -0
  382. warp/tests/test_overwrite.py +551 -0
  383. warp/tests/test_print.py +339 -0
  384. warp/tests/test_quat.py +2315 -0
  385. warp/tests/test_rand.py +339 -0
  386. warp/tests/test_reload.py +302 -0
  387. warp/tests/test_rounding.py +185 -0
  388. warp/tests/test_runlength_encode.py +196 -0
  389. warp/tests/test_scalar_ops.py +105 -0
  390. warp/tests/test_smoothstep.py +108 -0
  391. warp/tests/test_snippet.py +318 -0
  392. warp/tests/test_sparse.py +582 -0
  393. warp/tests/test_spatial.py +2229 -0
  394. warp/tests/test_special_values.py +361 -0
  395. warp/tests/test_static.py +592 -0
  396. warp/tests/test_struct.py +734 -0
  397. warp/tests/test_tape.py +204 -0
  398. warp/tests/test_transient_module.py +93 -0
  399. warp/tests/test_triangle_closest_point.py +145 -0
  400. warp/tests/test_types.py +562 -0
  401. warp/tests/test_utils.py +588 -0
  402. warp/tests/test_vec.py +1487 -0
  403. warp/tests/test_vec_lite.py +80 -0
  404. warp/tests/test_vec_scalar_ops.py +2327 -0
  405. warp/tests/test_verify_fp.py +100 -0
  406. warp/tests/tile/__init__.py +0 -0
  407. warp/tests/tile/test_tile.py +780 -0
  408. warp/tests/tile/test_tile_load.py +407 -0
  409. warp/tests/tile/test_tile_mathdx.py +208 -0
  410. warp/tests/tile/test_tile_mlp.py +402 -0
  411. warp/tests/tile/test_tile_reduce.py +447 -0
  412. warp/tests/tile/test_tile_shared_memory.py +247 -0
  413. warp/tests/tile/test_tile_view.py +173 -0
  414. warp/tests/unittest_serial.py +47 -0
  415. warp/tests/unittest_suites.py +427 -0
  416. warp/tests/unittest_utils.py +468 -0
  417. warp/tests/walkthrough_debug.py +93 -0
  418. warp/thirdparty/__init__.py +0 -0
  419. warp/thirdparty/appdirs.py +598 -0
  420. warp/thirdparty/dlpack.py +145 -0
  421. warp/thirdparty/unittest_parallel.py +570 -0
  422. warp/torch.py +391 -0
  423. warp/types.py +5230 -0
  424. warp/utils.py +1137 -0
  425. warp_lang-1.7.0.dist-info/METADATA +516 -0
  426. warp_lang-1.7.0.dist-info/RECORD +429 -0
  427. warp_lang-1.7.0.dist-info/WHEEL +5 -0
  428. warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
  429. warp_lang-1.7.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,228 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ # isort: skip_file
17
+
18
+ from enum import Enum
19
+ from typing import Optional
20
+
21
+ import warp.fem.domain as _domain
22
+ import warp.fem.geometry as _geometry
23
+ import warp.fem.polynomial as _polynomial
24
+
25
+ from .function_space import FunctionSpace
26
+ from .basis_function_space import CollocatedFunctionSpace, ContravariantFunctionSpace, CovariantFunctionSpace
27
+ from .topology import SpaceTopology
28
+ from .basis_space import BasisSpace, PointBasisSpace, ShapeBasisSpace, make_discontinuous_basis_space
29
+ from .shape import ElementBasis, get_shape_function, ShapeFunction
30
+
31
+ from .grid_2d_function_space import make_grid_2d_space_topology
32
+
33
+ from .grid_3d_function_space import make_grid_3d_space_topology
34
+
35
+ from .trimesh_function_space import make_trimesh_space_topology
36
+
37
+ from .tetmesh_function_space import make_tetmesh_space_topology
38
+
39
+ from .quadmesh_function_space import make_quadmesh_space_topology
40
+
41
+ from .hexmesh_function_space import make_hexmesh_space_topology
42
+
43
+ from .nanogrid_function_space import make_nanogrid_space_topology
44
+
45
+
46
+ from .partition import SpacePartition, make_space_partition
47
+ from .restriction import SpaceRestriction
48
+
49
+
50
+ from .dof_mapper import DofMapper, IdentityMapper, SymmetricTensorMapper, SkewSymmetricTensorMapper
51
+
52
+
53
+ def make_space_restriction(
54
+ space: Optional[FunctionSpace] = None,
55
+ space_partition: Optional[SpacePartition] = None,
56
+ domain: Optional[_domain.GeometryDomain] = None,
57
+ space_topology: Optional[SpaceTopology] = None,
58
+ device=None,
59
+ temporary_store: "Optional[warp.fem.cache.TemporaryStore]" = None, # noqa: F821
60
+ ) -> SpaceRestriction:
61
+ """
62
+ Restricts a function space partition to a Domain, i.e. a subset of its elements.
63
+
64
+ One of `space_partition`, `space_topology`, or `space` must be provided (and will be considered in that order).
65
+
66
+ Args:
67
+ space: (deprecated) if neither `space_partition` nor `space_topology` are provided, the space defining the topology to restrict
68
+ space_partition: the subset of nodes from the space topology to consider
69
+ domain: the domain to restrict the space to, defaults to all cells of the space geometry or partition.
70
+ space_topology: the space topology to be restricted, if `space_partition` is ``None``.
71
+ device: device on which to perform and store computations
72
+ temporary_store: shared pool from which to allocate temporary arrays
73
+ """
74
+
75
+ if space_partition is None:
76
+ if space_topology is None:
77
+ assert space is not None
78
+ space_topology = space.topology
79
+
80
+ if domain is None:
81
+ domain = _domain.Cells(geometry=space_topology.geometry)
82
+
83
+ space_partition = make_space_partition(
84
+ space_topology=space_topology, geometry_partition=domain.geometry_partition
85
+ )
86
+ elif domain is None:
87
+ domain = _domain.Cells(geometry=space_partition.geo_partition)
88
+
89
+ return SpaceRestriction(
90
+ space_partition=space_partition, domain=domain, device=device, temporary_store=temporary_store
91
+ )
92
+
93
+
94
+ def make_polynomial_basis_space(
95
+ geo: _geometry.Geometry,
96
+ degree: int = 1,
97
+ element_basis: Optional[ElementBasis] = None,
98
+ discontinuous: bool = False,
99
+ family: Optional[_polynomial.Polynomial] = None,
100
+ ) -> BasisSpace:
101
+ """
102
+ Equips a geometry with a polynomial basis.
103
+
104
+ Args:
105
+ geo: the Geometry on which to build the space
106
+ degree: polynomial degree of the per-element shape functions
107
+ discontinuous: if True, use Discontinuous Galerkin shape functions. Discontinuous is implied if degree is 0, i.e, piecewise-constant shape functions.
108
+ element_basis: type of basis function for the individual elements
109
+ family: Polynomial family used to generate the shape function basis. If not provided, a reasonable basis is chosen.
110
+
111
+ Returns:
112
+ the constructed basis space
113
+ """
114
+
115
+ base_geo = geo.base
116
+
117
+ if element_basis is None:
118
+ element_basis = ElementBasis.LAGRANGE
119
+ elif element_basis == ElementBasis.SERENDIPITY and degree == 1:
120
+ # Degree-1 serendipity is always equivalent to Lagrange
121
+ element_basis = ElementBasis.LAGRANGE
122
+
123
+ shape = get_shape_function(geo.reference_cell(), geo.dimension, degree, element_basis, family)
124
+
125
+ if discontinuous or degree == 0 or element_basis == ElementBasis.NONCONFORMING_POLYNOMIAL:
126
+ return make_discontinuous_basis_space(geo, shape)
127
+
128
+ topology = None
129
+ if isinstance(base_geo, _geometry.Grid2D):
130
+ topology = make_grid_2d_space_topology(geo, shape)
131
+ elif isinstance(base_geo, _geometry.Grid3D):
132
+ topology = make_grid_3d_space_topology(geo, shape)
133
+ elif isinstance(base_geo, _geometry.Trimesh):
134
+ topology = make_trimesh_space_topology(geo, shape)
135
+ elif isinstance(base_geo, _geometry.Tetmesh):
136
+ topology = make_tetmesh_space_topology(geo, shape)
137
+ elif isinstance(base_geo, _geometry.Quadmesh):
138
+ topology = make_quadmesh_space_topology(geo, shape)
139
+ elif isinstance(base_geo, _geometry.Hexmesh):
140
+ topology = make_hexmesh_space_topology(geo, shape)
141
+ elif isinstance(base_geo, _geometry.Nanogrid) or isinstance(base_geo, _geometry.AdaptiveNanogrid):
142
+ topology = make_nanogrid_space_topology(geo, shape)
143
+
144
+ if topology is None:
145
+ raise NotImplementedError(f"Unsupported geometry type {geo.name}")
146
+
147
+ return ShapeBasisSpace(topology, shape)
148
+
149
+
150
+ def make_collocated_function_space(
151
+ basis_space: BasisSpace, dtype: type = float, dof_mapper: Optional[DofMapper] = None
152
+ ) -> CollocatedFunctionSpace:
153
+ """
154
+ Constructs a function space from a scalar-valued basis space and a value type, such that all degrees of freedom of the value type are stored at each of the basis nodes.
155
+
156
+ Args:
157
+ geo: the Geometry on which to build the space
158
+ dtype: value type the function space. If ``dof_mapper`` is provided, the value type from the DofMapper will be used instead.
159
+ 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.
160
+
161
+ Returns:
162
+ the constructed function space
163
+ """
164
+
165
+ if basis_space.value != ShapeFunction.Value.Scalar:
166
+ raise ValueError("Collocated function spaces may only be constructed from scalar-valued basis")
167
+
168
+ return CollocatedFunctionSpace(basis_space, dtype=dtype, dof_mapper=dof_mapper)
169
+
170
+
171
+ def make_covariant_function_space(
172
+ basis_space: BasisSpace,
173
+ ) -> CovariantFunctionSpace:
174
+ """
175
+ Constructs a covariant function space from a vector-valued basis space
176
+ """
177
+
178
+ if basis_space.value != ShapeFunction.Value.CovariantVector:
179
+ raise ValueError("Covariant function spaces may only be constructed from covariant vector-valued basis")
180
+ return CovariantFunctionSpace(basis_space)
181
+
182
+
183
+ def make_contravariant_function_space(
184
+ basis_space: BasisSpace,
185
+ ) -> ContravariantFunctionSpace:
186
+ """
187
+ Constructs a contravariant function space from a vector-valued basis space
188
+ """
189
+
190
+ if basis_space.value != ShapeFunction.Value.ContravariantVector:
191
+ raise ValueError("Contravariant function spaces may only be constructed from contravariant vector-valued basis")
192
+ return ContravariantFunctionSpace(basis_space)
193
+
194
+
195
+ def make_polynomial_space(
196
+ geo: _geometry.Geometry,
197
+ dtype: type = float,
198
+ dof_mapper: Optional[DofMapper] = None,
199
+ degree: int = 1,
200
+ element_basis: Optional[ElementBasis] = None,
201
+ discontinuous: bool = False,
202
+ family: Optional[_polynomial.Polynomial] = None,
203
+ ) -> CollocatedFunctionSpace:
204
+ """
205
+ Equips a geometry with a collocated, polynomial function space.
206
+ Equivalent to successive calls to :func:`make_polynomial_basis_space` then `make_collocated_function_space`, `make_covariant_function_space` or `make_contravariant_function_space`.
207
+
208
+ Args:
209
+ geo: the Geometry on which to build the space
210
+ dtype: value type the function space. If ``dof_mapper`` is provided, the value type from the DofMapper will be used instead.
211
+ 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.
212
+ degree: polynomial degree of the per-element shape functions
213
+ discontinuous: if True, use Discontinuous Galerkin shape functions. Discontinuous is implied if degree is 0, i.e, piecewise-constant shape functions.
214
+ element_basis: type of basis function for the individual elements
215
+ family: Polynomial family used to generate the shape function basis. If not provided, a reasonable basis is chosen.
216
+
217
+ Returns:
218
+ the constructed function space
219
+ """
220
+
221
+ basis_space = make_polynomial_basis_space(geo, degree, element_basis, discontinuous, family)
222
+
223
+ if basis_space.value == ShapeFunction.Value.CovariantVector:
224
+ return make_covariant_function_space(basis_space)
225
+ if basis_space.value == ShapeFunction.Value.ContravariantVector:
226
+ return make_contravariant_function_space(basis_space)
227
+
228
+ return make_collocated_function_space(basis_space, dtype=dtype, dof_mapper=dof_mapper)
@@ -0,0 +1,468 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from typing import Any, Optional
17
+
18
+ import warp as wp
19
+ from warp.fem import cache
20
+ from warp.fem.geometry import Geometry
21
+ from warp.fem.linalg import basis_element, generalized_inner, generalized_outer
22
+ from warp.fem.types import NULL_QP_INDEX, Coords, ElementIndex, make_free_sample
23
+
24
+ from .basis_space import BasisSpace
25
+ from .dof_mapper import DofMapper, IdentityMapper
26
+ from .function_space import FunctionSpace
27
+ from .partition import SpacePartition, make_space_partition
28
+
29
+
30
+ class CollocatedFunctionSpace(FunctionSpace):
31
+ """Function space where values are collocated at nodes"""
32
+
33
+ @wp.struct
34
+ class LocalValueMap:
35
+ pass
36
+
37
+ def __init__(self, basis: BasisSpace, dtype: type = float, dof_mapper: DofMapper = None):
38
+ self.dof_mapper = IdentityMapper(dtype) if dof_mapper is None else dof_mapper
39
+ self._basis = basis
40
+
41
+ super().__init__(topology=basis.topology)
42
+
43
+ self.dtype = self.dof_mapper.value_dtype
44
+ self.dof_dtype = self.dof_mapper.dof_dtype
45
+ self.VALUE_DOF_COUNT = self.dof_mapper.DOF_SIZE
46
+ self.NODE_DOF_COUNT = self.dof_mapper.DOF_SIZE
47
+
48
+ self.SpaceArg = self._basis.BasisArg
49
+ self.space_arg_value = self._basis.basis_arg_value
50
+
51
+ self.ORDER = self._basis.ORDER
52
+
53
+ self.node_basis_element = self._make_node_basis_element()
54
+ self.value_basis_element = self._make_value_basis_element()
55
+
56
+ self.node_coords_in_element = self._basis.make_node_coords_in_element()
57
+ self.node_quadrature_weight = self._basis.make_node_quadrature_weight()
58
+ self.element_inner_weight = self._basis.make_element_inner_weight()
59
+ self.element_inner_weight_gradient = self._basis.make_element_inner_weight_gradient()
60
+ self.element_outer_weight = self._basis.make_element_outer_weight()
61
+ self.element_outer_weight_gradient = self._basis.make_element_outer_weight_gradient()
62
+
63
+ self.space_value = self._make_space_value()
64
+ self.space_gradient = self._make_space_gradient()
65
+ self.space_divergence = self._make_space_divergence()
66
+
67
+ self.node_dof_value = self._make_node_dof_value()
68
+
69
+ # For backward compatibility
70
+ if hasattr(basis, "node_grid"):
71
+ self.node_grid = basis.node_grid
72
+ if hasattr(basis, "node_triangulation"):
73
+ self.node_triangulation = basis.node_triangulation
74
+ if hasattr(basis, "node_tets"):
75
+ self.node_tets = basis.node_tets
76
+ if hasattr(basis, "node_hexes"):
77
+ self.node_hexes = basis.node_hexes
78
+ if hasattr(basis, "vtk_cells"):
79
+ self.vtk_cells = basis.vtk_cells
80
+
81
+ @property
82
+ def name(self):
83
+ return f"{self._basis.name}_{self.dof_mapper}".replace(".", "_")
84
+
85
+ def node_positions(self, out: Optional[wp.array] = None) -> wp.array:
86
+ return self._basis.node_positions(out=out)
87
+
88
+ def make_field(
89
+ self,
90
+ space_partition: Optional[SpacePartition] = None,
91
+ ) -> "wp.fem.field.NodalField":
92
+ from warp.fem.field import NodalField
93
+
94
+ if space_partition is None:
95
+ space_partition = make_space_partition(space_topology=self.topology)
96
+
97
+ return NodalField(space=self, space_partition=space_partition)
98
+
99
+ def trace(self) -> "CollocatedFunctionSpace":
100
+ return CollocatedFunctionSpaceTrace(self)
101
+
102
+ def _make_node_basis_element(self):
103
+ @cache.dynamic_func(suffix=self.name)
104
+ def node_basis_element(dof_coord: int):
105
+ return basis_element(self.dof_dtype(0.0), dof_coord)
106
+
107
+ return node_basis_element
108
+
109
+ def _make_value_basis_element(self):
110
+ @cache.dynamic_func(suffix=self.name)
111
+ def value_basis_element(dof_coord: int, value_map: CollocatedFunctionSpace.LocalValueMap):
112
+ return self.dof_mapper.dof_to_value(self.node_basis_element(dof_coord))
113
+
114
+ return value_basis_element
115
+
116
+ @wp.func
117
+ def local_value_map_inner(
118
+ elt_arg: Any,
119
+ element_index: ElementIndex,
120
+ element_coords: Coords,
121
+ ):
122
+ return CollocatedFunctionSpace.LocalValueMap()
123
+
124
+ @wp.func
125
+ def local_value_map_outer(
126
+ elt_arg: Any,
127
+ element_index: ElementIndex,
128
+ element_coords: Coords,
129
+ ):
130
+ return CollocatedFunctionSpace.LocalValueMap()
131
+
132
+ def _make_space_value(self):
133
+ @cache.dynamic_func(suffix=self.name)
134
+ def value_func(
135
+ dof_value: self.dof_dtype,
136
+ node_weight: self._basis.weight_type,
137
+ local_value_map: self.LocalValueMap,
138
+ ):
139
+ return node_weight * self.dof_mapper.dof_to_value(dof_value)
140
+
141
+ return value_func
142
+
143
+ def _make_space_gradient(self):
144
+ @cache.dynamic_func(suffix=self.name)
145
+ def gradient_func(
146
+ dof_value: self.dof_dtype,
147
+ node_weight_gradient: self._basis.weight_gradient_type,
148
+ local_value_map: self.LocalValueMap,
149
+ grad_transform: Any,
150
+ ):
151
+ return generalized_outer(self.dof_mapper.dof_to_value(dof_value), node_weight_gradient * grad_transform)
152
+
153
+ return gradient_func
154
+
155
+ def _make_space_divergence(self):
156
+ @cache.dynamic_func(suffix=self.name)
157
+ def divergence_func(
158
+ dof_value: self.dof_dtype,
159
+ node_weight_gradient: self._basis.weight_gradient_type,
160
+ local_value_map: self.LocalValueMap,
161
+ grad_transform: Any,
162
+ ):
163
+ return generalized_inner(self.dof_mapper.dof_to_value(dof_value), node_weight_gradient * grad_transform)
164
+
165
+ return divergence_func
166
+
167
+ def _make_node_dof_value(self):
168
+ @cache.dynamic_func(suffix=self.name)
169
+ def node_dof_value(
170
+ elt_arg: self.ElementArg,
171
+ space_arg: self.SpaceArg,
172
+ element_index: ElementIndex,
173
+ node_index_in_elt: int,
174
+ space_value: self.dtype,
175
+ ):
176
+ return self.dof_mapper.value_to_dof(space_value)
177
+
178
+ return node_dof_value
179
+
180
+
181
+ class CollocatedFunctionSpaceTrace(CollocatedFunctionSpace):
182
+ """Trace of a :class:`CollocatedFunctionSpace`"""
183
+
184
+ def __init__(self, space: CollocatedFunctionSpace):
185
+ self._space = space
186
+ super().__init__(space._basis.trace(), space.dtype, space.dof_mapper)
187
+
188
+ @property
189
+ def name(self):
190
+ return f"{self._space.name}_Trace"
191
+
192
+ def __eq__(self, other: "CollocatedFunctionSpaceTrace") -> bool:
193
+ return self._space == other._space
194
+
195
+
196
+ class VectorValuedFunctionSpace(FunctionSpace):
197
+ """Function space whose values are vectors"""
198
+
199
+ def __init__(self, basis: BasisSpace):
200
+ self._basis = basis
201
+
202
+ super().__init__(topology=basis.topology)
203
+
204
+ self.dtype = cache.cached_vec_type(self.geometry.dimension, dtype=float)
205
+ self.dof_dtype = float
206
+
207
+ self.VALUE_DOF_COUNT = self.geometry.dimension
208
+ self.NODE_DOF_COUNT = 1
209
+
210
+ self.SpaceArg = self._basis.BasisArg
211
+ self.space_arg_value = self._basis.basis_arg_value
212
+
213
+ self.ORDER = self._basis.ORDER
214
+
215
+ self.LocalValueMap = cache.cached_mat_type(
216
+ shape=(self.geometry.dimension, self.geometry.cell_dimension), dtype=float
217
+ )
218
+
219
+ self.value_basis_element = self._make_value_basis_element()
220
+
221
+ self.node_coords_in_element = self._basis.make_node_coords_in_element()
222
+ self.node_quadrature_weight = self._basis.make_node_quadrature_weight()
223
+ self.element_inner_weight = self._basis.make_element_inner_weight()
224
+ self.element_inner_weight_gradient = self._basis.make_element_inner_weight_gradient()
225
+ self.element_outer_weight = self._basis.make_element_outer_weight()
226
+ self.element_outer_weight_gradient = self._basis.make_element_outer_weight_gradient()
227
+
228
+ self.space_value = self._make_space_value()
229
+ self.space_gradient = self._make_space_gradient()
230
+ self.space_divergence = self._make_space_divergence()
231
+
232
+ self.node_dof_value = self._make_node_dof_value()
233
+
234
+ @property
235
+ def name(self):
236
+ return self._basis.name
237
+
238
+ def node_positions(self, out: Optional[wp.array] = None) -> wp.array:
239
+ return self._basis.node_positions(out=out)
240
+
241
+ def make_field(
242
+ self,
243
+ space_partition: Optional[SpacePartition] = None,
244
+ ) -> "wp.fem.field.NodalField":
245
+ from warp.fem.field import NodalField
246
+
247
+ if space_partition is None:
248
+ space_partition = make_space_partition(space_topology=self.topology)
249
+
250
+ return NodalField(space=self, space_partition=space_partition)
251
+
252
+ @wp.func
253
+ def node_basis_element(dof_coord: int):
254
+ return 1.0
255
+
256
+ def _make_value_basis_element(self):
257
+ @cache.dynamic_func(suffix=self.name)
258
+ def value_basis_element(dof_coord: int, value_map: Any):
259
+ return value_map * basis_element(self.dtype(0.0), dof_coord)
260
+
261
+ return value_basis_element
262
+
263
+ def _make_space_value(self):
264
+ @cache.dynamic_func(suffix=self.name)
265
+ def value_func(
266
+ dof_value: self.dof_dtype,
267
+ node_weight: self._basis.weight_type,
268
+ local_value_map: self.LocalValueMap,
269
+ ):
270
+ return local_value_map * (node_weight * dof_value)
271
+
272
+ return value_func
273
+
274
+ def _make_space_gradient(self):
275
+ @cache.dynamic_func(suffix=self.name)
276
+ def gradient_func(
277
+ dof_value: self.dof_dtype,
278
+ node_weight_gradient: self._basis.weight_gradient_type,
279
+ local_value_map: self.LocalValueMap,
280
+ grad_transform: Any,
281
+ ):
282
+ return dof_value * local_value_map * node_weight_gradient * grad_transform
283
+
284
+ return gradient_func
285
+
286
+ def _make_space_divergence(self):
287
+ @cache.dynamic_func(suffix=self.name)
288
+ def divergence_func(
289
+ dof_value: self.dof_dtype,
290
+ node_weight_gradient: self._basis.weight_gradient_type,
291
+ local_value_map: self.LocalValueMap,
292
+ grad_transform: Any,
293
+ ):
294
+ return dof_value * wp.trace(local_value_map * node_weight_gradient * grad_transform)
295
+
296
+ return divergence_func
297
+
298
+ def _make_node_dof_value(self):
299
+ @cache.dynamic_func(suffix=self.name)
300
+ def node_dof_value(
301
+ elt_arg: self.ElementArg,
302
+ space_arg: self.SpaceArg,
303
+ element_index: ElementIndex,
304
+ node_index_in_elt: int,
305
+ space_value: self.dtype,
306
+ ):
307
+ coords = self.node_coords_in_element(elt_arg, space_arg, element_index, node_index_in_elt)
308
+ weight = self.element_inner_weight(
309
+ elt_arg, space_arg, element_index, coords, node_index_in_elt, NULL_QP_INDEX
310
+ )
311
+ local_value_map = self.local_value_map_inner(elt_arg, element_index, coords)
312
+
313
+ unit_value = local_value_map * weight
314
+ return wp.dot(space_value, unit_value) / wp.length_sq(unit_value)
315
+
316
+ return node_dof_value
317
+
318
+
319
+ class CovariantFunctionSpace(VectorValuedFunctionSpace):
320
+ """Function space whose values are covariant vectors"""
321
+
322
+ def __init__(self, basis: BasisSpace):
323
+ super().__init__(basis)
324
+
325
+ self.local_value_map_inner = self._make_local_value_map()
326
+ self.local_value_map_outer = self.local_value_map_inner
327
+
328
+ def trace(self) -> "CovariantFunctionSpaceTrace":
329
+ return CovariantFunctionSpaceTrace(self)
330
+
331
+ def _make_local_value_map(self):
332
+ @cache.dynamic_func(suffix=self.name)
333
+ def local_value_map(
334
+ elt_arg: self.ElementArg,
335
+ element_index: ElementIndex,
336
+ element_coords: Coords,
337
+ ):
338
+ J = wp.transpose(
339
+ self.geometry.cell_inverse_deformation_gradient(
340
+ elt_arg, make_free_sample(element_index, element_coords)
341
+ )
342
+ )
343
+ return J
344
+
345
+ return local_value_map
346
+
347
+
348
+ class CovariantFunctionSpaceTrace(VectorValuedFunctionSpace):
349
+ """Trace of a :class:`CovariantFunctionSpace`"""
350
+
351
+ def __init__(self, space: VectorValuedFunctionSpace):
352
+ self._space = space
353
+ super().__init__(space._basis.trace())
354
+
355
+ self.local_value_map_inner = self._make_local_value_map_inner()
356
+ self.local_value_map_outer = self._make_local_value_map_outer()
357
+
358
+ @property
359
+ def name(self):
360
+ return f"{self._space.name}_Trace"
361
+
362
+ def __eq__(self, other: "CovariantFunctionSpaceTrace") -> bool:
363
+ return self._space == other._space
364
+
365
+ def _make_local_value_map_inner(self):
366
+ @cache.dynamic_func(suffix=self.name)
367
+ def local_value_map_inner(
368
+ elt_arg: self.ElementArg,
369
+ element_index: ElementIndex,
370
+ element_coords: Coords,
371
+ ):
372
+ return wp.transpose(
373
+ self.geometry.side_inner_inverse_deformation_gradient(
374
+ elt_arg, make_free_sample(element_index, element_coords)
375
+ )
376
+ )
377
+
378
+ return local_value_map_inner
379
+
380
+ def _make_local_value_map_outer(self):
381
+ @cache.dynamic_func(suffix=self.name)
382
+ def local_value_map_outer(
383
+ elt_arg: self.ElementArg,
384
+ element_index: ElementIndex,
385
+ element_coords: Coords,
386
+ ):
387
+ return wp.transpose(
388
+ self.geometry.side_outer_inverse_deformation_gradient(
389
+ elt_arg, make_free_sample(element_index, element_coords)
390
+ )
391
+ )
392
+
393
+ return local_value_map_outer
394
+
395
+
396
+ class ContravariantFunctionSpace(VectorValuedFunctionSpace):
397
+ """Function space whose values are contravariant vectors"""
398
+
399
+ def __init__(self, basis: BasisSpace):
400
+ super().__init__(basis)
401
+
402
+ self.local_value_map_inner = self._make_local_value_map()
403
+ self.local_value_map_outer = self.local_value_map_inner
404
+
405
+ def trace(self) -> "ContravariantFunctionSpaceTrace":
406
+ return ContravariantFunctionSpaceTrace(self)
407
+
408
+ def _make_local_value_map(self):
409
+ @cache.dynamic_func(suffix=self.name)
410
+ def local_value_map(
411
+ elt_arg: self.ElementArg,
412
+ element_index: ElementIndex,
413
+ element_coords: Coords,
414
+ ):
415
+ F = self.geometry.cell_deformation_gradient(elt_arg, make_free_sample(element_index, element_coords))
416
+ return F / Geometry._element_measure(F)
417
+
418
+ return local_value_map
419
+
420
+
421
+ class ContravariantFunctionSpaceTrace(VectorValuedFunctionSpace):
422
+ """Trace of a :class:`ContravariantFunctionSpace`"""
423
+
424
+ def __init__(self, space: ContravariantFunctionSpace):
425
+ self._space = space
426
+ super().__init__(space._basis.trace())
427
+
428
+ self.local_value_map_inner = self._make_local_value_map_inner()
429
+ self.local_value_map_outer = self._make_local_value_map_outer()
430
+
431
+ @property
432
+ def name(self):
433
+ return f"{self._space.name}_Trace"
434
+
435
+ def __eq__(self, other: "ContravariantFunctionSpaceTrace") -> bool:
436
+ return self._space == other._space
437
+
438
+ def _make_local_value_map_inner(self):
439
+ @cache.dynamic_func(suffix=self.name)
440
+ def local_value_map_inner(
441
+ elt_arg: self.ElementArg,
442
+ element_index: ElementIndex,
443
+ element_coords: Coords,
444
+ ):
445
+ cell_index = self.geometry.side_inner_cell_index(elt_arg, element_index)
446
+ cell_coords = self.geometry.side_inner_cell_coords(elt_arg, element_index, element_coords)
447
+ cell_arg = self.geometry.side_to_cell_arg(elt_arg)
448
+
449
+ F = self.geometry.cell_deformation_gradient(cell_arg, make_free_sample(cell_index, cell_coords))
450
+ return F / Geometry._element_measure(F)
451
+
452
+ return local_value_map_inner
453
+
454
+ def _make_local_value_map_outer(self):
455
+ @cache.dynamic_func(suffix=self.name)
456
+ def local_value_map_outer(
457
+ elt_arg: self.ElementArg,
458
+ element_index: ElementIndex,
459
+ element_coords: Coords,
460
+ ):
461
+ cell_index = self.geometry.side_outer_cell_index(elt_arg, element_index)
462
+ cell_coords = self.geometry.side_outer_cell_coords(elt_arg, element_index, element_coords)
463
+ cell_arg = self.geometry.side_to_cell_arg(elt_arg)
464
+
465
+ F = self.geometry.cell_deformation_gradient(cell_arg, make_free_sample(cell_index, cell_coords))
466
+ return F / Geometry._element_measure(F)
467
+
468
+ return local_value_map_outer