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,263 @@
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 Navier Stokes
18
+ #
19
+ # This example solves a 2D Navier-Stokes flow problem:
20
+ #
21
+ # Du/dt -nu D(u) + grad p = 0
22
+ # Div u = 0
23
+ #
24
+ # with (hard) velocity-Dirichlet boundary conditions
25
+ # and using semi-Lagrangian advection
26
+ ###########################################################################
27
+
28
+ import warp as wp
29
+ import warp.examples.fem.utils as fem_example_utils
30
+ import warp.fem as fem
31
+ from warp.fem.linalg import array_axpy
32
+
33
+
34
+ @wp.func
35
+ def u_boundary_value(x: wp.vec2, box_height: float, top_velocity: float):
36
+ # Horizontal velocity on top of domain, zero elsewhere
37
+ if x[1] >= box_height:
38
+ return wp.vec2(top_velocity, 0.0)
39
+
40
+ return wp.vec2(0.0, 0.0)
41
+
42
+
43
+ @fem.integrand
44
+ def mass_form(
45
+ s: fem.Sample,
46
+ u: fem.Field,
47
+ v: fem.Field,
48
+ ):
49
+ return wp.dot(u(s), v(s))
50
+
51
+
52
+ @fem.integrand
53
+ def inertia_form(s: fem.Sample, u: fem.Field, v: fem.Field, dt: float):
54
+ return mass_form(s, u, v) / dt
55
+
56
+
57
+ @fem.integrand
58
+ def viscosity_form(s: fem.Sample, u: fem.Field, v: fem.Field, nu: float):
59
+ return 2.0 * nu * wp.ddot(fem.D(u, s), fem.D(v, s))
60
+
61
+
62
+ @fem.integrand
63
+ def viscosity_and_inertia_form(s: fem.Sample, u: fem.Field, v: fem.Field, dt: float, nu: float):
64
+ return inertia_form(s, u, v, dt) + viscosity_form(s, u, v, nu)
65
+
66
+
67
+ @fem.integrand
68
+ def transported_inertia_form(s: fem.Sample, domain: fem.Domain, u: fem.Field, v: fem.Field, dt: float):
69
+ pos = domain(s)
70
+ vel = u(s)
71
+
72
+ conv_pos = pos - 0.5 * vel * dt
73
+ conv_s = fem.lookup(domain, conv_pos, s)
74
+ conv_vel = u(conv_s)
75
+
76
+ conv_pos = conv_pos - 0.5 * conv_vel * dt
77
+ conv_vel = u(fem.lookup(domain, conv_pos, conv_s))
78
+
79
+ return wp.dot(conv_vel, v(s)) / dt
80
+
81
+
82
+ @fem.integrand
83
+ def div_form(
84
+ s: fem.Sample,
85
+ u: fem.Field,
86
+ q: fem.Field,
87
+ ):
88
+ return -q(s) * fem.div(u, s)
89
+
90
+
91
+ class Example:
92
+ def __init__(self, quiet=False, degree=2, resolution=25, Re=1000.0, top_velocity=1.0, mesh: str = "grid"):
93
+ self._quiet = quiet
94
+
95
+ self.sim_dt = 1.0 / resolution
96
+ self.current_frame = 0
97
+
98
+ viscosity = top_velocity / Re
99
+
100
+ if mesh == "tri":
101
+ positions, tri_vidx = fem_example_utils.gen_trimesh(res=wp.vec2i(resolution))
102
+ geo = fem.Trimesh2D(tri_vertex_indices=tri_vidx, positions=positions, build_bvh=True)
103
+ elif mesh == "quad":
104
+ positions, quad_vidx = fem_example_utils.gen_quadmesh(res=wp.vec2i(resolution))
105
+ geo = fem.Quadmesh2D(quad_vertex_indices=quad_vidx, positions=positions, build_bvh=True)
106
+ else:
107
+ geo = fem.Grid2D(res=wp.vec2i(resolution))
108
+
109
+ domain = fem.Cells(geometry=geo)
110
+ boundary = fem.BoundarySides(geo)
111
+
112
+ # Functions spaces: Q(d)-Q(d-1)
113
+ u_degree = degree
114
+ u_space = fem.make_polynomial_space(geo, degree=u_degree, dtype=wp.vec2)
115
+ p_space = fem.make_polynomial_space(geo, degree=u_degree - 1)
116
+
117
+ # Viscosity and inertia
118
+ u_test = fem.make_test(space=u_space, domain=domain)
119
+ u_trial = fem.make_trial(space=u_space, domain=domain)
120
+
121
+ u_matrix = fem.integrate(
122
+ viscosity_and_inertia_form,
123
+ fields={"u": u_trial, "v": u_test},
124
+ values={"nu": viscosity, "dt": self.sim_dt},
125
+ )
126
+
127
+ # Pressure-velocity coupling
128
+ p_test = fem.make_test(space=p_space, domain=domain)
129
+ div_matrix = fem.integrate(div_form, fields={"u": u_trial, "q": p_test})
130
+
131
+ # Enforcing the Dirichlet boundary condition the hard way;
132
+ # build projector for velocity left- and right-hand-sides
133
+ u_bd_test = fem.make_test(space=u_space, domain=boundary)
134
+ u_bd_trial = fem.make_trial(space=u_space, domain=boundary)
135
+ u_bd_projector = fem.integrate(mass_form, fields={"u": u_bd_trial, "v": u_bd_test}, assembly="nodal")
136
+
137
+ # Define an implicit field for our boundary condition value and integrate
138
+ u_bd_field = fem.ImplicitField(
139
+ domain=boundary, func=u_boundary_value, values={"top_velocity": top_velocity, "box_height": 1.0}
140
+ )
141
+ u_bd_value = fem.integrate(
142
+ mass_form,
143
+ fields={"u": u_bd_field, "v": u_bd_test},
144
+ assembly="nodal",
145
+ output_dtype=wp.vec2d,
146
+ )
147
+
148
+ fem.normalize_dirichlet_projector(u_bd_projector, u_bd_value)
149
+
150
+ u_bd_rhs = wp.zeros_like(u_bd_value)
151
+ fem.project_linear_system(u_matrix, u_bd_rhs, u_bd_projector, u_bd_value, normalize_projector=False)
152
+
153
+ div_bd_rhs = -div_matrix @ u_bd_value
154
+ div_matrix -= div_matrix @ u_bd_projector
155
+
156
+ # Assemble saddle system
157
+ self._saddle_system = fem_example_utils.SaddleSystem(u_matrix, div_matrix)
158
+
159
+ # Save data for computing time steps rhs
160
+ self._u_bd_projector = u_bd_projector
161
+ self._u_bd_rhs = u_bd_rhs
162
+ self._u_test = u_test
163
+ self._div_bd_rhs = div_bd_rhs
164
+
165
+ # Velocitiy and pressure fields
166
+ self._u_field = u_space.make_field()
167
+ self._p_field = p_space.make_field()
168
+
169
+ self.renderer = fem_example_utils.Plot()
170
+ self.renderer.add_field("velocity", self._u_field)
171
+
172
+ def step(self):
173
+ self.current_frame += 1
174
+
175
+ u_rhs = fem.integrate(
176
+ transported_inertia_form,
177
+ fields={"u": self._u_field, "v": self._u_test},
178
+ values={"dt": self.sim_dt},
179
+ output_dtype=wp.vec2d,
180
+ )
181
+
182
+ # Apply boundary conditions
183
+ # u_rhs = (I - P) * u_rhs + u_bd_rhs
184
+ wp.sparse.bsr_mv(self._u_bd_projector, x=u_rhs, y=u_rhs, alpha=-1.0, beta=1.0)
185
+ array_axpy(x=self._u_bd_rhs, y=u_rhs, alpha=1.0, beta=1.0)
186
+
187
+ p_rhs = self._div_bd_rhs
188
+
189
+ x_u = wp.empty_like(u_rhs)
190
+ x_p = wp.empty_like(p_rhs)
191
+ wp.utils.array_cast(out_array=x_u, in_array=self._u_field.dof_values)
192
+ wp.utils.array_cast(out_array=x_p, in_array=self._p_field.dof_values)
193
+
194
+ fem_example_utils.bsr_solve_saddle(
195
+ saddle_system=self._saddle_system,
196
+ tol=1.0e-6,
197
+ x_u=x_u,
198
+ x_p=x_p,
199
+ b_u=u_rhs,
200
+ b_p=p_rhs,
201
+ quiet=self._quiet,
202
+ )
203
+
204
+ wp.utils.array_cast(in_array=x_u, out_array=self._u_field.dof_values)
205
+ wp.utils.array_cast(in_array=x_p, out_array=self._p_field.dof_values)
206
+
207
+ def render(self):
208
+ self.renderer.begin_frame(time=self.current_frame * self.sim_dt)
209
+ self.renderer.add_field("velocity", self._u_field)
210
+ self.renderer.end_frame()
211
+
212
+
213
+ if __name__ == "__main__":
214
+ import argparse
215
+
216
+ wp.set_module_options({"enable_backward": False})
217
+
218
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
219
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
220
+ parser.add_argument("--resolution", type=int, default=25, help="Grid resolution.")
221
+ parser.add_argument("--degree", type=int, default=2, help="Polynomial degree of shape functions.")
222
+ parser.add_argument("--num_frames", type=int, default=1000, help="Total number of frames.")
223
+ parser.add_argument(
224
+ "--top_velocity",
225
+ type=float,
226
+ default=1.0,
227
+ help="Horizontal velocity boundary condition at the top of the domain.",
228
+ )
229
+ parser.add_argument("--Re", type=float, default=1000.0, help="Reynolds number.")
230
+ parser.add_argument("--mesh", choices=("grid", "tri", "quad"), default="grid", help="Mesh type.")
231
+ parser.add_argument(
232
+ "--headless",
233
+ action="store_true",
234
+ help="Run in headless mode, suppressing the opening of any graphical windows.",
235
+ )
236
+ parser.add_argument("--quiet", action="store_true", help="Suppresses the printing out of iteration residuals.")
237
+
238
+ args = parser.parse_known_args()[0]
239
+
240
+ with wp.ScopedDevice(args.device):
241
+ example = Example(
242
+ quiet=args.quiet,
243
+ degree=args.degree,
244
+ resolution=args.resolution,
245
+ Re=args.Re,
246
+ top_velocity=args.top_velocity,
247
+ mesh=args.mesh,
248
+ )
249
+
250
+ for k in range(args.num_frames):
251
+ print(f"Frame {k}:")
252
+ example.step()
253
+ example.render()
254
+
255
+ example.renderer.add_field("velocity_final", example._u_field)
256
+
257
+ if not args.headless:
258
+ example.renderer.plot(
259
+ options={
260
+ "velocity": {"arrows": {"glyph_scale": 0.25}},
261
+ "velocity_final": {"streamlines": {"density": 2.0}},
262
+ }
263
+ )
@@ -0,0 +1,300 @@
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 Nonconforming Contact
18
+ #
19
+ # This example demonstrates using nonconforming fields (warp.fem.NonconformingField)
20
+ # to solve a no-slip contact problem between two elastic bodies discretized separately.
21
+ #
22
+ # Div[ E: D(u) ] = g over each body
23
+ # u_top = u_bottom along the contact surface (top body bottom boundary)
24
+ # u_bottom = 0 along the bottom boundary of the bottom body
25
+ #
26
+ # with E the rank-4 elasticity tensor
27
+ #
28
+ # Below we use a simple staggered scheme for solving bodies iteratively,
29
+ # but more robust methods could be considered (e.g. Augmented Lagrangian)
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
+ @wp.func
40
+ def compute_stress(tau: wp.mat22, E: wp.mat33):
41
+ """Strain to stress computation (using Voigt notation to drop tensor order)"""
42
+ tau_sym = wp.vec3(tau[0, 0], tau[1, 1], tau[0, 1] + tau[1, 0])
43
+ sig_sym = E * tau_sym
44
+ return wp.mat22(sig_sym[0], 0.5 * sig_sym[2], 0.5 * sig_sym[2], sig_sym[1])
45
+
46
+
47
+ @fem.integrand
48
+ def stress_form(s: fem.Sample, u: fem.Field, tau: fem.Field, E: wp.mat33):
49
+ """Stress inside body: (E : D(u)) : tau"""
50
+ return wp.ddot(tau(s), compute_stress(fem.D(u, s), E))
51
+
52
+
53
+ @fem.integrand
54
+ def boundary_stress_form(
55
+ s: fem.Sample,
56
+ domain: fem.Domain,
57
+ u: fem.Field,
58
+ tau: fem.Field,
59
+ ):
60
+ """Stress on boundary: u' tau n"""
61
+ return wp.dot(tau(s) * fem.normal(domain, s), u(s))
62
+
63
+
64
+ @fem.integrand
65
+ def symmetric_grad_form(
66
+ s: fem.Sample,
67
+ u: fem.Field,
68
+ tau: fem.Field,
69
+ ):
70
+ """Symmetric part of gradient of displacement: D(u) : tau"""
71
+ return wp.ddot(tau(s), fem.D(u, s))
72
+
73
+
74
+ @fem.integrand
75
+ def gravity_form(
76
+ s: fem.Sample,
77
+ v: fem.Field,
78
+ gravity: float,
79
+ ):
80
+ return -gravity * v(s)[1]
81
+
82
+
83
+ @fem.integrand
84
+ def bottom_boundary_projector_form(
85
+ s: fem.Sample,
86
+ domain: fem.Domain,
87
+ u: fem.Field,
88
+ v: fem.Field,
89
+ ):
90
+ # non zero on bottom boundary only
91
+ nor = fem.normal(domain, s)
92
+ return wp.dot(u(s), v(s)) * wp.max(0.0, -nor[1])
93
+
94
+
95
+ @fem.integrand
96
+ def tensor_mass_form(
97
+ s: fem.Sample,
98
+ sig: fem.Field,
99
+ tau: fem.Field,
100
+ ):
101
+ return wp.ddot(tau(s), sig(s))
102
+
103
+
104
+ class Example:
105
+ def __init__(
106
+ self,
107
+ degree=2,
108
+ resolution=16,
109
+ young_modulus=1.0,
110
+ poisson_ratio=0.5,
111
+ nonconforming_stresses=False,
112
+ ):
113
+ self._geo1 = fem.Grid2D(bounds_hi=wp.vec2(1.0, 0.5), res=wp.vec2i(resolution))
114
+ self._geo2 = fem.Grid2D(bounds_lo=(0.33, 0.5), bounds_hi=(0.67, 0.5 + 0.33), res=wp.vec2i(resolution))
115
+
116
+ # Strain-stress matrix
117
+ young = young_modulus
118
+ poisson = poisson_ratio
119
+ self._elasticity_mat = wp.mat33(
120
+ young
121
+ / (1.0 - poisson * poisson)
122
+ * np.array(
123
+ [
124
+ [1.0, poisson, 0.0],
125
+ [poisson, 1.0, 0.0],
126
+ [0.0, 0.0, (1.0 - poisson * poisson) / (2.0 * (1.0 + poisson))],
127
+ ]
128
+ )
129
+ )
130
+
131
+ # Displacement spaces and fields -- S_k
132
+ self._u1_space = fem.make_polynomial_space(
133
+ self._geo1, degree=degree, dtype=wp.vec2, element_basis=fem.ElementBasis.SERENDIPITY
134
+ )
135
+ self._u2_space = fem.make_polynomial_space(
136
+ self._geo2, degree=degree, dtype=wp.vec2, element_basis=fem.ElementBasis.SERENDIPITY
137
+ )
138
+ self._u1_field = self._u1_space.make_field()
139
+ self._u2_field = self._u2_space.make_field()
140
+
141
+ # Stress spaces and fields -- Q_{k-1}d
142
+ # Store stress degrees of freedom as symmetric tensors (3 dof) rather than full 2x2 matrices
143
+ self._tau1_space = fem.make_polynomial_space(
144
+ self._geo1,
145
+ degree=degree,
146
+ discontinuous=True,
147
+ element_basis=fem.ElementBasis.LAGRANGE,
148
+ dof_mapper=fem.SymmetricTensorMapper(wp.mat22),
149
+ )
150
+ self._tau2_space = fem.make_polynomial_space(
151
+ self._geo2,
152
+ degree=degree,
153
+ discontinuous=True,
154
+ element_basis=fem.ElementBasis.LAGRANGE,
155
+ dof_mapper=fem.SymmetricTensorMapper(wp.mat22),
156
+ )
157
+
158
+ self._sig1_field = self._tau1_space.make_field()
159
+ self._sig2_field = self._tau2_space.make_field()
160
+ self._sig2_field_new = self._tau2_space.make_field()
161
+
162
+ self.renderer = fem_example_utils.Plot()
163
+
164
+ def step(self):
165
+ # Solve for the two bodies separately
166
+ # Body (top) is 25x more dense and 5x stiffer than top body
167
+ # Body 1 affects body 2 through bottom displacement dirichlet BC
168
+ # Body 2 affects body 1 through applied strain on top
169
+ self.solve_solid(self._u1_field, self._sig1_field, self._u2_field, self._sig2_field, gravity=1.0, stiffness=1.0)
170
+ self.solve_solid(
171
+ self._u2_field, self._sig2_field_new, self._u1_field, self._sig1_field, gravity=25.0, stiffness=5.0
172
+ )
173
+
174
+ # Damped update of coupling stress (for stability)
175
+ alpha = 0.1
176
+ fem.linalg.array_axpy(
177
+ x=self._sig2_field_new.dof_values, y=self._sig2_field.dof_values, alpha=alpha, beta=1.0 - alpha
178
+ )
179
+
180
+ def solve_solid(
181
+ self,
182
+ u_field,
183
+ stress_field,
184
+ other_u_field,
185
+ other_stress_field,
186
+ gravity: float,
187
+ stiffness: float,
188
+ ):
189
+ u_space = u_field.space
190
+ stress_space = stress_field.space
191
+ geo = u_field.space.geometry
192
+
193
+ domain = fem.Cells(geometry=geo)
194
+ boundary = fem.BoundarySides(geometry=geo)
195
+
196
+ u_test = fem.make_test(space=u_space, domain=domain)
197
+ u_trial = fem.make_trial(space=u_space, domain=domain)
198
+ tau_test = fem.make_test(space=stress_space, domain=domain)
199
+ tau_trial = fem.make_trial(space=stress_space, domain=domain)
200
+
201
+ u_bd_test = fem.make_test(space=u_space, domain=boundary)
202
+ u_bd_trial = fem.make_trial(space=u_space, domain=boundary)
203
+
204
+ # Assemble stiffness matrix
205
+ # (Note: this is constant per body, this could be precomputed)
206
+ sym_grad_matrix = fem.integrate(symmetric_grad_form, fields={"u": u_trial, "tau": tau_test})
207
+
208
+ tau_inv_mass_matrix = fem.integrate(
209
+ tensor_mass_form, fields={"sig": tau_trial, "tau": tau_test}, assembly="nodal"
210
+ )
211
+ fem_example_utils.invert_diagonal_bsr_matrix(tau_inv_mass_matrix)
212
+
213
+ stress_matrix = tau_inv_mass_matrix @ fem.integrate(
214
+ stress_form, fields={"u": u_trial, "tau": tau_test}, values={"E": self._elasticity_mat * stiffness}
215
+ )
216
+ stiffness_matrix = sym_grad_matrix.transpose() @ stress_matrix
217
+
218
+ # Right-hand-side
219
+ u_rhs = fem.integrate(gravity_form, fields={"v": u_test}, values={"gravity": gravity}, output_dtype=wp.vec2d)
220
+
221
+ # Add boundary stress from other solid field
222
+ other_stress_field = fem.NonconformingField(boundary, other_stress_field)
223
+ fem.integrate(
224
+ boundary_stress_form,
225
+ fields={"u": u_bd_test, "tau": other_stress_field},
226
+ output=u_rhs,
227
+ add=True,
228
+ )
229
+
230
+ # Enforce boundary conditions
231
+ u_bd_matrix = fem.integrate(
232
+ bottom_boundary_projector_form, fields={"u": u_bd_trial, "v": u_bd_test}, assembly="nodal"
233
+ )
234
+
235
+ # displacement from other body defines bottom boundary Dirichlet BC
236
+ other_u_field = fem.NonconformingField(boundary, other_u_field)
237
+ u_bd_rhs = fem.integrate(
238
+ bottom_boundary_projector_form, fields={"u": other_u_field, "v": u_bd_test}, assembly="nodal"
239
+ )
240
+
241
+ fem.project_linear_system(stiffness_matrix, u_rhs, u_bd_matrix, u_bd_rhs)
242
+
243
+ # solve
244
+ x = wp.zeros_like(u_rhs)
245
+ wp.utils.array_cast(in_array=u_field.dof_values, out_array=x)
246
+ fem_example_utils.bsr_cg(stiffness_matrix, b=u_rhs, x=x, tol=1.0e-6, quiet=True)
247
+
248
+ # Extract result
249
+ stress = stress_matrix @ x
250
+ wp.utils.array_cast(in_array=x, out_array=u_field.dof_values)
251
+ wp.utils.array_cast(in_array=stress, out_array=stress_field.dof_values)
252
+
253
+ def render(self):
254
+ self.renderer.add_field("u1", self._u1_field)
255
+ self.renderer.add_field("u2", self._u2_field)
256
+ self.renderer.add_field("sig1", self._sig1_field)
257
+ self.renderer.add_field("sig2", self._sig2_field)
258
+
259
+
260
+ if __name__ == "__main__":
261
+ import argparse
262
+
263
+ wp.set_module_options({"enable_backward": False})
264
+
265
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
266
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
267
+ parser.add_argument("--resolution", type=int, default=32, help="Grid resolution.")
268
+ parser.add_argument("--degree", type=int, default=2, help="Polynomial degree of shape functions.")
269
+ parser.add_argument("--young_modulus", type=float, default=10.0)
270
+ parser.add_argument("--poisson_ratio", type=float, default=0.9)
271
+ parser.add_argument("--num_steps", type=int, default=50)
272
+ parser.add_argument(
273
+ "--headless",
274
+ action="store_true",
275
+ help="Run in headless mode, suppressing the opening of any graphical windows.",
276
+ )
277
+
278
+ args = parser.parse_known_args()[0]
279
+
280
+ with wp.ScopedDevice(args.device):
281
+ example = Example(
282
+ degree=args.degree,
283
+ resolution=args.resolution,
284
+ young_modulus=args.young_modulus,
285
+ poisson_ratio=args.poisson_ratio,
286
+ )
287
+
288
+ for i in range(args.num_steps):
289
+ print("Step", i)
290
+ example.step()
291
+ example.render()
292
+
293
+ if not args.headless:
294
+ example.renderer.plot(
295
+ {
296
+ "rows": 2,
297
+ "u1": {"displacement": {}},
298
+ "u2": {"displacement": {}},
299
+ },
300
+ )