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,499 @@
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 functools import cached_property
17
+ from typing import Any, ClassVar, Optional
18
+
19
+ import warp as wp
20
+ from warp._src.fem import cache
21
+ from warp._src.fem.geometry import Geometry
22
+ from warp._src.fem.linalg import generalized_inner, generalized_outer
23
+ from warp._src.fem.types import NULL_QP_INDEX, Coords, ElementIndex, make_free_sample
24
+ from warp._src.fem.utils import type_basis_element
25
+
26
+ from .basis_space import BasisSpace
27
+ from .dof_mapper import DofMapper, IdentityMapper
28
+ from .function_space import FunctionSpace
29
+ from .partition import SpacePartition, make_space_partition
30
+
31
+ _wp_module_name_ = "warp.fem.space.basis_function_space"
32
+
33
+
34
+ class CollocatedFunctionSpace(FunctionSpace):
35
+ """Function space where values are collocated at nodes"""
36
+
37
+ _dynamic_attribute_constructors: ClassVar = {
38
+ "node_basis_element": lambda obj: obj._make_node_basis_element(),
39
+ "value_basis_element": lambda obj: obj._make_value_basis_element(),
40
+ "node_coords_in_element": lambda obj: obj._basis.make_node_coords_in_element(),
41
+ "node_quadrature_weight": lambda obj: obj._basis.make_node_quadrature_weight(),
42
+ "element_inner_weight": lambda obj: obj._basis.make_element_inner_weight(),
43
+ "element_inner_weight_gradient": lambda obj: obj._basis.make_element_inner_weight_gradient(),
44
+ "element_outer_weight": lambda obj: obj._basis.make_element_outer_weight(),
45
+ "element_outer_weight_gradient": lambda obj: obj._basis.make_element_outer_weight_gradient(),
46
+ "space_value": lambda obj: obj._make_space_value(),
47
+ "space_gradient": lambda obj: obj._make_space_gradient(),
48
+ "space_divergence": lambda obj: obj._make_space_divergence(),
49
+ "node_dof_value": lambda obj: obj._make_node_dof_value(),
50
+ }
51
+
52
+ @wp.struct
53
+ class LocalValueMap:
54
+ pass
55
+
56
+ def __init__(self, basis: BasisSpace, dtype: type = float, dof_mapper: DofMapper = None):
57
+ self.dof_mapper = IdentityMapper(dtype) if dof_mapper is None else dof_mapper
58
+ self._basis = basis
59
+
60
+ super().__init__(topology=basis.topology)
61
+
62
+ self.dtype = self.dof_mapper.value_dtype
63
+ self.dof_dtype = self.dof_mapper.dof_dtype
64
+ self.VALUE_DOF_COUNT = self.dof_mapper.DOF_SIZE
65
+ self.NODE_DOF_COUNT = self.dof_mapper.DOF_SIZE
66
+
67
+ self.SpaceArg = self._basis.BasisArg
68
+ self.space_arg_value = self._basis.basis_arg_value
69
+ self.fill_space_arg = self._basis.fill_basis_arg
70
+
71
+ self.ORDER = self._basis.ORDER
72
+
73
+ cache.setup_dynamic_attributes(self)
74
+
75
+ # For backward compatibility
76
+ if hasattr(basis, "node_grid"):
77
+ self.node_grid = basis.node_grid
78
+ if hasattr(basis, "node_triangulation"):
79
+ self.node_triangulation = basis.node_triangulation
80
+ if hasattr(basis, "node_tets"):
81
+ self.node_tets = basis.node_tets
82
+ if hasattr(basis, "node_hexes"):
83
+ self.node_hexes = basis.node_hexes
84
+ if hasattr(basis, "vtk_cells"):
85
+ self.vtk_cells = basis.vtk_cells
86
+
87
+ @cached_property
88
+ def name(self):
89
+ return f"{self._basis.name}_{self.dof_mapper}".replace(".", "_")
90
+
91
+ @property
92
+ def basis(self) -> BasisSpace:
93
+ return self._basis
94
+
95
+ def node_positions(self, out: Optional[wp.array] = None) -> wp.array:
96
+ return self._basis.node_positions(out=out)
97
+
98
+ def make_field(
99
+ self,
100
+ space_partition: Optional[SpacePartition] = None,
101
+ ) -> "wp.fem.field.NodalField":
102
+ from warp._src.fem.field import NodalField
103
+
104
+ if space_partition is None:
105
+ space_partition = make_space_partition(space_topology=self.topology)
106
+
107
+ return NodalField(space=self, space_partition=space_partition)
108
+
109
+ def trace(self) -> "CollocatedFunctionSpace":
110
+ return CollocatedFunctionSpaceTrace(self)
111
+
112
+ def _make_node_basis_element(self):
113
+ basis_element = type_basis_element(self.dof_dtype)
114
+ return basis_element
115
+
116
+ def _make_value_basis_element(self):
117
+ @cache.dynamic_func(suffix=self.name)
118
+ def value_basis_element(dof_coord: int, value_map: CollocatedFunctionSpace.LocalValueMap):
119
+ return self.dof_mapper.dof_to_value(self.node_basis_element(dof_coord))
120
+
121
+ return value_basis_element
122
+
123
+ @wp.func
124
+ def local_value_map_inner(
125
+ elt_arg: Any,
126
+ element_index: ElementIndex,
127
+ element_coords: Coords,
128
+ ):
129
+ return CollocatedFunctionSpace.LocalValueMap()
130
+
131
+ @wp.func
132
+ def local_value_map_outer(
133
+ elt_arg: Any,
134
+ element_index: ElementIndex,
135
+ element_coords: Coords,
136
+ ):
137
+ return CollocatedFunctionSpace.LocalValueMap()
138
+
139
+ def _make_space_value(self):
140
+ @cache.dynamic_func(suffix=self.name)
141
+ def value_func(
142
+ dof_value: self.dof_dtype,
143
+ node_weight: self._basis.weight_type,
144
+ local_value_map: self.LocalValueMap,
145
+ ):
146
+ return node_weight * self.dof_mapper.dof_to_value(dof_value)
147
+
148
+ return value_func
149
+
150
+ def _make_space_gradient(self):
151
+ @cache.dynamic_func(suffix=self.name)
152
+ def gradient_func(
153
+ dof_value: self.dof_dtype,
154
+ node_weight_gradient: self._basis.weight_gradient_type,
155
+ local_value_map: self.LocalValueMap,
156
+ grad_transform: Any,
157
+ ):
158
+ return generalized_outer(self.dof_mapper.dof_to_value(dof_value), node_weight_gradient * grad_transform)
159
+
160
+ return gradient_func
161
+
162
+ def _make_space_divergence(self):
163
+ @cache.dynamic_func(suffix=self.name)
164
+ def divergence_func(
165
+ dof_value: self.dof_dtype,
166
+ node_weight_gradient: self._basis.weight_gradient_type,
167
+ local_value_map: self.LocalValueMap,
168
+ grad_transform: Any,
169
+ ):
170
+ return generalized_inner(self.dof_mapper.dof_to_value(dof_value), node_weight_gradient * grad_transform)
171
+
172
+ return divergence_func
173
+
174
+ def _make_node_dof_value(self):
175
+ @cache.dynamic_func(suffix=self.name)
176
+ def node_dof_value(
177
+ elt_arg: self.ElementArg,
178
+ space_arg: self.SpaceArg,
179
+ element_index: ElementIndex,
180
+ node_index_in_elt: int,
181
+ space_value: self.dtype,
182
+ ):
183
+ return self.dof_mapper.value_to_dof(space_value)
184
+
185
+ return node_dof_value
186
+
187
+
188
+ class CollocatedFunctionSpaceTrace(CollocatedFunctionSpace):
189
+ """Trace of a :class:`CollocatedFunctionSpace`"""
190
+
191
+ def __init__(self, space: CollocatedFunctionSpace):
192
+ self._space = space
193
+ super().__init__(space._basis.trace(), space.dtype, space.dof_mapper)
194
+
195
+ @cached_property
196
+ def name(self):
197
+ return f"{self._space.name}_Trace"
198
+
199
+ def __eq__(self, other: "CollocatedFunctionSpaceTrace") -> bool:
200
+ return self._space == other._space
201
+
202
+
203
+ class VectorValuedFunctionSpace(FunctionSpace):
204
+ """Function space whose values are vectors"""
205
+
206
+ _dynamic_attribute_constructors: ClassVar = {
207
+ "value_basis_element": lambda obj: obj._make_value_basis_element(),
208
+ "node_coords_in_element": lambda obj: obj._basis.make_node_coords_in_element(),
209
+ "node_quadrature_weight": lambda obj: obj._basis.make_node_quadrature_weight(),
210
+ "element_inner_weight": lambda obj: obj._basis.make_element_inner_weight(),
211
+ "element_inner_weight_gradient": lambda obj: obj._basis.make_element_inner_weight_gradient(),
212
+ "element_outer_weight": lambda obj: obj._basis.make_element_outer_weight(),
213
+ "element_outer_weight_gradient": lambda obj: obj._basis.make_element_outer_weight_gradient(),
214
+ "space_value": lambda obj: obj._make_space_value(),
215
+ "space_gradient": lambda obj: obj._make_space_gradient(),
216
+ "space_divergence": lambda obj: obj._make_space_divergence(),
217
+ "node_dof_value": lambda obj: obj._make_node_dof_value(),
218
+ }
219
+
220
+ def __init__(self, basis: BasisSpace):
221
+ self._basis = basis
222
+
223
+ super().__init__(topology=basis.topology)
224
+
225
+ self.dtype = cache.cached_vec_type(self.geometry.dimension, dtype=float)
226
+ self.dof_dtype = wp.float32
227
+
228
+ self.VALUE_DOF_COUNT = self.geometry.dimension
229
+ self.NODE_DOF_COUNT = 1
230
+
231
+ self.SpaceArg = self._basis.BasisArg
232
+ self.space_arg_value = self._basis.basis_arg_value
233
+ self.fill_space_arg = self._basis.fill_basis_arg
234
+
235
+ self.ORDER = self._basis.ORDER
236
+
237
+ self.LocalValueMap = cache.cached_mat_type(
238
+ shape=(self.geometry.dimension, self.geometry.cell_dimension), dtype=float
239
+ )
240
+
241
+ cache.setup_dynamic_attributes(self, cls=__class__)
242
+
243
+ @property
244
+ def name(self):
245
+ return self._basis.name
246
+
247
+ @property
248
+ def basis(self) -> BasisSpace:
249
+ return self._basis
250
+
251
+ def node_positions(self, out: Optional[wp.array] = None) -> wp.array:
252
+ return self._basis.node_positions(out=out)
253
+
254
+ def make_field(
255
+ self,
256
+ space_partition: Optional[SpacePartition] = None,
257
+ ) -> "wp.fem.field.NodalField":
258
+ from warp._src.fem.field import NodalField
259
+
260
+ if space_partition is None:
261
+ space_partition = make_space_partition(space_topology=self.topology)
262
+
263
+ return NodalField(space=self, space_partition=space_partition)
264
+
265
+ @wp.func
266
+ def node_basis_element(dof_coord: int):
267
+ return 1.0
268
+
269
+ def _make_value_basis_element(self):
270
+ basis_element = type_basis_element(self.dtype)
271
+
272
+ @cache.dynamic_func(suffix=self.name)
273
+ def value_basis_element(dof_coord: int, value_map: Any):
274
+ return value_map * basis_element(dof_coord)
275
+
276
+ return value_basis_element
277
+
278
+ def _make_space_value(self):
279
+ @cache.dynamic_func(suffix=self.name)
280
+ def value_func(
281
+ dof_value: self.dof_dtype,
282
+ node_weight: self._basis.weight_type,
283
+ local_value_map: self.LocalValueMap,
284
+ ):
285
+ return local_value_map * (node_weight * dof_value)
286
+
287
+ return value_func
288
+
289
+ def _make_space_gradient(self):
290
+ @cache.dynamic_func(suffix=self.name)
291
+ def gradient_func(
292
+ dof_value: self.dof_dtype,
293
+ node_weight_gradient: self._basis.weight_gradient_type,
294
+ local_value_map: self.LocalValueMap,
295
+ grad_transform: Any,
296
+ ):
297
+ return dof_value * local_value_map * node_weight_gradient * grad_transform
298
+
299
+ return gradient_func
300
+
301
+ def _make_space_divergence(self):
302
+ @cache.dynamic_func(suffix=self.name)
303
+ def divergence_func(
304
+ dof_value: self.dof_dtype,
305
+ node_weight_gradient: self._basis.weight_gradient_type,
306
+ local_value_map: self.LocalValueMap,
307
+ grad_transform: Any,
308
+ ):
309
+ return dof_value * wp.trace(local_value_map * node_weight_gradient * grad_transform)
310
+
311
+ return divergence_func
312
+
313
+ def _make_node_dof_value(self):
314
+ @cache.dynamic_func(suffix=self.name)
315
+ def node_dof_value(
316
+ elt_arg: self.ElementArg,
317
+ space_arg: self.SpaceArg,
318
+ element_index: ElementIndex,
319
+ node_index_in_elt: int,
320
+ space_value: self.dtype,
321
+ ):
322
+ coords = self.node_coords_in_element(elt_arg, space_arg, element_index, node_index_in_elt)
323
+ weight = self.element_inner_weight(
324
+ elt_arg, space_arg, element_index, coords, node_index_in_elt, NULL_QP_INDEX
325
+ )
326
+ local_value_map = self.local_value_map_inner(elt_arg, element_index, coords)
327
+
328
+ unit_value = local_value_map * weight
329
+ return wp.dot(space_value, unit_value) / wp.length_sq(unit_value)
330
+
331
+ return node_dof_value
332
+
333
+
334
+ class CovariantFunctionSpace(VectorValuedFunctionSpace):
335
+ """Function space whose values are covariant vectors"""
336
+
337
+ _dynamic_attribute_constructors: ClassVar = {
338
+ "local_value_map_inner": lambda obj: obj._make_local_value_map(),
339
+ "local_value_map_outer": lambda obj: obj.local_value_map_inner,
340
+ }
341
+
342
+ def __init__(self, basis: BasisSpace):
343
+ super().__init__(basis)
344
+
345
+ cache.setup_dynamic_attributes(self, cls=__class__)
346
+
347
+ def trace(self) -> "CovariantFunctionSpaceTrace":
348
+ return CovariantFunctionSpaceTrace(self)
349
+
350
+ def _make_local_value_map(self):
351
+ @cache.dynamic_func(suffix=self.name)
352
+ def local_value_map(
353
+ elt_arg: self.ElementArg,
354
+ element_index: ElementIndex,
355
+ element_coords: Coords,
356
+ ):
357
+ J = wp.transpose(
358
+ self.geometry.cell_inverse_deformation_gradient(
359
+ elt_arg, make_free_sample(element_index, element_coords)
360
+ )
361
+ )
362
+ return J
363
+
364
+ return local_value_map
365
+
366
+
367
+ class CovariantFunctionSpaceTrace(VectorValuedFunctionSpace):
368
+ """Trace of a :class:`CovariantFunctionSpace`"""
369
+
370
+ _dynamic_attribute_constructors: ClassVar = {
371
+ "local_value_map_inner": lambda obj: obj._make_local_value_map_inner(),
372
+ "local_value_map_outer": lambda obj: obj._make_local_value_map_outer(),
373
+ }
374
+
375
+ def __init__(self, space: VectorValuedFunctionSpace):
376
+ self._space = space
377
+ super().__init__(space._basis.trace())
378
+
379
+ cache.setup_dynamic_attributes(self, cls=__class__)
380
+
381
+ @cached_property
382
+ def name(self):
383
+ return f"{self._space.name}_Trace"
384
+
385
+ def __eq__(self, other: "CovariantFunctionSpaceTrace") -> bool:
386
+ return self._space == other._space
387
+
388
+ def _make_local_value_map_inner(self):
389
+ @cache.dynamic_func(suffix=self.name)
390
+ def local_value_map_inner(
391
+ elt_arg: self.ElementArg,
392
+ element_index: ElementIndex,
393
+ element_coords: Coords,
394
+ ):
395
+ return wp.transpose(
396
+ self.geometry.side_inner_inverse_deformation_gradient(
397
+ elt_arg, make_free_sample(element_index, element_coords)
398
+ )
399
+ )
400
+
401
+ return local_value_map_inner
402
+
403
+ def _make_local_value_map_outer(self):
404
+ @cache.dynamic_func(suffix=self.name)
405
+ def local_value_map_outer(
406
+ elt_arg: self.ElementArg,
407
+ element_index: ElementIndex,
408
+ element_coords: Coords,
409
+ ):
410
+ return wp.transpose(
411
+ self.geometry.side_outer_inverse_deformation_gradient(
412
+ elt_arg, make_free_sample(element_index, element_coords)
413
+ )
414
+ )
415
+
416
+ return local_value_map_outer
417
+
418
+
419
+ class ContravariantFunctionSpace(VectorValuedFunctionSpace):
420
+ """Function space whose values are contravariant vectors"""
421
+
422
+ _dynamic_attribute_constructors: ClassVar = {
423
+ "local_value_map_inner": lambda obj: obj._make_local_value_map(),
424
+ "local_value_map_outer": lambda obj: obj.local_value_map_inner,
425
+ }
426
+
427
+ def __init__(self, basis: BasisSpace):
428
+ super().__init__(basis)
429
+
430
+ cache.setup_dynamic_attributes(self, cls=__class__)
431
+
432
+ def trace(self) -> "ContravariantFunctionSpaceTrace":
433
+ return ContravariantFunctionSpaceTrace(self)
434
+
435
+ def _make_local_value_map(self):
436
+ @cache.dynamic_func(suffix=self.name)
437
+ def local_value_map(
438
+ elt_arg: self.ElementArg,
439
+ element_index: ElementIndex,
440
+ element_coords: Coords,
441
+ ):
442
+ F = self.geometry.cell_deformation_gradient(elt_arg, make_free_sample(element_index, element_coords))
443
+ return F / Geometry._element_measure(F)
444
+
445
+ return local_value_map
446
+
447
+
448
+ class ContravariantFunctionSpaceTrace(VectorValuedFunctionSpace):
449
+ """Trace of a :class:`ContravariantFunctionSpace`"""
450
+
451
+ _dynamic_attribute_constructors: ClassVar = {
452
+ "local_value_map_inner": lambda obj: obj._make_local_value_map_inner(),
453
+ "local_value_map_outer": lambda obj: obj._make_local_value_map_outer(),
454
+ }
455
+
456
+ def __init__(self, space: ContravariantFunctionSpace):
457
+ self._space = space
458
+ super().__init__(space._basis.trace())
459
+
460
+ cache.setup_dynamic_attributes(self, cls=__class__)
461
+
462
+ @cached_property
463
+ def name(self):
464
+ return f"{self._space.name}_Trace"
465
+
466
+ def __eq__(self, other: "ContravariantFunctionSpaceTrace") -> bool:
467
+ return self._space == other._space
468
+
469
+ def _make_local_value_map_inner(self):
470
+ @cache.dynamic_func(suffix=self.name)
471
+ def local_value_map_inner(
472
+ elt_arg: self.ElementArg,
473
+ element_index: ElementIndex,
474
+ element_coords: Coords,
475
+ ):
476
+ cell_index = self.geometry.side_inner_cell_index(elt_arg, element_index)
477
+ cell_coords = self.geometry.side_inner_cell_coords(elt_arg, element_index, element_coords)
478
+ cell_arg = self.geometry.side_to_cell_arg(elt_arg)
479
+
480
+ F = self.geometry.cell_deformation_gradient(cell_arg, make_free_sample(cell_index, cell_coords))
481
+ return F / Geometry._element_measure(F)
482
+
483
+ return local_value_map_inner
484
+
485
+ def _make_local_value_map_outer(self):
486
+ @cache.dynamic_func(suffix=self.name)
487
+ def local_value_map_outer(
488
+ elt_arg: self.ElementArg,
489
+ element_index: ElementIndex,
490
+ element_coords: Coords,
491
+ ):
492
+ cell_index = self.geometry.side_outer_cell_index(elt_arg, element_index)
493
+ cell_coords = self.geometry.side_outer_cell_coords(elt_arg, element_index, element_coords)
494
+ cell_arg = self.geometry.side_to_cell_arg(elt_arg)
495
+
496
+ F = self.geometry.cell_deformation_gradient(cell_arg, make_free_sample(cell_index, cell_coords))
497
+ return F / Geometry._element_measure(F)
498
+
499
+ return local_value_map_outer