warp-lang 1.10.0__py3-none-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of warp-lang might be problematic. Click here for more details.

Files changed (468) hide show
  1. warp/__init__.py +334 -0
  2. warp/__init__.pyi +5856 -0
  3. warp/_src/__init__.py +14 -0
  4. warp/_src/autograd.py +1077 -0
  5. warp/_src/build.py +620 -0
  6. warp/_src/build_dll.py +642 -0
  7. warp/_src/builtins.py +10555 -0
  8. warp/_src/codegen.py +4361 -0
  9. warp/_src/config.py +178 -0
  10. warp/_src/constants.py +59 -0
  11. warp/_src/context.py +8352 -0
  12. warp/_src/dlpack.py +464 -0
  13. warp/_src/fabric.py +362 -0
  14. warp/_src/fem/__init__.py +14 -0
  15. warp/_src/fem/adaptivity.py +510 -0
  16. warp/_src/fem/cache.py +689 -0
  17. warp/_src/fem/dirichlet.py +190 -0
  18. warp/_src/fem/domain.py +553 -0
  19. warp/_src/fem/field/__init__.py +131 -0
  20. warp/_src/fem/field/field.py +703 -0
  21. warp/_src/fem/field/nodal_field.py +403 -0
  22. warp/_src/fem/field/restriction.py +39 -0
  23. warp/_src/fem/field/virtual.py +1021 -0
  24. warp/_src/fem/geometry/__init__.py +32 -0
  25. warp/_src/fem/geometry/adaptive_nanogrid.py +782 -0
  26. warp/_src/fem/geometry/closest_point.py +99 -0
  27. warp/_src/fem/geometry/deformed_geometry.py +277 -0
  28. warp/_src/fem/geometry/element.py +854 -0
  29. warp/_src/fem/geometry/geometry.py +693 -0
  30. warp/_src/fem/geometry/grid_2d.py +478 -0
  31. warp/_src/fem/geometry/grid_3d.py +539 -0
  32. warp/_src/fem/geometry/hexmesh.py +956 -0
  33. warp/_src/fem/geometry/nanogrid.py +660 -0
  34. warp/_src/fem/geometry/partition.py +483 -0
  35. warp/_src/fem/geometry/quadmesh.py +597 -0
  36. warp/_src/fem/geometry/tetmesh.py +762 -0
  37. warp/_src/fem/geometry/trimesh.py +588 -0
  38. warp/_src/fem/integrate.py +2507 -0
  39. warp/_src/fem/linalg.py +385 -0
  40. warp/_src/fem/operator.py +398 -0
  41. warp/_src/fem/polynomial.py +231 -0
  42. warp/_src/fem/quadrature/__init__.py +17 -0
  43. warp/_src/fem/quadrature/pic_quadrature.py +318 -0
  44. warp/_src/fem/quadrature/quadrature.py +665 -0
  45. warp/_src/fem/space/__init__.py +248 -0
  46. warp/_src/fem/space/basis_function_space.py +499 -0
  47. warp/_src/fem/space/basis_space.py +681 -0
  48. warp/_src/fem/space/dof_mapper.py +253 -0
  49. warp/_src/fem/space/function_space.py +312 -0
  50. warp/_src/fem/space/grid_2d_function_space.py +179 -0
  51. warp/_src/fem/space/grid_3d_function_space.py +229 -0
  52. warp/_src/fem/space/hexmesh_function_space.py +255 -0
  53. warp/_src/fem/space/nanogrid_function_space.py +199 -0
  54. warp/_src/fem/space/partition.py +435 -0
  55. warp/_src/fem/space/quadmesh_function_space.py +222 -0
  56. warp/_src/fem/space/restriction.py +221 -0
  57. warp/_src/fem/space/shape/__init__.py +152 -0
  58. warp/_src/fem/space/shape/cube_shape_function.py +1107 -0
  59. warp/_src/fem/space/shape/shape_function.py +134 -0
  60. warp/_src/fem/space/shape/square_shape_function.py +928 -0
  61. warp/_src/fem/space/shape/tet_shape_function.py +829 -0
  62. warp/_src/fem/space/shape/triangle_shape_function.py +674 -0
  63. warp/_src/fem/space/tetmesh_function_space.py +270 -0
  64. warp/_src/fem/space/topology.py +461 -0
  65. warp/_src/fem/space/trimesh_function_space.py +193 -0
  66. warp/_src/fem/types.py +114 -0
  67. warp/_src/fem/utils.py +488 -0
  68. warp/_src/jax.py +188 -0
  69. warp/_src/jax_experimental/__init__.py +14 -0
  70. warp/_src/jax_experimental/custom_call.py +389 -0
  71. warp/_src/jax_experimental/ffi.py +1286 -0
  72. warp/_src/jax_experimental/xla_ffi.py +658 -0
  73. warp/_src/marching_cubes.py +710 -0
  74. warp/_src/math.py +416 -0
  75. warp/_src/optim/__init__.py +14 -0
  76. warp/_src/optim/adam.py +165 -0
  77. warp/_src/optim/linear.py +1608 -0
  78. warp/_src/optim/sgd.py +114 -0
  79. warp/_src/paddle.py +408 -0
  80. warp/_src/render/__init__.py +14 -0
  81. warp/_src/render/imgui_manager.py +291 -0
  82. warp/_src/render/render_opengl.py +3638 -0
  83. warp/_src/render/render_usd.py +939 -0
  84. warp/_src/render/utils.py +162 -0
  85. warp/_src/sparse.py +2718 -0
  86. warp/_src/tape.py +1208 -0
  87. warp/_src/thirdparty/__init__.py +0 -0
  88. warp/_src/thirdparty/appdirs.py +598 -0
  89. warp/_src/thirdparty/dlpack.py +145 -0
  90. warp/_src/thirdparty/unittest_parallel.py +676 -0
  91. warp/_src/torch.py +393 -0
  92. warp/_src/types.py +5888 -0
  93. warp/_src/utils.py +1695 -0
  94. warp/autograd.py +33 -0
  95. warp/bin/libwarp-clang.dylib +0 -0
  96. warp/bin/libwarp.dylib +0 -0
  97. warp/build.py +29 -0
  98. warp/build_dll.py +24 -0
  99. warp/codegen.py +24 -0
  100. warp/constants.py +24 -0
  101. warp/context.py +33 -0
  102. warp/dlpack.py +24 -0
  103. warp/examples/__init__.py +24 -0
  104. warp/examples/assets/bear.usd +0 -0
  105. warp/examples/assets/bunny.usd +0 -0
  106. warp/examples/assets/cube.usd +0 -0
  107. warp/examples/assets/nonuniform.usd +0 -0
  108. warp/examples/assets/nvidia_logo.png +0 -0
  109. warp/examples/assets/pixel.jpg +0 -0
  110. warp/examples/assets/rocks.nvdb +0 -0
  111. warp/examples/assets/rocks.usd +0 -0
  112. warp/examples/assets/sphere.usd +0 -0
  113. warp/examples/assets/square_cloth.usd +0 -0
  114. warp/examples/benchmarks/benchmark_api.py +389 -0
  115. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  116. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  117. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  118. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  119. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  120. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  121. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  122. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  123. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  124. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  125. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  126. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  127. warp/examples/benchmarks/benchmark_launches.py +301 -0
  128. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  129. warp/examples/benchmarks/benchmark_tile_sort.py +155 -0
  130. warp/examples/browse.py +37 -0
  131. warp/examples/core/example_cupy.py +86 -0
  132. warp/examples/core/example_dem.py +241 -0
  133. warp/examples/core/example_fluid.py +299 -0
  134. warp/examples/core/example_graph_capture.py +150 -0
  135. warp/examples/core/example_marching_cubes.py +195 -0
  136. warp/examples/core/example_mesh.py +180 -0
  137. warp/examples/core/example_mesh_intersect.py +211 -0
  138. warp/examples/core/example_nvdb.py +182 -0
  139. warp/examples/core/example_raycast.py +111 -0
  140. warp/examples/core/example_raymarch.py +205 -0
  141. warp/examples/core/example_render_opengl.py +290 -0
  142. warp/examples/core/example_sample_mesh.py +300 -0
  143. warp/examples/core/example_sph.py +411 -0
  144. warp/examples/core/example_spin_lock.py +93 -0
  145. warp/examples/core/example_torch.py +211 -0
  146. warp/examples/core/example_wave.py +269 -0
  147. warp/examples/core/example_work_queue.py +118 -0
  148. warp/examples/distributed/example_jacobi_mpi.py +506 -0
  149. warp/examples/fem/example_adaptive_grid.py +286 -0
  150. warp/examples/fem/example_apic_fluid.py +469 -0
  151. warp/examples/fem/example_burgers.py +261 -0
  152. warp/examples/fem/example_convection_diffusion.py +181 -0
  153. warp/examples/fem/example_convection_diffusion_dg.py +225 -0
  154. warp/examples/fem/example_darcy_ls_optimization.py +489 -0
  155. warp/examples/fem/example_deformed_geometry.py +172 -0
  156. warp/examples/fem/example_diffusion.py +196 -0
  157. warp/examples/fem/example_diffusion_3d.py +225 -0
  158. warp/examples/fem/example_diffusion_mgpu.py +225 -0
  159. warp/examples/fem/example_distortion_energy.py +228 -0
  160. warp/examples/fem/example_elastic_shape_optimization.py +387 -0
  161. warp/examples/fem/example_magnetostatics.py +242 -0
  162. warp/examples/fem/example_mixed_elasticity.py +293 -0
  163. warp/examples/fem/example_navier_stokes.py +263 -0
  164. warp/examples/fem/example_nonconforming_contact.py +300 -0
  165. warp/examples/fem/example_stokes.py +213 -0
  166. warp/examples/fem/example_stokes_transfer.py +262 -0
  167. warp/examples/fem/example_streamlines.py +357 -0
  168. warp/examples/fem/utils.py +1047 -0
  169. warp/examples/interop/example_jax_callable.py +146 -0
  170. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  171. warp/examples/interop/example_jax_kernel.py +232 -0
  172. warp/examples/optim/example_diffray.py +561 -0
  173. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  174. warp/examples/tile/example_tile_block_cholesky.py +502 -0
  175. warp/examples/tile/example_tile_cholesky.py +88 -0
  176. warp/examples/tile/example_tile_convolution.py +66 -0
  177. warp/examples/tile/example_tile_fft.py +55 -0
  178. warp/examples/tile/example_tile_filtering.py +113 -0
  179. warp/examples/tile/example_tile_matmul.py +85 -0
  180. warp/examples/tile/example_tile_mcgp.py +191 -0
  181. warp/examples/tile/example_tile_mlp.py +385 -0
  182. warp/examples/tile/example_tile_nbody.py +199 -0
  183. warp/fabric.py +24 -0
  184. warp/fem/__init__.py +173 -0
  185. warp/fem/adaptivity.py +26 -0
  186. warp/fem/cache.py +30 -0
  187. warp/fem/dirichlet.py +24 -0
  188. warp/fem/field/__init__.py +24 -0
  189. warp/fem/field/field.py +26 -0
  190. warp/fem/geometry/__init__.py +21 -0
  191. warp/fem/geometry/closest_point.py +31 -0
  192. warp/fem/linalg.py +38 -0
  193. warp/fem/operator.py +32 -0
  194. warp/fem/polynomial.py +29 -0
  195. warp/fem/space/__init__.py +22 -0
  196. warp/fem/space/basis_space.py +24 -0
  197. warp/fem/space/shape/__init__.py +68 -0
  198. warp/fem/space/topology.py +24 -0
  199. warp/fem/types.py +24 -0
  200. warp/fem/utils.py +32 -0
  201. warp/jax.py +29 -0
  202. warp/jax_experimental/__init__.py +29 -0
  203. warp/jax_experimental/custom_call.py +29 -0
  204. warp/jax_experimental/ffi.py +39 -0
  205. warp/jax_experimental/xla_ffi.py +24 -0
  206. warp/marching_cubes.py +24 -0
  207. warp/math.py +37 -0
  208. warp/native/array.h +1687 -0
  209. warp/native/builtin.h +2327 -0
  210. warp/native/bvh.cpp +562 -0
  211. warp/native/bvh.cu +826 -0
  212. warp/native/bvh.h +555 -0
  213. warp/native/clang/clang.cpp +541 -0
  214. warp/native/coloring.cpp +622 -0
  215. warp/native/crt.cpp +51 -0
  216. warp/native/crt.h +568 -0
  217. warp/native/cuda_crt.h +1058 -0
  218. warp/native/cuda_util.cpp +677 -0
  219. warp/native/cuda_util.h +313 -0
  220. warp/native/error.cpp +77 -0
  221. warp/native/error.h +36 -0
  222. warp/native/exports.h +2023 -0
  223. warp/native/fabric.h +246 -0
  224. warp/native/hashgrid.cpp +311 -0
  225. warp/native/hashgrid.cu +89 -0
  226. warp/native/hashgrid.h +240 -0
  227. warp/native/initializer_array.h +41 -0
  228. warp/native/intersect.h +1253 -0
  229. warp/native/intersect_adj.h +375 -0
  230. warp/native/intersect_tri.h +348 -0
  231. warp/native/mat.h +5189 -0
  232. warp/native/mathdx.cpp +93 -0
  233. warp/native/matnn.h +221 -0
  234. warp/native/mesh.cpp +266 -0
  235. warp/native/mesh.cu +406 -0
  236. warp/native/mesh.h +2097 -0
  237. warp/native/nanovdb/GridHandle.h +533 -0
  238. warp/native/nanovdb/HostBuffer.h +591 -0
  239. warp/native/nanovdb/NanoVDB.h +6246 -0
  240. warp/native/nanovdb/NodeManager.h +323 -0
  241. warp/native/nanovdb/PNanoVDB.h +3390 -0
  242. warp/native/noise.h +859 -0
  243. warp/native/quat.h +1664 -0
  244. warp/native/rand.h +342 -0
  245. warp/native/range.h +145 -0
  246. warp/native/reduce.cpp +174 -0
  247. warp/native/reduce.cu +363 -0
  248. warp/native/runlength_encode.cpp +79 -0
  249. warp/native/runlength_encode.cu +61 -0
  250. warp/native/scan.cpp +47 -0
  251. warp/native/scan.cu +55 -0
  252. warp/native/scan.h +23 -0
  253. warp/native/solid_angle.h +466 -0
  254. warp/native/sort.cpp +251 -0
  255. warp/native/sort.cu +286 -0
  256. warp/native/sort.h +35 -0
  257. warp/native/sparse.cpp +241 -0
  258. warp/native/sparse.cu +435 -0
  259. warp/native/spatial.h +1306 -0
  260. warp/native/svd.h +727 -0
  261. warp/native/temp_buffer.h +46 -0
  262. warp/native/tile.h +4124 -0
  263. warp/native/tile_radix_sort.h +1112 -0
  264. warp/native/tile_reduce.h +838 -0
  265. warp/native/tile_scan.h +240 -0
  266. warp/native/tuple.h +189 -0
  267. warp/native/vec.h +2199 -0
  268. warp/native/version.h +23 -0
  269. warp/native/volume.cpp +501 -0
  270. warp/native/volume.cu +68 -0
  271. warp/native/volume.h +970 -0
  272. warp/native/volume_builder.cu +483 -0
  273. warp/native/volume_builder.h +52 -0
  274. warp/native/volume_impl.h +70 -0
  275. warp/native/warp.cpp +1143 -0
  276. warp/native/warp.cu +4604 -0
  277. warp/native/warp.h +358 -0
  278. warp/optim/__init__.py +20 -0
  279. warp/optim/adam.py +24 -0
  280. warp/optim/linear.py +35 -0
  281. warp/optim/sgd.py +24 -0
  282. warp/paddle.py +24 -0
  283. warp/py.typed +0 -0
  284. warp/render/__init__.py +22 -0
  285. warp/render/imgui_manager.py +29 -0
  286. warp/render/render_opengl.py +24 -0
  287. warp/render/render_usd.py +24 -0
  288. warp/render/utils.py +24 -0
  289. warp/sparse.py +51 -0
  290. warp/tape.py +24 -0
  291. warp/tests/__init__.py +1 -0
  292. warp/tests/__main__.py +4 -0
  293. warp/tests/assets/curlnoise_golden.npy +0 -0
  294. warp/tests/assets/mlp_golden.npy +0 -0
  295. warp/tests/assets/pixel.npy +0 -0
  296. warp/tests/assets/pnoise_golden.npy +0 -0
  297. warp/tests/assets/spiky.usd +0 -0
  298. warp/tests/assets/test_grid.nvdb +0 -0
  299. warp/tests/assets/test_index_grid.nvdb +0 -0
  300. warp/tests/assets/test_int32_grid.nvdb +0 -0
  301. warp/tests/assets/test_vec_grid.nvdb +0 -0
  302. warp/tests/assets/torus.nvdb +0 -0
  303. warp/tests/assets/torus.usda +105 -0
  304. warp/tests/aux_test_class_kernel.py +34 -0
  305. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  306. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  307. warp/tests/aux_test_dependent.py +29 -0
  308. warp/tests/aux_test_grad_customs.py +29 -0
  309. warp/tests/aux_test_instancing_gc.py +26 -0
  310. warp/tests/aux_test_module_aot.py +7 -0
  311. warp/tests/aux_test_module_unload.py +23 -0
  312. warp/tests/aux_test_name_clash1.py +40 -0
  313. warp/tests/aux_test_name_clash2.py +40 -0
  314. warp/tests/aux_test_reference.py +9 -0
  315. warp/tests/aux_test_reference_reference.py +8 -0
  316. warp/tests/aux_test_square.py +16 -0
  317. warp/tests/aux_test_unresolved_func.py +22 -0
  318. warp/tests/aux_test_unresolved_symbol.py +22 -0
  319. warp/tests/cuda/__init__.py +0 -0
  320. warp/tests/cuda/test_async.py +676 -0
  321. warp/tests/cuda/test_conditional_captures.py +1147 -0
  322. warp/tests/cuda/test_ipc.py +124 -0
  323. warp/tests/cuda/test_mempool.py +233 -0
  324. warp/tests/cuda/test_multigpu.py +169 -0
  325. warp/tests/cuda/test_peer.py +139 -0
  326. warp/tests/cuda/test_pinned.py +84 -0
  327. warp/tests/cuda/test_streams.py +691 -0
  328. warp/tests/geometry/__init__.py +0 -0
  329. warp/tests/geometry/test_bvh.py +335 -0
  330. warp/tests/geometry/test_hash_grid.py +259 -0
  331. warp/tests/geometry/test_marching_cubes.py +294 -0
  332. warp/tests/geometry/test_mesh.py +318 -0
  333. warp/tests/geometry/test_mesh_query_aabb.py +392 -0
  334. warp/tests/geometry/test_mesh_query_point.py +935 -0
  335. warp/tests/geometry/test_mesh_query_ray.py +323 -0
  336. warp/tests/geometry/test_volume.py +1103 -0
  337. warp/tests/geometry/test_volume_write.py +346 -0
  338. warp/tests/interop/__init__.py +0 -0
  339. warp/tests/interop/test_dlpack.py +730 -0
  340. warp/tests/interop/test_jax.py +1673 -0
  341. warp/tests/interop/test_paddle.py +800 -0
  342. warp/tests/interop/test_torch.py +1001 -0
  343. warp/tests/run_coverage_serial.py +39 -0
  344. warp/tests/test_adam.py +162 -0
  345. warp/tests/test_arithmetic.py +1096 -0
  346. warp/tests/test_array.py +3756 -0
  347. warp/tests/test_array_reduce.py +156 -0
  348. warp/tests/test_assert.py +303 -0
  349. warp/tests/test_atomic.py +336 -0
  350. warp/tests/test_atomic_bitwise.py +209 -0
  351. warp/tests/test_atomic_cas.py +312 -0
  352. warp/tests/test_bool.py +220 -0
  353. warp/tests/test_builtins_resolution.py +732 -0
  354. warp/tests/test_closest_point_edge_edge.py +327 -0
  355. warp/tests/test_codegen.py +974 -0
  356. warp/tests/test_codegen_instancing.py +1495 -0
  357. warp/tests/test_compile_consts.py +215 -0
  358. warp/tests/test_conditional.py +298 -0
  359. warp/tests/test_context.py +35 -0
  360. warp/tests/test_copy.py +319 -0
  361. warp/tests/test_ctypes.py +618 -0
  362. warp/tests/test_dense.py +73 -0
  363. warp/tests/test_devices.py +127 -0
  364. warp/tests/test_enum.py +136 -0
  365. warp/tests/test_examples.py +424 -0
  366. warp/tests/test_fabricarray.py +998 -0
  367. warp/tests/test_fast_math.py +72 -0
  368. warp/tests/test_fem.py +2204 -0
  369. warp/tests/test_fixedarray.py +229 -0
  370. warp/tests/test_fp16.py +136 -0
  371. warp/tests/test_func.py +501 -0
  372. warp/tests/test_future_annotations.py +100 -0
  373. warp/tests/test_generics.py +656 -0
  374. warp/tests/test_grad.py +893 -0
  375. warp/tests/test_grad_customs.py +339 -0
  376. warp/tests/test_grad_debug.py +341 -0
  377. warp/tests/test_implicit_init.py +411 -0
  378. warp/tests/test_import.py +45 -0
  379. warp/tests/test_indexedarray.py +1140 -0
  380. warp/tests/test_intersect.py +103 -0
  381. warp/tests/test_iter.py +76 -0
  382. warp/tests/test_large.py +177 -0
  383. warp/tests/test_launch.py +411 -0
  384. warp/tests/test_lerp.py +151 -0
  385. warp/tests/test_linear_solvers.py +223 -0
  386. warp/tests/test_lvalue.py +427 -0
  387. warp/tests/test_map.py +526 -0
  388. warp/tests/test_mat.py +3515 -0
  389. warp/tests/test_mat_assign_copy.py +178 -0
  390. warp/tests/test_mat_constructors.py +573 -0
  391. warp/tests/test_mat_lite.py +122 -0
  392. warp/tests/test_mat_scalar_ops.py +2913 -0
  393. warp/tests/test_math.py +212 -0
  394. warp/tests/test_module_aot.py +287 -0
  395. warp/tests/test_module_hashing.py +258 -0
  396. warp/tests/test_modules_lite.py +70 -0
  397. warp/tests/test_noise.py +252 -0
  398. warp/tests/test_operators.py +299 -0
  399. warp/tests/test_options.py +129 -0
  400. warp/tests/test_overwrite.py +551 -0
  401. warp/tests/test_print.py +408 -0
  402. warp/tests/test_quat.py +2653 -0
  403. warp/tests/test_quat_assign_copy.py +145 -0
  404. warp/tests/test_rand.py +339 -0
  405. warp/tests/test_reload.py +303 -0
  406. warp/tests/test_rounding.py +157 -0
  407. warp/tests/test_runlength_encode.py +196 -0
  408. warp/tests/test_scalar_ops.py +133 -0
  409. warp/tests/test_smoothstep.py +108 -0
  410. warp/tests/test_snippet.py +318 -0
  411. warp/tests/test_sparse.py +845 -0
  412. warp/tests/test_spatial.py +2859 -0
  413. warp/tests/test_spatial_assign_copy.py +160 -0
  414. warp/tests/test_special_values.py +361 -0
  415. warp/tests/test_static.py +640 -0
  416. warp/tests/test_struct.py +901 -0
  417. warp/tests/test_tape.py +242 -0
  418. warp/tests/test_transient_module.py +93 -0
  419. warp/tests/test_triangle_closest_point.py +192 -0
  420. warp/tests/test_tuple.py +361 -0
  421. warp/tests/test_types.py +615 -0
  422. warp/tests/test_utils.py +594 -0
  423. warp/tests/test_vec.py +1408 -0
  424. warp/tests/test_vec_assign_copy.py +143 -0
  425. warp/tests/test_vec_constructors.py +325 -0
  426. warp/tests/test_vec_lite.py +80 -0
  427. warp/tests/test_vec_scalar_ops.py +2327 -0
  428. warp/tests/test_verify_fp.py +100 -0
  429. warp/tests/test_version.py +75 -0
  430. warp/tests/tile/__init__.py +0 -0
  431. warp/tests/tile/test_tile.py +1519 -0
  432. warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
  433. warp/tests/tile/test_tile_cholesky.py +608 -0
  434. warp/tests/tile/test_tile_load.py +724 -0
  435. warp/tests/tile/test_tile_mathdx.py +156 -0
  436. warp/tests/tile/test_tile_matmul.py +179 -0
  437. warp/tests/tile/test_tile_mlp.py +400 -0
  438. warp/tests/tile/test_tile_reduce.py +950 -0
  439. warp/tests/tile/test_tile_shared_memory.py +376 -0
  440. warp/tests/tile/test_tile_sort.py +121 -0
  441. warp/tests/tile/test_tile_view.py +173 -0
  442. warp/tests/unittest_serial.py +47 -0
  443. warp/tests/unittest_suites.py +430 -0
  444. warp/tests/unittest_utils.py +469 -0
  445. warp/tests/walkthrough_debug.py +95 -0
  446. warp/torch.py +24 -0
  447. warp/types.py +51 -0
  448. warp/utils.py +31 -0
  449. warp_lang-1.10.0.dist-info/METADATA +459 -0
  450. warp_lang-1.10.0.dist-info/RECORD +468 -0
  451. warp_lang-1.10.0.dist-info/WHEEL +5 -0
  452. warp_lang-1.10.0.dist-info/licenses/LICENSE.md +176 -0
  453. warp_lang-1.10.0.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
  454. warp_lang-1.10.0.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
  455. warp_lang-1.10.0.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
  456. warp_lang-1.10.0.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
  457. warp_lang-1.10.0.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
  458. warp_lang-1.10.0.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
  459. warp_lang-1.10.0.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
  460. warp_lang-1.10.0.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
  461. warp_lang-1.10.0.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
  462. warp_lang-1.10.0.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
  463. warp_lang-1.10.0.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
  464. warp_lang-1.10.0.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
  465. warp_lang-1.10.0.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
  466. warp_lang-1.10.0.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
  467. warp_lang-1.10.0.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
  468. warp_lang-1.10.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,674 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import numpy as np
17
+
18
+ import warp as wp
19
+ from warp._src.fem import cache
20
+ from warp._src.fem.types import Coords
21
+
22
+ from .shape_function import ShapeFunction
23
+
24
+ _wp_module_name_ = "warp.fem.space.shape.triangle_shape_function"
25
+
26
+
27
+ def _triangle_node_index(tx: int, ty: int, degree: int):
28
+ VERTEX_NODE_COUNT = 3
29
+ SIDE_INTERIOR_NODE_COUNT = degree - 1
30
+
31
+ # Index in similar order to e.g. VTK
32
+ # First vertices, then edge (counterclockwise) then interior points (recursively)
33
+
34
+ if tx == 0:
35
+ if ty == 0:
36
+ return 0
37
+ elif ty == degree:
38
+ return 2
39
+ else:
40
+ edge_index = 2
41
+ return VERTEX_NODE_COUNT + SIDE_INTERIOR_NODE_COUNT * edge_index + (SIDE_INTERIOR_NODE_COUNT - ty)
42
+ elif ty == 0:
43
+ if tx == degree:
44
+ return 1
45
+ else:
46
+ edge_index = 0
47
+ return VERTEX_NODE_COUNT + SIDE_INTERIOR_NODE_COUNT * edge_index + tx - 1
48
+ elif tx + ty == degree:
49
+ edge_index = 1
50
+ return VERTEX_NODE_COUNT + SIDE_INTERIOR_NODE_COUNT * edge_index + ty - 1
51
+
52
+ vertex_edge_node_count = 3 * degree
53
+ return vertex_edge_node_count + _triangle_node_index(tx - 1, ty - 1, degree - 3)
54
+
55
+
56
+ class TriangleShapeFunction(ShapeFunction):
57
+ VERTEX = wp.constant(0)
58
+ EDGE = wp.constant(1)
59
+ INTERIOR = wp.constant(2)
60
+
61
+ VERTEX_NODE_COUNT: int
62
+ """Number of shape function nodes per vertex"""
63
+
64
+ EDGE_NODE_COUNT: int
65
+ """Number of shape function nodes per triangle edge (excluding vertex nodes)"""
66
+
67
+ INTERIOR_NODE_COUNT: int
68
+ """Number of shape function nodes per triangle (excluding edge and vertex nodes)"""
69
+
70
+ @staticmethod
71
+ def node_type_and_index(node_index_in_elt: int):
72
+ pass
73
+
74
+ @wp.func
75
+ def _vertex_coords(vidx: int):
76
+ return wp.vec2(
77
+ float(vidx == 1),
78
+ float(vidx == 2),
79
+ )
80
+
81
+
82
+ class TrianglePolynomialShapeFunctions(TriangleShapeFunction):
83
+ def __init__(self, degree: int):
84
+ self.ORDER = wp.constant(degree)
85
+
86
+ self.NODES_PER_ELEMENT = wp.constant((degree + 1) * (degree + 2) // 2)
87
+ self.NODES_PER_SIDE = wp.constant(degree + 1)
88
+
89
+ self.VERTEX_NODE_COUNT = wp.constant(1)
90
+ self.EDGE_NODE_COUNT = wp.constant(degree - 1)
91
+ self.INTERIOR_NODE_COUNT = wp.constant(max(0, degree - 2) * max(0, degree - 1) // 2)
92
+
93
+ triangle_coords = np.empty((self.NODES_PER_ELEMENT, 2), dtype=int)
94
+
95
+ for tx in range(degree + 1):
96
+ for ty in range(degree + 1 - tx):
97
+ index = _triangle_node_index(tx, ty, degree)
98
+ triangle_coords[index] = [tx, ty]
99
+
100
+ CoordTypeVec = cache.cached_mat_type(dtype=int, shape=(self.NODES_PER_ELEMENT, 2))
101
+ self.NODE_TRIANGLE_COORDS = wp.constant(CoordTypeVec(triangle_coords))
102
+
103
+ self.node_type_and_type_index = self._get_node_type_and_type_index()
104
+ self._node_triangle_coordinates = self._get_node_triangle_coordinates()
105
+
106
+ @property
107
+ def name(self) -> str:
108
+ return f"Tri_P{self.ORDER}"
109
+
110
+ def _get_node_triangle_coordinates(self):
111
+ NODE_TRIANGLE_COORDS = self.NODE_TRIANGLE_COORDS
112
+
113
+ def node_triangle_coordinates(
114
+ node_index_in_elt: int,
115
+ ):
116
+ return NODE_TRIANGLE_COORDS[node_index_in_elt]
117
+
118
+ return cache.get_func(node_triangle_coordinates, self.name)
119
+
120
+ def _get_node_type_and_type_index(self):
121
+ ORDER = self.ORDER
122
+
123
+ def node_type_and_index(
124
+ node_index_in_elt: int,
125
+ ):
126
+ if node_index_in_elt < 3:
127
+ return TrianglePolynomialShapeFunctions.VERTEX, node_index_in_elt
128
+
129
+ if node_index_in_elt < 3 * ORDER:
130
+ return TrianglePolynomialShapeFunctions.EDGE, (node_index_in_elt - 3)
131
+
132
+ return TrianglePolynomialShapeFunctions.INTERIOR, (node_index_in_elt - 3 * ORDER)
133
+
134
+ return cache.get_func(node_type_and_index, self.name)
135
+
136
+ def make_node_coords_in_element(self):
137
+ ORDER = self.ORDER
138
+
139
+ def node_coords_in_element(
140
+ node_index_in_elt: int,
141
+ ):
142
+ tri_coords = self._node_triangle_coordinates(node_index_in_elt)
143
+ cx = float(tri_coords[0]) / float(ORDER)
144
+ cy = float(tri_coords[1]) / float(ORDER)
145
+ return Coords(1.0 - cx - cy, cx, cy)
146
+
147
+ return cache.get_func(node_coords_in_element, self.name)
148
+
149
+ def make_node_quadrature_weight(self):
150
+ if self.ORDER == 3:
151
+ # P3 intrinsic quadrature
152
+ vertex_weight = 1.0 / 30
153
+ edge_weight = 0.075
154
+ interior_weight = 0.45
155
+ elif self.ORDER == 2:
156
+ # Order 1, but optimized quadrature weights for monomials of order <= 4
157
+ vertex_weight = 0.022335964126
158
+ edge_weight = 0.310997369207
159
+ interior_weight = 0.0
160
+ else:
161
+ vertex_weight = 1.0 / self.NODES_PER_ELEMENT
162
+ edge_weight = 1.0 / self.NODES_PER_ELEMENT
163
+ interior_weight = 1.0 / self.NODES_PER_ELEMENT
164
+
165
+ VERTEX_WEIGHT = wp.constant(vertex_weight)
166
+ EDGE_WEIGHT = wp.constant(edge_weight)
167
+ INTERIOR_WEIGHT = wp.constant(interior_weight)
168
+
169
+ @cache.dynamic_func(suffix=self.name)
170
+ def node_quadrature_weight(node_index_in_element: int):
171
+ node_type, type_index = self.node_type_and_type_index(node_index_in_element)
172
+
173
+ if node_type == TrianglePolynomialShapeFunctions.VERTEX:
174
+ return VERTEX_WEIGHT
175
+ elif node_type == TrianglePolynomialShapeFunctions.EDGE:
176
+ return EDGE_WEIGHT
177
+
178
+ return INTERIOR_WEIGHT
179
+
180
+ return node_quadrature_weight
181
+
182
+ def make_trace_node_quadrature_weight(self):
183
+ # Closed Newton-Cotes
184
+ if self.ORDER == 3:
185
+ vertex_weight = 1.0 / 8.0
186
+ edge_weight = 3.0 / 8.0
187
+ elif self.ORDER == 2:
188
+ vertex_weight = 1.0 / 6.0
189
+ edge_weight = 2.0 / 3.0
190
+ else:
191
+ vertex_weight = 1.0 / self.NODES_PER_SIDE
192
+ edge_weight = 1.0 / self.NODES_PER_SIDE
193
+
194
+ VERTEX_WEIGHT = wp.constant(vertex_weight)
195
+ EDGE_WEIGHT = wp.constant(edge_weight)
196
+
197
+ @cache.dynamic_func(suffix=self.name)
198
+ def trace_node_quadrature_weight(node_index_in_element: int):
199
+ node_type, type_index = self.node_type_and_type_index(node_index_in_element)
200
+
201
+ return wp.where(node_type == TrianglePolynomialShapeFunctions.VERTEX, VERTEX_WEIGHT, EDGE_WEIGHT)
202
+
203
+ return trace_node_quadrature_weight
204
+
205
+ def make_element_inner_weight(self):
206
+ ORDER = self.ORDER
207
+
208
+ def element_inner_weight_linear(
209
+ coords: Coords,
210
+ node_index_in_elt: int,
211
+ ):
212
+ return coords[node_index_in_elt]
213
+
214
+ def element_inner_weight_quadratic(
215
+ coords: Coords,
216
+ node_index_in_elt: int,
217
+ ):
218
+ node_type, type_index = self.node_type_and_type_index(node_index_in_elt)
219
+
220
+ if node_type == TrianglePolynomialShapeFunctions.VERTEX:
221
+ # Vertex
222
+ return coords[type_index] * (2.0 * coords[type_index] - 1.0)
223
+
224
+ # Edge
225
+ c1 = type_index
226
+ c2 = (type_index + 1) % 3
227
+ return 4.0 * coords[c1] * coords[c2]
228
+
229
+ def element_inner_weight_cubic(
230
+ coords: Coords,
231
+ node_index_in_elt: int,
232
+ ):
233
+ node_type, type_index = self.node_type_and_type_index(node_index_in_elt)
234
+
235
+ if node_type == TrianglePolynomialShapeFunctions.VERTEX:
236
+ # Vertex
237
+ return 0.5 * coords[type_index] * (3.0 * coords[type_index] - 1.0) * (3.0 * coords[type_index] - 2.0)
238
+
239
+ elif node_type == TrianglePolynomialShapeFunctions.EDGE:
240
+ # Edge
241
+ edge = type_index // 2
242
+ k = type_index - 2 * edge
243
+ c1 = (edge + k) % 3
244
+ c2 = (edge + 1 - k) % 3
245
+
246
+ return 4.5 * coords[c1] * coords[c2] * (3.0 * coords[c1] - 1.0)
247
+
248
+ # Interior
249
+ return 27.0 * coords[0] * coords[1] * coords[2]
250
+
251
+ if ORDER == 1:
252
+ return cache.get_func(element_inner_weight_linear, self.name)
253
+ elif ORDER == 2:
254
+ return cache.get_func(element_inner_weight_quadratic, self.name)
255
+ elif ORDER == 3:
256
+ return cache.get_func(element_inner_weight_cubic, self.name)
257
+
258
+ return None
259
+
260
+ def make_element_inner_weight_gradient(self):
261
+ ORDER = self.ORDER
262
+
263
+ def element_inner_weight_gradient_linear(
264
+ coords: Coords,
265
+ node_index_in_elt: int,
266
+ ):
267
+ dw_dc = wp.vec3(0.0)
268
+ dw_dc[node_index_in_elt] = 1.0
269
+
270
+ dw_du = wp.vec2(dw_dc[1] - dw_dc[0], dw_dc[2] - dw_dc[0])
271
+ return dw_du
272
+
273
+ def element_inner_weight_gradient_quadratic(
274
+ coords: Coords,
275
+ node_index_in_elt: int,
276
+ ):
277
+ node_type, type_index = self.node_type_and_type_index(node_index_in_elt)
278
+
279
+ dw_dc = wp.vec3(0.0)
280
+
281
+ if node_type == TrianglePolynomialShapeFunctions.VERTEX:
282
+ # Vertex
283
+ dw_dc[type_index] = 4.0 * coords[type_index] - 1.0
284
+
285
+ else:
286
+ # Edge
287
+ c1 = type_index
288
+ c2 = (type_index + 1) % 3
289
+ dw_dc[c1] = 4.0 * coords[c2]
290
+ dw_dc[c2] = 4.0 * coords[c1]
291
+
292
+ dw_du = wp.vec2(dw_dc[1] - dw_dc[0], dw_dc[2] - dw_dc[0])
293
+ return dw_du
294
+
295
+ def element_inner_weight_gradient_cubic(
296
+ coords: Coords,
297
+ node_index_in_elt: int,
298
+ ):
299
+ node_type, type_index = self.node_type_and_type_index(node_index_in_elt)
300
+
301
+ dw_dc = wp.vec3(0.0)
302
+
303
+ if node_type == TrianglePolynomialShapeFunctions.VERTEX:
304
+ # Vertex
305
+ dw_dc[type_index] = (
306
+ 0.5 * 27.0 * coords[type_index] * coords[type_index] - 9.0 * coords[type_index] + 1.0
307
+ )
308
+
309
+ elif node_type == TrianglePolynomialShapeFunctions.EDGE:
310
+ # Edge
311
+ edge = type_index // 2
312
+ k = type_index - 2 * edge
313
+ c1 = (edge + k) % 3
314
+ c2 = (edge + 1 - k) % 3
315
+
316
+ dw_dc[c1] = 4.5 * coords[c2] * (6.0 * coords[c1] - 1.0)
317
+ dw_dc[c2] = 4.5 * coords[c1] * (3.0 * coords[c1] - 1.0)
318
+
319
+ else:
320
+ # Interior
321
+ dw_dc = wp.vec3(
322
+ 27.0 * coords[1] * coords[2], 27.0 * coords[2] * coords[0], 27.0 * coords[0] * coords[1]
323
+ )
324
+
325
+ dw_du = wp.vec2(dw_dc[1] - dw_dc[0], dw_dc[2] - dw_dc[0])
326
+ return dw_du
327
+
328
+ if ORDER == 1:
329
+ return cache.get_func(element_inner_weight_gradient_linear, self.name)
330
+ elif ORDER == 2:
331
+ return cache.get_func(element_inner_weight_gradient_quadratic, self.name)
332
+ elif ORDER == 3:
333
+ return cache.get_func(element_inner_weight_gradient_cubic, self.name)
334
+
335
+ return None
336
+
337
+ def element_node_triangulation(self):
338
+ if self.ORDER == 1:
339
+ element_triangles = [[0, 1, 2]]
340
+ if self.ORDER == 2:
341
+ element_triangles = [[0, 3, 5], [3, 1, 4], [2, 5, 4], [3, 4, 5]]
342
+ elif self.ORDER == 3:
343
+ element_triangles = [
344
+ [0, 3, 8],
345
+ [3, 4, 9],
346
+ [4, 1, 5],
347
+ [8, 3, 9],
348
+ [4, 5, 9],
349
+ [8, 9, 7],
350
+ [9, 5, 6],
351
+ [6, 7, 9],
352
+ [7, 6, 2],
353
+ ]
354
+
355
+ return np.array(element_triangles)
356
+
357
+ def element_vtk_cells(self):
358
+ cells = np.arange(self.NODES_PER_ELEMENT)
359
+ if self.ORDER == 1:
360
+ cell_type = 5 # VTK_TRIANGLE
361
+ else:
362
+ cell_type = 69 # VTK_LAGRANGE_TRIANGLE
363
+ return cells[np.newaxis, :], np.array([cell_type], dtype=np.int8)
364
+
365
+
366
+ class TriangleNonConformingPolynomialShapeFunctions(ShapeFunction):
367
+ def __init__(self, degree: int):
368
+ self._tri_shape = TrianglePolynomialShapeFunctions(degree=degree)
369
+ self.ORDER = self._tri_shape.ORDER
370
+ self.NODES_PER_ELEMENT = self._tri_shape.NODES_PER_ELEMENT
371
+
372
+ self.element_node_triangulation = self._tri_shape.element_node_triangulation
373
+ self.element_vtk_cells = self._tri_shape.element_vtk_cells
374
+
375
+ # Coordinates (a, b, b) of embedded triangle
376
+ if self.ORDER == 1:
377
+ # Order 2
378
+ a = 2.0 / 3.0
379
+ elif self.ORDER == 2:
380
+ # Order 2, optimized for small intrinsic quadrature error up to degree 4
381
+ a = 0.7790771484375001
382
+ elif self.ORDER == 3:
383
+ # Order 3, optimized for small intrinsic quadrature error up to degree 6
384
+ a = 0.8429443359375002
385
+ else:
386
+ a = 1.0
387
+
388
+ b = 0.5 * (1.0 - a)
389
+ self._small_to_big = np.full((3, 3), b) + (a - b) * np.eye(3)
390
+ self._tri_scale = a - b
391
+
392
+ @property
393
+ def name(self) -> str:
394
+ return f"Tri_dP{self.ORDER}"
395
+
396
+ def make_node_quadrature_weight(self):
397
+ # Intrinsic quadrature -- precomputed integral of node shape functions
398
+ # over element. Order equal to self.ORDER
399
+
400
+ if self.ORDER == 2:
401
+ vertex_weight = 0.13743348
402
+ edge_weight = 0.19589985
403
+ interior_weight = 0.0
404
+ elif self.ORDER == 3:
405
+ vertex_weight = 0.07462578
406
+ edge_weight = 0.1019807
407
+ interior_weight = 0.16423881
408
+ else:
409
+ vertex_weight = 1.0 / self.NODES_PER_ELEMENT
410
+ edge_weight = 1.0 / self.NODES_PER_ELEMENT
411
+ interior_weight = 1.0 / self.NODES_PER_ELEMENT
412
+
413
+ VERTEX_WEIGHT = wp.constant(vertex_weight)
414
+ EDGE_WEIGHT = wp.constant(edge_weight)
415
+ INTERIOR_WEIGHT = wp.constant(interior_weight)
416
+
417
+ @cache.dynamic_func(suffix=self.name)
418
+ def node_quadrature_weight(node_index_in_element: int):
419
+ node_type, type_index = self._tri_shape.node_type_and_type_index(node_index_in_element)
420
+
421
+ if node_type == TrianglePolynomialShapeFunctions.VERTEX:
422
+ return VERTEX_WEIGHT
423
+ elif node_type == TrianglePolynomialShapeFunctions.EDGE:
424
+ return EDGE_WEIGHT
425
+
426
+ return INTERIOR_WEIGHT
427
+
428
+ return node_quadrature_weight
429
+
430
+ def make_trace_node_quadrature_weight(self):
431
+ # Non-conforming, zero measure on sides
432
+
433
+ @wp.func
434
+ def zero(node_index_in_elt: int):
435
+ return 0.0
436
+
437
+ return zero
438
+
439
+ def make_node_coords_in_element(self):
440
+ node_coords_in_tet = self._tri_shape.make_node_coords_in_element()
441
+
442
+ SMALL_TO_BIG = wp.constant(wp.mat33(self._small_to_big))
443
+
444
+ @cache.dynamic_func(suffix=self.name)
445
+ def node_coords_in_element(
446
+ node_index_in_elt: int,
447
+ ):
448
+ tri_coords = node_coords_in_tet(node_index_in_elt)
449
+ return SMALL_TO_BIG * tri_coords
450
+
451
+ return node_coords_in_element
452
+
453
+ def make_element_inner_weight(self):
454
+ tri_inner_weight = self._tri_shape.make_element_inner_weight()
455
+
456
+ BIG_TO_SMALL = wp.constant(wp.mat33(np.linalg.inv(self._small_to_big)))
457
+
458
+ @cache.dynamic_func(suffix=self.name)
459
+ def element_inner_weight(
460
+ coords: Coords,
461
+ node_index_in_elt: int,
462
+ ):
463
+ tri_coords = BIG_TO_SMALL * coords
464
+ return tri_inner_weight(tri_coords, node_index_in_elt)
465
+
466
+ return element_inner_weight
467
+
468
+ def make_element_inner_weight_gradient(self):
469
+ tri_inner_weight_gradient = self._tri_shape.make_element_inner_weight_gradient()
470
+
471
+ BIG_TO_SMALL = wp.constant(wp.mat33(np.linalg.inv(self._small_to_big)))
472
+ INV_TRI_SCALE = wp.constant(1.0 / self._tri_scale)
473
+
474
+ @cache.dynamic_func(suffix=self.name)
475
+ def element_inner_weight_gradient(
476
+ coords: Coords,
477
+ node_index_in_elt: int,
478
+ ):
479
+ tri_coords = BIG_TO_SMALL * coords
480
+ grad = tri_inner_weight_gradient(tri_coords, node_index_in_elt)
481
+ return INV_TRI_SCALE * grad
482
+
483
+ return element_inner_weight_gradient
484
+
485
+
486
+ class TriangleNedelecFirstKindShapeFunctions(TriangleShapeFunction):
487
+ value = ShapeFunction.Value.CovariantVector
488
+
489
+ def __init__(self, degree: int):
490
+ if degree != 1:
491
+ raise NotImplementedError("Only linear Nédélec implemented right now")
492
+
493
+ self.ORDER = wp.constant(degree)
494
+
495
+ self.NODES_PER_ELEMENT = wp.constant(3)
496
+ self.NODES_PER_SIDE = wp.constant(1)
497
+
498
+ self.VERTEX_NODE_COUNT = wp.constant(0)
499
+ self.EDGE_NODE_COUNT = wp.constant(1)
500
+ self.INTERIOR_NODE_COUNT = wp.constant(0)
501
+
502
+ self.node_type_and_type_index = self._get_node_type_and_type_index()
503
+
504
+ @property
505
+ def name(self) -> str:
506
+ return f"TriN1_{self.ORDER}"
507
+
508
+ def _get_node_type_and_type_index(self):
509
+ @cache.dynamic_func(suffix=self.name)
510
+ def node_type_and_index(
511
+ node_index_in_elt: int,
512
+ ):
513
+ return TriangleShapeFunction.EDGE, node_index_in_elt
514
+
515
+ return node_type_and_index
516
+
517
+ def make_node_coords_in_element(self):
518
+ @cache.dynamic_func(suffix=self.name)
519
+ def node_coords_in_element(
520
+ node_index_in_elt: int,
521
+ ):
522
+ coords = Coords(0.5)
523
+ coords[(node_index_in_elt + 2) % 3] = 0.0
524
+ return coords
525
+
526
+ return node_coords_in_element
527
+
528
+ def make_node_quadrature_weight(self):
529
+ NODES_PER_ELEMENT = self.NODES_PER_ELEMENT
530
+
531
+ @cache.dynamic_func(suffix=self.name)
532
+ def node_quadrature_weight(node_index_in_element: int):
533
+ return 1.0 / float(NODES_PER_ELEMENT)
534
+
535
+ return node_quadrature_weight
536
+
537
+ def make_trace_node_quadrature_weight(self):
538
+ NODES_PER_SIDE = self.NODES_PER_SIDE
539
+
540
+ @cache.dynamic_func(suffix=self.name)
541
+ def trace_node_quadrature_weight(node_index_in_element: int):
542
+ return 1.0 / float(NODES_PER_SIDE)
543
+
544
+ return trace_node_quadrature_weight
545
+
546
+ @wp.func
547
+ def _vertex_coords(vidx: int):
548
+ return wp.vec2(
549
+ float(vidx == 1),
550
+ float(vidx == 2),
551
+ )
552
+
553
+ def make_element_inner_weight(self):
554
+ ORDER = self.ORDER
555
+
556
+ def element_inner_weight_linear(
557
+ coords: Coords,
558
+ node_index_in_elt: int,
559
+ ):
560
+ x = wp.vec2(coords[1], coords[2])
561
+ p = self._vertex_coords((node_index_in_elt + 2) % 3)
562
+
563
+ d = x - p
564
+ return wp.vec2(-d[1], d[0])
565
+
566
+ if ORDER == 1:
567
+ return cache.get_func(element_inner_weight_linear, self.name)
568
+
569
+ return None
570
+
571
+ def make_element_inner_weight_gradient(self):
572
+ ROT = wp.constant(wp.mat22f(0.0, -1.0, 1.0, 0.0))
573
+
574
+ def element_inner_weight_gradient_linear(
575
+ coords: Coords,
576
+ node_index_in_elt: int,
577
+ ):
578
+ return ROT
579
+
580
+ if self.ORDER == 1:
581
+ return cache.get_func(element_inner_weight_gradient_linear, self.name)
582
+
583
+ return None
584
+
585
+
586
+ class TriangleRaviartThomasShapeFunctions(TriangleShapeFunction):
587
+ value = ShapeFunction.Value.ContravariantVector
588
+
589
+ def __init__(self, degree: int):
590
+ if degree != 1:
591
+ raise NotImplementedError("Only linear Raviart-Thomas implemented right now")
592
+
593
+ self.ORDER = wp.constant(degree)
594
+
595
+ self.NODES_PER_ELEMENT = wp.constant(3)
596
+ self.NODES_PER_SIDE = wp.constant(1)
597
+
598
+ self.VERTEX_NODE_COUNT = wp.constant(0)
599
+ self.EDGE_NODE_COUNT = wp.constant(1)
600
+ self.INTERIOR_NODE_COUNT = wp.constant(0)
601
+
602
+ self.node_type_and_type_index = self._get_node_type_and_type_index()
603
+
604
+ @property
605
+ def name(self) -> str:
606
+ return f"TriRT_{self.ORDER}"
607
+
608
+ def _get_node_type_and_type_index(self):
609
+ @cache.dynamic_func(suffix=self.name)
610
+ def node_type_and_index(
611
+ node_index_in_elt: int,
612
+ ):
613
+ return TriangleShapeFunction.EDGE, node_index_in_elt
614
+
615
+ return node_type_and_index
616
+
617
+ def make_node_coords_in_element(self):
618
+ @cache.dynamic_func(suffix=self.name)
619
+ def node_coords_in_element(
620
+ node_index_in_elt: int,
621
+ ):
622
+ coords = Coords(0.5)
623
+ coords[(node_index_in_elt + 2) % 3] = 0.0
624
+ return coords
625
+
626
+ return node_coords_in_element
627
+
628
+ def make_node_quadrature_weight(self):
629
+ NODES_PER_ELEMENT = self.NODES_PER_ELEMENT
630
+
631
+ @cache.dynamic_func(suffix=self.name)
632
+ def node_quadrature_weight(node_index_in_element: int):
633
+ return 1.0 / float(NODES_PER_ELEMENT)
634
+
635
+ return node_quadrature_weight
636
+
637
+ def make_trace_node_quadrature_weight(self):
638
+ NODES_PER_SIDE = self.NODES_PER_SIDE
639
+
640
+ @cache.dynamic_func(suffix=self.name)
641
+ def trace_node_quadrature_weight(node_index_in_element: int):
642
+ return 1.0 / float(NODES_PER_SIDE)
643
+
644
+ return trace_node_quadrature_weight
645
+
646
+ def make_element_inner_weight(self):
647
+ ORDER = self.ORDER
648
+
649
+ def element_inner_weight_linear(
650
+ coords: Coords,
651
+ node_index_in_elt: int,
652
+ ):
653
+ x = wp.vec2(coords[1], coords[2])
654
+ p = self._vertex_coords((node_index_in_elt + 2) % 3)
655
+
656
+ d = x - p
657
+ return d
658
+
659
+ if ORDER == 1:
660
+ return cache.get_func(element_inner_weight_linear, self.name)
661
+
662
+ return None
663
+
664
+ def make_element_inner_weight_gradient(self):
665
+ def element_inner_weight_gradient_linear(
666
+ coords: Coords,
667
+ node_index_in_elt: int,
668
+ ):
669
+ return wp.identity(n=2, dtype=float)
670
+
671
+ if self.ORDER == 1:
672
+ return cache.get_func(element_inner_weight_gradient_linear, self.name)
673
+
674
+ return None