warp-lang 1.6.1__py3-none-macosx_10_13_universal2.whl → 1.7.0__py3-none-macosx_10_13_universal2.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 (401) hide show
  1. warp/__init__.py +21 -7
  2. warp/autograd.py +14 -6
  3. warp/bin/libwarp-clang.dylib +0 -0
  4. warp/bin/libwarp.dylib +0 -0
  5. warp/build.py +424 -6
  6. warp/build_dll.py +20 -20
  7. warp/builtins.py +467 -368
  8. warp/codegen.py +193 -125
  9. warp/config.py +56 -12
  10. warp/constants.py +14 -6
  11. warp/context.py +524 -277
  12. warp/dlpack.py +22 -12
  13. warp/examples/__init__.py +14 -6
  14. warp/examples/assets/nonuniform.usd +0 -0
  15. warp/examples/assets/nvidia_logo.png +0 -0
  16. warp/examples/benchmarks/benchmark_api.py +14 -6
  17. warp/examples/benchmarks/benchmark_cloth.py +14 -6
  18. warp/examples/benchmarks/benchmark_cloth_cupy.py +14 -6
  19. warp/examples/benchmarks/benchmark_cloth_jax.py +14 -6
  20. warp/examples/benchmarks/benchmark_cloth_numba.py +15 -0
  21. warp/examples/benchmarks/benchmark_cloth_numpy.py +14 -6
  22. warp/examples/benchmarks/benchmark_cloth_paddle.py +14 -6
  23. warp/examples/benchmarks/benchmark_cloth_pytorch.py +14 -6
  24. warp/examples/benchmarks/benchmark_cloth_taichi.py +14 -6
  25. warp/examples/benchmarks/benchmark_cloth_warp.py +14 -6
  26. warp/examples/benchmarks/benchmark_gemm.py +82 -48
  27. warp/examples/benchmarks/benchmark_interop_paddle.py +14 -6
  28. warp/examples/benchmarks/benchmark_interop_torch.py +14 -6
  29. warp/examples/benchmarks/benchmark_launches.py +14 -6
  30. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  31. warp/examples/browse.py +14 -6
  32. warp/examples/core/example_cupy.py +14 -6
  33. warp/examples/core/example_dem.py +14 -6
  34. warp/examples/core/example_fluid.py +14 -6
  35. warp/examples/core/example_graph_capture.py +14 -6
  36. warp/examples/core/example_marching_cubes.py +14 -6
  37. warp/examples/core/example_mesh.py +14 -6
  38. warp/examples/core/example_mesh_intersect.py +14 -6
  39. warp/examples/core/example_nvdb.py +14 -6
  40. warp/examples/core/example_raycast.py +14 -6
  41. warp/examples/core/example_raymarch.py +14 -6
  42. warp/examples/core/example_render_opengl.py +14 -6
  43. warp/examples/core/example_sample_mesh.py +300 -0
  44. warp/examples/core/example_sph.py +14 -6
  45. warp/examples/core/example_torch.py +14 -6
  46. warp/examples/core/example_wave.py +14 -6
  47. warp/examples/fem/example_adaptive_grid.py +14 -6
  48. warp/examples/fem/example_apic_fluid.py +15 -7
  49. warp/examples/fem/example_burgers.py +16 -8
  50. warp/examples/fem/example_convection_diffusion.py +14 -6
  51. warp/examples/fem/example_convection_diffusion_dg.py +14 -6
  52. warp/examples/fem/example_deformed_geometry.py +15 -7
  53. warp/examples/fem/example_diffusion.py +14 -6
  54. warp/examples/fem/example_diffusion_3d.py +14 -6
  55. warp/examples/fem/example_diffusion_mgpu.py +14 -6
  56. warp/examples/fem/example_distortion_energy.py +15 -7
  57. warp/examples/fem/example_magnetostatics.py +20 -12
  58. warp/examples/fem/example_mixed_elasticity.py +14 -6
  59. warp/examples/fem/example_navier_stokes.py +14 -6
  60. warp/examples/fem/example_nonconforming_contact.py +14 -6
  61. warp/examples/fem/example_stokes.py +14 -6
  62. warp/examples/fem/example_stokes_transfer.py +14 -6
  63. warp/examples/fem/example_streamlines.py +14 -6
  64. warp/examples/fem/utils.py +24 -3
  65. warp/examples/interop/example_jax_callable.py +116 -0
  66. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  67. warp/examples/interop/example_jax_kernel.py +205 -0
  68. warp/examples/optim/example_bounce.py +14 -6
  69. warp/examples/optim/example_cloth_throw.py +14 -6
  70. warp/examples/optim/example_diffray.py +14 -6
  71. warp/examples/optim/example_drone.py +14 -6
  72. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  73. warp/examples/optim/example_inverse_kinematics.py +14 -6
  74. warp/examples/optim/example_inverse_kinematics_torch.py +14 -6
  75. warp/examples/optim/example_softbody_properties.py +14 -6
  76. warp/examples/optim/example_spring_cage.py +14 -6
  77. warp/examples/optim/example_trajectory.py +14 -6
  78. warp/examples/sim/example_cartpole.py +14 -6
  79. warp/examples/sim/example_cloth.py +14 -6
  80. warp/examples/sim/example_cloth_self_contact.py +14 -6
  81. warp/examples/sim/example_granular.py +14 -6
  82. warp/examples/sim/example_granular_collision_sdf.py +14 -6
  83. warp/examples/sim/example_jacobian_ik.py +14 -6
  84. warp/examples/sim/example_particle_chain.py +14 -6
  85. warp/examples/sim/example_quadruped.py +14 -6
  86. warp/examples/sim/example_rigid_chain.py +14 -6
  87. warp/examples/sim/example_rigid_contact.py +14 -6
  88. warp/examples/sim/example_rigid_force.py +14 -6
  89. warp/examples/sim/example_rigid_gyroscopic.py +14 -6
  90. warp/examples/sim/example_rigid_soft_contact.py +14 -6
  91. warp/examples/sim/example_soft_body.py +14 -6
  92. warp/examples/tile/example_tile_cholesky.py +14 -6
  93. warp/examples/tile/example_tile_convolution.py +14 -6
  94. warp/examples/tile/example_tile_fft.py +14 -6
  95. warp/examples/tile/example_tile_filtering.py +14 -6
  96. warp/examples/tile/example_tile_matmul.py +16 -10
  97. warp/examples/tile/example_tile_mlp.py +14 -6
  98. warp/examples/tile/example_tile_nbody.py +14 -6
  99. warp/examples/tile/example_tile_walker.py +14 -6
  100. warp/fabric.py +15 -0
  101. warp/fem/__init__.py +26 -1
  102. warp/fem/adaptivity.py +19 -4
  103. warp/fem/cache.py +15 -0
  104. warp/fem/dirichlet.py +15 -0
  105. warp/fem/domain.py +15 -0
  106. warp/fem/field/__init__.py +15 -0
  107. warp/fem/field/field.py +15 -0
  108. warp/fem/field/nodal_field.py +37 -68
  109. warp/fem/field/restriction.py +15 -0
  110. warp/fem/field/virtual.py +77 -23
  111. warp/fem/geometry/__init__.py +15 -0
  112. warp/fem/geometry/adaptive_nanogrid.py +24 -10
  113. warp/fem/geometry/closest_point.py +16 -1
  114. warp/fem/geometry/deformed_geometry.py +20 -2
  115. warp/fem/geometry/element.py +15 -0
  116. warp/fem/geometry/geometry.py +20 -0
  117. warp/fem/geometry/grid_2d.py +27 -12
  118. warp/fem/geometry/grid_3d.py +27 -15
  119. warp/fem/geometry/hexmesh.py +20 -7
  120. warp/fem/geometry/nanogrid.py +24 -11
  121. warp/fem/geometry/partition.py +15 -0
  122. warp/fem/geometry/quadmesh.py +28 -13
  123. warp/fem/geometry/tetmesh.py +18 -4
  124. warp/fem/geometry/trimesh.py +18 -8
  125. warp/fem/integrate.py +277 -93
  126. warp/fem/linalg.py +20 -5
  127. warp/fem/operator.py +15 -0
  128. warp/fem/polynomial.py +15 -0
  129. warp/fem/quadrature/__init__.py +15 -0
  130. warp/fem/quadrature/pic_quadrature.py +52 -22
  131. warp/fem/quadrature/quadrature.py +209 -25
  132. warp/fem/space/__init__.py +16 -1
  133. warp/fem/space/basis_function_space.py +19 -2
  134. warp/fem/space/basis_space.py +40 -18
  135. warp/fem/space/dof_mapper.py +15 -0
  136. warp/fem/space/function_space.py +15 -0
  137. warp/fem/space/grid_2d_function_space.py +15 -0
  138. warp/fem/space/grid_3d_function_space.py +15 -0
  139. warp/fem/space/hexmesh_function_space.py +17 -2
  140. warp/fem/space/nanogrid_function_space.py +15 -0
  141. warp/fem/space/partition.py +21 -2
  142. warp/fem/space/quadmesh_function_space.py +23 -8
  143. warp/fem/space/restriction.py +15 -0
  144. warp/fem/space/shape/__init__.py +15 -0
  145. warp/fem/space/shape/cube_shape_function.py +38 -23
  146. warp/fem/space/shape/shape_function.py +15 -0
  147. warp/fem/space/shape/square_shape_function.py +27 -12
  148. warp/fem/space/shape/tet_shape_function.py +15 -0
  149. warp/fem/space/shape/triangle_shape_function.py +16 -1
  150. warp/fem/space/tetmesh_function_space.py +18 -3
  151. warp/fem/space/topology.py +15 -0
  152. warp/fem/space/trimesh_function_space.py +17 -2
  153. warp/fem/types.py +15 -0
  154. warp/fem/utils.py +27 -6
  155. warp/jax.py +28 -7
  156. warp/jax_experimental/__init__.py +16 -0
  157. warp/{jax_experimental.py → jax_experimental/custom_call.py} +28 -33
  158. warp/jax_experimental/ffi.py +698 -0
  159. warp/jax_experimental/xla_ffi.py +602 -0
  160. warp/math.py +103 -6
  161. warp/native/array.h +28 -6
  162. warp/native/builtin.h +44 -9
  163. warp/native/bvh.cpp +18 -7
  164. warp/native/bvh.cu +57 -20
  165. warp/native/bvh.h +17 -7
  166. warp/native/clang/clang.cpp +45 -9
  167. warp/native/coloring.cpp +15 -6
  168. warp/native/crt.cpp +15 -6
  169. warp/native/crt.h +15 -6
  170. warp/native/cuda_crt.h +15 -6
  171. warp/native/cuda_util.cpp +29 -6
  172. warp/native/cuda_util.h +17 -6
  173. warp/native/error.cpp +15 -6
  174. warp/native/error.h +15 -6
  175. warp/native/exports.h +85 -63
  176. warp/native/fabric.h +15 -6
  177. warp/native/hashgrid.cpp +15 -6
  178. warp/native/hashgrid.cu +15 -6
  179. warp/native/hashgrid.h +15 -6
  180. warp/native/initializer_array.h +15 -6
  181. warp/native/intersect.h +41 -32
  182. warp/native/intersect_adj.h +48 -39
  183. warp/native/intersect_tri.h +17 -0
  184. warp/native/marching.cpp +16 -0
  185. warp/native/marching.cu +16 -7
  186. warp/native/marching.h +17 -0
  187. warp/native/mat.h +528 -15
  188. warp/native/mathdx.cpp +15 -6
  189. warp/native/matnn.h +15 -6
  190. warp/native/mesh.cpp +15 -6
  191. warp/native/mesh.cu +15 -6
  192. warp/native/mesh.h +25 -16
  193. warp/native/noise.h +15 -6
  194. warp/native/quat.h +114 -17
  195. warp/native/rand.h +21 -6
  196. warp/native/range.h +15 -6
  197. warp/native/reduce.cpp +15 -6
  198. warp/native/reduce.cu +15 -6
  199. warp/native/runlength_encode.cpp +15 -6
  200. warp/native/runlength_encode.cu +15 -6
  201. warp/native/scan.cpp +15 -6
  202. warp/native/scan.cu +15 -6
  203. warp/native/scan.h +15 -6
  204. warp/native/solid_angle.h +17 -0
  205. warp/native/sort.cpp +137 -65
  206. warp/native/sort.cu +167 -21
  207. warp/native/sort.h +23 -7
  208. warp/native/sparse.cpp +58 -28
  209. warp/native/sparse.cu +67 -23
  210. warp/native/spatial.h +15 -6
  211. warp/native/svd.h +131 -6
  212. warp/native/temp_buffer.h +15 -6
  213. warp/native/tile.h +316 -111
  214. warp/native/tile_reduce.h +61 -9
  215. warp/native/vec.h +83 -13
  216. warp/native/volume.cpp +100 -119
  217. warp/native/volume.cu +15 -6
  218. warp/native/volume.h +15 -6
  219. warp/native/volume_builder.cu +40 -16
  220. warp/native/volume_builder.h +21 -6
  221. warp/native/volume_impl.h +15 -6
  222. warp/native/warp.cpp +20 -12
  223. warp/native/warp.cu +114 -16
  224. warp/native/warp.h +34 -16
  225. warp/optim/__init__.py +14 -6
  226. warp/optim/adam.py +14 -6
  227. warp/optim/linear.py +25 -10
  228. warp/optim/sgd.py +14 -6
  229. warp/paddle.py +14 -6
  230. warp/render/__init__.py +14 -6
  231. warp/render/render_opengl.py +14 -6
  232. warp/render/render_usd.py +14 -6
  233. warp/render/utils.py +14 -6
  234. warp/sim/__init__.py +14 -7
  235. warp/sim/articulation.py +18 -10
  236. warp/sim/collide.py +35 -16
  237. warp/sim/graph_coloring.py +14 -6
  238. warp/sim/import_mjcf.py +463 -162
  239. warp/sim/import_snu.py +14 -7
  240. warp/sim/import_urdf.py +46 -18
  241. warp/sim/import_usd.py +14 -7
  242. warp/sim/inertia.py +14 -6
  243. warp/sim/integrator.py +14 -6
  244. warp/sim/integrator_euler.py +19 -11
  245. warp/sim/integrator_featherstone.py +17 -16
  246. warp/sim/integrator_vbd.py +222 -8
  247. warp/sim/integrator_xpbd.py +19 -11
  248. warp/sim/model.py +56 -19
  249. warp/sim/particles.py +14 -6
  250. warp/sim/render.py +14 -6
  251. warp/sim/utils.py +17 -2
  252. warp/sparse.py +657 -555
  253. warp/stubs.py +231 -19
  254. warp/tape.py +14 -6
  255. warp/tests/aux_test_class_kernel.py +14 -6
  256. warp/tests/aux_test_compile_consts_dummy.py +14 -6
  257. warp/tests/aux_test_conditional_unequal_types_kernels.py +14 -6
  258. warp/tests/aux_test_dependent.py +14 -6
  259. warp/tests/aux_test_grad_customs.py +14 -6
  260. warp/tests/aux_test_instancing_gc.py +14 -6
  261. warp/tests/aux_test_module_unload.py +14 -6
  262. warp/tests/aux_test_name_clash1.py +14 -6
  263. warp/tests/aux_test_name_clash2.py +14 -6
  264. warp/tests/aux_test_unresolved_func.py +14 -6
  265. warp/tests/aux_test_unresolved_symbol.py +14 -6
  266. warp/tests/cuda/__init__.py +0 -0
  267. warp/tests/{test_async.py → cuda/test_async.py} +14 -6
  268. warp/tests/{test_ipc.py → cuda/test_ipc.py} +14 -6
  269. warp/tests/{test_mempool.py → cuda/test_mempool.py} +53 -6
  270. warp/tests/{test_multigpu.py → cuda/test_multigpu.py} +14 -6
  271. warp/tests/{test_peer.py → cuda/test_peer.py} +14 -6
  272. warp/tests/{test_pinned.py → cuda/test_pinned.py} +14 -6
  273. warp/tests/{test_streams.py → cuda/test_streams.py} +85 -6
  274. warp/tests/geometry/__init__.py +0 -0
  275. warp/tests/{test_bvh.py → geometry/test_bvh.py} +14 -6
  276. warp/tests/{test_hash_grid.py → geometry/test_hash_grid.py} +14 -6
  277. warp/tests/{test_marching_cubes.py → geometry/test_marching_cubes.py} +14 -6
  278. warp/tests/{test_mesh.py → geometry/test_mesh.py} +14 -6
  279. warp/tests/{test_mesh_query_aabb.py → geometry/test_mesh_query_aabb.py} +14 -6
  280. warp/tests/{test_mesh_query_point.py → geometry/test_mesh_query_point.py} +80 -69
  281. warp/tests/{test_mesh_query_ray.py → geometry/test_mesh_query_ray.py} +15 -7
  282. warp/tests/{test_volume.py → geometry/test_volume.py} +55 -12
  283. warp/tests/{test_volume_write.py → geometry/test_volume_write.py} +14 -6
  284. warp/tests/interop/__init__.py +0 -0
  285. warp/tests/{test_dlpack.py → interop/test_dlpack.py} +42 -11
  286. warp/tests/{test_jax.py → interop/test_jax.py} +14 -6
  287. warp/tests/{test_paddle.py → interop/test_paddle.py} +14 -6
  288. warp/tests/{test_torch.py → interop/test_torch.py} +14 -6
  289. warp/tests/run_coverage_serial.py +14 -6
  290. warp/tests/sim/__init__.py +0 -0
  291. warp/tests/{disabled_kinematics.py → sim/disabled_kinematics.py} +23 -16
  292. warp/tests/{flaky_test_sim_grad.py → sim/flaky_test_sim_grad.py} +14 -6
  293. warp/tests/{test_collision.py → sim/test_collision.py} +16 -8
  294. warp/tests/{test_coloring.py → sim/test_coloring.py} +14 -7
  295. warp/tests/{test_model.py → sim/test_model.py} +55 -7
  296. warp/tests/{test_sim_grad_bounce_linear.py → sim/test_sim_grad_bounce_linear.py} +14 -6
  297. warp/tests/{test_sim_kinematics.py → sim/test_sim_kinematics.py} +16 -7
  298. warp/tests/sim/test_vbd.py +597 -0
  299. warp/tests/test_adam.py +14 -6
  300. warp/tests/test_arithmetic.py +14 -6
  301. warp/tests/test_array.py +14 -6
  302. warp/tests/test_array_reduce.py +14 -6
  303. warp/tests/test_assert.py +14 -6
  304. warp/tests/test_atomic.py +14 -6
  305. warp/tests/test_bool.py +15 -7
  306. warp/tests/test_builtins_resolution.py +14 -6
  307. warp/tests/test_closest_point_edge_edge.py +14 -6
  308. warp/tests/test_codegen.py +14 -6
  309. warp/tests/test_codegen_instancing.py +14 -6
  310. warp/tests/test_compile_consts.py +14 -6
  311. warp/tests/test_conditional.py +14 -6
  312. warp/tests/test_context.py +14 -6
  313. warp/tests/test_copy.py +14 -6
  314. warp/tests/test_ctypes.py +14 -6
  315. warp/tests/test_dense.py +14 -6
  316. warp/tests/test_devices.py +14 -6
  317. warp/tests/test_examples.py +42 -42
  318. warp/tests/test_fabricarray.py +14 -6
  319. warp/tests/test_fast_math.py +14 -6
  320. warp/tests/test_fem.py +37 -10
  321. warp/tests/test_fp16.py +14 -6
  322. warp/tests/test_func.py +14 -6
  323. warp/tests/test_future_annotations.py +14 -6
  324. warp/tests/test_generics.py +14 -6
  325. warp/tests/test_grad.py +14 -6
  326. warp/tests/test_grad_customs.py +14 -6
  327. warp/tests/test_grad_debug.py +14 -6
  328. warp/tests/test_implicit_init.py +14 -6
  329. warp/tests/test_import.py +14 -6
  330. warp/tests/test_indexedarray.py +14 -6
  331. warp/tests/test_intersect.py +14 -6
  332. warp/tests/test_iter.py +14 -6
  333. warp/tests/test_large.py +14 -6
  334. warp/tests/test_launch.py +14 -6
  335. warp/tests/test_lerp.py +14 -6
  336. warp/tests/test_linear_solvers.py +15 -11
  337. warp/tests/test_lvalue.py +14 -6
  338. warp/tests/test_mat.py +247 -85
  339. warp/tests/test_mat_lite.py +14 -6
  340. warp/tests/test_mat_scalar_ops.py +18 -10
  341. warp/tests/test_math.py +14 -6
  342. warp/tests/test_mlp.py +14 -6
  343. warp/tests/test_module_hashing.py +14 -6
  344. warp/tests/test_modules_lite.py +14 -6
  345. warp/tests/test_noise.py +14 -6
  346. warp/tests/test_operators.py +14 -6
  347. warp/tests/test_options.py +14 -6
  348. warp/tests/test_overwrite.py +15 -60
  349. warp/tests/test_print.py +14 -6
  350. warp/tests/test_quat.py +81 -52
  351. warp/tests/test_rand.py +58 -43
  352. warp/tests/test_reload.py +14 -6
  353. warp/tests/test_rounding.py +14 -6
  354. warp/tests/test_runlength_encode.py +14 -6
  355. warp/tests/test_scalar_ops.py +14 -6
  356. warp/tests/test_smoothstep.py +14 -6
  357. warp/tests/test_snippet.py +15 -0
  358. warp/tests/test_sparse.py +61 -12
  359. warp/tests/test_spatial.py +89 -6
  360. warp/tests/test_special_values.py +14 -6
  361. warp/tests/test_static.py +15 -7
  362. warp/tests/test_struct.py +14 -6
  363. warp/tests/test_tape.py +14 -6
  364. warp/tests/test_transient_module.py +14 -6
  365. warp/tests/test_triangle_closest_point.py +14 -6
  366. warp/tests/test_types.py +14 -6
  367. warp/tests/test_utils.py +98 -10
  368. warp/tests/test_vec.py +60 -40
  369. warp/tests/test_vec_lite.py +14 -6
  370. warp/tests/test_vec_scalar_ops.py +14 -6
  371. warp/tests/test_verify_fp.py +14 -6
  372. warp/tests/tile/__init__.py +0 -0
  373. warp/tests/{test_tile.py → tile/test_tile.py} +150 -57
  374. warp/tests/{test_tile_load.py → tile/test_tile_load.py} +15 -7
  375. warp/tests/{test_tile_mathdx.py → tile/test_tile_mathdx.py} +23 -12
  376. warp/tests/{test_tile_mlp.py → tile/test_tile_mlp.py} +39 -20
  377. warp/tests/{test_tile_reduce.py → tile/test_tile_reduce.py} +74 -7
  378. warp/tests/{test_tile_shared_memory.py → tile/test_tile_shared_memory.py} +14 -6
  379. warp/tests/{test_tile_view.py → tile/test_tile_view.py} +15 -7
  380. warp/tests/unittest_serial.py +15 -6
  381. warp/tests/unittest_suites.py +59 -65
  382. warp/tests/unittest_utils.py +16 -7
  383. warp/tests/walkthrough_debug.py +14 -6
  384. warp/thirdparty/unittest_parallel.py +15 -8
  385. warp/torch.py +14 -6
  386. warp/types.py +124 -664
  387. warp/utils.py +151 -78
  388. {warp_lang-1.6.1.dist-info → warp_lang-1.7.0.dist-info}/METADATA +39 -12
  389. warp_lang-1.7.0.dist-info/RECORD +429 -0
  390. {warp_lang-1.6.1.dist-info → warp_lang-1.7.0.dist-info}/WHEEL +1 -1
  391. warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
  392. warp/examples/optim/example_walker.py +0 -309
  393. warp/native/cutlass_gemm.cpp +0 -34
  394. warp/native/cutlass_gemm.cu +0 -373
  395. warp/tests/test_matmul.py +0 -503
  396. warp/tests/test_matmul_lite.py +0 -403
  397. warp/tests/test_vbd.py +0 -378
  398. warp/tests/unused_test_misc.py +0 -69
  399. warp_lang-1.6.1.dist-info/LICENSE.md +0 -126
  400. warp_lang-1.6.1.dist-info/RECORD +0 -419
  401. {warp_lang-1.6.1.dist-info → warp_lang-1.7.0.dist-info}/top_level.txt +0 -0
warp/fem/adaptivity.py CHANGED
@@ -1,3 +1,18 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024 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
+
1
16
  from typing import List, Optional, Tuple
2
17
 
3
18
  import numpy as np
@@ -353,7 +368,7 @@ def _fill_graded_cells(
353
368
  level = int(coarse_level[cell])
354
369
  refinement = wp.min(1, coarse_refinement[cell])
355
370
 
356
- count = wp.select(refinement > 0, 1, 8)
371
+ count = wp.where(refinement > 0, 8, 1)
357
372
  offset = wp.atomic_sub(fine_count, 0, count) - count
358
373
 
359
374
  f_level = level - refinement
@@ -388,7 +403,7 @@ def _sample_refinement(
388
403
  if sampled_level >= 0:
389
404
  min_level = wp.min(sampled_level, min_level)
390
405
 
391
- return wp.select(min_level < level_count, -1, cur_level - wp.clamp(min_level, 0, cur_level))
406
+ return wp.where(min_level < level_count, cur_level - wp.clamp(min_level, 0, cur_level), -1)
392
407
 
393
408
 
394
409
  @integrand
@@ -416,7 +431,7 @@ def _count_refined_voxels(
416
431
 
417
432
  coarse_refinement[cell] = wp.int8(refinement)
418
433
  if refinement >= 0:
419
- wp.atomic_add(fine_count, 0, wp.select(refinement > 0, 1, 8))
434
+ wp.atomic_add(fine_count, 0, wp.where(refinement > 0, 8, 1))
420
435
 
421
436
 
422
437
  @wp.kernel
@@ -434,7 +449,7 @@ def _fill_refined_voxels(
434
449
  refinement = wp.min(1, int(coarse_refinement[cell]))
435
450
 
436
451
  if refinement >= 0:
437
- count = wp.select(refinement > 0, 1, 8)
452
+ count = wp.where(refinement > 0, 8, 1)
438
453
  offset = wp.atomic_sub(fine_count, 0, count) - count
439
454
 
440
455
  f_level = level - refinement
warp/fem/cache.py CHANGED
@@ -1,3 +1,18 @@
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
+
1
16
  import ast
2
17
  import bisect
3
18
  import re
warp/fem/dirichlet.py CHANGED
@@ -1,3 +1,18 @@
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
+
1
16
  from typing import Any, Optional
2
17
 
3
18
  import warp as wp
warp/fem/domain.py CHANGED
@@ -1,3 +1,18 @@
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
+
1
16
  from typing import Any, Optional, Set, Union
2
17
 
3
18
  import warp as wp
@@ -1,3 +1,18 @@
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
+
1
16
  from typing import Optional, Union
2
17
 
3
18
  from warp.fem.domain import Cells, GeometryDomain
warp/fem/field/field.py CHANGED
@@ -1,3 +1,18 @@
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
+
1
16
  from typing import Any, Dict, Optional, Set
2
17
 
3
18
  import warp as wp
@@ -1,3 +1,18 @@
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
+
1
16
  from typing import Any
2
17
 
3
18
  import warp as wp
@@ -68,22 +83,15 @@ class NodalFieldBase(DiscreteField):
68
83
  @cache.dynamic_func(suffix=self.name)
69
84
  def eval_inner(args: self.ElementEvalArg, s: Sample):
70
85
  local_value_map = self.space.local_value_map_inner(args.elt_arg, s.element_index, s.element_coords)
71
- res = self.space.space_value(
72
- self._read_node_value(args, s.element_index, 0),
73
- self.space.element_inner_weight(
74
- args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, 0
75
- ),
76
- local_value_map,
77
- )
78
-
79
86
  node_count = self.space.topology.element_node_count(
80
87
  args.elt_arg, args.eval_arg.topology_arg, s.element_index
81
88
  )
82
- for k in range(1, node_count):
89
+ res = self.space.dtype(0.0)
90
+ for k in range(node_count):
83
91
  res += self.space.space_value(
84
92
  self._read_node_value(args, s.element_index, k),
85
93
  self.space.element_inner_weight(
86
- args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k
94
+ args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
87
95
  ),
88
96
  local_value_map,
89
97
  )
@@ -98,24 +106,16 @@ class NodalFieldBase(DiscreteField):
98
106
  @cache.dynamic_func(suffix=self.name)
99
107
  def eval_grad_inner(args: self.ElementEvalArg, s: Sample, grad_transform: Any):
100
108
  local_value_map = self.space.local_value_map_inner(args.elt_arg, s.element_index, s.element_coords)
101
-
102
- res = self.space.space_gradient(
103
- self._read_node_value(args, s.element_index, 0),
104
- self.space.element_inner_weight_gradient(
105
- args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, 0
106
- ),
107
- local_value_map,
108
- grad_transform,
109
- )
110
-
111
109
  node_count = self.space.topology.element_node_count(
112
110
  args.elt_arg, args.eval_arg.topology_arg, s.element_index
113
111
  )
114
- for k in range(1, node_count):
112
+
113
+ res = self.gradient_dtype(0.0)
114
+ for k in range(node_count):
115
115
  res += self.space.space_gradient(
116
116
  self._read_node_value(args, s.element_index, k),
117
117
  self.space.element_inner_weight_gradient(
118
- args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k
118
+ args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
119
119
  ),
120
120
  local_value_map,
121
121
  grad_transform,
@@ -142,24 +142,16 @@ class NodalFieldBase(DiscreteField):
142
142
  def eval_div_inner(args: self.ElementEvalArg, s: Sample):
143
143
  grad_transform = self.space.element_inner_reference_gradient_transform(args.elt_arg, s)
144
144
  local_value_map = self.space.local_value_map_inner(args.elt_arg, s.element_index, s.element_coords)
145
-
146
- res = self.space.space_divergence(
147
- self._read_node_value(args, s.element_index, 0),
148
- self.space.element_inner_weight_gradient(
149
- args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, 0
150
- ),
151
- local_value_map,
152
- grad_transform,
153
- )
154
-
155
145
  node_count = self.space.topology.element_node_count(
156
146
  args.elt_arg, args.eval_arg.topology_arg, s.element_index
157
147
  )
158
- for k in range(1, node_count):
148
+
149
+ res = self.divergence_dtype(0.0)
150
+ for k in range(node_count):
159
151
  res += self.space.space_divergence(
160
152
  self._read_node_value(args, s.element_index, k),
161
153
  self.space.element_inner_weight_gradient(
162
- args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k
154
+ args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
163
155
  ),
164
156
  local_value_map,
165
157
  grad_transform,
@@ -172,23 +164,16 @@ class NodalFieldBase(DiscreteField):
172
164
  @cache.dynamic_func(suffix=self.name)
173
165
  def eval_outer(args: self.ElementEvalArg, s: Sample):
174
166
  local_value_map = self.space.local_value_map_outer(args.elt_arg, s.element_index, s.element_coords)
175
- res = self.space.space_value(
176
- self._read_node_value(args, s.element_index, 0),
177
- self.space.element_outer_weight(
178
- args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, 0
179
- ),
180
- local_value_map,
181
- )
182
-
183
167
  node_count = self.space.topology.element_node_count(
184
168
  args.elt_arg, args.eval_arg.topology_arg, s.element_index
185
169
  )
186
170
 
187
- for k in range(1, node_count):
171
+ res = self.dtype(0.0)
172
+ for k in range(node_count):
188
173
  res += self.space.space_value(
189
174
  self._read_node_value(args, s.element_index, k),
190
175
  self.space.element_outer_weight(
191
- args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k
176
+ args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
192
177
  ),
193
178
  local_value_map,
194
179
  )
@@ -203,24 +188,16 @@ class NodalFieldBase(DiscreteField):
203
188
  @cache.dynamic_func(suffix=self.name)
204
189
  def eval_grad_outer(args: self.ElementEvalArg, s: Sample, grad_transform: Any):
205
190
  local_value_map = self.space.local_value_map_outer(args.elt_arg, s.element_index, s.element_coords)
206
-
207
- res = self.space.space_gradient(
208
- self._read_node_value(args, s.element_index, 0),
209
- self.space.element_outer_weight_gradient(
210
- args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, 0
211
- ),
212
- local_value_map,
213
- grad_transform,
214
- )
215
-
216
191
  node_count = self.space.topology.element_node_count(
217
192
  args.elt_arg, args.eval_arg.topology_arg, s.element_index
218
193
  )
219
- for k in range(1, node_count):
194
+
195
+ res = self.gradient_dtype(0.0)
196
+ for k in range(node_count):
220
197
  res += self.space.space_gradient(
221
198
  self._read_node_value(args, s.element_index, k),
222
199
  self.space.element_outer_weight_gradient(
223
- args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k
200
+ args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
224
201
  ),
225
202
  local_value_map,
226
203
  grad_transform,
@@ -247,24 +224,16 @@ class NodalFieldBase(DiscreteField):
247
224
  def eval_div_outer(args: self.ElementEvalArg, s: Sample):
248
225
  grad_transform = self.space.element_outer_reference_gradient_transform(args.elt_arg, s)
249
226
  local_value_map = self.space.local_value_map_outer(args.elt_arg, s.element_index, s.element_coords)
250
-
251
- res = self.space.space_divergence(
252
- self._read_node_value(args, s.element_index, 0),
253
- self.space.element_outer_weight_gradient(
254
- args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, 0
255
- ),
256
- local_value_map,
257
- grad_transform,
258
- )
259
-
260
227
  node_count = self.space.topology.element_node_count(
261
228
  args.elt_arg, args.eval_arg.topology_arg, s.element_index
262
229
  )
263
- for k in range(1, node_count):
230
+
231
+ res = self.divergence_dtype(0.0)
232
+ for k in range(node_count):
264
233
  res += self.space.space_divergence(
265
234
  self._read_node_value(args, s.element_index, k),
266
235
  self.space.element_outer_weight_gradient(
267
- args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k
236
+ args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
268
237
  ),
269
238
  local_value_map,
270
239
  grad_transform,
@@ -1,3 +1,18 @@
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
+
1
16
  from warp.fem.space import SpaceRestriction
2
17
 
3
18
  from .field import DiscreteField
warp/fem/field/virtual.py CHANGED
@@ -1,3 +1,18 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024 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
+
1
16
  from typing import Any, Set
2
17
 
3
18
  import warp as wp
@@ -54,7 +69,12 @@ class AdjointField(SpaceField):
54
69
  def eval_test_inner(args: self.ElementEvalArg, s: Sample):
55
70
  dof = self._get_dof(s)
56
71
  node_weight = self.space.element_inner_weight(
57
- args.elt_arg, args.eval_arg, s.element_index, s.element_coords, get_node_index_in_element(dof)
72
+ args.elt_arg,
73
+ args.eval_arg,
74
+ s.element_index,
75
+ s.element_coords,
76
+ get_node_index_in_element(dof),
77
+ s.qp_index,
58
78
  )
59
79
  local_value_map = self.space.local_value_map_inner(args.elt_arg, s.element_index, s.element_coords)
60
80
  dof_value = self.space.node_basis_element(get_node_coord(dof))
@@ -75,6 +95,7 @@ class AdjointField(SpaceField):
75
95
  s.element_index,
76
96
  s.element_coords,
77
97
  get_node_index_in_element(dof),
98
+ s.qp_index,
78
99
  )
79
100
  grad_transform = self.space.element_inner_reference_gradient_transform(args.elt_arg, s)
80
101
  local_value_map = self.space.local_value_map_inner(args.elt_arg, s.element_index, s.element_coords)
@@ -96,6 +117,7 @@ class AdjointField(SpaceField):
96
117
  s.element_index,
97
118
  s.element_coords,
98
119
  get_node_index_in_element(dof),
120
+ s.qp_index,
99
121
  )
100
122
  grad_transform = self.space.element_inner_reference_gradient_transform(args.elt_arg, s)
101
123
  local_value_map = self.space.local_value_map_inner(args.elt_arg, s.element_index, s.element_coords)
@@ -109,7 +131,12 @@ class AdjointField(SpaceField):
109
131
  def eval_test_outer(args: self.ElementEvalArg, s: Sample):
110
132
  dof = self._get_dof(s)
111
133
  node_weight = self.space.element_outer_weight(
112
- args.elt_arg, args.eval_arg, s.element_index, s.element_coords, get_node_index_in_element(dof)
134
+ args.elt_arg,
135
+ args.eval_arg,
136
+ s.element_index,
137
+ s.element_coords,
138
+ get_node_index_in_element(dof),
139
+ s.qp_index,
113
140
  )
114
141
  local_value_map = self.space.local_value_map_outer(args.elt_arg, s.element_index, s.element_coords)
115
142
  dof_value = self.space.node_basis_element(get_node_coord(dof))
@@ -130,6 +157,7 @@ class AdjointField(SpaceField):
130
157
  s.element_index,
131
158
  s.element_coords,
132
159
  get_node_index_in_element(dof),
160
+ s.qp_index,
133
161
  )
134
162
  grad_transform = self.space.element_outer_reference_gradient_transform(args.elt_arg, s)
135
163
  local_value_map = self.space.local_value_map_outer(args.elt_arg, s.element_index, s.element_coords)
@@ -151,6 +179,7 @@ class AdjointField(SpaceField):
151
179
  s.element_index,
152
180
  s.element_coords,
153
181
  get_node_index_in_element(dof),
182
+ s.qp_index,
154
183
  )
155
184
  grad_transform = self.space.element_outer_reference_gradient_transform(args.elt_arg, s)
156
185
  local_value_map = self.space.local_value_map_outer(args.elt_arg, s.element_index, s.element_coords)
@@ -355,9 +384,8 @@ class LocalAdjointField(SpaceField):
355
384
 
356
385
  @cache.dynamic_func(suffix=str(TAYLOR_DOF_COUNT))
357
386
  def split_dof(dof_index: DofIndex, dof_begin: int):
358
- dof = get_node_coord(dof_index)
359
- value_dof = dof // TAYLOR_DOF_COUNT
360
- taylor_dof = dof - value_dof * TAYLOR_DOF_COUNT - dof_begin
387
+ taylor_dof = get_node_index_in_element(dof_index) - dof_begin
388
+ value_dof = get_node_coord(dof_index)
361
389
  return value_dof, taylor_dof
362
390
 
363
391
  return split_dof
@@ -371,7 +399,7 @@ class LocalAdjointField(SpaceField):
371
399
 
372
400
  local_value_map = self.space.local_value_map_inner(args.elt_arg, s.element_index, s.element_coords)
373
401
  dof_value = self.space.value_basis_element(value_dof, local_value_map)
374
- return wp.select(taylor_dof == 0, self.dtype(0.0), dof_value)
402
+ return wp.where(taylor_dof == 0, dof_value, self.dtype(0.0))
375
403
 
376
404
  return eval_test_inner
377
405
 
@@ -426,7 +454,7 @@ class LocalAdjointField(SpaceField):
426
454
 
427
455
  local_value_map = self.space.local_value_map_outer(args.elt_arg, s.element_index, s.element_coords)
428
456
  dof_value = self.space.value_basis_element(value_dof, local_value_map)
429
- return wp.select(taylor_dof == 0, self.dtype(0.0), dof_value)
457
+ return wp.where(taylor_dof == 0, dof_value, self.dtype(0.0))
430
458
 
431
459
  return eval_test_outer
432
460
 
@@ -536,17 +564,25 @@ def make_linear_dispatch_kernel(test: LocalTestField, quadrature: Quadrature, ac
536
564
  qp_index = quadrature.point_index(
537
565
  domain_arg, qp_arg, test_element_index.domain_element_index, element_index, k
538
566
  )
567
+ qp_eval_index = quadrature.point_evaluation_index(
568
+ domain_arg, qp_arg, test_element_index.domain_element_index, element_index, k
569
+ )
539
570
  coords = quadrature.point_coords(
540
571
  domain_arg, qp_arg, test_element_index.domain_element_index, element_index, k
541
572
  )
542
573
 
543
- qp_result = local_result[qp_index]
574
+ qp_result = local_result[qp_eval_index]
544
575
 
545
576
  qp_sum = float(0.0)
546
577
 
547
578
  if wp.static(0 != TEST_INNER_COUNT):
548
579
  w = test.space.element_inner_weight(
549
- domain_arg, test_space_arg, element_index, coords, test_element_index.node_index_in_element
580
+ domain_arg,
581
+ test_space_arg,
582
+ element_index,
583
+ coords,
584
+ test_element_index.node_index_in_element,
585
+ qp_index,
550
586
  )
551
587
  for val_dof in range(TEST_NODE_DOF_DIM):
552
588
  test_dof = test_node_dof * TEST_NODE_DOF_DIM + val_dof
@@ -554,7 +590,12 @@ def make_linear_dispatch_kernel(test: LocalTestField, quadrature: Quadrature, ac
554
590
 
555
591
  if wp.static(0 != TEST_OUTER_COUNT):
556
592
  w = test.space.element_outer_weight(
557
- domain_arg, test_space_arg, element_index, coords, test_element_index.node_index_in_element
593
+ domain_arg,
594
+ test_space_arg,
595
+ element_index,
596
+ coords,
597
+ test_element_index.node_index_in_element,
598
+ qp_index,
558
599
  )
559
600
  for val_dof in range(TEST_NODE_DOF_DIM):
560
601
  test_dof = test_node_dof * TEST_NODE_DOF_DIM + val_dof
@@ -562,7 +603,12 @@ def make_linear_dispatch_kernel(test: LocalTestField, quadrature: Quadrature, ac
562
603
 
563
604
  if wp.static(0 != TEST_INNER_GRAD_COUNT):
564
605
  w_grad = test.space.element_inner_weight_gradient(
565
- domain_arg, test_space_arg, element_index, coords, test_element_index.node_index_in_element
606
+ domain_arg,
607
+ test_space_arg,
608
+ element_index,
609
+ coords,
610
+ test_element_index.node_index_in_element,
611
+ qp_index,
566
612
  )
567
613
  for val_dof in range(TEST_NODE_DOF_DIM):
568
614
  test_dof = test_node_dof * TEST_NODE_DOF_DIM + val_dof
@@ -574,7 +620,12 @@ def make_linear_dispatch_kernel(test: LocalTestField, quadrature: Quadrature, ac
574
620
 
575
621
  if wp.static(0 != TEST_OUTER_GRAD_COUNT):
576
622
  w_grad = test.space.element_outer_weight_gradient(
577
- domain_arg, test_space_arg, element_index, coords, test_element_index.node_index_in_element
623
+ domain_arg,
624
+ test_space_arg,
625
+ element_index,
626
+ coords,
627
+ test_element_index.node_index_in_element,
628
+ qp_index,
578
629
  )
579
630
  for val_dof in range(TEST_NODE_DOF_DIM):
580
631
  test_dof = test_node_dof * TEST_NODE_DOF_DIM + val_dof
@@ -654,10 +705,10 @@ def make_bilinear_dispatch_kernel(
654
705
  domain_arg, trial_topology_arg, element_index
655
706
  )
656
707
 
657
- qp_point_count = wp.select(
708
+ qp_point_count = wp.where(
658
709
  trial_node < element_trial_node_count,
659
- 0,
660
710
  quadrature.point_count(domain_arg, qp_arg, test_element_index.domain_element_index, element_index),
711
+ 0,
661
712
  )
662
713
 
663
714
  val_sum = accumulate_dtype(0.0)
@@ -666,51 +717,54 @@ def make_bilinear_dispatch_kernel(
666
717
  qp_index = quadrature.point_index(
667
718
  domain_arg, qp_arg, test_element_index.domain_element_index, element_index, k
668
719
  )
720
+ qp_eval_index = quadrature.point_evaluation_index(
721
+ domain_arg, qp_arg, test_element_index.domain_element_index, element_index, k
722
+ )
669
723
  coords = quadrature.point_coords(
670
724
  domain_arg, qp_arg, test_element_index.domain_element_index, element_index, k
671
725
  )
672
726
 
673
- qp_result = local_result[qp_index]
727
+ qp_result = local_result[qp_eval_index]
674
728
  trial_result = float(0.0)
675
729
 
676
730
  if wp.static(0 != TEST_INNER_COUNT):
677
731
  w_test_inner = test.space.element_inner_weight(
678
- domain_arg, test_space_arg, element_index, coords, test_node
732
+ domain_arg, test_space_arg, element_index, coords, test_node, qp_index
679
733
  )
680
734
 
681
735
  if wp.static(0 != TEST_OUTER_COUNT):
682
736
  w_test_outer = test.space.element_outer_weight(
683
- domain_arg, test_space_arg, element_index, coords, test_node
737
+ domain_arg, test_space_arg, element_index, coords, test_node, qp_index
684
738
  )
685
739
 
686
740
  if wp.static(0 != TEST_INNER_GRAD_COUNT):
687
741
  w_test_grad_inner = test.space.element_inner_weight_gradient(
688
- domain_arg, test_space_arg, element_index, coords, test_node
742
+ domain_arg, test_space_arg, element_index, coords, test_node, qp_index
689
743
  )
690
744
 
691
745
  if wp.static(0 != TEST_OUTER_GRAD_COUNT):
692
746
  w_test_grad_outer = test.space.element_outer_weight_gradient(
693
- domain_arg, test_space_arg, element_index, coords, test_node
747
+ domain_arg, test_space_arg, element_index, coords, test_node, qp_index
694
748
  )
695
749
 
696
750
  if wp.static(0 != TRIAL_INNER_COUNT):
697
751
  w_trial_inner = trial.space.element_inner_weight(
698
- domain_arg, trial_space_arg, element_index, coords, trial_node
752
+ domain_arg, trial_space_arg, element_index, coords, trial_node, qp_index
699
753
  )
700
754
 
701
755
  if wp.static(0 != TRIAL_OUTER_COUNT):
702
756
  w_trial_outer = trial.space.element_outer_weight(
703
- domain_arg, trial_space_arg, element_index, coords, trial_node
757
+ domain_arg, trial_space_arg, element_index, coords, trial_node, qp_index
704
758
  )
705
759
 
706
760
  if wp.static(0 != TRIAL_INNER_GRAD_COUNT):
707
761
  w_trial_grad_inner = trial.space.element_inner_weight_gradient(
708
- domain_arg, trial_space_arg, element_index, coords, trial_node
762
+ domain_arg, trial_space_arg, element_index, coords, trial_node, qp_index
709
763
  )
710
764
 
711
765
  if wp.static(0 != TRIAL_OUTER_GRAD_COUNT):
712
766
  w_trial_grad_outer = trial.space.element_outer_weight_gradient(
713
- domain_arg, trial_space_arg, element_index, coords, trial_node
767
+ domain_arg, trial_space_arg, element_index, coords, trial_node, qp_index
714
768
  )
715
769
 
716
770
  for trial_val_dof in range(TRIAL_NODE_DOF_DIM):
@@ -1,3 +1,18 @@
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
+
1
16
  from .adaptive_nanogrid import AdaptiveNanogrid
2
17
  from .deformed_geometry import DeformedGeometry
3
18
  from .element import Element