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,242 @@
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
+ ###########################################################################
17
+ # Example Magnetostatics
18
+ #
19
+ # This example demonstrates solving a 3d magnetostatics problem
20
+ # (a copper coil with radial current around a cylindrical iron core)
21
+ # using a curl-curl formulation and H(curl)-conforming function space
22
+ #
23
+ # 1/mu Curl B + j = 0
24
+ # Div. B = 0
25
+ #
26
+ # solved over field A such that B = Curl A,
27
+ # and Dirichlet homogeneous essential boundary conditions
28
+ #
29
+ # This example also illustrates using an ImplicitField to warp a grid mesh
30
+ # to a cylindrical domain
31
+ ###########################################################################
32
+
33
+ import numpy as np
34
+
35
+ import warp as wp
36
+ import warp.examples.fem.utils as fem_example_utils
37
+ import warp.fem as fem
38
+
39
+ # Physics constants
40
+ MU_0 = wp.constant(np.pi * 4.0e-7) # Vacuum magnetic permeability
41
+ MU_c = wp.constant(1.25e-6) # Copper magnetic permeability
42
+ MU_i = wp.constant(6.0e-3) # Iron magnetic permeability
43
+
44
+
45
+ @wp.func
46
+ def cube_to_cylinder(x: wp.vec3):
47
+ # mapping from unit square to unit disk
48
+ pos_xz = wp.vec3(x[0], 0.0, x[2])
49
+ return wp.max(wp.abs(pos_xz)) * wp.normalize(pos_xz) + wp.vec3(0.0, x[1], 0.0)
50
+
51
+
52
+ @wp.func
53
+ def cube_to_cylinder_grad(x: wp.vec3):
54
+ # gradient of mapping from unit square to unit disk
55
+ pos_xz = wp.vec3(x[0], 0.0, x[2])
56
+ if pos_xz == wp.vec3(0.0):
57
+ grad = wp.mat33(0.0)
58
+ else:
59
+ dir_xz = wp.normalize(pos_xz)
60
+ dir_grad = (wp.identity(n=3, dtype=float) - wp.outer(dir_xz, dir_xz)) / wp.length(pos_xz)
61
+
62
+ abs_xz = wp.abs(pos_xz)
63
+ xinf_grad = wp.where(
64
+ abs_xz[0] > abs_xz[2], wp.vec(wp.sign(pos_xz[0]), 0.0, 0.0), wp.vec3(0.0, 0.0, wp.sign(pos_xz[2]))
65
+ )
66
+ grad = dir_grad * wp.max(abs_xz) + wp.outer(dir_xz, xinf_grad)
67
+
68
+ grad[1, 1] = 1.0
69
+ return grad
70
+
71
+
72
+ @wp.func
73
+ def permeability_field(
74
+ pos: wp.vec3,
75
+ core_radius: float,
76
+ core_height: float,
77
+ coil_internal_radius: float,
78
+ coil_external_radius: float,
79
+ coil_height: float,
80
+ ):
81
+ x = wp.abs(pos[0])
82
+ y = wp.abs(pos[1])
83
+ z = wp.abs(pos[2])
84
+
85
+ r = wp.sqrt(x * x + z * z)
86
+
87
+ if r <= core_radius:
88
+ return wp.where(y < core_height, MU_i, MU_0)
89
+
90
+ if r >= coil_internal_radius and r <= coil_external_radius:
91
+ return wp.where(y < coil_height, MU_c, MU_0)
92
+
93
+ return MU_0
94
+
95
+
96
+ @wp.func
97
+ def current_field(
98
+ pos: wp.vec3,
99
+ current: float,
100
+ coil_internal_radius: float,
101
+ coil_external_radius: float,
102
+ coil_height: float,
103
+ ):
104
+ x = pos[0]
105
+ y = wp.abs(pos[1])
106
+ z = pos[2]
107
+
108
+ r = wp.sqrt(x * x + z * z)
109
+
110
+ return wp.where(
111
+ y < coil_height and r >= coil_internal_radius and r <= coil_external_radius,
112
+ wp.vec3(z, 0.0, -x) * current / r,
113
+ wp.vec3(0.0),
114
+ )
115
+
116
+
117
+ @fem.integrand
118
+ def curl_curl_form(s: fem.Sample, domain: fem.Domain, u: fem.Field, v: fem.Field, mu: fem.Field):
119
+ return wp.dot(fem.curl(u, s), fem.curl(v, s)) / mu(s)
120
+
121
+
122
+ @fem.integrand
123
+ def mass_form(s: fem.Sample, domain: fem.Domain, v: fem.Field, u: fem.Field):
124
+ return wp.dot(u(s), v(s))
125
+
126
+
127
+ @fem.integrand
128
+ def curl_expr(s: fem.Sample, u: fem.Field):
129
+ return fem.curl(u, s)
130
+
131
+
132
+ class Example:
133
+ def __init__(self, quiet=False, mesh: str = "grid", resolution=32, domain_radius=2.0, current=1.0e6):
134
+ # We mesh the unit disk by first meshing the unit square, then building a deformed geometry
135
+ # from an implicit mapping field
136
+
137
+ if mesh == "hex":
138
+ positions, hex_vidx = fem_example_utils.gen_hexmesh(
139
+ bounds_lo=wp.vec3(-domain_radius, -domain_radius, -domain_radius),
140
+ bounds_hi=wp.vec3(domain_radius, domain_radius, domain_radius),
141
+ res=wp.vec3i(resolution, resolution, resolution),
142
+ )
143
+ cube_geo = fem.Hexmesh(hex_vertex_indices=hex_vidx, positions=positions)
144
+ elif mesh == "tet":
145
+ positions, tet_vidx = fem_example_utils.gen_tetmesh(
146
+ bounds_lo=wp.vec3(-domain_radius, -domain_radius, -domain_radius),
147
+ bounds_hi=wp.vec3(domain_radius, domain_radius, domain_radius),
148
+ res=wp.vec3i(resolution, resolution, resolution),
149
+ )
150
+ cube_geo = fem.Tetmesh(tet_vertex_indices=tet_vidx, positions=positions)
151
+ elif mesh == "nano":
152
+ vol = fem_example_utils.gen_volume(
153
+ bounds_lo=wp.vec3(-domain_radius, -domain_radius, -domain_radius),
154
+ bounds_hi=wp.vec3(domain_radius, domain_radius, domain_radius),
155
+ res=wp.vec3i(resolution, resolution, resolution),
156
+ )
157
+ cube_geo = fem.Nanogrid(grid=vol)
158
+ else:
159
+ cube_geo = fem.Grid3D(
160
+ bounds_lo=wp.vec3(-domain_radius, -domain_radius, -domain_radius),
161
+ bounds_hi=wp.vec3(domain_radius, domain_radius, domain_radius),
162
+ res=wp.vec3i(resolution, resolution, resolution),
163
+ )
164
+
165
+ def_field = fem.ImplicitField(
166
+ domain=fem.Cells(cube_geo), func=cube_to_cylinder, grad_func=cube_to_cylinder_grad
167
+ )
168
+ sim_geo = def_field.make_deformed_geometry(relative=False)
169
+
170
+ coil_config = {"coil_height": 0.25, "coil_internal_radius": 0.3, "coil_external_radius": 0.4}
171
+ core_config = {"core_height": 1.0, "core_radius": 0.2}
172
+
173
+ domain = fem.Cells(sim_geo)
174
+ self._permeability_field = fem.ImplicitField(
175
+ domain, func=permeability_field, values=dict(**coil_config, **core_config)
176
+ )
177
+ self._current_field = fem.ImplicitField(domain, func=current_field, values=dict(current=current, **coil_config))
178
+
179
+ A_space = fem.make_polynomial_space(
180
+ sim_geo, degree=1, element_basis=fem.ElementBasis.NEDELEC_FIRST_KIND, dtype=wp.vec3
181
+ )
182
+ self.A_field = A_space.make_field()
183
+
184
+ B_space = fem.make_polynomial_space(sim_geo, degree=1, element_basis=fem.ElementBasis.LAGRANGE, dtype=wp.vec3)
185
+ self.B_field = B_space.make_field()
186
+
187
+ self.renderer = fem_example_utils.Plot()
188
+
189
+ def step(self):
190
+ A_space = self.A_field.space
191
+ sim_geo = A_space.geometry
192
+
193
+ u = fem.make_trial(space=A_space)
194
+ v = fem.make_test(space=A_space)
195
+ lhs = fem.integrate(curl_curl_form, fields={"u": u, "v": v, "mu": self._permeability_field}, output_dtype=float)
196
+ rhs = fem.integrate(mass_form, fields={"v": v, "u": self._current_field}, output_dtype=float)
197
+
198
+ # Dirichlet BC
199
+ boundary = fem.BoundarySides(sim_geo)
200
+ u_bd = fem.make_trial(space=A_space, domain=boundary)
201
+ v_bd = fem.make_test(space=A_space, domain=boundary)
202
+ dirichlet_bd_proj = fem.integrate(
203
+ mass_form, fields={"u": u_bd, "v": v_bd}, assembly="nodal", output_dtype=float
204
+ )
205
+ fem.project_linear_system(lhs, rhs, dirichlet_bd_proj)
206
+
207
+ # solve using Conjugate Residual (numerically rhs may not be in image of lhs)
208
+ fem_example_utils.bsr_cg(lhs, b=rhs, x=self.A_field.dof_values, method="cr", max_iters=250, quiet=False)
209
+
210
+ # compute B as curl(A)
211
+ fem.interpolate(curl_expr, dest=self.B_field, fields={"u": self.A_field})
212
+
213
+ def render(self):
214
+ self.renderer.add_field("B", self.B_field)
215
+
216
+
217
+ if __name__ == "__main__":
218
+ import argparse
219
+
220
+ wp.set_module_options({"enable_backward": False})
221
+
222
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
223
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
224
+ parser.add_argument("--resolution", type=int, default=32, help="Grid resolution.")
225
+ parser.add_argument("--mesh", type=str, default="grid", choices=["tet", "hex", "grid", "nano"], help="Mesh type.")
226
+ parser.add_argument("--radius", type=float, default=2.0, help="Radius of simulation domain.")
227
+ parser.add_argument(
228
+ "--headless",
229
+ action="store_true",
230
+ help="Run in headless mode, suppressing the opening of any graphical windows.",
231
+ )
232
+ parser.add_argument("--quiet", action="store_true", help="Suppresses the printing out of iteration residuals.")
233
+
234
+ args = parser.parse_known_args()[0]
235
+
236
+ with wp.ScopedDevice(args.device):
237
+ example = Example(quiet=args.quiet, mesh=args.mesh, resolution=args.resolution, domain_radius=args.radius)
238
+ example.step()
239
+ example.render()
240
+
241
+ if not args.headless:
242
+ example.renderer.plot({"B": {"streamlines": {"density": 1.0}}})
@@ -0,0 +1,293 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2022 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
+ ###########################################################################
17
+ # Example Mixed Elasticity
18
+ #
19
+ # This example illustrates using Mixed FEM to solve a nonlinear static elasticity equilibrium problem:
20
+ #
21
+ # Div[ d/dF Psi(F(u)) ] = 0
22
+ #
23
+ # with Dirichlet boundary conditions on vertical sides and Psi an elastic potential function of the deformation gradient.
24
+ # Here we choose Psi Neo-Hookean, as per Sec 3.2 of "Stable Neo-Hookean Flesh Simulation" (Smith et al. 2018),
25
+ # Psi(F) = mu ||F||^2 + lambda (det J - 1 - mu/lambda)^2
26
+ #
27
+ # which we write as a sequence of Newton iterations:
28
+ # int {sigma : grad v} = 0 for all displacement test functions v
29
+ # int {sigma : tau} = int{dPsi/dF : tau} + int{grad du : d2 Psi/dF2 : tau} for all stress test functions tau
30
+ ###########################################################################
31
+
32
+ import numpy as np
33
+
34
+ import warp as wp
35
+ import warp.examples.fem.utils as fem_example_utils
36
+ import warp.fem as fem
37
+
38
+
39
+ @fem.integrand
40
+ def displacement_gradient_form(
41
+ s: fem.Sample,
42
+ u: fem.Field,
43
+ tau: fem.Field,
44
+ ):
45
+ """grad(u) : tau"""
46
+ return wp.ddot(tau(s), fem.grad(u, s))
47
+
48
+
49
+ @wp.func
50
+ def nh_parameters_from_lame(lame: wp.vec2):
51
+ """Parameters such that for small strains model behaves according to Hooke's law"""
52
+ mu_nh = lame[1]
53
+ lambda_nh = lame[0] + lame[1]
54
+
55
+ return mu_nh, lambda_nh
56
+
57
+
58
+ @fem.integrand
59
+ def nh_stress_form(s: fem.Sample, tau: fem.Field, u_cur: fem.Field, lame: wp.vec2):
60
+ """d Psi/dF : tau"""
61
+
62
+ # Deformation gradient
63
+ F = wp.identity(n=2, dtype=float) + fem.grad(u_cur, s)
64
+
65
+ # Area term and its derivative w.r.t F
66
+ J = wp.determinant(F)
67
+ dJ_dF = wp.mat22(F[1, 1], -F[1, 0], -F[0, 1], F[0, 0])
68
+
69
+ mu_nh, lambda_nh = nh_parameters_from_lame(lame)
70
+ nh_stress = mu_nh * F + (lambda_nh * (J - 1.0) - mu_nh) * dJ_dF
71
+
72
+ return wp.ddot(tau(s), nh_stress)
73
+
74
+
75
+ @fem.integrand
76
+ def nh_stress_delta_form(s: fem.Sample, tau: fem.Field, u: fem.Field, u_cur: fem.Field, lame: wp.vec2):
77
+ """grad(u) : d2 Psi/dF2 : tau"""
78
+
79
+ tau_s = tau(s)
80
+ sigma_s = fem.grad(u, s)
81
+
82
+ F = wp.identity(n=2, dtype=float) + fem.grad(u_cur, s)
83
+ dJ_dF = wp.mat22(F[1, 1], -F[1, 0], -F[0, 1], F[0, 0])
84
+
85
+ # Gauss--Newton approximation; ignore d2J/dF2 term
86
+ mu_nh, lambda_nh = nh_parameters_from_lame(lame)
87
+ return mu_nh * wp.ddot(tau_s, sigma_s) + lambda_nh * wp.ddot(dJ_dF, tau_s) * wp.ddot(dJ_dF, sigma_s)
88
+
89
+
90
+ @fem.integrand
91
+ def vertical_boundary_projector_form(
92
+ s: fem.Sample,
93
+ domain: fem.Domain,
94
+ u: fem.Field,
95
+ v: fem.Field,
96
+ ):
97
+ # non zero on vertical boundary of domain only
98
+ nor = fem.normal(domain, s)
99
+ return wp.dot(u(s), v(s)) * wp.abs(nor[0])
100
+
101
+
102
+ @fem.integrand
103
+ def vertical_displacement_form(
104
+ s: fem.Sample,
105
+ domain: fem.Domain,
106
+ v: fem.Field,
107
+ displacement: float,
108
+ ):
109
+ # opposed to normal on vertical boundary of domain only
110
+ nor = fem.normal(domain, s)
111
+ return -wp.abs(nor[0]) * displacement * wp.dot(nor, v(s))
112
+
113
+
114
+ @fem.integrand
115
+ def tensor_mass_form(
116
+ s: fem.Sample,
117
+ sig: fem.Field,
118
+ tau: fem.Field,
119
+ ):
120
+ return wp.ddot(tau(s), sig(s))
121
+
122
+
123
+ @fem.integrand
124
+ def area_form(s: fem.Sample, u_cur: fem.Field):
125
+ F = wp.identity(n=2, dtype=float) + fem.grad(u_cur, s)
126
+ return wp.determinant(F)
127
+
128
+
129
+ class Example:
130
+ def __init__(
131
+ self,
132
+ quiet=False,
133
+ degree=2,
134
+ resolution=25,
135
+ mesh="grid",
136
+ displacement=0.1,
137
+ poisson_ratio=0.5,
138
+ nonconforming_stresses=False,
139
+ ):
140
+ self._quiet = quiet
141
+
142
+ self._displacement = displacement
143
+
144
+ # Grid or mesh geometry
145
+ if mesh == "tri":
146
+ positions, tri_vidx = fem_example_utils.gen_trimesh(res=wp.vec2i(resolution))
147
+ self._geo = fem.Trimesh2D(tri_vertex_indices=tri_vidx, positions=positions)
148
+ elif mesh == "quad":
149
+ positions, quad_vidx = fem_example_utils.gen_quadmesh(res=wp.vec2i(resolution))
150
+ self._geo = fem.Quadmesh2D(quad_vertex_indices=quad_vidx, positions=positions)
151
+ else:
152
+ self._geo = fem.Grid2D(res=wp.vec2i(resolution))
153
+
154
+ # Lame coefficients from Young modulus and Poisson ratio
155
+ self._lame = wp.vec2(1.0 / (1.0 + poisson_ratio) * np.array([poisson_ratio / (1.0 - poisson_ratio), 0.5]))
156
+
157
+ # Function spaces -- S_k for displacement, Q_k or P_{k-1}d for stress
158
+ self._u_space = fem.make_polynomial_space(
159
+ self._geo, degree=degree, dtype=wp.vec2, element_basis=fem.ElementBasis.SERENDIPITY
160
+ )
161
+
162
+ if self._geo.reference_cell() == fem.Element.TRIANGLE:
163
+ # triangle elements
164
+ tau_basis = fem.ElementBasis.NONCONFORMING_POLYNOMIAL
165
+ tau_degree = degree - 1
166
+ else:
167
+ # square elements
168
+ tau_basis = fem.ElementBasis.LAGRANGE
169
+ tau_degree = degree
170
+
171
+ self._tau_space = fem.make_polynomial_space(
172
+ self._geo,
173
+ degree=tau_degree,
174
+ discontinuous=True,
175
+ element_basis=tau_basis,
176
+ family=fem.Polynomial.GAUSS_LEGENDRE,
177
+ dtype=wp.mat22,
178
+ )
179
+
180
+ self._u_field = self._u_space.make_field()
181
+
182
+ self.renderer = fem_example_utils.Plot()
183
+
184
+ def step(self):
185
+ boundary = fem.BoundarySides(self._geo)
186
+ domain = fem.Cells(geometry=self._geo)
187
+
188
+ # Displacement boundary conditions
189
+ u_bd_test = fem.make_test(space=self._u_space, domain=boundary)
190
+ u_bd_trial = fem.make_trial(space=self._u_space, domain=boundary)
191
+ u_bd_rhs = fem.integrate(
192
+ vertical_displacement_form,
193
+ fields={"v": u_bd_test},
194
+ values={"displacement": self._displacement},
195
+ assembly="nodal",
196
+ output_dtype=wp.vec2d,
197
+ )
198
+ u_bd_matrix = fem.integrate(
199
+ vertical_boundary_projector_form, fields={"u": u_bd_trial, "v": u_bd_test}, assembly="nodal"
200
+ )
201
+
202
+ # Stress/velocity coupling
203
+ u_trial = fem.make_trial(space=self._u_space, domain=domain)
204
+ tau_test = fem.make_test(space=self._tau_space, domain=domain)
205
+ tau_trial = fem.make_trial(space=self._tau_space, domain=domain)
206
+
207
+ gradient_matrix = fem.integrate(displacement_gradient_form, fields={"u": u_trial, "tau": tau_test}).transpose()
208
+
209
+ # Compute inverse of the (block-diagonal) tau mass matrix
210
+ tau_inv_mass_matrix = fem.integrate(
211
+ tensor_mass_form, fields={"sig": tau_trial, "tau": tau_test}, assembly="nodal"
212
+ )
213
+ fem_example_utils.invert_diagonal_bsr_matrix(tau_inv_mass_matrix)
214
+
215
+ # Newton iterations (without line-search for simplicity)
216
+ for newton_iteration in range(5):
217
+ stress_matrix = fem.integrate(
218
+ nh_stress_delta_form,
219
+ fields={"u_cur": self._u_field, "u": u_trial, "tau": tau_test},
220
+ values={"lame": self._lame},
221
+ )
222
+
223
+ stress_rhs = fem.integrate(
224
+ nh_stress_form,
225
+ fields={"u_cur": self._u_field, "tau": tau_test},
226
+ values={"lame": self._lame},
227
+ output_dtype=wp.vec(length=stress_matrix.block_shape[0], dtype=wp.float64),
228
+ )
229
+
230
+ # Assemble system matrix
231
+ u_matrix = gradient_matrix @ tau_inv_mass_matrix @ stress_matrix
232
+
233
+ # Enforce boundary conditions (apply displacement only at first iteration)
234
+ u_rhs = -gradient_matrix @ (tau_inv_mass_matrix @ stress_rhs)
235
+ fem.project_linear_system(u_matrix, u_rhs, u_bd_matrix, u_bd_rhs if newton_iteration == 0 else None)
236
+
237
+ x = wp.zeros_like(u_rhs)
238
+ fem_example_utils.bsr_cg(u_matrix, b=u_rhs, x=x, quiet=self._quiet)
239
+
240
+ # Extract result -- cast to float32 and accumulate to displacement field
241
+ delta_u = wp.empty_like(self._u_field.dof_values)
242
+ wp.utils.array_cast(in_array=x, out_array=delta_u)
243
+ fem.linalg.array_axpy(x=delta_u, y=self._u_field.dof_values)
244
+
245
+ # Evaluate area conservation, should converge to 1.0 as Poisson ratio approaches 1.0
246
+ final_area = fem.integrate(
247
+ area_form, quadrature=fem.RegularQuadrature(domain, order=4), fields={"u_cur": self._u_field}
248
+ )
249
+ print(f"Area gain: {final_area} (using Poisson ratio={self._lame[0] / (self._lame[0] + 2.0 * self._lame[1])})")
250
+
251
+ def render(self):
252
+ self.renderer.add_field("solution", self._u_field)
253
+
254
+
255
+ if __name__ == "__main__":
256
+ import argparse
257
+
258
+ wp.set_module_options({"enable_backward": False})
259
+
260
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
261
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
262
+ parser.add_argument("--resolution", type=int, default=25, help="Grid resolution.")
263
+ parser.add_argument("--degree", type=int, default=2, help="Polynomial degree of shape functions.")
264
+ parser.add_argument("--displacement", type=float, default=-0.5)
265
+ parser.add_argument("--poisson_ratio", type=float, default=0.99)
266
+ parser.add_argument("--mesh", choices=("grid", "tri", "quad"), default="grid", help="Mesh type")
267
+ parser.add_argument(
268
+ "--nonconforming_stresses", action="store_true", help="For grid, use non-conforming stresses (Q_d/P_d)"
269
+ )
270
+ parser.add_argument(
271
+ "--headless",
272
+ action="store_true",
273
+ help="Run in headless mode, suppressing the opening of any graphical windows.",
274
+ )
275
+ parser.add_argument("--quiet", action="store_true", help="Suppresses the printing out of iteration residuals.")
276
+
277
+ args = parser.parse_known_args()[0]
278
+
279
+ with wp.ScopedDevice(args.device):
280
+ example = Example(
281
+ quiet=args.quiet,
282
+ degree=args.degree,
283
+ resolution=args.resolution,
284
+ mesh=args.mesh,
285
+ displacement=args.displacement,
286
+ poisson_ratio=args.poisson_ratio,
287
+ nonconforming_stresses=args.nonconforming_stresses,
288
+ )
289
+ example.step()
290
+ example.render()
291
+
292
+ if not args.headless:
293
+ example.renderer.plot(options={"solution": {"displacement": {}}})