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,539 @@
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
+ from functools import cached_property
17
+ from typing import Any, Optional
18
+
19
+ import warp as wp
20
+ from warp._src.fem.cache import cached_arg_value, dynamic_func
21
+ from warp._src.fem.types import NULL_ELEMENT_INDEX, OUTSIDE, Coords, ElementIndex, Sample, make_free_sample
22
+
23
+ from .closest_point import project_on_box_at_origin
24
+ from .element import Element
25
+ from .geometry import Geometry
26
+
27
+ _wp_module_name_ = "warp.fem.geometry.grid_3d"
28
+
29
+
30
+ @wp.struct
31
+ class Grid3DCellArg:
32
+ res: wp.vec3i
33
+ cell_size: wp.vec3
34
+ origin: wp.vec3
35
+
36
+
37
+ class Grid3D(Geometry):
38
+ """Three-dimensional regular grid geometry"""
39
+
40
+ dimension = 3
41
+
42
+ def __init__(self, res: wp.vec3i, bounds_lo: Optional[wp.vec3] = None, bounds_hi: Optional[wp.vec3] = None):
43
+ """Constructs a dense 3D grid
44
+
45
+ Args:
46
+ res: Resolution of the grid along each dimension
47
+ bounds_lo: Position of the lower bound of the axis-aligned grid
48
+ bounds_hi: Position of the upper bound of the axis-aligned grid
49
+ """
50
+
51
+ if bounds_lo is None:
52
+ bounds_lo = wp.vec3(0.0)
53
+
54
+ if bounds_hi is None:
55
+ bounds_hi = wp.vec3(1.0)
56
+
57
+ self.bounds_lo = bounds_lo
58
+ self.bounds_hi = bounds_hi
59
+
60
+ self._res = res
61
+
62
+ @cached_property
63
+ def extents(self) -> wp.vec3:
64
+ # Avoid using native sub due to higher over of calling builtins from Python
65
+ return wp.vec3(
66
+ self.bounds_hi[0] - self.bounds_lo[0],
67
+ self.bounds_hi[1] - self.bounds_lo[1],
68
+ self.bounds_hi[2] - self.bounds_lo[2],
69
+ )
70
+
71
+ @cached_property
72
+ def cell_size(self) -> wp.vec3:
73
+ ex = self.extents
74
+ return wp.vec3(
75
+ ex[0] / self.res[0],
76
+ ex[1] / self.res[1],
77
+ ex[2] / self.res[2],
78
+ )
79
+
80
+ def cell_count(self):
81
+ return self.res[0] * self.res[1] * self.res[2]
82
+
83
+ def vertex_count(self):
84
+ return (self.res[0] + 1) * (self.res[1] + 1) * (self.res[2] + 1)
85
+
86
+ def side_count(self):
87
+ return (
88
+ (self.res[0] + 1) * (self.res[1]) * (self.res[2])
89
+ + (self.res[0]) * (self.res[1] + 1) * (self.res[2])
90
+ + (self.res[0]) * (self.res[1]) * (self.res[2] + 1)
91
+ )
92
+
93
+ def edge_count(self):
94
+ return (
95
+ (self.res[0] + 1) * (self.res[1] + 1) * (self.res[2])
96
+ + (self.res[0]) * (self.res[1] + 1) * (self.res[2] + 1)
97
+ + (self.res[0] + 1) * (self.res[1]) * (self.res[2] + 1)
98
+ )
99
+
100
+ def boundary_side_count(self):
101
+ return 2 * (self.res[1]) * (self.res[2]) + (self.res[0]) * 2 * (self.res[2]) + (self.res[0]) * (self.res[1]) * 2
102
+
103
+ def reference_cell(self) -> Element:
104
+ return Element.CUBE
105
+
106
+ def reference_side(self) -> Element:
107
+ return Element.SQUARE
108
+
109
+ @property
110
+ def res(self):
111
+ return self._res
112
+
113
+ @property
114
+ def origin(self):
115
+ return self.bounds_lo
116
+
117
+ @cached_property
118
+ def strides(self):
119
+ return wp.vec3i(self.res[1] * self.res[2], self.res[2], 1)
120
+
121
+ # Utility device functions
122
+
123
+ CellArg = Grid3DCellArg
124
+ Cell = wp.vec3i
125
+
126
+ @wp.func
127
+ def _to_3d_index(strides: wp.vec2i, index: int):
128
+ x = index // strides[0]
129
+ y = (index - strides[0] * x) // strides[1]
130
+ z = index - strides[0] * x - strides[1] * y
131
+ return wp.vec3i(x, y, z)
132
+
133
+ @wp.func
134
+ def _from_3d_index(strides: wp.vec2i, index: wp.vec3i):
135
+ return strides[0] * index[0] + strides[1] * index[1] + index[2]
136
+
137
+ @wp.func
138
+ def cell_index(res: wp.vec3i, cell: Cell):
139
+ strides = wp.vec2i(res[1] * res[2], res[2])
140
+ return Grid3D._from_3d_index(strides, cell)
141
+
142
+ @wp.func
143
+ def get_cell(res: wp.vec3i, cell_index: ElementIndex):
144
+ strides = wp.vec2i(res[1] * res[2], res[2])
145
+ return Grid3D._to_3d_index(strides, cell_index)
146
+
147
+ @wp.struct
148
+ class Side:
149
+ axis: int # normal
150
+ origin: wp.vec3i # index of vertex at corner (0,0,0)
151
+
152
+ @wp.struct
153
+ class SideArg:
154
+ cell_count: int
155
+ axis_offsets: wp.vec3i
156
+ cell_arg: Grid3DCellArg
157
+
158
+ SideIndexArg = SideArg
159
+
160
+ @wp.func
161
+ def _world_to_local(axis: int, vec: Any):
162
+ return type(vec)(
163
+ vec[axis],
164
+ vec[(axis + 1) % 3],
165
+ vec[(axis + 2) % 3],
166
+ )
167
+
168
+ @wp.func
169
+ def _local_to_world(axis: int, vec: Any):
170
+ return type(vec)(
171
+ vec[(2 * axis) % 3],
172
+ vec[(2 * axis + 1) % 3],
173
+ vec[(2 * axis + 2) % 3],
174
+ )
175
+
176
+ @wp.func
177
+ def _local_to_world_axis(axis: int, loc_index: Any):
178
+ return (axis + loc_index) % 3
179
+
180
+ @wp.func
181
+ def side_index(arg: SideArg, side: Side):
182
+ alt_axis = Grid3D._local_to_world_axis(side.axis, 0)
183
+ if side.origin[0] == arg.cell_arg.res[alt_axis]:
184
+ # Upper-boundary side
185
+ longitude = side.origin[1]
186
+ latitude = side.origin[2]
187
+
188
+ latitude_res = arg.cell_arg.res[Grid3D._local_to_world_axis(side.axis, 2)]
189
+ lat_long = latitude_res * longitude + latitude
190
+
191
+ return 3 * arg.cell_count + arg.axis_offsets[side.axis] + lat_long
192
+
193
+ cell_index = Grid3D.cell_index(arg.cell_arg.res, Grid3D._local_to_world(side.axis, side.origin))
194
+ return side.axis * arg.cell_count + cell_index
195
+
196
+ @wp.func
197
+ def get_side(arg: SideArg, side_index: ElementIndex):
198
+ res = arg.cell_arg.res
199
+
200
+ if side_index < 3 * arg.cell_count:
201
+ axis = side_index // arg.cell_count
202
+ cell_index = side_index - axis * arg.cell_count
203
+ origin_loc = Grid3D._world_to_local(axis, Grid3D.get_cell(res, cell_index))
204
+ return Grid3D.Side(axis, origin_loc)
205
+
206
+ axis_offsets = arg.axis_offsets
207
+ axis_side_index = side_index - 3 * arg.cell_count
208
+ if axis_side_index < axis_offsets[1]:
209
+ axis = 0
210
+ elif axis_side_index < axis_offsets[2]:
211
+ axis = 1
212
+ else:
213
+ axis = 2
214
+
215
+ altitude = res[Grid3D._local_to_world_axis(axis, 0)]
216
+
217
+ lat_long = axis_side_index - axis_offsets[axis]
218
+ latitude_res = res[Grid3D._local_to_world_axis(axis, 2)]
219
+
220
+ longitude = lat_long // latitude_res
221
+ latitude = lat_long - longitude * latitude_res
222
+
223
+ origin_loc = wp.vec3i(altitude, longitude, latitude)
224
+
225
+ return Grid3D.Side(axis, origin_loc)
226
+
227
+ # Geometry device interface
228
+
229
+ def fill_cell_arg(self, args: CellArg, device):
230
+ args.res = self.res
231
+ args.origin = self.bounds_lo
232
+ args.cell_size = self.cell_size
233
+
234
+ @wp.func
235
+ def cell_position(args: CellArg, s: Sample):
236
+ cell = Grid3D.get_cell(args.res, s.element_index)
237
+ return (
238
+ wp.vec3(
239
+ (float(cell[0]) + s.element_coords[0]) * args.cell_size[0],
240
+ (float(cell[1]) + s.element_coords[1]) * args.cell_size[1],
241
+ (float(cell[2]) + s.element_coords[2]) * args.cell_size[2],
242
+ )
243
+ + args.origin
244
+ )
245
+
246
+ @wp.func
247
+ def cell_deformation_gradient(args: CellArg, s: Sample):
248
+ return wp.diag(args.cell_size)
249
+
250
+ @wp.func
251
+ def cell_inverse_deformation_gradient(args: CellArg, s: Sample):
252
+ return wp.diag(wp.cw_div(wp.vec3(1.0), args.cell_size))
253
+
254
+ @wp.func
255
+ def cell_coordinates(args: Grid3DCellArg, cell_index: int, pos: wp.vec3):
256
+ uvw = wp.cw_div(pos - args.origin, args.cell_size)
257
+ ijk = Grid3D.get_cell(args.res, cell_index)
258
+ return uvw - wp.vec3(ijk)
259
+
260
+ @wp.func
261
+ def cell_closest_point(args: Grid3DCellArg, cell_index: int, pos: wp.vec3):
262
+ ijk_world = wp.cw_mul(wp.vec3(Grid3D.get_cell(args.res, cell_index)), args.cell_size) + args.origin
263
+ dist_sq, coords = project_on_box_at_origin(pos - ijk_world, args.cell_size)
264
+ return coords, dist_sq
265
+
266
+ def supports_cell_lookup(self, device):
267
+ return True
268
+
269
+ def make_filtered_cell_lookup(self, filter_func: wp.Function = None):
270
+ suffix = f"{self.name}{filter_func.key if filter_func is not None else ''}"
271
+
272
+ @dynamic_func(suffix=suffix)
273
+ def cell_lookup(args: self.CellArg, pos: wp.vec3, max_dist: float, filter_data: Any, filter_target: Any):
274
+ cell_size = args.cell_size
275
+ res = args.res
276
+
277
+ # Start at closest point on grid
278
+ loc_pos = wp.cw_div(pos - args.origin, cell_size)
279
+ x = wp.clamp(loc_pos[0], 0.0, float(res[0]))
280
+ y = wp.clamp(loc_pos[1], 0.0, float(res[1]))
281
+ z = wp.clamp(loc_pos[2], 0.0, float(res[2]))
282
+
283
+ x_cell = wp.min(wp.floor(x), float(res[0]) - 1.0)
284
+ y_cell = wp.min(wp.floor(y), float(res[1]) - 1.0)
285
+ z_cell = wp.min(wp.floor(z), float(res[2]) - 1.0)
286
+
287
+ coords = Coords(x - x_cell, y - y_cell, z - z_cell)
288
+ cell_index = Grid3D.cell_index(res, Grid3D.Cell(int(x_cell), int(y_cell), int(z_cell)))
289
+
290
+ if wp.static(filter_func is None):
291
+ return make_free_sample(cell_index, coords)
292
+ else:
293
+ if filter_func(filter_data, cell_index) == filter_target:
294
+ return make_free_sample(cell_index, coords)
295
+
296
+ offset = float(0.5)
297
+ min_cell_size = wp.min(cell_size)
298
+ max_offset = wp.ceil(max_dist / min_cell_size)
299
+ scales = wp.cw_div(wp.vec3(min_cell_size), cell_size)
300
+
301
+ closest_cell = NULL_ELEMENT_INDEX
302
+ closest_coords = Coords()
303
+
304
+ # Iterate over increasingly larger neighborhoods
305
+ while closest_cell == NULL_ELEMENT_INDEX:
306
+ i_min = wp.max(0, int(wp.floor(x - offset * scales[0])))
307
+ i_max = wp.min(res[0], int(wp.floor(x + offset * scales[0])) + 1)
308
+ j_min = wp.max(0, int(wp.floor(y - offset * scales[1])))
309
+ j_max = wp.min(res[1], int(wp.floor(y + offset * scales[1])) + 1)
310
+ k_min = wp.max(0, int(wp.floor(z - offset * scales[2])))
311
+ k_max = wp.min(res[2], int(wp.floor(z + offset * scales[2])) + 1)
312
+
313
+ closest_dist = min_cell_size * min_cell_size * float(offset * offset)
314
+
315
+ for i in range(i_min, i_max):
316
+ for j in range(j_min, j_max):
317
+ for k in range(k_min, k_max):
318
+ ijk = Grid3D.Cell(i, j, k)
319
+ cell_index = Grid3D.cell_index(res, ijk)
320
+ if filter_func(filter_data, cell_index) == filter_target:
321
+ rel_pos = wp.cw_mul(loc_pos - wp.vec3(ijk), cell_size)
322
+ dist, coords = project_on_box_at_origin(rel_pos, cell_size)
323
+
324
+ if dist <= closest_dist:
325
+ closest_dist = dist
326
+ closest_coords = coords
327
+ closest_cell = cell_index
328
+
329
+ if offset >= max_offset:
330
+ break
331
+ offset = wp.min(3.0 * offset, max_offset)
332
+
333
+ return make_free_sample(closest_cell, closest_coords)
334
+
335
+ return cell_lookup
336
+
337
+ @wp.func
338
+ def cell_measure(args: CellArg, s: Sample):
339
+ return args.cell_size[0] * args.cell_size[1] * args.cell_size[2]
340
+
341
+ @wp.func
342
+ def cell_normal(args: CellArg, s: Sample):
343
+ return wp.vec3(0.0)
344
+
345
+ @cached_arg_value
346
+ def side_arg_value(self, device) -> SideArg:
347
+ args = self.SideArg()
348
+ axis_dims = wp.vec3i(
349
+ self.res[1] * self.res[2],
350
+ self.res[2] * self.res[0],
351
+ self.res[0] * self.res[1],
352
+ )
353
+ args.axis_offsets = wp.vec3i(
354
+ 0,
355
+ axis_dims[0],
356
+ axis_dims[0] + axis_dims[1],
357
+ )
358
+ args.cell_count = self.cell_count()
359
+ args.cell_arg = self.cell_arg_value(device)
360
+ return args
361
+
362
+ def side_index_arg_value(self, device) -> SideIndexArg:
363
+ return self.side_arg_value(device)
364
+
365
+ @wp.func
366
+ def boundary_side_index(args: SideArg, boundary_side_index: int):
367
+ """Boundary side to side index"""
368
+
369
+ axis_side_index = boundary_side_index // 2
370
+ border = boundary_side_index - 2 * axis_side_index
371
+
372
+ if axis_side_index < args.axis_offsets[1]:
373
+ axis = 0
374
+ elif axis_side_index < args.axis_offsets[2]:
375
+ axis = 1
376
+ else:
377
+ axis = 2
378
+
379
+ lat_long = axis_side_index - args.axis_offsets[axis]
380
+ latitude_res = args.cell_arg.res[Grid3D._local_to_world_axis(axis, 2)]
381
+
382
+ longitude = lat_long // latitude_res
383
+ latitude = lat_long - longitude * latitude_res
384
+
385
+ altitude = border * args.cell_arg.res[axis]
386
+
387
+ side = Grid3D.Side(axis, wp.vec3i(altitude, longitude, latitude))
388
+ return Grid3D.side_index(args, side)
389
+
390
+ @wp.func
391
+ def side_position(args: SideArg, s: Sample):
392
+ side = Grid3D.get_side(args, s.element_index)
393
+
394
+ coord0 = wp.where(side.origin[0] == 0, 1.0 - s.element_coords[0], s.element_coords[0])
395
+
396
+ local_pos = wp.vec3(
397
+ float(side.origin[0]),
398
+ float(side.origin[1]) + coord0,
399
+ float(side.origin[2]) + s.element_coords[1],
400
+ )
401
+
402
+ pos = args.cell_arg.origin + wp.cw_mul(Grid3D._local_to_world(side.axis, local_pos), args.cell_arg.cell_size)
403
+
404
+ return pos
405
+
406
+ @wp.func
407
+ def side_deformation_gradient(args: SideArg, s: Sample):
408
+ side = Grid3D.get_side(args, s.element_index)
409
+
410
+ sign = wp.where(side.origin[0] == 0, -1.0, 1.0)
411
+
412
+ return wp.matrix_from_cols(
413
+ wp.cw_mul(Grid3D._local_to_world(side.axis, wp.vec3(0.0, sign, 0.0)), args.cell_arg.cell_size),
414
+ wp.cw_mul(Grid3D._local_to_world(side.axis, wp.vec3(0.0, 0.0, 1.0)), args.cell_arg.cell_size),
415
+ )
416
+
417
+ @wp.func
418
+ def side_inner_inverse_deformation_gradient(args: SideArg, s: Sample):
419
+ return Grid3D.cell_inverse_deformation_gradient(args.cell_arg, s)
420
+
421
+ @wp.func
422
+ def side_outer_inverse_deformation_gradient(args: SideArg, s: Sample):
423
+ return Grid3D.cell_inverse_deformation_gradient(args.cell_arg, s)
424
+
425
+ @wp.func
426
+ def side_measure(args: SideArg, s: Sample):
427
+ side = Grid3D.get_side(args, s.element_index)
428
+ long_axis = Grid3D._local_to_world_axis(side.axis, 1)
429
+ lat_axis = Grid3D._local_to_world_axis(side.axis, 2)
430
+ return args.cell_arg.cell_size[long_axis] * args.cell_arg.cell_size[lat_axis]
431
+
432
+ @wp.func
433
+ def side_measure_ratio(args: SideArg, s: Sample):
434
+ side = Grid3D.get_side(args, s.element_index)
435
+ alt_axis = Grid3D._local_to_world_axis(side.axis, 0)
436
+ return 1.0 / args.cell_arg.cell_size[alt_axis]
437
+
438
+ @wp.func
439
+ def side_normal(args: SideArg, s: Sample):
440
+ side = Grid3D.get_side(args, s.element_index)
441
+
442
+ sign = wp.where(side.origin[0] == 0, -1.0, 1.0)
443
+
444
+ local_n = wp.vec3(sign, 0.0, 0.0)
445
+ return Grid3D._local_to_world(side.axis, local_n)
446
+
447
+ @wp.func
448
+ def side_inner_cell_index(arg: SideArg, side_index: ElementIndex):
449
+ side = Grid3D.get_side(arg, side_index)
450
+
451
+ inner_alt = wp.where(side.origin[0] == 0, 0, side.origin[0] - 1)
452
+
453
+ inner_origin = wp.vec3i(inner_alt, side.origin[1], side.origin[2])
454
+
455
+ cell = Grid3D._local_to_world(side.axis, inner_origin)
456
+ return Grid3D.cell_index(arg.cell_arg.res, cell)
457
+
458
+ @wp.func
459
+ def side_outer_cell_index(arg: SideArg, side_index: ElementIndex):
460
+ side = Grid3D.get_side(arg, side_index)
461
+
462
+ alt_axis = Grid3D._local_to_world_axis(side.axis, 0)
463
+
464
+ outer_alt = wp.where(
465
+ side.origin[0] == arg.cell_arg.res[alt_axis], arg.cell_arg.res[alt_axis] - 1, side.origin[0]
466
+ )
467
+
468
+ outer_origin = wp.vec3i(outer_alt, side.origin[1], side.origin[2])
469
+
470
+ cell = Grid3D._local_to_world(side.axis, outer_origin)
471
+ return Grid3D.cell_index(arg.cell_arg.res, cell)
472
+
473
+ @wp.func
474
+ def side_inner_cell_coords(args: SideArg, side_index: ElementIndex, side_coords: Coords):
475
+ side = Grid3D.get_side(args, side_index)
476
+
477
+ inner_alt = wp.where(side.origin[0] == 0, 0.0, 1.0)
478
+
479
+ side_coord0 = wp.where(side.origin[0] == 0, 1.0 - side_coords[0], side_coords[0])
480
+
481
+ return Grid3D._local_to_world(side.axis, wp.vec3(inner_alt, side_coord0, side_coords[1]))
482
+
483
+ @wp.func
484
+ def side_outer_cell_coords(args: SideArg, side_index: ElementIndex, side_coords: Coords):
485
+ side = Grid3D.get_side(args, side_index)
486
+
487
+ alt_axis = Grid3D._local_to_world_axis(side.axis, 0)
488
+ outer_alt = wp.where(side.origin[0] == args.cell_arg.res[alt_axis], 1.0, 0.0)
489
+
490
+ side_coord0 = wp.where(side.origin[0] == 0, 1.0 - side_coords[0], side_coords[0])
491
+
492
+ return Grid3D._local_to_world(side.axis, wp.vec3(outer_alt, side_coord0, side_coords[1]))
493
+
494
+ @wp.func
495
+ def side_from_cell_coords(
496
+ args: SideArg,
497
+ side_index: ElementIndex,
498
+ element_index: ElementIndex,
499
+ element_coords: Coords,
500
+ ):
501
+ side = Grid3D.get_side(args, side_index)
502
+ cell = Grid3D.get_cell(args.cell_arg.res, element_index)
503
+
504
+ if float(side.origin[0] - cell[side.axis]) == element_coords[side.axis]:
505
+ long_axis = Grid3D._local_to_world_axis(side.axis, 1)
506
+ lat_axis = Grid3D._local_to_world_axis(side.axis, 2)
507
+ long_coord = element_coords[long_axis]
508
+ long_coord = wp.where(side.origin[0] == 0, 1.0 - long_coord, long_coord)
509
+ return Coords(long_coord, element_coords[lat_axis], 0.0)
510
+
511
+ return Coords(OUTSIDE)
512
+
513
+ @wp.func
514
+ def side_to_cell_arg(side_arg: SideArg):
515
+ return side_arg.cell_arg
516
+
517
+ @wp.func
518
+ def side_coordinates(args: SideArg, side_index: int, pos: wp.vec3):
519
+ cell_arg = args.cell_arg
520
+ side = Grid3D.get_side(args, side_index)
521
+
522
+ pos_loc = Grid3D._world_to_local(side.axis, wp.cw_div(pos - cell_arg.origin, cell_arg.cell_size)) - wp.vec3(
523
+ side.origin
524
+ )
525
+
526
+ coord0 = wp.where(side.origin[0] == 0, 1.0 - pos_loc[1], pos_loc[1])
527
+ return Coords(coord0, pos_loc[2], 0.0)
528
+
529
+ @wp.func
530
+ def side_closest_point(args: SideArg, side_index: int, pos: wp.vec3):
531
+ coord = Grid3D.side_coordinates(args, side_index, pos)
532
+
533
+ cell_arg = args.cell_arg
534
+ side = Grid3D.get_side(args, side_index)
535
+
536
+ loc_cell_size = Grid3D._world_to_local(side.axis, cell_arg.cell_size)
537
+ long_lat_sizes = wp.vec2(loc_cell_size[1], loc_cell_size[2])
538
+ dist, proj_coord = project_on_box_at_origin(wp.vec2(coord[0], coord[1]), long_lat_sizes)
539
+ return proj_coord, dist