warp-lang 0.10.1__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 (300) hide show
  1. warp/__init__.py +10 -4
  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 +5 -3
  6. warp/build_dll.py +29 -9
  7. warp/builtins.py +868 -507
  8. warp/codegen.py +1074 -638
  9. warp/config.py +3 -3
  10. warp/constants.py +6 -0
  11. warp/context.py +715 -222
  12. warp/fabric.py +326 -0
  13. warp/fem/__init__.py +27 -0
  14. warp/fem/cache.py +389 -0
  15. warp/fem/dirichlet.py +181 -0
  16. warp/fem/domain.py +263 -0
  17. warp/fem/field/__init__.py +101 -0
  18. warp/fem/field/field.py +149 -0
  19. warp/fem/field/nodal_field.py +299 -0
  20. warp/fem/field/restriction.py +21 -0
  21. warp/fem/field/test.py +181 -0
  22. warp/fem/field/trial.py +183 -0
  23. warp/fem/geometry/__init__.py +19 -0
  24. warp/fem/geometry/closest_point.py +70 -0
  25. warp/fem/geometry/deformed_geometry.py +271 -0
  26. warp/fem/geometry/element.py +744 -0
  27. warp/fem/geometry/geometry.py +186 -0
  28. warp/fem/geometry/grid_2d.py +373 -0
  29. warp/fem/geometry/grid_3d.py +435 -0
  30. warp/fem/geometry/hexmesh.py +953 -0
  31. warp/fem/geometry/partition.py +376 -0
  32. warp/fem/geometry/quadmesh_2d.py +532 -0
  33. warp/fem/geometry/tetmesh.py +840 -0
  34. warp/fem/geometry/trimesh_2d.py +577 -0
  35. warp/fem/integrate.py +1616 -0
  36. warp/fem/operator.py +191 -0
  37. warp/fem/polynomial.py +213 -0
  38. warp/fem/quadrature/__init__.py +2 -0
  39. warp/fem/quadrature/pic_quadrature.py +245 -0
  40. warp/fem/quadrature/quadrature.py +294 -0
  41. warp/fem/space/__init__.py +292 -0
  42. warp/fem/space/basis_space.py +489 -0
  43. warp/fem/space/collocated_function_space.py +105 -0
  44. warp/fem/space/dof_mapper.py +236 -0
  45. warp/fem/space/function_space.py +145 -0
  46. warp/fem/space/grid_2d_function_space.py +267 -0
  47. warp/fem/space/grid_3d_function_space.py +306 -0
  48. warp/fem/space/hexmesh_function_space.py +352 -0
  49. warp/fem/space/partition.py +350 -0
  50. warp/fem/space/quadmesh_2d_function_space.py +369 -0
  51. warp/fem/space/restriction.py +160 -0
  52. warp/fem/space/shape/__init__.py +15 -0
  53. warp/fem/space/shape/cube_shape_function.py +738 -0
  54. warp/fem/space/shape/shape_function.py +103 -0
  55. warp/fem/space/shape/square_shape_function.py +611 -0
  56. warp/fem/space/shape/tet_shape_function.py +567 -0
  57. warp/fem/space/shape/triangle_shape_function.py +429 -0
  58. warp/fem/space/tetmesh_function_space.py +292 -0
  59. warp/fem/space/topology.py +295 -0
  60. warp/fem/space/trimesh_2d_function_space.py +221 -0
  61. warp/fem/types.py +77 -0
  62. warp/fem/utils.py +495 -0
  63. warp/native/array.h +147 -44
  64. warp/native/builtin.h +122 -149
  65. warp/native/bvh.cpp +73 -325
  66. warp/native/bvh.cu +406 -23
  67. warp/native/bvh.h +34 -43
  68. warp/native/clang/clang.cpp +13 -8
  69. warp/native/crt.h +2 -0
  70. warp/native/cuda_crt.h +5 -0
  71. warp/native/cuda_util.cpp +15 -3
  72. warp/native/cuda_util.h +3 -1
  73. warp/native/cutlass/tools/library/scripts/conv2d_operation.py +463 -0
  74. warp/native/cutlass/tools/library/scripts/conv3d_operation.py +321 -0
  75. warp/native/cutlass/tools/library/scripts/gemm_operation.py +988 -0
  76. warp/native/cutlass/tools/library/scripts/generator.py +4625 -0
  77. warp/native/cutlass/tools/library/scripts/library.py +799 -0
  78. warp/native/cutlass/tools/library/scripts/manifest.py +402 -0
  79. warp/native/cutlass/tools/library/scripts/pycutlass/docs/source/conf.py +96 -0
  80. warp/native/cutlass/tools/library/scripts/pycutlass/profile/conv/conv2d_f16_sm80.py +106 -0
  81. warp/native/cutlass/tools/library/scripts/pycutlass/profile/gemm/gemm_f32_sm80.py +91 -0
  82. warp/native/cutlass/tools/library/scripts/pycutlass/setup.py +80 -0
  83. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/__init__.py +48 -0
  84. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/arguments.py +118 -0
  85. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/c_types.py +241 -0
  86. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/compiler.py +432 -0
  87. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/conv2d_operation.py +631 -0
  88. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/epilogue.py +1026 -0
  89. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/frontend.py +104 -0
  90. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/gemm_operation.py +1276 -0
  91. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/library.py +744 -0
  92. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/memory_manager.py +74 -0
  93. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/operation.py +110 -0
  94. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/parser.py +619 -0
  95. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/reduction_operation.py +398 -0
  96. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/tensor_ref.py +70 -0
  97. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/__init__.py +4 -0
  98. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/conv2d_testbed.py +646 -0
  99. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_grouped_testbed.py +235 -0
  100. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_testbed.py +557 -0
  101. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/profiler.py +70 -0
  102. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/type_hint.py +39 -0
  103. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/__init__.py +1 -0
  104. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/device.py +76 -0
  105. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/reference_model.py +255 -0
  106. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/__init__.py +0 -0
  107. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +201 -0
  108. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +177 -0
  109. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +98 -0
  110. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +95 -0
  111. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_few_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +163 -0
  112. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_fixed_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +187 -0
  113. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +309 -0
  114. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +54 -0
  115. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
  116. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
  117. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_strided_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +253 -0
  118. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +97 -0
  119. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +242 -0
  120. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
  121. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
  122. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/run_all_tests.py +10 -0
  123. warp/native/cutlass/tools/library/scripts/pycutlass/test/frontend/test_frontend.py +146 -0
  124. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/__init__.py +0 -0
  125. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_bf16_sm80.py +96 -0
  126. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f16_sm80.py +447 -0
  127. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f32_sm80.py +146 -0
  128. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f64_sm80.py +102 -0
  129. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_grouped_sm80.py +203 -0
  130. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_s8_sm80.py +229 -0
  131. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/run_all_tests.py +9 -0
  132. warp/native/cutlass/tools/library/scripts/pycutlass/test/unit/test_sm80.py +453 -0
  133. warp/native/cutlass/tools/library/scripts/rank_2k_operation.py +398 -0
  134. warp/native/cutlass/tools/library/scripts/rank_k_operation.py +387 -0
  135. warp/native/cutlass/tools/library/scripts/rt.py +796 -0
  136. warp/native/cutlass/tools/library/scripts/symm_operation.py +400 -0
  137. warp/native/cutlass/tools/library/scripts/trmm_operation.py +407 -0
  138. warp/native/cutlass_gemm.cu +5 -3
  139. warp/native/exports.h +1240 -952
  140. warp/native/fabric.h +228 -0
  141. warp/native/hashgrid.cpp +4 -4
  142. warp/native/hashgrid.h +22 -2
  143. warp/native/intersect.h +22 -7
  144. warp/native/intersect_adj.h +8 -8
  145. warp/native/intersect_tri.h +1 -1
  146. warp/native/marching.cu +157 -161
  147. warp/native/mat.h +80 -19
  148. warp/native/matnn.h +2 -2
  149. warp/native/mesh.cpp +33 -108
  150. warp/native/mesh.cu +114 -23
  151. warp/native/mesh.h +446 -46
  152. warp/native/noise.h +272 -329
  153. warp/native/quat.h +51 -8
  154. warp/native/rand.h +45 -35
  155. warp/native/range.h +6 -2
  156. warp/native/reduce.cpp +1 -1
  157. warp/native/reduce.cu +10 -12
  158. warp/native/runlength_encode.cu +6 -10
  159. warp/native/scan.cu +8 -11
  160. warp/native/sparse.cpp +4 -4
  161. warp/native/sparse.cu +164 -154
  162. warp/native/spatial.h +2 -2
  163. warp/native/temp_buffer.h +14 -30
  164. warp/native/vec.h +107 -23
  165. warp/native/volume.h +120 -0
  166. warp/native/warp.cpp +560 -30
  167. warp/native/warp.cu +431 -44
  168. warp/native/warp.h +13 -4
  169. warp/optim/__init__.py +1 -0
  170. warp/optim/linear.py +922 -0
  171. warp/optim/sgd.py +92 -0
  172. warp/render/render_opengl.py +335 -119
  173. warp/render/render_usd.py +11 -11
  174. warp/sim/__init__.py +2 -2
  175. warp/sim/articulation.py +385 -185
  176. warp/sim/collide.py +8 -0
  177. warp/sim/import_mjcf.py +297 -106
  178. warp/sim/import_urdf.py +389 -210
  179. warp/sim/import_usd.py +198 -97
  180. warp/sim/inertia.py +17 -18
  181. warp/sim/integrator_euler.py +14 -8
  182. warp/sim/integrator_xpbd.py +158 -16
  183. warp/sim/model.py +795 -291
  184. warp/sim/render.py +3 -3
  185. warp/sim/utils.py +3 -0
  186. warp/sparse.py +640 -150
  187. warp/stubs.py +606 -267
  188. warp/tape.py +61 -10
  189. warp/tests/__main__.py +3 -6
  190. warp/tests/assets/curlnoise_golden.npy +0 -0
  191. warp/tests/assets/pnoise_golden.npy +0 -0
  192. warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
  193. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
  194. warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
  195. warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
  196. warp/tests/aux_test_unresolved_func.py +14 -0
  197. warp/tests/aux_test_unresolved_symbol.py +14 -0
  198. warp/tests/disabled_kinematics.py +239 -0
  199. warp/tests/run_coverage_serial.py +31 -0
  200. warp/tests/test_adam.py +103 -106
  201. warp/tests/test_arithmetic.py +128 -74
  202. warp/tests/test_array.py +212 -97
  203. warp/tests/test_array_reduce.py +57 -23
  204. warp/tests/test_atomic.py +64 -28
  205. warp/tests/test_bool.py +99 -0
  206. warp/tests/test_builtins_resolution.py +1292 -0
  207. warp/tests/test_bvh.py +42 -18
  208. warp/tests/test_closest_point_edge_edge.py +54 -57
  209. warp/tests/test_codegen.py +208 -130
  210. warp/tests/test_compile_consts.py +28 -20
  211. warp/tests/test_conditional.py +108 -24
  212. warp/tests/test_copy.py +10 -12
  213. warp/tests/test_ctypes.py +112 -88
  214. warp/tests/test_dense.py +21 -14
  215. warp/tests/test_devices.py +98 -0
  216. warp/tests/test_dlpack.py +75 -75
  217. warp/tests/test_examples.py +277 -0
  218. warp/tests/test_fabricarray.py +955 -0
  219. warp/tests/test_fast_math.py +15 -11
  220. warp/tests/test_fem.py +1271 -0
  221. warp/tests/test_fp16.py +53 -19
  222. warp/tests/test_func.py +187 -86
  223. warp/tests/test_generics.py +194 -49
  224. warp/tests/test_grad.py +178 -109
  225. warp/tests/test_grad_customs.py +176 -0
  226. warp/tests/test_hash_grid.py +52 -37
  227. warp/tests/test_import.py +10 -23
  228. warp/tests/test_indexedarray.py +32 -31
  229. warp/tests/test_intersect.py +18 -9
  230. warp/tests/test_large.py +141 -0
  231. warp/tests/test_launch.py +14 -41
  232. warp/tests/test_lerp.py +64 -65
  233. warp/tests/test_linear_solvers.py +154 -0
  234. warp/tests/test_lvalue.py +493 -0
  235. warp/tests/test_marching_cubes.py +12 -13
  236. warp/tests/test_mat.py +517 -2898
  237. warp/tests/test_mat_lite.py +115 -0
  238. warp/tests/test_mat_scalar_ops.py +2889 -0
  239. warp/tests/test_math.py +103 -9
  240. warp/tests/test_matmul.py +305 -69
  241. warp/tests/test_matmul_lite.py +410 -0
  242. warp/tests/test_mesh.py +71 -14
  243. warp/tests/test_mesh_query_aabb.py +41 -25
  244. warp/tests/test_mesh_query_point.py +140 -22
  245. warp/tests/test_mesh_query_ray.py +39 -22
  246. warp/tests/test_mlp.py +30 -22
  247. warp/tests/test_model.py +92 -89
  248. warp/tests/test_modules_lite.py +39 -0
  249. warp/tests/test_multigpu.py +88 -114
  250. warp/tests/test_noise.py +12 -11
  251. warp/tests/test_operators.py +16 -20
  252. warp/tests/test_options.py +11 -11
  253. warp/tests/test_pinned.py +17 -18
  254. warp/tests/test_print.py +32 -11
  255. warp/tests/test_quat.py +275 -129
  256. warp/tests/test_rand.py +18 -16
  257. warp/tests/test_reload.py +38 -34
  258. warp/tests/test_rounding.py +50 -43
  259. warp/tests/test_runlength_encode.py +168 -20
  260. warp/tests/test_smoothstep.py +9 -11
  261. warp/tests/test_snippet.py +143 -0
  262. warp/tests/test_sparse.py +261 -63
  263. warp/tests/test_spatial.py +276 -243
  264. warp/tests/test_streams.py +110 -85
  265. warp/tests/test_struct.py +268 -63
  266. warp/tests/test_tape.py +39 -21
  267. warp/tests/test_torch.py +118 -89
  268. warp/tests/test_transient_module.py +12 -13
  269. warp/tests/test_types.py +614 -0
  270. warp/tests/test_utils.py +494 -0
  271. warp/tests/test_vec.py +354 -2050
  272. warp/tests/test_vec_lite.py +73 -0
  273. warp/tests/test_vec_scalar_ops.py +2099 -0
  274. warp/tests/test_volume.py +457 -293
  275. warp/tests/test_volume_write.py +124 -134
  276. warp/tests/unittest_serial.py +35 -0
  277. warp/tests/unittest_suites.py +341 -0
  278. warp/tests/unittest_utils.py +568 -0
  279. warp/tests/unused_test_misc.py +71 -0
  280. warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
  281. warp/thirdparty/appdirs.py +36 -45
  282. warp/thirdparty/unittest_parallel.py +549 -0
  283. warp/torch.py +9 -6
  284. warp/types.py +1089 -366
  285. warp/utils.py +93 -387
  286. warp_lang-0.11.0.dist-info/METADATA +238 -0
  287. warp_lang-0.11.0.dist-info/RECORD +332 -0
  288. {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/WHEEL +1 -1
  289. warp/tests/test_all.py +0 -219
  290. warp/tests/test_array_scan.py +0 -60
  291. warp/tests/test_base.py +0 -208
  292. warp/tests/test_unresolved_func.py +0 -7
  293. warp/tests/test_unresolved_symbol.py +0 -7
  294. warp_lang-0.10.1.dist-info/METADATA +0 -21
  295. warp_lang-0.10.1.dist-info/RECORD +0 -188
  296. /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
  297. /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
  298. /warp/tests/{test_square.py → aux_test_square.py} +0 -0
  299. {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/LICENSE.md +0 -0
  300. {warp_lang-0.10.1.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