warp-lang 1.10.0__py3-none-macosx_11_0_arm64.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 (468) hide show
  1. warp/__init__.py +334 -0
  2. warp/__init__.pyi +5856 -0
  3. warp/_src/__init__.py +14 -0
  4. warp/_src/autograd.py +1077 -0
  5. warp/_src/build.py +620 -0
  6. warp/_src/build_dll.py +642 -0
  7. warp/_src/builtins.py +10555 -0
  8. warp/_src/codegen.py +4361 -0
  9. warp/_src/config.py +178 -0
  10. warp/_src/constants.py +59 -0
  11. warp/_src/context.py +8352 -0
  12. warp/_src/dlpack.py +464 -0
  13. warp/_src/fabric.py +362 -0
  14. warp/_src/fem/__init__.py +14 -0
  15. warp/_src/fem/adaptivity.py +510 -0
  16. warp/_src/fem/cache.py +689 -0
  17. warp/_src/fem/dirichlet.py +190 -0
  18. warp/_src/fem/domain.py +553 -0
  19. warp/_src/fem/field/__init__.py +131 -0
  20. warp/_src/fem/field/field.py +703 -0
  21. warp/_src/fem/field/nodal_field.py +403 -0
  22. warp/_src/fem/field/restriction.py +39 -0
  23. warp/_src/fem/field/virtual.py +1021 -0
  24. warp/_src/fem/geometry/__init__.py +32 -0
  25. warp/_src/fem/geometry/adaptive_nanogrid.py +782 -0
  26. warp/_src/fem/geometry/closest_point.py +99 -0
  27. warp/_src/fem/geometry/deformed_geometry.py +277 -0
  28. warp/_src/fem/geometry/element.py +854 -0
  29. warp/_src/fem/geometry/geometry.py +693 -0
  30. warp/_src/fem/geometry/grid_2d.py +478 -0
  31. warp/_src/fem/geometry/grid_3d.py +539 -0
  32. warp/_src/fem/geometry/hexmesh.py +956 -0
  33. warp/_src/fem/geometry/nanogrid.py +660 -0
  34. warp/_src/fem/geometry/partition.py +483 -0
  35. warp/_src/fem/geometry/quadmesh.py +597 -0
  36. warp/_src/fem/geometry/tetmesh.py +762 -0
  37. warp/_src/fem/geometry/trimesh.py +588 -0
  38. warp/_src/fem/integrate.py +2507 -0
  39. warp/_src/fem/linalg.py +385 -0
  40. warp/_src/fem/operator.py +398 -0
  41. warp/_src/fem/polynomial.py +231 -0
  42. warp/_src/fem/quadrature/__init__.py +17 -0
  43. warp/_src/fem/quadrature/pic_quadrature.py +318 -0
  44. warp/_src/fem/quadrature/quadrature.py +665 -0
  45. warp/_src/fem/space/__init__.py +248 -0
  46. warp/_src/fem/space/basis_function_space.py +499 -0
  47. warp/_src/fem/space/basis_space.py +681 -0
  48. warp/_src/fem/space/dof_mapper.py +253 -0
  49. warp/_src/fem/space/function_space.py +312 -0
  50. warp/_src/fem/space/grid_2d_function_space.py +179 -0
  51. warp/_src/fem/space/grid_3d_function_space.py +229 -0
  52. warp/_src/fem/space/hexmesh_function_space.py +255 -0
  53. warp/_src/fem/space/nanogrid_function_space.py +199 -0
  54. warp/_src/fem/space/partition.py +435 -0
  55. warp/_src/fem/space/quadmesh_function_space.py +222 -0
  56. warp/_src/fem/space/restriction.py +221 -0
  57. warp/_src/fem/space/shape/__init__.py +152 -0
  58. warp/_src/fem/space/shape/cube_shape_function.py +1107 -0
  59. warp/_src/fem/space/shape/shape_function.py +134 -0
  60. warp/_src/fem/space/shape/square_shape_function.py +928 -0
  61. warp/_src/fem/space/shape/tet_shape_function.py +829 -0
  62. warp/_src/fem/space/shape/triangle_shape_function.py +674 -0
  63. warp/_src/fem/space/tetmesh_function_space.py +270 -0
  64. warp/_src/fem/space/topology.py +461 -0
  65. warp/_src/fem/space/trimesh_function_space.py +193 -0
  66. warp/_src/fem/types.py +114 -0
  67. warp/_src/fem/utils.py +488 -0
  68. warp/_src/jax.py +188 -0
  69. warp/_src/jax_experimental/__init__.py +14 -0
  70. warp/_src/jax_experimental/custom_call.py +389 -0
  71. warp/_src/jax_experimental/ffi.py +1286 -0
  72. warp/_src/jax_experimental/xla_ffi.py +658 -0
  73. warp/_src/marching_cubes.py +710 -0
  74. warp/_src/math.py +416 -0
  75. warp/_src/optim/__init__.py +14 -0
  76. warp/_src/optim/adam.py +165 -0
  77. warp/_src/optim/linear.py +1608 -0
  78. warp/_src/optim/sgd.py +114 -0
  79. warp/_src/paddle.py +408 -0
  80. warp/_src/render/__init__.py +14 -0
  81. warp/_src/render/imgui_manager.py +291 -0
  82. warp/_src/render/render_opengl.py +3638 -0
  83. warp/_src/render/render_usd.py +939 -0
  84. warp/_src/render/utils.py +162 -0
  85. warp/_src/sparse.py +2718 -0
  86. warp/_src/tape.py +1208 -0
  87. warp/_src/thirdparty/__init__.py +0 -0
  88. warp/_src/thirdparty/appdirs.py +598 -0
  89. warp/_src/thirdparty/dlpack.py +145 -0
  90. warp/_src/thirdparty/unittest_parallel.py +676 -0
  91. warp/_src/torch.py +393 -0
  92. warp/_src/types.py +5888 -0
  93. warp/_src/utils.py +1695 -0
  94. warp/autograd.py +33 -0
  95. warp/bin/libwarp-clang.dylib +0 -0
  96. warp/bin/libwarp.dylib +0 -0
  97. warp/build.py +29 -0
  98. warp/build_dll.py +24 -0
  99. warp/codegen.py +24 -0
  100. warp/constants.py +24 -0
  101. warp/context.py +33 -0
  102. warp/dlpack.py +24 -0
  103. warp/examples/__init__.py +24 -0
  104. warp/examples/assets/bear.usd +0 -0
  105. warp/examples/assets/bunny.usd +0 -0
  106. warp/examples/assets/cube.usd +0 -0
  107. warp/examples/assets/nonuniform.usd +0 -0
  108. warp/examples/assets/nvidia_logo.png +0 -0
  109. warp/examples/assets/pixel.jpg +0 -0
  110. warp/examples/assets/rocks.nvdb +0 -0
  111. warp/examples/assets/rocks.usd +0 -0
  112. warp/examples/assets/sphere.usd +0 -0
  113. warp/examples/assets/square_cloth.usd +0 -0
  114. warp/examples/benchmarks/benchmark_api.py +389 -0
  115. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  116. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  117. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  118. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  119. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  120. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  121. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  122. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  123. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  124. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  125. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  126. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  127. warp/examples/benchmarks/benchmark_launches.py +301 -0
  128. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  129. warp/examples/benchmarks/benchmark_tile_sort.py +155 -0
  130. warp/examples/browse.py +37 -0
  131. warp/examples/core/example_cupy.py +86 -0
  132. warp/examples/core/example_dem.py +241 -0
  133. warp/examples/core/example_fluid.py +299 -0
  134. warp/examples/core/example_graph_capture.py +150 -0
  135. warp/examples/core/example_marching_cubes.py +195 -0
  136. warp/examples/core/example_mesh.py +180 -0
  137. warp/examples/core/example_mesh_intersect.py +211 -0
  138. warp/examples/core/example_nvdb.py +182 -0
  139. warp/examples/core/example_raycast.py +111 -0
  140. warp/examples/core/example_raymarch.py +205 -0
  141. warp/examples/core/example_render_opengl.py +290 -0
  142. warp/examples/core/example_sample_mesh.py +300 -0
  143. warp/examples/core/example_sph.py +411 -0
  144. warp/examples/core/example_spin_lock.py +93 -0
  145. warp/examples/core/example_torch.py +211 -0
  146. warp/examples/core/example_wave.py +269 -0
  147. warp/examples/core/example_work_queue.py +118 -0
  148. warp/examples/distributed/example_jacobi_mpi.py +506 -0
  149. warp/examples/fem/example_adaptive_grid.py +286 -0
  150. warp/examples/fem/example_apic_fluid.py +469 -0
  151. warp/examples/fem/example_burgers.py +261 -0
  152. warp/examples/fem/example_convection_diffusion.py +181 -0
  153. warp/examples/fem/example_convection_diffusion_dg.py +225 -0
  154. warp/examples/fem/example_darcy_ls_optimization.py +489 -0
  155. warp/examples/fem/example_deformed_geometry.py +172 -0
  156. warp/examples/fem/example_diffusion.py +196 -0
  157. warp/examples/fem/example_diffusion_3d.py +225 -0
  158. warp/examples/fem/example_diffusion_mgpu.py +225 -0
  159. warp/examples/fem/example_distortion_energy.py +228 -0
  160. warp/examples/fem/example_elastic_shape_optimization.py +387 -0
  161. warp/examples/fem/example_magnetostatics.py +242 -0
  162. warp/examples/fem/example_mixed_elasticity.py +293 -0
  163. warp/examples/fem/example_navier_stokes.py +263 -0
  164. warp/examples/fem/example_nonconforming_contact.py +300 -0
  165. warp/examples/fem/example_stokes.py +213 -0
  166. warp/examples/fem/example_stokes_transfer.py +262 -0
  167. warp/examples/fem/example_streamlines.py +357 -0
  168. warp/examples/fem/utils.py +1047 -0
  169. warp/examples/interop/example_jax_callable.py +146 -0
  170. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  171. warp/examples/interop/example_jax_kernel.py +232 -0
  172. warp/examples/optim/example_diffray.py +561 -0
  173. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  174. warp/examples/tile/example_tile_block_cholesky.py +502 -0
  175. warp/examples/tile/example_tile_cholesky.py +88 -0
  176. warp/examples/tile/example_tile_convolution.py +66 -0
  177. warp/examples/tile/example_tile_fft.py +55 -0
  178. warp/examples/tile/example_tile_filtering.py +113 -0
  179. warp/examples/tile/example_tile_matmul.py +85 -0
  180. warp/examples/tile/example_tile_mcgp.py +191 -0
  181. warp/examples/tile/example_tile_mlp.py +385 -0
  182. warp/examples/tile/example_tile_nbody.py +199 -0
  183. warp/fabric.py +24 -0
  184. warp/fem/__init__.py +173 -0
  185. warp/fem/adaptivity.py +26 -0
  186. warp/fem/cache.py +30 -0
  187. warp/fem/dirichlet.py +24 -0
  188. warp/fem/field/__init__.py +24 -0
  189. warp/fem/field/field.py +26 -0
  190. warp/fem/geometry/__init__.py +21 -0
  191. warp/fem/geometry/closest_point.py +31 -0
  192. warp/fem/linalg.py +38 -0
  193. warp/fem/operator.py +32 -0
  194. warp/fem/polynomial.py +29 -0
  195. warp/fem/space/__init__.py +22 -0
  196. warp/fem/space/basis_space.py +24 -0
  197. warp/fem/space/shape/__init__.py +68 -0
  198. warp/fem/space/topology.py +24 -0
  199. warp/fem/types.py +24 -0
  200. warp/fem/utils.py +32 -0
  201. warp/jax.py +29 -0
  202. warp/jax_experimental/__init__.py +29 -0
  203. warp/jax_experimental/custom_call.py +29 -0
  204. warp/jax_experimental/ffi.py +39 -0
  205. warp/jax_experimental/xla_ffi.py +24 -0
  206. warp/marching_cubes.py +24 -0
  207. warp/math.py +37 -0
  208. warp/native/array.h +1687 -0
  209. warp/native/builtin.h +2327 -0
  210. warp/native/bvh.cpp +562 -0
  211. warp/native/bvh.cu +826 -0
  212. warp/native/bvh.h +555 -0
  213. warp/native/clang/clang.cpp +541 -0
  214. warp/native/coloring.cpp +622 -0
  215. warp/native/crt.cpp +51 -0
  216. warp/native/crt.h +568 -0
  217. warp/native/cuda_crt.h +1058 -0
  218. warp/native/cuda_util.cpp +677 -0
  219. warp/native/cuda_util.h +313 -0
  220. warp/native/error.cpp +77 -0
  221. warp/native/error.h +36 -0
  222. warp/native/exports.h +2023 -0
  223. warp/native/fabric.h +246 -0
  224. warp/native/hashgrid.cpp +311 -0
  225. warp/native/hashgrid.cu +89 -0
  226. warp/native/hashgrid.h +240 -0
  227. warp/native/initializer_array.h +41 -0
  228. warp/native/intersect.h +1253 -0
  229. warp/native/intersect_adj.h +375 -0
  230. warp/native/intersect_tri.h +348 -0
  231. warp/native/mat.h +5189 -0
  232. warp/native/mathdx.cpp +93 -0
  233. warp/native/matnn.h +221 -0
  234. warp/native/mesh.cpp +266 -0
  235. warp/native/mesh.cu +406 -0
  236. warp/native/mesh.h +2097 -0
  237. warp/native/nanovdb/GridHandle.h +533 -0
  238. warp/native/nanovdb/HostBuffer.h +591 -0
  239. warp/native/nanovdb/NanoVDB.h +6246 -0
  240. warp/native/nanovdb/NodeManager.h +323 -0
  241. warp/native/nanovdb/PNanoVDB.h +3390 -0
  242. warp/native/noise.h +859 -0
  243. warp/native/quat.h +1664 -0
  244. warp/native/rand.h +342 -0
  245. warp/native/range.h +145 -0
  246. warp/native/reduce.cpp +174 -0
  247. warp/native/reduce.cu +363 -0
  248. warp/native/runlength_encode.cpp +79 -0
  249. warp/native/runlength_encode.cu +61 -0
  250. warp/native/scan.cpp +47 -0
  251. warp/native/scan.cu +55 -0
  252. warp/native/scan.h +23 -0
  253. warp/native/solid_angle.h +466 -0
  254. warp/native/sort.cpp +251 -0
  255. warp/native/sort.cu +286 -0
  256. warp/native/sort.h +35 -0
  257. warp/native/sparse.cpp +241 -0
  258. warp/native/sparse.cu +435 -0
  259. warp/native/spatial.h +1306 -0
  260. warp/native/svd.h +727 -0
  261. warp/native/temp_buffer.h +46 -0
  262. warp/native/tile.h +4124 -0
  263. warp/native/tile_radix_sort.h +1112 -0
  264. warp/native/tile_reduce.h +838 -0
  265. warp/native/tile_scan.h +240 -0
  266. warp/native/tuple.h +189 -0
  267. warp/native/vec.h +2199 -0
  268. warp/native/version.h +23 -0
  269. warp/native/volume.cpp +501 -0
  270. warp/native/volume.cu +68 -0
  271. warp/native/volume.h +970 -0
  272. warp/native/volume_builder.cu +483 -0
  273. warp/native/volume_builder.h +52 -0
  274. warp/native/volume_impl.h +70 -0
  275. warp/native/warp.cpp +1143 -0
  276. warp/native/warp.cu +4604 -0
  277. warp/native/warp.h +358 -0
  278. warp/optim/__init__.py +20 -0
  279. warp/optim/adam.py +24 -0
  280. warp/optim/linear.py +35 -0
  281. warp/optim/sgd.py +24 -0
  282. warp/paddle.py +24 -0
  283. warp/py.typed +0 -0
  284. warp/render/__init__.py +22 -0
  285. warp/render/imgui_manager.py +29 -0
  286. warp/render/render_opengl.py +24 -0
  287. warp/render/render_usd.py +24 -0
  288. warp/render/utils.py +24 -0
  289. warp/sparse.py +51 -0
  290. warp/tape.py +24 -0
  291. warp/tests/__init__.py +1 -0
  292. warp/tests/__main__.py +4 -0
  293. warp/tests/assets/curlnoise_golden.npy +0 -0
  294. warp/tests/assets/mlp_golden.npy +0 -0
  295. warp/tests/assets/pixel.npy +0 -0
  296. warp/tests/assets/pnoise_golden.npy +0 -0
  297. warp/tests/assets/spiky.usd +0 -0
  298. warp/tests/assets/test_grid.nvdb +0 -0
  299. warp/tests/assets/test_index_grid.nvdb +0 -0
  300. warp/tests/assets/test_int32_grid.nvdb +0 -0
  301. warp/tests/assets/test_vec_grid.nvdb +0 -0
  302. warp/tests/assets/torus.nvdb +0 -0
  303. warp/tests/assets/torus.usda +105 -0
  304. warp/tests/aux_test_class_kernel.py +34 -0
  305. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  306. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  307. warp/tests/aux_test_dependent.py +29 -0
  308. warp/tests/aux_test_grad_customs.py +29 -0
  309. warp/tests/aux_test_instancing_gc.py +26 -0
  310. warp/tests/aux_test_module_aot.py +7 -0
  311. warp/tests/aux_test_module_unload.py +23 -0
  312. warp/tests/aux_test_name_clash1.py +40 -0
  313. warp/tests/aux_test_name_clash2.py +40 -0
  314. warp/tests/aux_test_reference.py +9 -0
  315. warp/tests/aux_test_reference_reference.py +8 -0
  316. warp/tests/aux_test_square.py +16 -0
  317. warp/tests/aux_test_unresolved_func.py +22 -0
  318. warp/tests/aux_test_unresolved_symbol.py +22 -0
  319. warp/tests/cuda/__init__.py +0 -0
  320. warp/tests/cuda/test_async.py +676 -0
  321. warp/tests/cuda/test_conditional_captures.py +1147 -0
  322. warp/tests/cuda/test_ipc.py +124 -0
  323. warp/tests/cuda/test_mempool.py +233 -0
  324. warp/tests/cuda/test_multigpu.py +169 -0
  325. warp/tests/cuda/test_peer.py +139 -0
  326. warp/tests/cuda/test_pinned.py +84 -0
  327. warp/tests/cuda/test_streams.py +691 -0
  328. warp/tests/geometry/__init__.py +0 -0
  329. warp/tests/geometry/test_bvh.py +335 -0
  330. warp/tests/geometry/test_hash_grid.py +259 -0
  331. warp/tests/geometry/test_marching_cubes.py +294 -0
  332. warp/tests/geometry/test_mesh.py +318 -0
  333. warp/tests/geometry/test_mesh_query_aabb.py +392 -0
  334. warp/tests/geometry/test_mesh_query_point.py +935 -0
  335. warp/tests/geometry/test_mesh_query_ray.py +323 -0
  336. warp/tests/geometry/test_volume.py +1103 -0
  337. warp/tests/geometry/test_volume_write.py +346 -0
  338. warp/tests/interop/__init__.py +0 -0
  339. warp/tests/interop/test_dlpack.py +730 -0
  340. warp/tests/interop/test_jax.py +1673 -0
  341. warp/tests/interop/test_paddle.py +800 -0
  342. warp/tests/interop/test_torch.py +1001 -0
  343. warp/tests/run_coverage_serial.py +39 -0
  344. warp/tests/test_adam.py +162 -0
  345. warp/tests/test_arithmetic.py +1096 -0
  346. warp/tests/test_array.py +3756 -0
  347. warp/tests/test_array_reduce.py +156 -0
  348. warp/tests/test_assert.py +303 -0
  349. warp/tests/test_atomic.py +336 -0
  350. warp/tests/test_atomic_bitwise.py +209 -0
  351. warp/tests/test_atomic_cas.py +312 -0
  352. warp/tests/test_bool.py +220 -0
  353. warp/tests/test_builtins_resolution.py +732 -0
  354. warp/tests/test_closest_point_edge_edge.py +327 -0
  355. warp/tests/test_codegen.py +974 -0
  356. warp/tests/test_codegen_instancing.py +1495 -0
  357. warp/tests/test_compile_consts.py +215 -0
  358. warp/tests/test_conditional.py +298 -0
  359. warp/tests/test_context.py +35 -0
  360. warp/tests/test_copy.py +319 -0
  361. warp/tests/test_ctypes.py +618 -0
  362. warp/tests/test_dense.py +73 -0
  363. warp/tests/test_devices.py +127 -0
  364. warp/tests/test_enum.py +136 -0
  365. warp/tests/test_examples.py +424 -0
  366. warp/tests/test_fabricarray.py +998 -0
  367. warp/tests/test_fast_math.py +72 -0
  368. warp/tests/test_fem.py +2204 -0
  369. warp/tests/test_fixedarray.py +229 -0
  370. warp/tests/test_fp16.py +136 -0
  371. warp/tests/test_func.py +501 -0
  372. warp/tests/test_future_annotations.py +100 -0
  373. warp/tests/test_generics.py +656 -0
  374. warp/tests/test_grad.py +893 -0
  375. warp/tests/test_grad_customs.py +339 -0
  376. warp/tests/test_grad_debug.py +341 -0
  377. warp/tests/test_implicit_init.py +411 -0
  378. warp/tests/test_import.py +45 -0
  379. warp/tests/test_indexedarray.py +1140 -0
  380. warp/tests/test_intersect.py +103 -0
  381. warp/tests/test_iter.py +76 -0
  382. warp/tests/test_large.py +177 -0
  383. warp/tests/test_launch.py +411 -0
  384. warp/tests/test_lerp.py +151 -0
  385. warp/tests/test_linear_solvers.py +223 -0
  386. warp/tests/test_lvalue.py +427 -0
  387. warp/tests/test_map.py +526 -0
  388. warp/tests/test_mat.py +3515 -0
  389. warp/tests/test_mat_assign_copy.py +178 -0
  390. warp/tests/test_mat_constructors.py +573 -0
  391. warp/tests/test_mat_lite.py +122 -0
  392. warp/tests/test_mat_scalar_ops.py +2913 -0
  393. warp/tests/test_math.py +212 -0
  394. warp/tests/test_module_aot.py +287 -0
  395. warp/tests/test_module_hashing.py +258 -0
  396. warp/tests/test_modules_lite.py +70 -0
  397. warp/tests/test_noise.py +252 -0
  398. warp/tests/test_operators.py +299 -0
  399. warp/tests/test_options.py +129 -0
  400. warp/tests/test_overwrite.py +551 -0
  401. warp/tests/test_print.py +408 -0
  402. warp/tests/test_quat.py +2653 -0
  403. warp/tests/test_quat_assign_copy.py +145 -0
  404. warp/tests/test_rand.py +339 -0
  405. warp/tests/test_reload.py +303 -0
  406. warp/tests/test_rounding.py +157 -0
  407. warp/tests/test_runlength_encode.py +196 -0
  408. warp/tests/test_scalar_ops.py +133 -0
  409. warp/tests/test_smoothstep.py +108 -0
  410. warp/tests/test_snippet.py +318 -0
  411. warp/tests/test_sparse.py +845 -0
  412. warp/tests/test_spatial.py +2859 -0
  413. warp/tests/test_spatial_assign_copy.py +160 -0
  414. warp/tests/test_special_values.py +361 -0
  415. warp/tests/test_static.py +640 -0
  416. warp/tests/test_struct.py +901 -0
  417. warp/tests/test_tape.py +242 -0
  418. warp/tests/test_transient_module.py +93 -0
  419. warp/tests/test_triangle_closest_point.py +192 -0
  420. warp/tests/test_tuple.py +361 -0
  421. warp/tests/test_types.py +615 -0
  422. warp/tests/test_utils.py +594 -0
  423. warp/tests/test_vec.py +1408 -0
  424. warp/tests/test_vec_assign_copy.py +143 -0
  425. warp/tests/test_vec_constructors.py +325 -0
  426. warp/tests/test_vec_lite.py +80 -0
  427. warp/tests/test_vec_scalar_ops.py +2327 -0
  428. warp/tests/test_verify_fp.py +100 -0
  429. warp/tests/test_version.py +75 -0
  430. warp/tests/tile/__init__.py +0 -0
  431. warp/tests/tile/test_tile.py +1519 -0
  432. warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
  433. warp/tests/tile/test_tile_cholesky.py +608 -0
  434. warp/tests/tile/test_tile_load.py +724 -0
  435. warp/tests/tile/test_tile_mathdx.py +156 -0
  436. warp/tests/tile/test_tile_matmul.py +179 -0
  437. warp/tests/tile/test_tile_mlp.py +400 -0
  438. warp/tests/tile/test_tile_reduce.py +950 -0
  439. warp/tests/tile/test_tile_shared_memory.py +376 -0
  440. warp/tests/tile/test_tile_sort.py +121 -0
  441. warp/tests/tile/test_tile_view.py +173 -0
  442. warp/tests/unittest_serial.py +47 -0
  443. warp/tests/unittest_suites.py +430 -0
  444. warp/tests/unittest_utils.py +469 -0
  445. warp/tests/walkthrough_debug.py +95 -0
  446. warp/torch.py +24 -0
  447. warp/types.py +51 -0
  448. warp/utils.py +31 -0
  449. warp_lang-1.10.0.dist-info/METADATA +459 -0
  450. warp_lang-1.10.0.dist-info/RECORD +468 -0
  451. warp_lang-1.10.0.dist-info/WHEEL +5 -0
  452. warp_lang-1.10.0.dist-info/licenses/LICENSE.md +176 -0
  453. warp_lang-1.10.0.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
  454. warp_lang-1.10.0.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
  455. warp_lang-1.10.0.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
  456. warp_lang-1.10.0.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
  457. warp_lang-1.10.0.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
  458. warp_lang-1.10.0.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
  459. warp_lang-1.10.0.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
  460. warp_lang-1.10.0.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
  461. warp_lang-1.10.0.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
  462. warp_lang-1.10.0.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
  463. warp_lang-1.10.0.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
  464. warp_lang-1.10.0.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
  465. warp_lang-1.10.0.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
  466. warp_lang-1.10.0.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
  467. warp_lang-1.10.0.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
  468. warp_lang-1.10.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,253 @@
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
+ import math
17
+ from enum import Enum
18
+ from typing import Any
19
+
20
+ import warp as wp
21
+ from warp._src.types import type_size
22
+
23
+ _wp_module_name_ = "warp.fem.space.dof_mapper"
24
+
25
+ vec6 = wp.vec(length=6, dtype=wp.float32)
26
+
27
+ _SQRT_2 = wp.constant(math.sqrt(2.0))
28
+ _SQRT_3 = wp.constant(math.sqrt(3.0))
29
+ _SQRT_1_2 = wp.constant(math.sqrt(1.0 / 2.0))
30
+ _SQRT_1_3 = wp.constant(math.sqrt(1.0 / 3.0))
31
+
32
+
33
+ class DofMapper:
34
+ """Base class from mapping node degrees of freedom to function values"""
35
+
36
+ value_dtype: type
37
+ dof_dtype: type
38
+ DOF_SIZE: int
39
+
40
+ @wp.func
41
+ def dof_to_value(dof: Any):
42
+ raise NotImplementedError
43
+
44
+ @wp.func
45
+ def value_to_dof(val: Any):
46
+ raise NotImplementedError
47
+
48
+ def __str__(self):
49
+ return f"{self.value_dtype.__name__}_{self.DOF_SIZE}"
50
+
51
+
52
+ class IdentityMapper(DofMapper):
53
+ """Identity mapper"""
54
+
55
+ def __init__(self, dtype: type):
56
+ if dtype == float:
57
+ dtype = wp.float32
58
+
59
+ self.value_dtype = dtype
60
+ self.dof_dtype = dtype
61
+
62
+ size = type_size(dtype)
63
+ self.DOF_SIZE = wp.constant(size)
64
+
65
+ @wp.func
66
+ def dof_to_value(dof: Any):
67
+ return dof
68
+
69
+ @wp.func
70
+ def value_to_dof(val: Any):
71
+ return val
72
+
73
+
74
+ class SymmetricTensorMapper(DofMapper):
75
+ """Orthonormal isomorphism from R^{n (n+1)} to nxn symmetric tensors,
76
+ using usual L2 norm for vectors and half Frobenius norm, (tau : tau)/2 for tensors.
77
+ """
78
+
79
+ class Mapping(Enum):
80
+ VOIGT = 0
81
+ """Voigt ordering of vector coefficients:
82
+ first the three diagonal terms, then off-diagonal coefficients"""
83
+ DB16 = 1
84
+ """Ordering that also separates normal from tangential coefficients:
85
+ first trace, then other diagonal terms, then off-diagonal coefficients.
86
+ See [Daviet and Bertails-Descoubes 2016]"""
87
+
88
+ def __init__(self, dtype: type, mapping: Mapping = Mapping.VOIGT):
89
+ self.value_dtype = dtype
90
+ self.mapping = mapping
91
+
92
+ if dtype == wp.mat22:
93
+ self.dof_dtype = wp.vec3
94
+ self.DOF_SIZE = wp.constant(3)
95
+ if mapping == SymmetricTensorMapper.Mapping.VOIGT:
96
+ self.dof_to_value = SymmetricTensorMapper.dof_to_value_2d_voigt
97
+ self.value_to_dof = SymmetricTensorMapper.value_to_dof_2d_voigt
98
+ else:
99
+ self.dof_to_value = SymmetricTensorMapper.dof_to_value_2d
100
+ self.value_to_dof = SymmetricTensorMapper.value_to_dof_2d
101
+ elif dtype == wp.mat33:
102
+ self.dof_dtype = vec6
103
+ self.DOF_SIZE = wp.constant(6)
104
+ if mapping == SymmetricTensorMapper.Mapping.VOIGT:
105
+ self.dof_to_value = SymmetricTensorMapper.dof_to_value_3d_voigt
106
+ self.value_to_dof = SymmetricTensorMapper.value_to_dof_3d_voigt
107
+ else:
108
+ self.dof_to_value = SymmetricTensorMapper.dof_to_value_3d
109
+ self.value_to_dof = SymmetricTensorMapper.value_to_dof_3d
110
+ else:
111
+ raise ValueError("Unsupported value dtype: ", dtype)
112
+
113
+ def __str__(self):
114
+ return f"{self.mapping}_{self.DOF_SIZE}"
115
+
116
+ @wp.func
117
+ def dof_to_value_2d(dof: wp.vec3):
118
+ a = dof[0]
119
+ b = dof[1]
120
+ c = dof[2]
121
+ return wp.mat22(a + b, c, c, a - b)
122
+
123
+ @wp.func
124
+ def value_to_dof_2d(val: wp.mat22):
125
+ a = 0.5 * (val[0, 0] + val[1, 1])
126
+ b = 0.5 * (val[0, 0] - val[1, 1])
127
+ c = 0.5 * (val[0, 1] + val[1, 0])
128
+ return wp.vec3(a, b, c)
129
+
130
+ @wp.func
131
+ def dof_to_value_2d_voigt(dof: wp.vec3):
132
+ a = _SQRT_2 * dof[0]
133
+ b = _SQRT_2 * dof[1]
134
+ c = dof[2]
135
+ return wp.mat22(a, c, c, b)
136
+
137
+ @wp.func
138
+ def value_to_dof_2d_voigt(val: wp.mat22):
139
+ a = _SQRT_1_2 * val[0, 0]
140
+ b = _SQRT_1_2 * val[1, 1]
141
+ c = 0.5 * (val[0, 1] + val[1, 0])
142
+ return wp.vec3(a, b, c)
143
+
144
+ @wp.func
145
+ def dof_to_value_3d(dof: vec6):
146
+ a = dof[0] * _SQRT_2 * _SQRT_1_3
147
+ b = dof[1]
148
+ c = dof[2] * _SQRT_1_3
149
+ d = dof[3]
150
+ e = dof[4]
151
+ f = dof[5]
152
+ return wp.mat33(
153
+ a + b - c,
154
+ f,
155
+ e,
156
+ f,
157
+ a - b - c,
158
+ d,
159
+ e,
160
+ d,
161
+ a + 2.0 * c,
162
+ )
163
+
164
+ @wp.func
165
+ def value_to_dof_3d(val: wp.mat33):
166
+ a = (val[0, 0] + val[1, 1] + val[2, 2]) * _SQRT_1_3 * _SQRT_1_2
167
+ b = 0.5 * (val[0, 0] - val[1, 1])
168
+ c = 0.5 * (val[2, 2] - (val[0, 0] + val[1, 1] + val[2, 2]) / 3.0) * _SQRT_3
169
+
170
+ d = 0.5 * (val[2, 1] + val[1, 2])
171
+ e = 0.5 * (val[0, 2] + val[2, 0])
172
+ f = 0.5 * (val[1, 0] + val[0, 1])
173
+
174
+ return vec6(a, b, c, d, e, f)
175
+
176
+ @wp.func
177
+ def dof_to_value_3d_voigt(dof: vec6):
178
+ a = _SQRT_2 * dof[0]
179
+ b = _SQRT_2 * dof[1]
180
+ c = _SQRT_2 * dof[2]
181
+ d = dof[3]
182
+ e = dof[4]
183
+ f = dof[5]
184
+ return wp.mat33(
185
+ a,
186
+ f,
187
+ e,
188
+ f,
189
+ b,
190
+ d,
191
+ e,
192
+ d,
193
+ c,
194
+ )
195
+
196
+ @wp.func
197
+ def value_to_dof_3d_voigt(val: wp.mat33):
198
+ a = _SQRT_1_2 * val[0, 0]
199
+ b = _SQRT_1_2 * val[1, 1]
200
+ c = _SQRT_1_2 * val[2, 2]
201
+
202
+ d = 0.5 * (val[2, 1] + val[1, 2])
203
+ e = 0.5 * (val[0, 2] + val[2, 0])
204
+ f = 0.5 * (val[1, 0] + val[0, 1])
205
+
206
+ return vec6(a, b, c, d, e, f)
207
+
208
+
209
+ class SkewSymmetricTensorMapper(DofMapper):
210
+ """Orthonormal isomorphism from R^{n (n-1)} to nxn skew-symmetric tensors,
211
+ using usual L2 norm for vectors and half Frobenius norm, (tau : tau)/2 for tensors.
212
+ """
213
+
214
+ def __init__(self, dtype: type):
215
+ self.value_dtype = dtype
216
+
217
+ if dtype == wp.mat22:
218
+ self.dof_dtype = float
219
+ self.DOF_SIZE = wp.constant(1)
220
+ self.dof_to_value = SkewSymmetricTensorMapper.dof_to_value_2d
221
+ self.value_to_dof = SkewSymmetricTensorMapper.value_to_dof_2d
222
+ elif dtype == wp.mat33:
223
+ self.dof_dtype = wp.vec3
224
+ self.DOF_SIZE = wp.constant(3)
225
+ self.dof_to_value = SkewSymmetricTensorMapper.dof_to_value_3d
226
+ self.value_to_dof = SkewSymmetricTensorMapper.value_to_dof_3d
227
+ else:
228
+ raise ValueError("Unsupported value dtype: ", dtype)
229
+
230
+ def __str__(self):
231
+ return f"{self.__class__.__name__}_{self.DOF_SIZE}"
232
+
233
+ @wp.func
234
+ def dof_to_value_2d(dof: float):
235
+ return wp.mat22(0.0, -dof, dof, 0.0)
236
+
237
+ @wp.func
238
+ def value_to_dof_2d(val: wp.mat22):
239
+ return 0.5 * (val[1, 0] - val[0, 1])
240
+
241
+ @wp.func
242
+ def dof_to_value_3d(dof: wp.vec3):
243
+ a = dof[0]
244
+ b = dof[1]
245
+ c = dof[2]
246
+ return wp.mat33(0.0, -c, b, c, 0.0, -a, -b, a, 0.0)
247
+
248
+ @wp.func
249
+ def value_to_dof_3d(val: wp.mat33):
250
+ a = 0.5 * (val[2, 1] - val[1, 2])
251
+ b = 0.5 * (val[0, 2] - val[2, 0])
252
+ c = 0.5 * (val[1, 0] - val[0, 1])
253
+ return wp.vec3(a, b, c)
@@ -0,0 +1,312 @@
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
+ from typing import Any
17
+
18
+ from warp._src.codegen import Struct, StructInstance
19
+ from warp._src.fem import cache
20
+ from warp._src.fem.geometry import Geometry
21
+ from warp._src.fem.types import Coords, ElementIndex, ElementKind, Sample, make_free_sample
22
+ from warp._src.types import type_is_matrix, type_is_vector, type_size
23
+
24
+ from .topology import SpaceTopology
25
+
26
+ _wp_module_name_ = "warp.fem.space.function_space"
27
+
28
+
29
+ class FunctionSpace:
30
+ """
31
+ Interface class for function spaces, i.e. geometry + interpolation basis
32
+
33
+ The value of a function `f` at a position `x` is generally computed as
34
+ ``f(x) = L(x)[sum_i f_i N_i(x)]``
35
+ with:
36
+ - ``f_i`` the value of the ith node's degrees-of-freedom (dof)
37
+ - ``N_i(x)`` the weight associated to the node at `x`
38
+ - ``L(x)`` local linear transformation from node-space to world-space
39
+ """
40
+
41
+ dtype: type
42
+ """Value type of the interpolation functions"""
43
+
44
+ dof_dtype: type
45
+ """Data type of the degrees of freedom of each node"""
46
+
47
+ SpaceArg: Struct
48
+ """Structure containing arguments to be passed to device function"""
49
+
50
+ LocalValueMap: type
51
+ """Type of the local map for transforming vector-valued functions from reference to world space"""
52
+
53
+ VALUE_DOF_COUNT: int
54
+ """Number of degrees of freedom per value, as a Warp constant"""
55
+
56
+ NODE_DOF_COUNT: int
57
+ """Number of degrees of freedom per node, as a Warp constant"""
58
+
59
+ ORDER: int
60
+ """Polynomial degree of the function space, used to determine integration order"""
61
+
62
+ def __init__(self, topology: SpaceTopology):
63
+ self._topology = topology
64
+ self.ElementArg = self.topology.ElementArg
65
+
66
+ if self._topology.is_trace:
67
+ self.element_inner_reference_gradient_transform = self.geometry.side_inner_inverse_deformation_gradient
68
+ self.element_outer_reference_gradient_transform = self.geometry.side_outer_inverse_deformation_gradient
69
+ else:
70
+ self.element_inner_reference_gradient_transform = self.geometry.cell_inverse_deformation_gradient
71
+ self.element_outer_reference_gradient_transform = self.geometry.cell_inverse_deformation_gradient
72
+
73
+ def node_count(self) -> int:
74
+ """Number of nodes in the interpolation basis"""
75
+ return self.topology.node_count()
76
+
77
+ def space_arg_value(self, device) -> StructInstance:
78
+ """Value of the arguments to be passed to device functions"""
79
+ raise NotImplementedError
80
+
81
+ @property
82
+ def topology(self) -> SpaceTopology:
83
+ """Underlying geometry"""
84
+ return self._topology
85
+
86
+ @property
87
+ def geometry(self) -> Geometry:
88
+ """Underlying geometry"""
89
+ return self.topology.geometry
90
+
91
+ @property
92
+ def element_kind(self) -> ElementKind:
93
+ """Kind of element the function space is expressed over"""
94
+ return ElementKind.CELL if self.dimension == self.geometry.dimension else ElementKind.SIDE
95
+
96
+ @property
97
+ def dimension(self) -> int:
98
+ """Function space embedding dimension"""
99
+ return self.topology.dimension
100
+
101
+ @property
102
+ def degree(self) -> int:
103
+ """Maximum polynomial degree of the underlying basis"""
104
+ return self.ORDER
105
+
106
+ @property
107
+ def name(self):
108
+ raise NotImplementedError
109
+
110
+ def __str__(self):
111
+ return self.name
112
+
113
+ def trace(self) -> "FunctionSpace":
114
+ """Trace of the function space over lower-dimensional elements of the geometry"""
115
+ raise NotImplementedError
116
+
117
+ def make_field(self, space_partition=None):
118
+ """Creates a zero-initialized discrete field over the function space holding values for all degrees of freedom of nodes in a space partition
119
+
120
+ Args:
121
+ space_partition: If provided, the subset of nodes to consider
122
+
123
+ See also: :func:`make_space_partition`
124
+ """
125
+ raise NotImplementedError
126
+
127
+ def gradient_valid(self) -> bool:
128
+ """Whether gradient operator can be computed. Only for scalar and vector fields as higher-order tensors are not supported yet"""
129
+ return not type_is_matrix(self.dtype)
130
+
131
+ def divergence_valid(self) -> bool:
132
+ """Whether divergence of this field can be computed. Only for vector and tensor fields with same dimension as embedding geometry"""
133
+ if type_is_vector(self.dtype):
134
+ return type_size(self.dtype) == self.geometry.dimension
135
+ if type_is_matrix(self.dtype):
136
+ return self.dtype._shape_[0] == self.geometry.dimension
137
+ return False
138
+
139
+ @staticmethod
140
+ def node_basis_element(dof_coord: int):
141
+ """Basis element for node degrees of freedom.
142
+
143
+ Assumes 0 <= dof_coord < NODE_DOF_COUNT
144
+ """
145
+ raise NotImplementedError
146
+
147
+ @staticmethod
148
+ def value_basis_element(dof_coord: int):
149
+ """Basis element for the function space values
150
+
151
+ Assumes 0 <= dof_coord < VALUE_DOF_COUNT
152
+ """
153
+ raise NotImplementedError
154
+
155
+ @staticmethod
156
+ def local_value_map_inner(
157
+ elt_arg: "SpaceTopology.ElementArg",
158
+ element_index: ElementIndex,
159
+ coords: Coords,
160
+ ):
161
+ """Builds the local value map transforming from node to world space"""
162
+ raise NotImplementedError
163
+
164
+ @staticmethod
165
+ def local_value_map_outer(
166
+ elt_arg: "SpaceTopology.ElementArg",
167
+ element_index: ElementIndex,
168
+ coords: Coords,
169
+ ):
170
+ """Builds the local value map transforming vector-valued from node to world space"""
171
+ raise NotImplementedError
172
+
173
+ @staticmethod
174
+ def node_coords_in_element(
175
+ elt_arg: "SpaceTopology.ElementArg",
176
+ space_arg: "SpaceArg", # noqa: F821
177
+ element_index: ElementIndex,
178
+ node_index_in_elt: int,
179
+ ):
180
+ """Coordinates inside element of a given node"""
181
+ raise NotImplementedError
182
+
183
+ @staticmethod
184
+ def node_quadrature_weight(
185
+ elt_arg: "SpaceTopology.ElementArg",
186
+ space_arg: "SpaceArg", # noqa: F821
187
+ element_index: ElementIndex,
188
+ node_index_in_elt: int,
189
+ ):
190
+ """Weight of a given node when used as a quadrature point"""
191
+ raise NotImplementedError
192
+
193
+ @staticmethod
194
+ def element_inner_weight(
195
+ elt_arg: "SpaceTopology.ElementArg",
196
+ space_arg: "SpaceArg", # noqa: F821
197
+ element_index: ElementIndex,
198
+ coords: Coords,
199
+ node_index_in_elt: int,
200
+ ):
201
+ """Inner weight for a node at given coordinates"""
202
+ raise NotImplementedError
203
+
204
+ @staticmethod
205
+ def element_inner_weight_gradient(
206
+ elt_arg: "SpaceTopology.ElementArg",
207
+ space_arg: "SpaceArg", # noqa: F821
208
+ element_index: ElementIndex,
209
+ coords: Coords,
210
+ node_index_in_elt: int,
211
+ ):
212
+ """Inner weight gradient w.r.t. reference space for a node at given coordinates"""
213
+ raise NotImplementedError
214
+
215
+ @staticmethod
216
+ def element_outer_weight(
217
+ elt_arg: "SpaceTopology.ElementArg",
218
+ space_arg: "SpaceArg", # noqa: F821
219
+ element_index: ElementIndex,
220
+ coords: Coords,
221
+ node_index_in_elt: int,
222
+ ):
223
+ """Outer weight for a node at given coordinates"""
224
+ raise NotImplementedError
225
+
226
+ @staticmethod
227
+ def element_outer_weight_gradient(
228
+ elt_arg: "SpaceTopology.ElementArg",
229
+ space_arg: "SpaceArg", # noqa: F821
230
+ element_index: ElementIndex,
231
+ coords: Coords,
232
+ node_index_in_elt: int,
233
+ ):
234
+ """Outer weight gradient w.r.t reference space for a node at given coordinates"""
235
+ raise NotImplementedError
236
+
237
+ def space_value(
238
+ dof_value: "FunctionSpace.dof_dtype",
239
+ node_weight: Any,
240
+ local_value_map: "FunctionSpace.LocalValueMap",
241
+ ):
242
+ """
243
+ Assembles the world-space value of the function space
244
+ Args:
245
+ - dof_value: node value in the degrees-of-freedom basis
246
+ - node_weight: weight associated to the node, as given per `element_(inn|out)er_weight`
247
+ - local_value_map: local transformation from node space to world space, as given per `local_map_value_(inn|out)er`
248
+ """
249
+ raise NotImplementedError
250
+
251
+ def space_gradient(
252
+ dof_value: "FunctionSpace.dof_dtype",
253
+ node_weight: Any,
254
+ local_value_map: "FunctionSpace.LocalValueMap",
255
+ grad_transform: Any,
256
+ ):
257
+ """
258
+ Assembles the world-space gradient of the function space
259
+ Args:
260
+ - dof_value: node value in the degrees-of-freedom basis
261
+ - node_weight_gradient: gradient of the weight associated to the node, as given per `element_(inn|out)er_weight_gradient`
262
+ - local_value_map: local transformation from node space to world space, as given per `local_map_value_(inn|out)er`
263
+ - grad_transform: transform mapping the reference-space gradient to world-space gradient (inverse deformation gradient)
264
+ """
265
+ raise NotImplementedError
266
+
267
+ def space_divergence(
268
+ dof_value: "FunctionSpace.dof_dtype",
269
+ node_weight: Any,
270
+ local_value_map: "FunctionSpace.LocalValueMap",
271
+ grad_transform: Any,
272
+ ):
273
+ """ "
274
+ Assembles the world-space divergence of the function space
275
+ Args:
276
+ - dof_value: node value in the degrees-of-freedom basis
277
+ - node_weight_gradient: gradient of the weight associated to the node, as given per `element_(inn|out)er_weight_gradient`
278
+ - local_value_map: local transformation from node space to world space, as given per `local_map_value_(inn|out)er`
279
+ - grad_transform: transform mapping the reference-space gradient to world-space gradient (inverse deformation gradient)
280
+ """
281
+ raise NotImplementedError
282
+
283
+ @staticmethod
284
+ def node_dof_value(
285
+ elt_arg: "FunctionSpace.ElementArg",
286
+ space_arg: "FunctionSpace.SpaceArg",
287
+ element_index: ElementIndex,
288
+ node_index_in_elt: int,
289
+ space_value: "FunctionSpace.dtype",
290
+ ):
291
+ """Converts space value to node degrees of freedom"""
292
+ raise NotImplementedError
293
+
294
+ def _make_side_inner_inverse_deformation_gradient(self):
295
+ @cache.dynamic_func(suffix=self.name)
296
+ def side_inner_inverse_deformation_gradient(args: self.ElementArg, s: Sample):
297
+ cell_index = self.side_inner_cell_index(args, s.element_index)
298
+ cell_coords = self.side_inner_cell_coords(args, s.element_index, s.element_coords)
299
+ cell_arg = self.side_to_cell_arg(args)
300
+ return self.geometry.cell_inverse_deformation_gradient(cell_arg, make_free_sample(cell_index, cell_coords))
301
+
302
+ return side_inner_inverse_deformation_gradient
303
+
304
+ def _make_side_outer_inverse_deformation_gradient(self):
305
+ @cache.dynamic_func(suffix=self.name)
306
+ def side_outer_inverse_deformation_gradient(args: self.ElementArg, s: Sample):
307
+ cell_index = self.side_outer_cell_index(args, s.element_index)
308
+ cell_coords = self.side_outer_cell_coords(args, s.element_index, s.element_coords)
309
+ cell_arg = self.side_to_cell_arg(args)
310
+ return self.geometry.cell_inverse_deformation_gradient(cell_arg, make_free_sample(cell_index, cell_coords))
311
+
312
+ return side_outer_inverse_deformation_gradient