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
@@ -0,0 +1,221 @@
1
+ import warp as wp
2
+
3
+ from warp.fem.types import ElementIndex, Coords
4
+ from warp.fem.geometry import Trimesh2D
5
+ from warp.fem import cache
6
+
7
+ from .topology import SpaceTopology, DiscontinuousSpaceTopologyMixin, forward_base_topology
8
+ from .basis_space import ShapeBasisSpace, TraceBasisSpace
9
+
10
+ from .shape import ShapeFunction, ConstantShapeFunction
11
+ from .shape import Triangle2DPolynomialShapeFunctions, Triangle2DNonConformingPolynomialShapeFunctions
12
+
13
+
14
+ @wp.struct
15
+ class Trimesh2DTopologyArg:
16
+ edge_vertex_indices: wp.array(dtype=wp.vec2i)
17
+ tri_edge_indices: wp.array2d(dtype=int)
18
+
19
+ vertex_count: int
20
+ edge_count: int
21
+
22
+
23
+ class Trimesh2DSpaceTopology(SpaceTopology):
24
+ TopologyArg = Trimesh2DTopologyArg
25
+
26
+ def __init__(self, mesh: Trimesh2D, shape: ShapeFunction):
27
+ super().__init__(mesh, shape.NODES_PER_ELEMENT)
28
+ self._mesh = mesh
29
+ self._shape = shape
30
+
31
+ self._compute_tri_edge_indices()
32
+
33
+ @cache.cached_arg_value
34
+ def topo_arg_value(self, device):
35
+ arg = Trimesh2DTopologyArg()
36
+ arg.tri_edge_indices = self._tri_edge_indices.to(device)
37
+ arg.edge_vertex_indices = self._mesh.edge_vertex_indices.to(device)
38
+
39
+ arg.vertex_count = self._mesh.vertex_count()
40
+ arg.edge_count = self._mesh.side_count()
41
+ return arg
42
+
43
+ def _compute_tri_edge_indices(self):
44
+ self._tri_edge_indices = wp.empty(
45
+ dtype=int, device=self._mesh.tri_vertex_indices.device, shape=(self._mesh.cell_count(), 3)
46
+ )
47
+
48
+ wp.launch(
49
+ kernel=Trimesh2DSpaceTopology._compute_tri_edge_indices_kernel,
50
+ dim=self._mesh.edge_tri_indices.shape,
51
+ device=self._mesh.tri_vertex_indices.device,
52
+ inputs=[
53
+ self._mesh.edge_tri_indices,
54
+ self._mesh.edge_vertex_indices,
55
+ self._mesh.tri_vertex_indices,
56
+ self._tri_edge_indices,
57
+ ],
58
+ )
59
+
60
+ @wp.func
61
+ def _find_edge_index_in_tri(
62
+ edge_vtx: wp.vec2i,
63
+ tri_vtx: wp.vec3i,
64
+ ):
65
+ for k in range(2):
66
+ if (edge_vtx[0] == tri_vtx[k] and edge_vtx[1] == tri_vtx[k + 1]) or (
67
+ edge_vtx[1] == tri_vtx[k] and edge_vtx[0] == tri_vtx[k + 1]
68
+ ):
69
+ return k
70
+ return 2
71
+
72
+ @wp.kernel
73
+ def _compute_tri_edge_indices_kernel(
74
+ edge_tri_indices: wp.array(dtype=wp.vec2i),
75
+ edge_vertex_indices: wp.array(dtype=wp.vec2i),
76
+ tri_vertex_indices: wp.array2d(dtype=int),
77
+ tri_edge_indices: wp.array2d(dtype=int),
78
+ ):
79
+ e = wp.tid()
80
+
81
+ edge_vtx = edge_vertex_indices[e]
82
+ edge_tris = edge_tri_indices[e]
83
+
84
+ t0 = edge_tris[0]
85
+ t0_vtx = wp.vec3i(tri_vertex_indices[t0, 0], tri_vertex_indices[t0, 1], tri_vertex_indices[t0, 2])
86
+ t0_edge = Trimesh2DSpaceTopology._find_edge_index_in_tri(edge_vtx, t0_vtx)
87
+ tri_edge_indices[t0, t0_edge] = e
88
+
89
+ t1 = edge_tris[1]
90
+ if t1 != t0:
91
+ t1_vtx = wp.vec3i(tri_vertex_indices[t1, 0], tri_vertex_indices[t1, 1], tri_vertex_indices[t1, 2])
92
+ t1_edge = Trimesh2DSpaceTopology._find_edge_index_in_tri(edge_vtx, t1_vtx)
93
+ tri_edge_indices[t1, t1_edge] = e
94
+
95
+
96
+ class Trimesh2DDiscontinuousSpaceTopology(
97
+ DiscontinuousSpaceTopologyMixin,
98
+ SpaceTopology,
99
+ ):
100
+ def __init__(self, mesh: Trimesh2D, shape: ShapeFunction):
101
+ super().__init__(mesh, shape.NODES_PER_ELEMENT)
102
+
103
+
104
+ class Trimesh2DBasisSpace(ShapeBasisSpace):
105
+ def __init__(self, topology: Trimesh2DSpaceTopology, shape: ShapeFunction):
106
+ super().__init__(topology, shape)
107
+
108
+ self._mesh: Trimesh2D = topology.geometry
109
+
110
+
111
+ class Trimesh2DPiecewiseConstantBasis(Trimesh2DBasisSpace):
112
+ def __init__(self, mesh: Trimesh2D):
113
+ shape = ConstantShapeFunction(mesh.reference_cell(), space_dimension=2)
114
+ topology = Trimesh2DDiscontinuousSpaceTopology(mesh, shape)
115
+ super().__init__(shape=shape, topology=topology)
116
+
117
+ class Trace(TraceBasisSpace):
118
+ @wp.func
119
+ def _node_coords_in_element(
120
+ side_arg: Trimesh2D.SideArg,
121
+ basis_arg: Trimesh2DBasisSpace.BasisArg,
122
+ element_index: ElementIndex,
123
+ node_index_in_element: int,
124
+ ):
125
+ return Coords(0.5, 0.0, 0.0)
126
+
127
+ def make_node_coords_in_element(self):
128
+ return self._node_coords_in_element
129
+
130
+ def trace(self):
131
+ return Trimesh2DPiecewiseConstantBasis.Trace(self)
132
+
133
+
134
+ class Trimesh2DPolynomialSpaceTopology(Trimesh2DSpaceTopology):
135
+ def __init__(self, mesh: Trimesh2D, shape: Triangle2DPolynomialShapeFunctions):
136
+ super().__init__(mesh, shape)
137
+
138
+ self.element_node_index = self._make_element_node_index()
139
+
140
+ def node_count(self) -> int:
141
+ INTERIOR_NODES_PER_SIDE = max(0, self._shape.ORDER - 1)
142
+ INTERIOR_NODES_PER_CELL = max(0, self._shape.ORDER - 2) * max(0, self._shape.ORDER - 1) // 2
143
+
144
+ return (
145
+ self._mesh.vertex_count()
146
+ + self._mesh.side_count() * INTERIOR_NODES_PER_SIDE
147
+ + self._mesh.cell_count() * INTERIOR_NODES_PER_CELL
148
+ )
149
+
150
+ def _make_element_node_index(self):
151
+ INTERIOR_NODES_PER_SIDE = wp.constant(max(0, self._shape.ORDER - 1))
152
+ INTERIOR_NODES_PER_CELL = wp.constant(max(0, self._shape.ORDER - 2) * max(0, self._shape.ORDER - 1) // 2)
153
+
154
+ @cache.dynamic_func(suffix=self.name)
155
+ def element_node_index(
156
+ geo_arg: Trimesh2D.CellArg,
157
+ topo_arg: Trimesh2DTopologyArg,
158
+ element_index: ElementIndex,
159
+ node_index_in_elt: int,
160
+ ):
161
+ node_type, type_index = self._shape.node_type_and_type_index(node_index_in_elt)
162
+
163
+ if node_type == Triangle2DPolynomialShapeFunctions.VERTEX:
164
+ return geo_arg.tri_vertex_indices[element_index][type_index]
165
+
166
+ global_offset = topo_arg.vertex_count
167
+
168
+ if node_type == Triangle2DPolynomialShapeFunctions.EDGE:
169
+ edge = type_index // INTERIOR_NODES_PER_SIDE
170
+ edge_node = type_index - INTERIOR_NODES_PER_SIDE * edge
171
+
172
+ global_edge_index = topo_arg.tri_edge_indices[element_index][edge]
173
+
174
+ if (
175
+ topo_arg.edge_vertex_indices[global_edge_index][0]
176
+ != geo_arg.tri_vertex_indices[element_index][edge]
177
+ ):
178
+ edge_node = INTERIOR_NODES_PER_SIDE - 1 - edge_node
179
+
180
+ return global_offset + INTERIOR_NODES_PER_SIDE * global_edge_index + edge_node
181
+
182
+ global_offset += INTERIOR_NODES_PER_SIDE * topo_arg.edge_count
183
+ return global_offset + INTERIOR_NODES_PER_CELL * element_index + type_index
184
+
185
+ return element_node_index
186
+
187
+
188
+ class Trimesh2DPolynomialBasisSpace(Trimesh2DBasisSpace):
189
+ def __init__(
190
+ self,
191
+ mesh: Trimesh2D,
192
+ degree: int,
193
+ ):
194
+ shape = Triangle2DPolynomialShapeFunctions(degree)
195
+ topology = forward_base_topology(Trimesh2DPolynomialSpaceTopology, mesh, shape)
196
+
197
+ super().__init__(topology, shape)
198
+
199
+
200
+ class Trimesh2DDGPolynomialBasisSpace(Trimesh2DBasisSpace):
201
+ def __init__(
202
+ self,
203
+ mesh: Trimesh2D,
204
+ degree: int,
205
+ ):
206
+ shape = Triangle2DPolynomialShapeFunctions(degree)
207
+ topology = Trimesh2DDiscontinuousSpaceTopology(mesh, shape)
208
+
209
+ super().__init__(topology, shape)
210
+
211
+
212
+ class Trimesh2DNonConformingPolynomialBasisSpace(Trimesh2DBasisSpace):
213
+ def __init__(
214
+ self,
215
+ mesh: Trimesh2D,
216
+ degree: int,
217
+ ):
218
+ shape = Triangle2DNonConformingPolynomialShapeFunctions(degree)
219
+ topology = Trimesh2DDiscontinuousSpaceTopology(mesh, shape)
220
+
221
+ super().__init__(topology, shape)
warp/fem/types.py ADDED
@@ -0,0 +1,77 @@
1
+ import warp as wp
2
+
3
+ # kept to avoid breaking existing example code, no longer used internally
4
+ vec2i = wp.vec2i
5
+ vec3i = wp.vec3i
6
+ vec4i = wp.vec4i
7
+
8
+ Coords = wp.vec3
9
+ OUTSIDE = wp.constant(-1.0e8)
10
+
11
+ ElementIndex = int
12
+ QuadraturePointIndex = int
13
+ NodeIndex = int
14
+
15
+ NULL_ELEMENT_INDEX = wp.constant(-1)
16
+ NULL_QP_INDEX = wp.constant(-1)
17
+ NULL_NODE_INDEX = wp.constant(-1)
18
+
19
+ DofIndex = wp.vec2i
20
+ """Opaque descriptor for indexing degrees of freedom within elements"""
21
+ NULL_DOF_INDEX = wp.constant(DofIndex(-1, -1))
22
+
23
+
24
+ @wp.func
25
+ def get_node_index_in_element(dof_idx: DofIndex):
26
+ return dof_idx[0]
27
+
28
+
29
+ @wp.func
30
+ def get_node_coord(dof_idx: DofIndex):
31
+ return dof_idx[1]
32
+
33
+
34
+ @wp.struct
35
+ class NodeElementIndex:
36
+ domain_element_index: ElementIndex
37
+ node_index_in_element: int
38
+
39
+
40
+ @wp.struct
41
+ class Sample:
42
+ """Per-sample point context for evaluating fields and related operators in integrands"""
43
+
44
+ element_index: ElementIndex
45
+ """Index of the geometry element the sample point is in"""
46
+ element_coords: Coords
47
+ """Coordinates of the sample point inside the element"""
48
+ qp_index: QuadraturePointIndex = NULL_QP_INDEX
49
+ """If the sample corresponds to a quadrature point, its global index"""
50
+ qp_weight: float = 0.0
51
+ """If the sample corresponds to a quadrature point, its weight"""
52
+ test_dof: DofIndex = NULL_DOF_INDEX
53
+ """For linear of bilinear form assembly, index of the test degree-of-freedom currently being considered"""
54
+ trial_dof: DofIndex = NULL_DOF_INDEX
55
+ """For bilinear form assembly, index of the trial degree-of-freedom currently being considered"""
56
+
57
+
58
+ @wp.func
59
+ def make_free_sample(element_index: ElementIndex, element_coords: Coords):
60
+ """Returns a :class:`Sample` that is not associated to any quadrature point or dof"""
61
+ return Sample(element_index, element_coords, NULL_QP_INDEX, 0.0, NULL_DOF_INDEX, NULL_DOF_INDEX)
62
+
63
+
64
+ class Field:
65
+ """
66
+ Tag for field-like integrand arguments
67
+ """
68
+
69
+ call_operator: "warp.fem.operator.Operator" = None # Set in operator.py
70
+
71
+
72
+ class Domain:
73
+ """
74
+ Tag for domain-like integrand arguments
75
+ """
76
+
77
+ call_operator: "warp.fem.operator.Operator" = None # Set in operator.py