warp-lang 0.9.0__py3-none-win_amd64.whl → 0.11.0__py3-none-win_amd64.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 (315) hide show
  1. warp/__init__.py +15 -7
  2. warp/__init__.pyi +1 -0
  3. warp/bin/warp-clang.dll +0 -0
  4. warp/bin/warp.dll +0 -0
  5. warp/build.py +22 -443
  6. warp/build_dll.py +384 -0
  7. warp/builtins.py +998 -488
  8. warp/codegen.py +1307 -739
  9. warp/config.py +5 -3
  10. warp/constants.py +6 -0
  11. warp/context.py +1291 -548
  12. warp/dlpack.py +31 -31
  13. warp/fabric.py +326 -0
  14. warp/fem/__init__.py +27 -0
  15. warp/fem/cache.py +389 -0
  16. warp/fem/dirichlet.py +181 -0
  17. warp/fem/domain.py +263 -0
  18. warp/fem/field/__init__.py +101 -0
  19. warp/fem/field/field.py +149 -0
  20. warp/fem/field/nodal_field.py +299 -0
  21. warp/fem/field/restriction.py +21 -0
  22. warp/fem/field/test.py +181 -0
  23. warp/fem/field/trial.py +183 -0
  24. warp/fem/geometry/__init__.py +19 -0
  25. warp/fem/geometry/closest_point.py +70 -0
  26. warp/fem/geometry/deformed_geometry.py +271 -0
  27. warp/fem/geometry/element.py +744 -0
  28. warp/fem/geometry/geometry.py +186 -0
  29. warp/fem/geometry/grid_2d.py +373 -0
  30. warp/fem/geometry/grid_3d.py +435 -0
  31. warp/fem/geometry/hexmesh.py +953 -0
  32. warp/fem/geometry/partition.py +376 -0
  33. warp/fem/geometry/quadmesh_2d.py +532 -0
  34. warp/fem/geometry/tetmesh.py +840 -0
  35. warp/fem/geometry/trimesh_2d.py +577 -0
  36. warp/fem/integrate.py +1616 -0
  37. warp/fem/operator.py +191 -0
  38. warp/fem/polynomial.py +213 -0
  39. warp/fem/quadrature/__init__.py +2 -0
  40. warp/fem/quadrature/pic_quadrature.py +245 -0
  41. warp/fem/quadrature/quadrature.py +294 -0
  42. warp/fem/space/__init__.py +292 -0
  43. warp/fem/space/basis_space.py +489 -0
  44. warp/fem/space/collocated_function_space.py +105 -0
  45. warp/fem/space/dof_mapper.py +236 -0
  46. warp/fem/space/function_space.py +145 -0
  47. warp/fem/space/grid_2d_function_space.py +267 -0
  48. warp/fem/space/grid_3d_function_space.py +306 -0
  49. warp/fem/space/hexmesh_function_space.py +352 -0
  50. warp/fem/space/partition.py +350 -0
  51. warp/fem/space/quadmesh_2d_function_space.py +369 -0
  52. warp/fem/space/restriction.py +160 -0
  53. warp/fem/space/shape/__init__.py +15 -0
  54. warp/fem/space/shape/cube_shape_function.py +738 -0
  55. warp/fem/space/shape/shape_function.py +103 -0
  56. warp/fem/space/shape/square_shape_function.py +611 -0
  57. warp/fem/space/shape/tet_shape_function.py +567 -0
  58. warp/fem/space/shape/triangle_shape_function.py +429 -0
  59. warp/fem/space/tetmesh_function_space.py +292 -0
  60. warp/fem/space/topology.py +295 -0
  61. warp/fem/space/trimesh_2d_function_space.py +221 -0
  62. warp/fem/types.py +77 -0
  63. warp/fem/utils.py +495 -0
  64. warp/native/array.h +164 -55
  65. warp/native/builtin.h +150 -174
  66. warp/native/bvh.cpp +75 -328
  67. warp/native/bvh.cu +406 -23
  68. warp/native/bvh.h +37 -45
  69. warp/native/clang/clang.cpp +136 -24
  70. warp/native/crt.cpp +1 -76
  71. warp/native/crt.h +111 -104
  72. warp/native/cuda_crt.h +1049 -0
  73. warp/native/cuda_util.cpp +15 -3
  74. warp/native/cuda_util.h +3 -1
  75. warp/native/cutlass/tools/library/scripts/conv2d_operation.py +463 -0
  76. warp/native/cutlass/tools/library/scripts/conv3d_operation.py +321 -0
  77. warp/native/cutlass/tools/library/scripts/gemm_operation.py +988 -0
  78. warp/native/cutlass/tools/library/scripts/generator.py +4625 -0
  79. warp/native/cutlass/tools/library/scripts/library.py +799 -0
  80. warp/native/cutlass/tools/library/scripts/manifest.py +402 -0
  81. warp/native/cutlass/tools/library/scripts/pycutlass/docs/source/conf.py +96 -0
  82. warp/native/cutlass/tools/library/scripts/pycutlass/profile/conv/conv2d_f16_sm80.py +106 -0
  83. warp/native/cutlass/tools/library/scripts/pycutlass/profile/gemm/gemm_f32_sm80.py +91 -0
  84. warp/native/cutlass/tools/library/scripts/pycutlass/setup.py +80 -0
  85. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/__init__.py +48 -0
  86. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/arguments.py +118 -0
  87. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/c_types.py +241 -0
  88. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/compiler.py +432 -0
  89. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/conv2d_operation.py +631 -0
  90. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/epilogue.py +1026 -0
  91. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/frontend.py +104 -0
  92. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/gemm_operation.py +1276 -0
  93. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/library.py +744 -0
  94. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/memory_manager.py +74 -0
  95. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/operation.py +110 -0
  96. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/parser.py +619 -0
  97. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/reduction_operation.py +398 -0
  98. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/tensor_ref.py +70 -0
  99. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/__init__.py +4 -0
  100. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/conv2d_testbed.py +646 -0
  101. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_grouped_testbed.py +235 -0
  102. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_testbed.py +557 -0
  103. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/profiler.py +70 -0
  104. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/type_hint.py +39 -0
  105. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/__init__.py +1 -0
  106. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/device.py +76 -0
  107. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/reference_model.py +255 -0
  108. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/__init__.py +0 -0
  109. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +201 -0
  110. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +177 -0
  111. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +98 -0
  112. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +95 -0
  113. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_few_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +163 -0
  114. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_fixed_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +187 -0
  115. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +309 -0
  116. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +54 -0
  117. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
  118. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
  119. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_strided_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +253 -0
  120. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +97 -0
  121. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +242 -0
  122. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
  123. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
  124. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/run_all_tests.py +10 -0
  125. warp/native/cutlass/tools/library/scripts/pycutlass/test/frontend/test_frontend.py +146 -0
  126. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/__init__.py +0 -0
  127. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_bf16_sm80.py +96 -0
  128. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f16_sm80.py +447 -0
  129. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f32_sm80.py +146 -0
  130. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f64_sm80.py +102 -0
  131. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_grouped_sm80.py +203 -0
  132. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_s8_sm80.py +229 -0
  133. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/run_all_tests.py +9 -0
  134. warp/native/cutlass/tools/library/scripts/pycutlass/test/unit/test_sm80.py +453 -0
  135. warp/native/cutlass/tools/library/scripts/rank_2k_operation.py +398 -0
  136. warp/native/cutlass/tools/library/scripts/rank_k_operation.py +387 -0
  137. warp/native/cutlass/tools/library/scripts/rt.py +796 -0
  138. warp/native/cutlass/tools/library/scripts/symm_operation.py +400 -0
  139. warp/native/cutlass/tools/library/scripts/trmm_operation.py +407 -0
  140. warp/native/cutlass_gemm.cu +5 -3
  141. warp/native/exports.h +1240 -949
  142. warp/native/fabric.h +228 -0
  143. warp/native/hashgrid.cpp +4 -4
  144. warp/native/hashgrid.h +22 -2
  145. warp/native/initializer_array.h +2 -2
  146. warp/native/intersect.h +22 -7
  147. warp/native/intersect_adj.h +8 -8
  148. warp/native/intersect_tri.h +13 -16
  149. warp/native/marching.cu +157 -161
  150. warp/native/mat.h +119 -19
  151. warp/native/matnn.h +2 -2
  152. warp/native/mesh.cpp +108 -83
  153. warp/native/mesh.cu +243 -6
  154. warp/native/mesh.h +1547 -458
  155. warp/native/nanovdb/NanoVDB.h +1 -1
  156. warp/native/noise.h +272 -329
  157. warp/native/quat.h +51 -8
  158. warp/native/rand.h +45 -35
  159. warp/native/range.h +6 -2
  160. warp/native/reduce.cpp +157 -0
  161. warp/native/reduce.cu +348 -0
  162. warp/native/runlength_encode.cpp +62 -0
  163. warp/native/runlength_encode.cu +46 -0
  164. warp/native/scan.cu +11 -13
  165. warp/native/scan.h +1 -0
  166. warp/native/solid_angle.h +442 -0
  167. warp/native/sort.cpp +13 -0
  168. warp/native/sort.cu +9 -1
  169. warp/native/sparse.cpp +338 -0
  170. warp/native/sparse.cu +545 -0
  171. warp/native/spatial.h +2 -2
  172. warp/native/temp_buffer.h +30 -0
  173. warp/native/vec.h +126 -24
  174. warp/native/volume.h +120 -0
  175. warp/native/warp.cpp +658 -53
  176. warp/native/warp.cu +660 -68
  177. warp/native/warp.h +112 -12
  178. warp/optim/__init__.py +1 -0
  179. warp/optim/linear.py +922 -0
  180. warp/optim/sgd.py +92 -0
  181. warp/render/render_opengl.py +392 -152
  182. warp/render/render_usd.py +11 -11
  183. warp/sim/__init__.py +2 -2
  184. warp/sim/articulation.py +385 -185
  185. warp/sim/collide.py +21 -8
  186. warp/sim/import_mjcf.py +297 -106
  187. warp/sim/import_urdf.py +389 -210
  188. warp/sim/import_usd.py +198 -97
  189. warp/sim/inertia.py +17 -18
  190. warp/sim/integrator_euler.py +14 -8
  191. warp/sim/integrator_xpbd.py +161 -19
  192. warp/sim/model.py +795 -291
  193. warp/sim/optimizer.py +2 -6
  194. warp/sim/render.py +65 -3
  195. warp/sim/utils.py +3 -0
  196. warp/sparse.py +1227 -0
  197. warp/stubs.py +665 -223
  198. warp/tape.py +66 -15
  199. warp/tests/__main__.py +3 -6
  200. warp/tests/assets/curlnoise_golden.npy +0 -0
  201. warp/tests/assets/pnoise_golden.npy +0 -0
  202. warp/tests/assets/torus.usda +105 -105
  203. warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
  204. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
  205. warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
  206. warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
  207. warp/tests/aux_test_unresolved_func.py +14 -0
  208. warp/tests/aux_test_unresolved_symbol.py +14 -0
  209. warp/tests/disabled_kinematics.py +239 -0
  210. warp/tests/run_coverage_serial.py +31 -0
  211. warp/tests/test_adam.py +103 -106
  212. warp/tests/test_arithmetic.py +128 -74
  213. warp/tests/test_array.py +1497 -211
  214. warp/tests/test_array_reduce.py +150 -0
  215. warp/tests/test_atomic.py +64 -28
  216. warp/tests/test_bool.py +99 -0
  217. warp/tests/test_builtins_resolution.py +1292 -0
  218. warp/tests/test_bvh.py +75 -43
  219. warp/tests/test_closest_point_edge_edge.py +54 -57
  220. warp/tests/test_codegen.py +233 -128
  221. warp/tests/test_compile_consts.py +28 -20
  222. warp/tests/test_conditional.py +108 -24
  223. warp/tests/test_copy.py +10 -12
  224. warp/tests/test_ctypes.py +112 -88
  225. warp/tests/test_dense.py +21 -14
  226. warp/tests/test_devices.py +98 -0
  227. warp/tests/test_dlpack.py +136 -108
  228. warp/tests/test_examples.py +277 -0
  229. warp/tests/test_fabricarray.py +955 -0
  230. warp/tests/test_fast_math.py +15 -11
  231. warp/tests/test_fem.py +1271 -0
  232. warp/tests/test_fp16.py +53 -19
  233. warp/tests/test_func.py +187 -74
  234. warp/tests/test_generics.py +194 -49
  235. warp/tests/test_grad.py +180 -116
  236. warp/tests/test_grad_customs.py +176 -0
  237. warp/tests/test_hash_grid.py +52 -37
  238. warp/tests/test_import.py +10 -23
  239. warp/tests/test_indexedarray.py +577 -24
  240. warp/tests/test_intersect.py +18 -9
  241. warp/tests/test_large.py +141 -0
  242. warp/tests/test_launch.py +251 -15
  243. warp/tests/test_lerp.py +64 -65
  244. warp/tests/test_linear_solvers.py +154 -0
  245. warp/tests/test_lvalue.py +493 -0
  246. warp/tests/test_marching_cubes.py +12 -13
  247. warp/tests/test_mat.py +508 -2778
  248. warp/tests/test_mat_lite.py +115 -0
  249. warp/tests/test_mat_scalar_ops.py +2889 -0
  250. warp/tests/test_math.py +103 -9
  251. warp/tests/test_matmul.py +305 -69
  252. warp/tests/test_matmul_lite.py +410 -0
  253. warp/tests/test_mesh.py +71 -14
  254. warp/tests/test_mesh_query_aabb.py +41 -25
  255. warp/tests/test_mesh_query_point.py +325 -34
  256. warp/tests/test_mesh_query_ray.py +39 -22
  257. warp/tests/test_mlp.py +30 -22
  258. warp/tests/test_model.py +92 -89
  259. warp/tests/test_modules_lite.py +39 -0
  260. warp/tests/test_multigpu.py +88 -114
  261. warp/tests/test_noise.py +12 -11
  262. warp/tests/test_operators.py +16 -20
  263. warp/tests/test_options.py +11 -11
  264. warp/tests/test_pinned.py +17 -18
  265. warp/tests/test_print.py +32 -11
  266. warp/tests/test_quat.py +275 -129
  267. warp/tests/test_rand.py +18 -16
  268. warp/tests/test_reload.py +38 -34
  269. warp/tests/test_rounding.py +50 -43
  270. warp/tests/test_runlength_encode.py +190 -0
  271. warp/tests/test_smoothstep.py +9 -11
  272. warp/tests/test_snippet.py +143 -0
  273. warp/tests/test_sparse.py +460 -0
  274. warp/tests/test_spatial.py +276 -243
  275. warp/tests/test_streams.py +110 -85
  276. warp/tests/test_struct.py +331 -85
  277. warp/tests/test_tape.py +39 -21
  278. warp/tests/test_torch.py +118 -89
  279. warp/tests/test_transient_module.py +12 -13
  280. warp/tests/test_types.py +614 -0
  281. warp/tests/test_utils.py +494 -0
  282. warp/tests/test_vec.py +354 -1987
  283. warp/tests/test_vec_lite.py +73 -0
  284. warp/tests/test_vec_scalar_ops.py +2099 -0
  285. warp/tests/test_volume.py +457 -293
  286. warp/tests/test_volume_write.py +124 -134
  287. warp/tests/unittest_serial.py +35 -0
  288. warp/tests/unittest_suites.py +341 -0
  289. warp/tests/unittest_utils.py +568 -0
  290. warp/tests/unused_test_misc.py +71 -0
  291. warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
  292. warp/thirdparty/appdirs.py +36 -45
  293. warp/thirdparty/unittest_parallel.py +549 -0
  294. warp/torch.py +72 -30
  295. warp/types.py +1744 -713
  296. warp/utils.py +360 -350
  297. warp_lang-0.11.0.dist-info/LICENSE.md +36 -0
  298. warp_lang-0.11.0.dist-info/METADATA +238 -0
  299. warp_lang-0.11.0.dist-info/RECORD +332 -0
  300. {warp_lang-0.9.0.dist-info → warp_lang-0.11.0.dist-info}/WHEEL +1 -1
  301. warp/bin/warp-clang.exp +0 -0
  302. warp/bin/warp-clang.lib +0 -0
  303. warp/bin/warp.exp +0 -0
  304. warp/bin/warp.lib +0 -0
  305. warp/tests/test_all.py +0 -215
  306. warp/tests/test_array_scan.py +0 -60
  307. warp/tests/test_base.py +0 -208
  308. warp/tests/test_unresolved_func.py +0 -7
  309. warp/tests/test_unresolved_symbol.py +0 -7
  310. warp_lang-0.9.0.dist-info/METADATA +0 -20
  311. warp_lang-0.9.0.dist-info/RECORD +0 -177
  312. /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
  313. /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
  314. /warp/tests/{test_square.py → aux_test_square.py} +0 -0
  315. {warp_lang-0.9.0.dist-info → warp_lang-0.11.0.dist-info}/top_level.txt +0 -0
warp/tests/test_dlpack.py CHANGED
@@ -5,13 +5,14 @@
5
5
  # distribution of this software and related documentation without an express
6
6
  # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
7
 
8
- import numpy as np
8
+ import ctypes
9
+ import os
9
10
  import unittest
10
- import sys
11
11
 
12
+ import numpy as np
12
13
 
13
14
  import warp as wp
14
- from warp.tests.test_base import *
15
+ from warp.tests.unittest_utils import *
15
16
 
16
17
  wp.init()
17
18
 
@@ -64,57 +65,69 @@ def test_dlpack_dtypes_and_shapes(test, device):
64
65
  test.assertEqual(a1.shape, a2.shape)
65
66
  test.assertEqual(a1.strides, a2.strides)
66
67
 
67
- # convert vec arrays to float arrays
68
- def wrap_vec_to_float_tensor(vec_dtype):
68
+ # convert vector arrays to scalar arrays
69
+ def wrap_vector_to_scalar_tensor(vec_dtype):
70
+ scalar_type = vec_dtype._wp_scalar_type_
71
+ scalar_size = ctypes.sizeof(vec_dtype._type_)
72
+
69
73
  a1 = wp.zeros(10, dtype=vec_dtype, device=device)
70
- a2 = wp.from_dlpack(wp.to_dlpack(a1), dtype=wp.float32)
74
+ a2 = wp.from_dlpack(wp.to_dlpack(a1), dtype=scalar_type)
71
75
 
72
76
  test.assertEqual(a1.ptr, a2.ptr)
73
77
  test.assertEqual(a1.device, a2.device)
74
78
  test.assertEqual(a2.ndim, a1.ndim + 1)
75
79
  test.assertEqual(a1.dtype, vec_dtype)
76
- test.assertEqual(a2.dtype, wp.float32)
80
+ test.assertEqual(a2.dtype, scalar_type)
77
81
  test.assertEqual(a2.shape, (*a1.shape, vec_dtype._length_))
78
- test.assertEqual(a2.strides, (*a1.strides, 4))
82
+ test.assertEqual(a2.strides, (*a1.strides, scalar_size))
79
83
 
80
- # convert float arrays to vec arrays
81
- def wrap_float_to_vec_tensor(vec_dtype):
82
- a1 = wp.zeros((10, vec_dtype._length_), dtype=wp.float32, device=device)
84
+ # convert scalar arrays to vector arrays
85
+ def wrap_scalar_to_vector_tensor(vec_dtype):
86
+ scalar_type = vec_dtype._wp_scalar_type_
87
+ scalar_size = ctypes.sizeof(vec_dtype._type_)
88
+
89
+ a1 = wp.zeros((10, vec_dtype._length_), dtype=scalar_type, device=device)
83
90
  a2 = wp.from_dlpack(wp.to_dlpack(a1), dtype=vec_dtype)
84
91
 
85
92
  test.assertEqual(a1.ptr, a2.ptr)
86
93
  test.assertEqual(a1.device, a2.device)
87
94
  test.assertEqual(a2.ndim, a1.ndim - 1)
88
- test.assertEqual(a1.dtype, wp.float32)
95
+ test.assertEqual(a1.dtype, scalar_type)
89
96
  test.assertEqual(a2.dtype, vec_dtype)
90
97
  test.assertEqual(a1.shape, (*a2.shape, vec_dtype._length_))
91
- test.assertEqual(a1.strides, (*a2.strides, 4))
98
+ test.assertEqual(a1.strides, (*a2.strides, scalar_size))
99
+
100
+ # convert matrix arrays to scalar arrays
101
+ def wrap_matrix_to_scalar_tensor(mat_dtype):
102
+ scalar_type = mat_dtype._wp_scalar_type_
103
+ scalar_size = ctypes.sizeof(mat_dtype._type_)
92
104
 
93
- # convert mat arrays to float arrays
94
- def wrap_mat_to_float_tensor(mat_dtype):
95
105
  a1 = wp.zeros(10, dtype=mat_dtype, device=device)
96
- a2 = wp.from_dlpack(wp.to_dlpack(a1), dtype=wp.float32)
106
+ a2 = wp.from_dlpack(wp.to_dlpack(a1), dtype=scalar_type)
97
107
 
98
108
  test.assertEqual(a1.ptr, a2.ptr)
99
109
  test.assertEqual(a1.device, a2.device)
100
110
  test.assertEqual(a2.ndim, a1.ndim + 2)
101
111
  test.assertEqual(a1.dtype, mat_dtype)
102
- test.assertEqual(a2.dtype, wp.float32)
112
+ test.assertEqual(a2.dtype, scalar_type)
103
113
  test.assertEqual(a2.shape, (*a1.shape, *mat_dtype._shape_))
104
- test.assertEqual(a2.strides, (*a1.strides, *wp.types.strides_from_shape(mat_dtype._shape_, wp.float32)))
114
+ test.assertEqual(a2.strides, (*a1.strides, scalar_size * mat_dtype._shape_[1], scalar_size))
105
115
 
106
- # convert float arrays to mat arrays
107
- def wrap_float_to_mat_tensor(mat_dtype):
108
- a1 = wp.zeros((10, *mat_dtype._shape_), dtype=wp.float32, device=device)
116
+ # convert scalar arrays to matrix arrays
117
+ def wrap_scalar_to_matrix_tensor(mat_dtype):
118
+ scalar_type = mat_dtype._wp_scalar_type_
119
+ scalar_size = ctypes.sizeof(mat_dtype._type_)
120
+
121
+ a1 = wp.zeros((10, *mat_dtype._shape_), dtype=scalar_type, device=device)
109
122
  a2 = wp.from_dlpack(wp.to_dlpack(a1), dtype=mat_dtype)
110
123
 
111
124
  test.assertEqual(a1.ptr, a2.ptr)
112
125
  test.assertEqual(a1.device, a2.device)
113
126
  test.assertEqual(a2.ndim, a1.ndim - 2)
114
- test.assertEqual(a1.dtype, wp.float32)
127
+ test.assertEqual(a1.dtype, scalar_type)
115
128
  test.assertEqual(a2.dtype, mat_dtype)
116
129
  test.assertEqual(a1.shape, (*a2.shape, *mat_dtype._shape_))
117
- test.assertEqual(a1.strides, (*a2.strides, *wp.types.strides_from_shape(mat_dtype._shape_, wp.float32)))
130
+ test.assertEqual(a1.strides, (*a2.strides, scalar_size * mat_dtype._shape_[1], scalar_size))
118
131
 
119
132
  for t in wp.types.scalar_types:
120
133
  wrap_scalar_tensor_implicit(t)
@@ -132,25 +145,38 @@ def test_dlpack_dtypes_and_shapes(test, device):
132
145
  wrap_scalar_tensor_explicit(wp.int64, wp.uint64)
133
146
  wrap_scalar_tensor_explicit(wp.uint64, wp.int64)
134
147
 
135
- wrap_vec_to_float_tensor(wp.vec2)
136
- wrap_vec_to_float_tensor(wp.vec3)
137
- wrap_vec_to_float_tensor(wp.vec4)
138
- wrap_vec_to_float_tensor(wp.spatial_vector)
139
- wrap_vec_to_float_tensor(wp.transform)
140
-
141
- wrap_float_to_vec_tensor(wp.vec2)
142
- wrap_float_to_vec_tensor(wp.vec3)
143
- wrap_float_to_vec_tensor(wp.vec4)
144
- wrap_float_to_vec_tensor(wp.spatial_vector)
145
- wrap_float_to_vec_tensor(wp.transform)
148
+ vec_types = []
149
+ for t in wp.types.scalar_types:
150
+ for vec_len in [2, 3, 4, 5]:
151
+ vec_types.append(wp.types.vector(vec_len, t))
152
+
153
+ vec_types.append(wp.quath)
154
+ vec_types.append(wp.quatf)
155
+ vec_types.append(wp.quatd)
156
+ vec_types.append(wp.transformh)
157
+ vec_types.append(wp.transformf)
158
+ vec_types.append(wp.transformd)
159
+ vec_types.append(wp.spatial_vectorh)
160
+ vec_types.append(wp.spatial_vectorf)
161
+ vec_types.append(wp.spatial_vectord)
162
+
163
+ for vec_type in vec_types:
164
+ wrap_vector_to_scalar_tensor(vec_type)
165
+ wrap_scalar_to_vector_tensor(vec_type)
166
+
167
+ mat_shapes = [(2, 2), (3, 3), (4, 4), (5, 5), (2, 3), (3, 2), (3, 4), (4, 3)]
168
+ mat_types = []
169
+ for t in wp.types.scalar_types:
170
+ for mat_shape in mat_shapes:
171
+ mat_types.append(wp.types.matrix(mat_shape, t))
146
172
 
147
- wrap_mat_to_float_tensor(wp.mat22)
148
- wrap_mat_to_float_tensor(wp.mat33)
149
- wrap_mat_to_float_tensor(wp.mat44)
173
+ mat_types.append(wp.spatial_matrixh)
174
+ mat_types.append(wp.spatial_matrixf)
175
+ mat_types.append(wp.spatial_matrixd)
150
176
 
151
- wrap_float_to_mat_tensor(wp.mat22)
152
- wrap_float_to_mat_tensor(wp.mat33)
153
- wrap_float_to_mat_tensor(wp.mat44)
177
+ for mat_type in mat_types:
178
+ wrap_matrix_to_scalar_tensor(mat_type)
179
+ wrap_scalar_to_matrix_tensor(mat_type)
154
180
 
155
181
 
156
182
  def test_dlpack_warp_to_torch(test, device):
@@ -274,75 +300,77 @@ def test_dlpack_jax_to_warp(test, device):
274
300
  assert_np_equal(a2.numpy(), np.asarray(j))
275
301
 
276
302
 
277
- def register(parent):
278
- class TestDLPack(parent):
279
- pass
280
-
281
- devices = get_test_devices()
282
-
283
- add_function_test(TestDLPack, "test_dlpack_warp_to_warp", test_dlpack_warp_to_warp, devices=devices)
284
- add_function_test(TestDLPack, "test_dlpack_dtypes_and_shapes", test_dlpack_dtypes_and_shapes, devices=devices)
285
-
286
- # torch interop via dlpack
287
- try:
288
- import torch
289
- import torch.utils.dlpack
290
-
291
- # check which Warp devices work with Torch
292
- # CUDA devices may fail if Torch was not compiled with CUDA support
293
- test_devices = get_test_devices()
294
- torch_compatible_devices = []
295
- for d in test_devices:
296
- try:
297
- t = torch.arange(10, device=wp.device_to_torch(d))
298
- t += 1
299
- torch_compatible_devices.append(d)
300
- except Exception as e:
301
- print(f"Skipping Torch DLPack tests on device '{d}' due to exception: {e}")
302
-
303
- if torch_compatible_devices:
304
- add_function_test(
305
- TestDLPack, "test_dlpack_warp_to_torch", test_dlpack_warp_to_torch, devices=torch_compatible_devices
306
- )
307
- add_function_test(
308
- TestDLPack, "test_dlpack_torch_to_warp", test_dlpack_torch_to_warp, devices=torch_compatible_devices
309
- )
310
-
311
- except Exception as e:
312
- print(f"Skipping Torch DLPack tests due to exception: {e}")
313
-
314
- # jax interop via dlpack
315
- try:
316
- import jax
317
- import jax.dlpack
318
-
319
- # check which Warp devices work with Jax
320
- # CUDA devices may fail if Jax cannot find a CUDA Toolkit
321
- test_devices = get_test_devices()
322
- jax_compatible_devices = []
323
- for d in test_devices:
324
- try:
325
- with jax.default_device(wp.device_to_jax(d)):
326
- j = jax.numpy.arange(10, dtype=jax.numpy.float32)
327
- j += 1
328
- jax_compatible_devices.append(d)
329
- except Exception as e:
330
- print(f"Skipping Jax DLPack tests on device '{d}' due to exception: {e}")
331
-
332
- if jax_compatible_devices:
333
- add_function_test(
334
- TestDLPack, "test_dlpack_warp_to_jax", test_dlpack_warp_to_jax, devices=jax_compatible_devices
335
- )
336
- add_function_test(
337
- TestDLPack, "test_dlpack_jax_to_warp", test_dlpack_jax_to_warp, devices=jax_compatible_devices
338
- )
339
-
340
- except Exception as e:
341
- print(f"Skipping Jax DLPack tests due to exception: {e}")
342
-
343
- return TestDLPack
303
+ class TestDLPack(unittest.TestCase):
304
+ pass
305
+
306
+
307
+ devices = get_test_devices()
308
+
309
+ add_function_test(TestDLPack, "test_dlpack_warp_to_warp", test_dlpack_warp_to_warp, devices=devices)
310
+ add_function_test(TestDLPack, "test_dlpack_dtypes_and_shapes", test_dlpack_dtypes_and_shapes, devices=devices)
311
+
312
+ # torch interop via dlpack
313
+ try:
314
+ import torch
315
+ import torch.utils.dlpack
316
+
317
+ # check which Warp devices work with Torch
318
+ # CUDA devices may fail if Torch was not compiled with CUDA support
319
+ test_devices = get_test_devices()
320
+ torch_compatible_devices = []
321
+ for d in test_devices:
322
+ try:
323
+ t = torch.arange(10, device=wp.device_to_torch(d))
324
+ t += 1
325
+ torch_compatible_devices.append(d)
326
+ except Exception as e:
327
+ print(f"Skipping Torch DLPack tests on device '{d}' due to exception: {e}")
328
+
329
+ if torch_compatible_devices:
330
+ add_function_test(
331
+ TestDLPack, "test_dlpack_warp_to_torch", test_dlpack_warp_to_torch, devices=torch_compatible_devices
332
+ )
333
+ add_function_test(
334
+ TestDLPack, "test_dlpack_torch_to_warp", test_dlpack_torch_to_warp, devices=torch_compatible_devices
335
+ )
336
+
337
+ except Exception as e:
338
+ print(f"Skipping Torch DLPack tests due to exception: {e}")
339
+
340
+ # jax interop via dlpack
341
+ try:
342
+ # prevent Jax from gobbling up GPU memory
343
+ os.environ["XLA_PYTHON_CLIENT_PREALLOCATE"] = "false"
344
+ os.environ["XLA_PYTHON_CLIENT_ALLOCATOR"] = "platform"
345
+
346
+ import jax
347
+ import jax.dlpack
348
+
349
+ # check which Warp devices work with Jax
350
+ # CUDA devices may fail if Jax cannot find a CUDA Toolkit
351
+ test_devices = get_test_devices()
352
+ jax_compatible_devices = []
353
+ for d in test_devices:
354
+ try:
355
+ with jax.default_device(wp.device_to_jax(d)):
356
+ j = jax.numpy.arange(10, dtype=jax.numpy.float32)
357
+ j += 1
358
+ jax_compatible_devices.append(d)
359
+ except Exception as e:
360
+ print(f"Skipping Jax DLPack tests on device '{d}' due to exception: {e}")
361
+
362
+ if jax_compatible_devices:
363
+ add_function_test(
364
+ TestDLPack, "test_dlpack_warp_to_jax", test_dlpack_warp_to_jax, devices=jax_compatible_devices
365
+ )
366
+ add_function_test(
367
+ TestDLPack, "test_dlpack_jax_to_warp", test_dlpack_jax_to_warp, devices=jax_compatible_devices
368
+ )
369
+
370
+ except Exception as e:
371
+ print(f"Skipping Jax DLPack tests due to exception: {e}")
344
372
 
345
373
 
346
374
  if __name__ == "__main__":
347
- c = register(unittest.TestCase)
375
+ wp.build.clear_kernel_cache()
348
376
  unittest.main(verbosity=2)
@@ -0,0 +1,277 @@
1
+ # Copyright (c) 2023 NVIDIA CORPORATION. All rights reserved.
2
+ # NVIDIA CORPORATION and its licensors retain all intellectual property
3
+ # and proprietary rights in and to this software, related documentation
4
+ # and any modifications thereto. Any use, reproduction, disclosure or
5
+ # distribution of this software and related documentation without an express
6
+ # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
+
8
+ import importlib
9
+ import os
10
+ import unittest
11
+
12
+ import warp as wp
13
+ from warp.tests.unittest_utils import (
14
+ USD_AVAILABLE,
15
+ get_test_devices,
16
+ get_unique_cuda_test_devices,
17
+ sanitize_identifier,
18
+ )
19
+
20
+ wp.init()
21
+
22
+
23
+ # registers an example to run as a TestCase
24
+ def add_example_test(cls, name, devices=None, options={}):
25
+ def run(test, device):
26
+ # The copy() is needed because pop() is used to avoid passing extra args to Example()
27
+ # Can remove once all examples accept **kwargs and we no longer need to pop()
28
+ test_options = options.copy()
29
+
30
+ try:
31
+ module = importlib.import_module(f"examples.{name}")
32
+
33
+ torch_cuda_required = test_options.setdefault("torch_cuda_required", False)
34
+ test_options.pop("torch_cuda_required", None)
35
+ if torch_cuda_required and wp.get_device(device).is_cuda:
36
+ # Ensure torch has CUDA support
37
+ import torch
38
+
39
+ if not torch.cuda.is_available():
40
+ test.skipTest("Torch not compiled with CUDA support")
41
+
42
+ except Exception as e:
43
+ test.skipTest(f"{e}")
44
+
45
+ # create default USD stage output path which many examples expect
46
+ test_options.setdefault(
47
+ "stage",
48
+ os.path.join(os.path.dirname(__file__), f"outputs/{name}_{sanitize_identifier(device)}.usd")
49
+ if USD_AVAILABLE
50
+ else None,
51
+ )
52
+
53
+ if test_options["stage"]:
54
+ try:
55
+ os.remove(test_options["stage"])
56
+ except OSError:
57
+ pass
58
+
59
+ num_frames = test_options.get("num_frames", 10)
60
+ test_options.pop("num_frames", None)
61
+
62
+ # Don't want to force load all modules by default for serial test runner
63
+ wp.config.graph_capture_module_load_default = False
64
+
65
+ try:
66
+ enable_backward = test_options.get("enable_backward", True)
67
+ wp.set_module_options({"enable_backward": enable_backward}, module)
68
+ test_options.pop("enable_backward", None)
69
+
70
+ with wp.ScopedDevice(device):
71
+ wp.load_module(module, device=wp.get_device())
72
+ extra_load_modules = test_options.get("load_modules", [])
73
+ for module_name in extra_load_modules:
74
+ wp.load_module(module_name, device=wp.get_device())
75
+ test_options.pop("load_modules", None)
76
+
77
+ e = module.Example(**test_options)
78
+
79
+ # disable scoped timer to avoid log spam from time steps
80
+ wp.ScopedTimer.enabled = False
81
+
82
+ for _ in range(num_frames):
83
+ e.update()
84
+ e.render()
85
+ except Exception as e:
86
+ test.fail(f"{e}")
87
+ finally:
88
+ wp.ScopedTimer.enabled = True
89
+ wp.config.graph_capture_module_load_default = True
90
+
91
+ from warp.tests.unittest_utils import add_function_test
92
+
93
+ add_function_test(cls, f"test_{name}", run, devices=devices, check_output=False)
94
+
95
+
96
+ # TODO: Make the example classes use the passed in device
97
+ cuda_test_devices = get_unique_cuda_test_devices()
98
+ test_devices = get_test_devices()
99
+
100
+ # NOTE: To give the parallel test runner more opportunities to parallelize test cases,
101
+ # we break up the tests into multiple TestCase classes that should be non-conflicting
102
+ # w.r.t. kernel compilation
103
+
104
+
105
+ class TestExamples(unittest.TestCase):
106
+ pass
107
+
108
+
109
+ # Exclude unless we can run headless somehow
110
+ # add_example_test(TestExamples, name="example_render_opengl", options={})
111
+
112
+ add_example_test(TestExamples, name="example_dem", devices=cuda_test_devices)
113
+ add_example_test(TestExamples, name="example_diffray", devices=cuda_test_devices)
114
+ add_example_test(TestExamples, name="example_fluid", devices=cuda_test_devices)
115
+ add_example_test(TestExamples, name="example_jacobian_ik", devices=cuda_test_devices)
116
+ add_example_test(TestExamples, name="example_marching_cubes", devices=cuda_test_devices)
117
+ add_example_test(TestExamples, name="example_mesh", devices=cuda_test_devices)
118
+ add_example_test(TestExamples, name="example_mesh_intersect", devices=cuda_test_devices, options={"num_frames": 1})
119
+ add_example_test(TestExamples, name="example_nvdb", devices=cuda_test_devices)
120
+ add_example_test(TestExamples, name="example_raycast", devices=cuda_test_devices)
121
+ add_example_test(TestExamples, name="example_raymarch", devices=cuda_test_devices)
122
+ add_example_test(TestExamples, name="example_sph", devices=cuda_test_devices)
123
+ add_example_test(TestExamples, name="example_wave", devices=cuda_test_devices, options={"resx": 256, "resy": 256})
124
+
125
+
126
+ class TestSimExamples(unittest.TestCase):
127
+ pass
128
+
129
+
130
+ add_example_test(
131
+ TestSimExamples,
132
+ name="example_sim_cartpole",
133
+ devices=cuda_test_devices,
134
+ options={"load_modules": ["warp.sim.collide", "warp.sim.integrator_euler", "warp.sim.articulation"]},
135
+ )
136
+ add_example_test(
137
+ TestSimExamples,
138
+ name="example_sim_cloth",
139
+ devices=cuda_test_devices,
140
+ options={"load_modules": ["warp.sim.collide", "warp.sim.integrator_euler", "warp.sim.particles"]},
141
+ )
142
+ add_example_test(TestSimExamples, name="example_sim_fk_grad", devices=cuda_test_devices)
143
+ add_example_test(
144
+ TestSimExamples, name="example_sim_fk_grad_torch", devices=cuda_test_devices, options={"torch_cuda_required": True}
145
+ )
146
+ add_example_test(
147
+ TestSimExamples,
148
+ name="example_sim_grad_bounce",
149
+ devices=cuda_test_devices,
150
+ options={"load_modules": ["warp.sim.integrator_euler", "warp.sim.particles"]},
151
+ )
152
+ add_example_test(
153
+ TestSimExamples,
154
+ name="example_sim_grad_cloth",
155
+ devices=cuda_test_devices,
156
+ options={"load_modules": ["warp.sim.integrator_euler", "warp.sim.particles"]},
157
+ )
158
+ add_example_test(TestSimExamples, name="example_sim_granular", devices=cuda_test_devices)
159
+ add_example_test(TestSimExamples, name="example_sim_granular_collision_sdf", devices=cuda_test_devices)
160
+ add_example_test(TestSimExamples, name="example_sim_neo_hookean", devices=cuda_test_devices)
161
+ add_example_test(TestSimExamples, name="example_sim_particle_chain", devices=cuda_test_devices)
162
+ add_example_test(
163
+ TestSimExamples,
164
+ name="example_sim_quadruped",
165
+ devices=cuda_test_devices,
166
+ options={"load_modules": ["warp.sim.integrator_xpbd", "warp.sim.integrator_euler"]},
167
+ )
168
+ add_example_test(
169
+ TestSimExamples,
170
+ name="example_sim_rigid_chain",
171
+ devices=cuda_test_devices,
172
+ options={"load_modules": ["warp.sim.integrator_xpbd", "warp.sim.integrator_euler"]},
173
+ )
174
+ add_example_test(
175
+ TestSimExamples,
176
+ name="example_sim_rigid_contact",
177
+ devices=cuda_test_devices,
178
+ options={"load_modules": ["warp.sim.integrator_euler"]},
179
+ )
180
+ add_example_test(TestSimExamples, name="example_sim_rigid_fem", devices=cuda_test_devices)
181
+ add_example_test(TestSimExamples, name="example_sim_rigid_force", devices=cuda_test_devices)
182
+ add_example_test(TestSimExamples, name="example_sim_rigid_gyroscopic", devices=cuda_test_devices)
183
+ add_example_test(TestSimExamples, name="example_sim_rigid_kinematics", devices=cuda_test_devices)
184
+ add_example_test(TestSimExamples, name="example_sim_trajopt", devices=cuda_test_devices)
185
+
186
+
187
+ class TestFemExamples(unittest.TestCase):
188
+ pass
189
+
190
+
191
+ add_example_test(
192
+ TestFemExamples,
193
+ name="fem.example_diffusion_mgpu",
194
+ devices=cuda_test_devices,
195
+ options={"quiet": True, "num_frames": 1, "enable_backward": False},
196
+ )
197
+
198
+ # The following examples do not need CUDA
199
+ add_example_test(
200
+ TestFemExamples,
201
+ name="fem.example_apic_fluid",
202
+ devices=test_devices,
203
+ options={"quiet": True, "res": [16, 16, 16], "enable_backward": False},
204
+ )
205
+ add_example_test(
206
+ TestFemExamples,
207
+ name="fem.example_diffusion",
208
+ devices=test_devices,
209
+ options={"quiet": True, "resolution": 10, "mesh": "tri", "num_frames": 1, "enable_backward": False},
210
+ )
211
+ add_example_test(
212
+ TestFemExamples,
213
+ name="fem.example_diffusion_3d",
214
+ devices=test_devices,
215
+ options={"quiet": True, "resolution": 10, "num_frames": 1, "enable_backward": False},
216
+ )
217
+ add_example_test(
218
+ TestFemExamples,
219
+ name="fem.example_deformed_geometry",
220
+ devices=test_devices,
221
+ options={"quiet": True, "resolution": 10, "num_frames": 1, "mesh": "tri", "enable_backward": False},
222
+ )
223
+ add_example_test(
224
+ TestFemExamples,
225
+ name="fem.example_convection_diffusion",
226
+ devices=test_devices,
227
+ options={"quiet": True, "resolution": 20, "enable_backward": False},
228
+ )
229
+ add_example_test(
230
+ TestExamples,
231
+ name="fem.example_convection_diffusion_dg0",
232
+ devices=test_devices,
233
+ options={"quiet": True, "resolution": 20, "num_frames": 25, "mesh": "quad", "enable_backward": False},
234
+ )
235
+ add_example_test(
236
+ TestExamples,
237
+ name="fem.example_convection_diffusion_dg",
238
+ devices=test_devices,
239
+ options={"quiet": True, "resolution": 20, "num_frames": 25, "mesh": "tri", "enable_backward": False},
240
+ )
241
+ add_example_test(
242
+ TestFemExamples,
243
+ name="fem.example_mixed_elasticity",
244
+ devices=test_devices,
245
+ options={"quiet": True, "nonconforming_stresses": True, "mesh": "quad", "num_frames": 1, "enable_backward": False},
246
+ )
247
+ add_example_test(
248
+ TestFemExamples,
249
+ name="fem.example_stokes_transfer",
250
+ devices=test_devices,
251
+ options={"quiet": True, "num_frames": 1, "enable_backward": False},
252
+ )
253
+ add_example_test(
254
+ TestExamples,
255
+ name="fem.example_stokes",
256
+ devices=test_devices,
257
+ options={
258
+ "quiet": True,
259
+ "num_frames": 1,
260
+ "resolution": 10,
261
+ "nonconforming_pressures": True,
262
+ "enable_backward": False,
263
+ },
264
+ )
265
+ add_example_test(
266
+ TestExamples,
267
+ name="fem.example_navier_stokes",
268
+ devices=test_devices,
269
+ options={"quiet": True, "num_frames": 100, "resolution": 10, "tri_mesh": True, "enable_backward": False},
270
+ )
271
+
272
+
273
+ if __name__ == "__main__":
274
+ # force rebuild of all kernels
275
+ wp.build.clear_kernel_cache()
276
+
277
+ unittest.main(verbosity=2, failfast=True)