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/fem/domain.py ADDED
@@ -0,0 +1,263 @@
1
+ from typing import Union
2
+ from enum import Enum
3
+
4
+ import warp as wp
5
+ import warp.codegen
6
+ import warp.context
7
+
8
+ from warp.fem.geometry import (
9
+ Element,
10
+ Geometry,
11
+ GeometryPartition,
12
+ WholeGeometryPartition,
13
+ )
14
+
15
+ GeometryOrPartition = Union[Geometry, GeometryPartition]
16
+
17
+
18
+ class GeometryDomain:
19
+ """Interface class for domains, i.e. (partial) views of elements in a Geometry"""
20
+
21
+ class ElementKind(Enum):
22
+ """Possible kinds of elements contained in a domain"""
23
+
24
+ CELL = 0
25
+ SIDE = 1
26
+
27
+ def __init__(self, geometry: GeometryOrPartition):
28
+ if isinstance(geometry, GeometryPartition):
29
+ self.geometry_partition = geometry
30
+ else:
31
+ self.geometry_partition = WholeGeometryPartition(geometry)
32
+
33
+ self.geometry = self.geometry_partition.geometry
34
+
35
+ @property
36
+ def name(self) -> str:
37
+ return f"{self.geometry_partition.name}_{self.__class__.__name__}"
38
+
39
+ def __str__(self) -> str:
40
+ return self.name
41
+
42
+ def __eq__(self, other) -> bool:
43
+ return self.__class__ == other.__class__ and self.geometry_partition == other.geometry_partition
44
+
45
+ @property
46
+ def element_kind(self) -> ElementKind:
47
+ """Kind of elements that this domain contains (cells or sides)"""
48
+ raise NotImplementedError
49
+
50
+ @property
51
+ def dimension(self) -> int:
52
+ """Dimension of the elements of the domain"""
53
+ raise NotImplementedError
54
+
55
+ def element_count(self) -> int:
56
+ """Number of elements in the domain"""
57
+ raise NotImplementedError
58
+
59
+ def geometry_element_count(self) -> int:
60
+ """Number of elements in the underlying geometry"""
61
+ return self.geometry.cell_count()
62
+
63
+ def reference_element(self) -> Element:
64
+ """Protypical element"""
65
+ raise NotImplementedError
66
+
67
+ def element_index_arg_value(self, device: warp.context.Devicelike) -> warp.codegen.StructInstance:
68
+ """Value of the argument to be passed to device functions"""
69
+ raise NotImplementedError
70
+
71
+ def element_arg_value(self, device: warp.context.Devicelike) -> warp.codegen.StructInstance:
72
+ """Value of the argument to be passed to device functions"""
73
+ raise NotImplementedError
74
+
75
+ ElementIndexArg: warp.codegen.Struct
76
+ """Structure containing arguments to be passed to device functions computing element indices"""
77
+
78
+ element_index: wp.Function
79
+ """Device function for retrieving an ElementIndex from a linearized index"""
80
+
81
+ ElementArg: warp.codegen.Struct
82
+ """Structure containing arguments to be passed to device functions computing element geometry"""
83
+
84
+ element_measure: wp.Function
85
+ """Device function returning the measure determinant (e.g. volume, area) at a given point"""
86
+
87
+ element_measure_ratio: wp.Function
88
+ """Device function returning the ratio of the measure of a side to that of its neighbour cells"""
89
+
90
+ element_position: wp.Function
91
+ """Device function returning the element position at a sample point"""
92
+
93
+ element_deformation_gradient: wp.Function
94
+ """Device function returning the gradient of the position with respect to the element's reference space"""
95
+
96
+ element_normal: wp.Function
97
+ """Device function returning the element normal at a sample point"""
98
+
99
+ element_lookup: wp.Function
100
+ """Device function returning the sample point corresponding to a world position"""
101
+
102
+
103
+ class Cells(GeometryDomain):
104
+ """A Domain containing all cells of the geometry or geometry partition"""
105
+
106
+ def __init__(self, geometry: GeometryOrPartition):
107
+ super().__init__(geometry)
108
+
109
+ @property
110
+ def element_kind(self) -> GeometryDomain.ElementKind:
111
+ return GeometryDomain.ElementKind.CELL
112
+
113
+ @property
114
+ def dimension(self) -> int:
115
+ return self.geometry.dimension
116
+
117
+ def reference_element(self) -> Element:
118
+ return self.geometry.reference_cell()
119
+
120
+ def element_count(self) -> int:
121
+ return self.geometry_partition.cell_count()
122
+
123
+ def geometry_element_count(self) -> int:
124
+ return self.geometry.cell_count()
125
+
126
+ @property
127
+ def ElementIndexArg(self) -> warp.codegen.Struct:
128
+ return self.geometry_partition.CellArg
129
+
130
+ def element_index_arg_value(self, device: warp.context.Devicelike) -> warp.codegen.StructInstance:
131
+ return self.geometry_partition.cell_arg_value(device)
132
+
133
+ @property
134
+ def element_index(self) -> wp.Function:
135
+ return self.geometry_partition.cell_index
136
+
137
+ def element_arg_value(self, device: warp.context.Devicelike) -> warp.codegen.StructInstance:
138
+ return self.geometry.cell_arg_value(device)
139
+
140
+ @property
141
+ def ElementArg(self) -> warp.codegen.Struct:
142
+ return self.geometry.CellArg
143
+
144
+ @property
145
+ def element_position(self) -> wp.Function:
146
+ return self.geometry.cell_position
147
+
148
+ @property
149
+ def element_deformation_gradient(self) -> wp.Function:
150
+ return self.geometry.cell_deformation_gradient
151
+
152
+ @property
153
+ def element_measure(self) -> wp.Function:
154
+ return self.geometry.cell_measure
155
+
156
+ @property
157
+ def element_measure_ratio(self) -> wp.Function:
158
+ return self.geometry.cell_measure_ratio
159
+
160
+ @property
161
+ def eval_normal(self) -> wp.Function:
162
+ return self.geometry.cell_normal
163
+
164
+ @property
165
+ def element_lookup(self) -> wp.Function:
166
+ return self.geometry.cell_lookup
167
+
168
+
169
+ class Sides(GeometryDomain):
170
+ """A Domain containing all (interior and boundary) sides of the geometry or geometry partition"""
171
+
172
+ def __init__(self, geometry: GeometryOrPartition):
173
+ self.geometry = geometry
174
+ super().__init__(geometry)
175
+
176
+ @property
177
+ def element_kind(self) -> GeometryDomain.ElementKind:
178
+ return GeometryDomain.ElementKind.SIDE
179
+
180
+ @property
181
+ def dimension(self) -> int:
182
+ return self.geometry.dimension - 1
183
+
184
+ def reference_element(self) -> Element:
185
+ return self.geometry.reference_side()
186
+
187
+ def element_count(self) -> int:
188
+ return self.geometry_partition.side_count()
189
+
190
+ def geometry_element_count(self) -> int:
191
+ return self.geometry.side_count()
192
+
193
+ @property
194
+ def ElementIndexArg(self) -> warp.codegen.Struct:
195
+ return self.geometry_partition.SideArg
196
+
197
+ def element_index_arg_value(self, device: warp.context.Devicelike) -> warp.codegen.StructInstance:
198
+ return self.geometry_partition.side_arg_value(device)
199
+
200
+ @property
201
+ def element_index(self) -> wp.Function:
202
+ return self.geometry_partition.side_index
203
+
204
+ @property
205
+ def ElementArg(self) -> warp.codegen.Struct:
206
+ return self.geometry.SideArg
207
+
208
+ def element_arg_value(self, device: warp.context.Devicelike) -> warp.codegen.StructInstance:
209
+ return self.geometry.side_arg_value(device)
210
+
211
+ @property
212
+ def element_position(self) -> wp.Function:
213
+ return self.geometry.side_position
214
+
215
+ @property
216
+ def element_deformation_gradient(self) -> wp.Function:
217
+ return self.geometry.side_deformation_gradient
218
+
219
+ @property
220
+ def element_measure(self) -> wp.Function:
221
+ return self.geometry.side_measure
222
+
223
+ @property
224
+ def element_measure_ratio(self) -> wp.Function:
225
+ return self.geometry.side_measure_ratio
226
+
227
+ @property
228
+ def eval_normal(self) -> wp.Function:
229
+ return self.geometry.side_normal
230
+
231
+
232
+ class BoundarySides(Sides):
233
+ """A Domain containing boundary sides of the geometry or geometry partition"""
234
+
235
+ def __init__(self, geometry: GeometryOrPartition):
236
+ super().__init__(geometry)
237
+
238
+ def element_count(self) -> int:
239
+ return self.geometry_partition.boundary_side_count()
240
+
241
+ def geometry_element_count(self) -> int:
242
+ return self.geometry.boundary_side_count()
243
+
244
+ @property
245
+ def element_index(self) -> wp.Function:
246
+ return self.geometry_partition.boundary_side_index
247
+
248
+
249
+ class FrontierSides(Sides):
250
+ """A Domain containing frontier sides of the geometry partition (sides shared with at least another partition)"""
251
+
252
+ def __init__(self, geometry: GeometryOrPartition):
253
+ super().__init__(geometry)
254
+
255
+ def element_count(self) -> int:
256
+ return self.geometry_partition.frontier_side_count()
257
+
258
+ def geometry_element_count(self) -> int:
259
+ raise RuntimeError("Frontier sides not defined at the geometry level")
260
+
261
+ @property
262
+ def element_index(self) -> wp.Function:
263
+ return self.geometry_partition.frontier_side_index
@@ -0,0 +1,101 @@
1
+ from typing import Union, Optional
2
+
3
+ from warp.fem.domain import GeometryDomain, Cells
4
+ from warp.fem.space import FunctionSpace, SpaceRestriction, SpacePartition, make_space_partition, make_space_restriction
5
+
6
+ from .field import DiscreteField, SpaceField, FieldLike
7
+ from .restriction import FieldRestriction
8
+ from .test import TestField
9
+ from .trial import TrialField
10
+
11
+ from .nodal_field import NodalField
12
+
13
+
14
+ def make_restriction(
15
+ field: DiscreteField,
16
+ space_restriction: Optional[SpaceRestriction] = None,
17
+ domain: Optional[GeometryDomain] = None,
18
+ device=None,
19
+ ) -> FieldRestriction:
20
+ """
21
+ Restricts a discrete field to a subset of elements.
22
+
23
+ Args:
24
+ field: the discrete field to restrict
25
+ space_restriction: the function space restriction defining the subset of elements to consider
26
+ domain: if ``space_restriction`` is not provided, the :py:class:`Domain` defining the subset of elements to consider
27
+ device: Warp device on which to perform and store computations
28
+
29
+ Returns:
30
+ the field restriction
31
+ """
32
+
33
+ if space_restriction is None:
34
+ space_restriction = make_space_restriction(space_partition=field.space_partition, domain=domain, device=device)
35
+
36
+ return FieldRestriction(field=field, space_restriction=space_restriction)
37
+
38
+
39
+ def make_test(
40
+ space: FunctionSpace,
41
+ space_restriction: Optional[SpaceRestriction] = None,
42
+ space_partition: Optional[SpacePartition] = None,
43
+ domain: Optional[GeometryDomain] = None,
44
+ device=None,
45
+ ) -> TestField:
46
+ """
47
+ Constructs a test field over a function space or its restriction
48
+
49
+ Args:
50
+ space: the function space
51
+ space_restriction: restriction of the space topology to a domain
52
+ space_partition: if `space_restriction` is ``None``, the optional subset of node indices to consider
53
+ domain: if `space_restriction` is ``None``, optional subset of elements to consider
54
+ device: Warp device on which to perform and store computations
55
+
56
+ Returns:
57
+ the test field
58
+ """
59
+
60
+ if space_restriction is None:
61
+ space_restriction = make_space_restriction(
62
+ space_topology=space.topology, space_partition=space_partition, domain=domain, device=device
63
+ )
64
+
65
+ return TestField(space_restriction=space_restriction, space=space)
66
+
67
+
68
+ def make_trial(
69
+ space: FunctionSpace,
70
+ space_restriction: Optional[SpaceRestriction] = None,
71
+ space_partition: Optional[SpacePartition] = None,
72
+ domain: Optional[GeometryDomain] = None,
73
+ ) -> TrialField:
74
+ """
75
+ Constructs a trial field over a function space or partition
76
+
77
+ Args:
78
+ space: the function space or function space restriction
79
+ space_restriction: restriction of the space topology to a domain
80
+ space_partition: if `space_restriction` is ``None``, the optional subset of node indices to consider
81
+ domain: if `space_restriction` is ``None``, optional subset of elements to consider
82
+ device: Warp device on which to perform and store computations
83
+
84
+ Returns:
85
+ the trial field
86
+ """
87
+
88
+ if space_restriction is not None:
89
+ domain = space.domain
90
+ space_partition = space.space_partition
91
+
92
+ if space_partition is None:
93
+ if domain is None:
94
+ domain = Cells(geometry=space.geometry)
95
+ space_partition = make_space_partition(
96
+ space_topology=space.topology, geometry_partition=domain.geometry_partition
97
+ )
98
+ elif domain is None:
99
+ domain = Cells(geometry=space_partition.geo_partition)
100
+
101
+ return TrialField(space, space_partition, domain)
@@ -0,0 +1,149 @@
1
+ from typing import Any
2
+
3
+ import warp as wp
4
+
5
+ from warp.fem.types import Sample
6
+ from warp.fem.space import FunctionSpace, SpacePartition
7
+ from warp.fem.geometry import Geometry, DeformedGeometry
8
+
9
+
10
+ class FieldLike:
11
+ """Base class for integrable fields"""
12
+
13
+ EvalArg: wp.codegen.Struct
14
+ """Structure containing field-level arguments passed to device functions for field evaluation"""
15
+
16
+ ElementEvalArg: wp.codegen.Struct
17
+ """Structure combining geometry-level and field-level arguments passed to device functions for field evaluation"""
18
+
19
+ def eval_arg_value(self, device) -> "EvalArg":
20
+ """Value of the field-level arguments to be passed to device functions"""
21
+ raise NotImplementedError
22
+
23
+ @property
24
+ def degree(self) -> int:
25
+ """Polynomial degree of the field, used to estimate necessary quadrature order"""
26
+ raise NotImplementedError
27
+
28
+ @property
29
+ def name(self) -> str:
30
+ raise NotImplementedError
31
+
32
+ @property
33
+ def __str__(self) -> str:
34
+ return self.name
35
+
36
+ def eval_arg_value(self, device):
37
+ """Value of arguments to be passed to device functions"""
38
+ raise NotImplementedError
39
+
40
+ @staticmethod
41
+ def eval_inner(args: "ElementEvalArg", s: "Sample"):
42
+ """Device function evaluating the inner field value at a sample point"""
43
+ raise NotImplementedError
44
+
45
+ @staticmethod
46
+ def eval_grad_inner(args: "ElementEvalArg", s: "Sample"):
47
+ """Device function evaluating the inner field gradient at a sample point"""
48
+ raise NotImplementedError
49
+
50
+ @staticmethod
51
+ def eval_div_inner(args: "ElementEvalArg", s: "Sample"):
52
+ """Device function evaluating the inner field divergence at a sample point"""
53
+ raise NotImplementedError
54
+
55
+ @staticmethod
56
+ def eval_outer(args: "ElementEvalArg", s: "Sample"):
57
+ """Device function evaluating the outer field value at a sample point"""
58
+ raise NotImplementedError
59
+
60
+ @staticmethod
61
+ def eval_grad_outer(args: "ElementEvalArg", s: "Sample"):
62
+ """Device function evaluating the outer field gradient at a sample point"""
63
+ raise NotImplementedError
64
+
65
+ @staticmethod
66
+ def eval_div_outer(args: "ElementEvalArg", s: "Sample"):
67
+ """Device function evaluating the outer field divergence at a sample point"""
68
+ raise NotImplementedError
69
+
70
+
71
+ class SpaceField(FieldLike):
72
+ """Base class for fields defined over a function space"""
73
+
74
+ def __init__(self, space: FunctionSpace, space_partition: SpacePartition):
75
+ self._space = space
76
+ self._space_partition = space_partition
77
+
78
+ @property
79
+ def space(self) -> FunctionSpace:
80
+ return self._space
81
+
82
+ @property
83
+ def space_partition(self) -> SpacePartition:
84
+ return self._space_partition
85
+
86
+ @property
87
+ def degree(self) -> int:
88
+ return self.space.degree
89
+
90
+ @property
91
+ def dtype(self) -> type:
92
+ return self.space.dtype
93
+
94
+ @property
95
+ def dof_dtype(self) -> type:
96
+ return self.space.dof_dtype
97
+
98
+ def gradient_valid(self) -> bool:
99
+ """Whether gradient operator can be computed. Only for scalar and vector fields as higher-order tensors are not support yet"""
100
+ return not wp.types.type_is_matrix(self.dtype)
101
+
102
+ def divergence_valid(self) -> bool:
103
+ """Whether divergence of this field can be computed. Only for vector and tensor fields with same dimension as embedding geometry"""
104
+ if wp.types.type_is_vector(self.dtype):
105
+ return wp.types.type_length(self.dtype) == self.space.geometry.dimension
106
+ if wp.types.type_is_matrix(self.dtype):
107
+ return self.dtype._shape_[0] == self.space.geometry.dimension
108
+ return False
109
+
110
+ def _make_eval_degree(self):
111
+ ORDER = self.space.ORDER
112
+ from warp.fem import cache
113
+
114
+ @cache.dynamic_func(suffix=self.name)
115
+ def degree(args: self.ElementEvalArg):
116
+ return ORDER
117
+
118
+ return degree
119
+
120
+
121
+ class DiscreteField(SpaceField):
122
+ """Explicitly-valued field defined over a partition of a discrete function space"""
123
+
124
+ @property
125
+ def dof_values(self) -> wp.array:
126
+ """Array of degrees of freedom values"""
127
+ raise NotImplementedError
128
+
129
+ @dof_values.setter
130
+ def dof_values(self, values: wp.array):
131
+ """Sets degrees of freedom values from an array"""
132
+ raise NotImplementedError
133
+
134
+ def trace(self) -> "DiscreteField":
135
+ """Trace of this field over a lower-dimensional function space"""
136
+ raise NotImplementedError
137
+
138
+ @staticmethod
139
+ def set_node_value(args: "FieldLike.EvalArg", node_index: int, value: Any):
140
+ """Device function setting the value at given node"""
141
+ raise NotImplementedError
142
+
143
+ @property
144
+ def name(self) -> str:
145
+ return f"{self.__class__.__qualname__}_{self.space.name}_{self.space_partition.name}"
146
+
147
+ def make_deformed_geometry(self) -> Geometry:
148
+ """Returns a deformed version of the underlying geometry using this field's values as displacement"""
149
+ return DeformedGeometry(self)