warp-lang 1.0.0b2__py3-none-win_amd64.whl → 1.0.0b6__py3-none-win_amd64.whl

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

Potentially problematic release.


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

Files changed (271) hide show
  1. docs/conf.py +17 -5
  2. examples/env/env_ant.py +1 -1
  3. examples/env/env_cartpole.py +1 -1
  4. examples/env/env_humanoid.py +1 -1
  5. examples/env/env_usd.py +4 -1
  6. examples/env/environment.py +8 -9
  7. examples/example_dem.py +34 -33
  8. examples/example_diffray.py +364 -337
  9. examples/example_fluid.py +32 -23
  10. examples/example_jacobian_ik.py +97 -93
  11. examples/example_marching_cubes.py +6 -16
  12. examples/example_mesh.py +6 -16
  13. examples/example_mesh_intersect.py +16 -14
  14. examples/example_nvdb.py +14 -16
  15. examples/example_raycast.py +14 -13
  16. examples/example_raymarch.py +16 -23
  17. examples/example_render_opengl.py +19 -10
  18. examples/example_sim_cartpole.py +82 -78
  19. examples/example_sim_cloth.py +45 -48
  20. examples/example_sim_fk_grad.py +51 -44
  21. examples/example_sim_fk_grad_torch.py +47 -40
  22. examples/example_sim_grad_bounce.py +108 -133
  23. examples/example_sim_grad_cloth.py +99 -113
  24. examples/example_sim_granular.py +5 -6
  25. examples/{example_sim_sdf_shape.py → example_sim_granular_collision_sdf.py} +37 -26
  26. examples/example_sim_neo_hookean.py +51 -55
  27. examples/example_sim_particle_chain.py +4 -4
  28. examples/example_sim_quadruped.py +126 -81
  29. examples/example_sim_rigid_chain.py +54 -61
  30. examples/example_sim_rigid_contact.py +66 -70
  31. examples/example_sim_rigid_fem.py +3 -3
  32. examples/example_sim_rigid_force.py +1 -1
  33. examples/example_sim_rigid_gyroscopic.py +3 -4
  34. examples/example_sim_rigid_kinematics.py +28 -39
  35. examples/example_sim_trajopt.py +112 -110
  36. examples/example_sph.py +9 -8
  37. examples/example_wave.py +7 -7
  38. examples/fem/bsr_utils.py +30 -17
  39. examples/fem/example_apic_fluid.py +85 -69
  40. examples/fem/example_convection_diffusion.py +97 -93
  41. examples/fem/example_convection_diffusion_dg.py +142 -149
  42. examples/fem/example_convection_diffusion_dg0.py +141 -136
  43. examples/fem/example_deformed_geometry.py +146 -0
  44. examples/fem/example_diffusion.py +115 -84
  45. examples/fem/example_diffusion_3d.py +116 -86
  46. examples/fem/example_diffusion_mgpu.py +102 -79
  47. examples/fem/example_mixed_elasticity.py +139 -100
  48. examples/fem/example_navier_stokes.py +175 -162
  49. examples/fem/example_stokes.py +143 -111
  50. examples/fem/example_stokes_transfer.py +186 -157
  51. examples/fem/mesh_utils.py +59 -97
  52. examples/fem/plot_utils.py +138 -17
  53. tools/ci/publishing/build_nodes_info.py +54 -0
  54. warp/__init__.py +4 -3
  55. warp/__init__.pyi +1 -0
  56. warp/bin/warp-clang.dll +0 -0
  57. warp/bin/warp.dll +0 -0
  58. warp/build.py +5 -3
  59. warp/build_dll.py +29 -9
  60. warp/builtins.py +836 -492
  61. warp/codegen.py +864 -553
  62. warp/config.py +3 -1
  63. warp/context.py +389 -172
  64. warp/fem/__init__.py +24 -6
  65. warp/fem/cache.py +318 -25
  66. warp/fem/dirichlet.py +7 -3
  67. warp/fem/domain.py +14 -0
  68. warp/fem/field/__init__.py +30 -38
  69. warp/fem/field/field.py +149 -0
  70. warp/fem/field/nodal_field.py +244 -138
  71. warp/fem/field/restriction.py +8 -6
  72. warp/fem/field/test.py +127 -59
  73. warp/fem/field/trial.py +117 -60
  74. warp/fem/geometry/__init__.py +5 -1
  75. warp/fem/geometry/deformed_geometry.py +271 -0
  76. warp/fem/geometry/element.py +24 -1
  77. warp/fem/geometry/geometry.py +86 -14
  78. warp/fem/geometry/grid_2d.py +112 -54
  79. warp/fem/geometry/grid_3d.py +134 -65
  80. warp/fem/geometry/hexmesh.py +953 -0
  81. warp/fem/geometry/partition.py +85 -33
  82. warp/fem/geometry/quadmesh_2d.py +532 -0
  83. warp/fem/geometry/tetmesh.py +451 -115
  84. warp/fem/geometry/trimesh_2d.py +197 -92
  85. warp/fem/integrate.py +534 -268
  86. warp/fem/operator.py +58 -31
  87. warp/fem/polynomial.py +11 -0
  88. warp/fem/quadrature/__init__.py +1 -1
  89. warp/fem/quadrature/pic_quadrature.py +150 -58
  90. warp/fem/quadrature/quadrature.py +209 -57
  91. warp/fem/space/__init__.py +230 -53
  92. warp/fem/space/basis_space.py +489 -0
  93. warp/fem/space/collocated_function_space.py +105 -0
  94. warp/fem/space/dof_mapper.py +49 -2
  95. warp/fem/space/function_space.py +90 -39
  96. warp/fem/space/grid_2d_function_space.py +149 -496
  97. warp/fem/space/grid_3d_function_space.py +173 -538
  98. warp/fem/space/hexmesh_function_space.py +352 -0
  99. warp/fem/space/partition.py +129 -76
  100. warp/fem/space/quadmesh_2d_function_space.py +369 -0
  101. warp/fem/space/restriction.py +46 -34
  102. warp/fem/space/shape/__init__.py +15 -0
  103. warp/fem/space/shape/cube_shape_function.py +738 -0
  104. warp/fem/space/shape/shape_function.py +103 -0
  105. warp/fem/space/shape/square_shape_function.py +611 -0
  106. warp/fem/space/shape/tet_shape_function.py +567 -0
  107. warp/fem/space/shape/triangle_shape_function.py +429 -0
  108. warp/fem/space/tetmesh_function_space.py +132 -1039
  109. warp/fem/space/topology.py +295 -0
  110. warp/fem/space/trimesh_2d_function_space.py +104 -742
  111. warp/fem/types.py +13 -11
  112. warp/fem/utils.py +335 -60
  113. warp/native/array.h +120 -34
  114. warp/native/builtin.h +101 -72
  115. warp/native/bvh.cpp +73 -325
  116. warp/native/bvh.cu +406 -23
  117. warp/native/bvh.h +22 -40
  118. warp/native/clang/clang.cpp +1 -0
  119. warp/native/crt.h +2 -0
  120. warp/native/cuda_util.cpp +8 -3
  121. warp/native/cuda_util.h +1 -0
  122. warp/native/exports.h +1522 -1243
  123. warp/native/intersect.h +19 -4
  124. warp/native/intersect_adj.h +8 -8
  125. warp/native/mat.h +76 -17
  126. warp/native/mesh.cpp +33 -108
  127. warp/native/mesh.cu +114 -18
  128. warp/native/mesh.h +395 -40
  129. warp/native/noise.h +272 -329
  130. warp/native/quat.h +51 -8
  131. warp/native/rand.h +44 -34
  132. warp/native/reduce.cpp +1 -1
  133. warp/native/sparse.cpp +4 -4
  134. warp/native/sparse.cu +163 -155
  135. warp/native/spatial.h +2 -2
  136. warp/native/temp_buffer.h +18 -14
  137. warp/native/vec.h +103 -21
  138. warp/native/warp.cpp +2 -1
  139. warp/native/warp.cu +28 -3
  140. warp/native/warp.h +4 -3
  141. warp/render/render_opengl.py +261 -109
  142. warp/sim/__init__.py +1 -2
  143. warp/sim/articulation.py +385 -185
  144. warp/sim/import_mjcf.py +59 -48
  145. warp/sim/import_urdf.py +15 -15
  146. warp/sim/import_usd.py +174 -102
  147. warp/sim/inertia.py +17 -18
  148. warp/sim/integrator_xpbd.py +4 -3
  149. warp/sim/model.py +330 -250
  150. warp/sim/render.py +1 -1
  151. warp/sparse.py +625 -152
  152. warp/stubs.py +341 -309
  153. warp/tape.py +9 -6
  154. warp/tests/__main__.py +3 -6
  155. warp/tests/assets/curlnoise_golden.npy +0 -0
  156. warp/tests/assets/pnoise_golden.npy +0 -0
  157. warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
  158. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
  159. warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
  160. warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
  161. warp/tests/aux_test_unresolved_func.py +14 -0
  162. warp/tests/aux_test_unresolved_symbol.py +14 -0
  163. warp/tests/disabled_kinematics.py +239 -0
  164. warp/tests/run_coverage_serial.py +31 -0
  165. warp/tests/test_adam.py +103 -106
  166. warp/tests/test_arithmetic.py +94 -74
  167. warp/tests/test_array.py +82 -101
  168. warp/tests/test_array_reduce.py +57 -23
  169. warp/tests/test_atomic.py +64 -28
  170. warp/tests/test_bool.py +22 -12
  171. warp/tests/test_builtins_resolution.py +1292 -0
  172. warp/tests/test_bvh.py +18 -18
  173. warp/tests/test_closest_point_edge_edge.py +54 -57
  174. warp/tests/test_codegen.py +165 -134
  175. warp/tests/test_compile_consts.py +28 -20
  176. warp/tests/test_conditional.py +108 -24
  177. warp/tests/test_copy.py +10 -12
  178. warp/tests/test_ctypes.py +112 -88
  179. warp/tests/test_dense.py +21 -14
  180. warp/tests/test_devices.py +98 -0
  181. warp/tests/test_dlpack.py +75 -75
  182. warp/tests/test_examples.py +237 -0
  183. warp/tests/test_fabricarray.py +22 -24
  184. warp/tests/test_fast_math.py +15 -11
  185. warp/tests/test_fem.py +1034 -124
  186. warp/tests/test_fp16.py +23 -16
  187. warp/tests/test_func.py +187 -86
  188. warp/tests/test_generics.py +194 -49
  189. warp/tests/test_grad.py +123 -181
  190. warp/tests/test_grad_customs.py +176 -0
  191. warp/tests/test_hash_grid.py +35 -34
  192. warp/tests/test_import.py +10 -23
  193. warp/tests/test_indexedarray.py +24 -25
  194. warp/tests/test_intersect.py +18 -9
  195. warp/tests/test_large.py +141 -0
  196. warp/tests/test_launch.py +14 -41
  197. warp/tests/test_lerp.py +64 -65
  198. warp/tests/test_lvalue.py +493 -0
  199. warp/tests/test_marching_cubes.py +12 -13
  200. warp/tests/test_mat.py +517 -2898
  201. warp/tests/test_mat_lite.py +115 -0
  202. warp/tests/test_mat_scalar_ops.py +2889 -0
  203. warp/tests/test_math.py +103 -9
  204. warp/tests/test_matmul.py +304 -69
  205. warp/tests/test_matmul_lite.py +410 -0
  206. warp/tests/test_mesh.py +60 -22
  207. warp/tests/test_mesh_query_aabb.py +21 -25
  208. warp/tests/test_mesh_query_point.py +111 -22
  209. warp/tests/test_mesh_query_ray.py +12 -24
  210. warp/tests/test_mlp.py +30 -22
  211. warp/tests/test_model.py +92 -89
  212. warp/tests/test_modules_lite.py +39 -0
  213. warp/tests/test_multigpu.py +88 -114
  214. warp/tests/test_noise.py +12 -11
  215. warp/tests/test_operators.py +16 -20
  216. warp/tests/test_options.py +11 -11
  217. warp/tests/test_pinned.py +17 -18
  218. warp/tests/test_print.py +32 -11
  219. warp/tests/test_quat.py +275 -129
  220. warp/tests/test_rand.py +18 -16
  221. warp/tests/test_reload.py +38 -34
  222. warp/tests/test_rounding.py +50 -43
  223. warp/tests/test_runlength_encode.py +168 -20
  224. warp/tests/test_smoothstep.py +9 -11
  225. warp/tests/test_snippet.py +143 -0
  226. warp/tests/test_sparse.py +261 -63
  227. warp/tests/test_spatial.py +276 -243
  228. warp/tests/test_streams.py +110 -85
  229. warp/tests/test_struct.py +268 -63
  230. warp/tests/test_tape.py +39 -21
  231. warp/tests/test_torch.py +90 -86
  232. warp/tests/test_transient_module.py +10 -12
  233. warp/tests/test_types.py +363 -0
  234. warp/tests/test_utils.py +451 -0
  235. warp/tests/test_vec.py +354 -2050
  236. warp/tests/test_vec_lite.py +73 -0
  237. warp/tests/test_vec_scalar_ops.py +2099 -0
  238. warp/tests/test_volume.py +418 -376
  239. warp/tests/test_volume_write.py +124 -134
  240. warp/tests/unittest_serial.py +35 -0
  241. warp/tests/unittest_suites.py +291 -0
  242. warp/tests/unittest_utils.py +342 -0
  243. warp/tests/{test_misc.py → unused_test_misc.py} +13 -5
  244. warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
  245. warp/thirdparty/appdirs.py +36 -45
  246. warp/thirdparty/unittest_parallel.py +589 -0
  247. warp/types.py +622 -211
  248. warp/utils.py +54 -393
  249. warp_lang-1.0.0b6.dist-info/METADATA +238 -0
  250. warp_lang-1.0.0b6.dist-info/RECORD +409 -0
  251. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/WHEEL +1 -1
  252. examples/example_cache_management.py +0 -40
  253. examples/example_multigpu.py +0 -54
  254. examples/example_struct.py +0 -65
  255. examples/fem/example_stokes_transfer_3d.py +0 -210
  256. warp/bin/warp-clang.so +0 -0
  257. warp/bin/warp.so +0 -0
  258. warp/fem/field/discrete_field.py +0 -80
  259. warp/fem/space/nodal_function_space.py +0 -233
  260. warp/tests/test_all.py +0 -223
  261. warp/tests/test_array_scan.py +0 -60
  262. warp/tests/test_base.py +0 -208
  263. warp/tests/test_unresolved_func.py +0 -7
  264. warp/tests/test_unresolved_symbol.py +0 -7
  265. warp_lang-1.0.0b2.dist-info/METADATA +0 -26
  266. warp_lang-1.0.0b2.dist-info/RECORD +0 -380
  267. /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
  268. /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
  269. /warp/tests/{test_square.py → aux_test_square.py} +0 -0
  270. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/LICENSE.md +0 -0
  271. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/top_level.txt +0 -0
docs/conf.py CHANGED
@@ -12,16 +12,19 @@
12
12
  #
13
13
  import os
14
14
  import sys
15
+ from datetime import date
15
16
 
16
- sys.path.insert(0, os.path.abspath(".."))
17
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
18
+ import warp as wp # noqa: E402
17
19
 
18
20
  # -- Project information -----------------------------------------------------
19
21
 
20
22
  project = "Warp"
21
- copyright = "2023, NVIDIA"
23
+ copyright = f"2022-{date.today().year}, NVIDIA"
22
24
  author = "NVIDIA"
23
25
 
24
- version = "1.0.0-beta.2"
26
+ version = wp.__version__
27
+ release = version
25
28
 
26
29
  # -- General configuration ---------------------------------------------------
27
30
 
@@ -34,9 +37,10 @@ extensions = [
34
37
  "sphinx.ext.intersphinx",
35
38
  "sphinx.ext.autosummary",
36
39
  "sphinx.ext.todo",
40
+ "sphinx.ext.extlinks", # Markup to shorten external links
37
41
  # Third-party extensions:
42
+ "sphinx_copybutton"
38
43
  # 'sphinx_tabs.tabs',
39
- # 'sphinx_copybutton'
40
44
  # 'autodocsumm'
41
45
  ]
42
46
 
@@ -55,7 +59,11 @@ todo_emit_warnings = True
55
59
 
56
60
  intersphinx_mapping = {
57
61
  "python": ("https://docs.python.org/3", None),
58
- "numpy": ("http://docs.scipy.org/doc/numpy/", None),
62
+ "numpy": ("https://numpy.org/doc/stable", None),
63
+ }
64
+
65
+ extlinks = {
66
+ "github": ("https://github.com/NVIDIA/warp/blob/main/%s", "%s"),
59
67
  }
60
68
 
61
69
  # List of patterns, relative to source directory, that match files and
@@ -63,6 +71,10 @@ intersphinx_mapping = {
63
71
  # This pattern also affects html_static_path and html_extra_path.
64
72
  exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
65
73
 
74
+ # sphinx_copybutton settings
75
+ copybutton_prompt_text = r">>> |\.\.\. |\$ "
76
+ copybutton_prompt_is_regexp = True
77
+
66
78
  # -- Options for HTML output -------------------------------------------------
67
79
 
68
80
  # The theme to use for HTML and HTML Help pages. See the documentation for
examples/env/env_ant.py CHANGED
@@ -54,7 +54,7 @@ class AntEnvironment(Environment):
54
54
  up_axis="y",
55
55
  )
56
56
  builder.joint_q[7:] = [0.0, 1.0, 0.0, -1.0, 0.0, -1.0, 0.0, 1.0]
57
- builder.joint_q[:7] = [0.0, 0.7, 0.0, *wp.quat_from_axis_angle((1.0, 0.0, 0.0), -math.pi * 0.5)]
57
+ builder.joint_q[:7] = [0.0, 0.7, 0.0, *wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), -math.pi * 0.5)]
58
58
 
59
59
 
60
60
  if __name__ == "__main__":
@@ -39,7 +39,7 @@ class CartpoleEnvironment(Environment):
39
39
  wp.sim.parse_urdf(
40
40
  os.path.join(os.path.dirname(__file__), "../assets/cartpole.urdf"),
41
41
  builder,
42
- xform=wp.transform((0.0, 0.0, 0.0), wp.quat_from_axis_angle((1.0, 0.0, 0.0), -math.pi * 0.5)),
42
+ xform=wp.transform((0.0, 0.0, 0.0), wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), -math.pi * 0.5)),
43
43
  floating=False,
44
44
  armature=0.1,
45
45
  stiffness=0.0,
@@ -58,7 +58,7 @@ class HumanoidEnvironment(Environment):
58
58
  up_axis="y",
59
59
  )
60
60
 
61
- builder.joint_q[:7] = [0.0, 1.7, 0.0, *wp.quat_from_axis_angle((1.0, 0.0, 0.0), -math.pi * 0.5)]
61
+ builder.joint_q[:7] = [0.0, 1.7, 0.0, *wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), -math.pi * 0.5)]
62
62
 
63
63
 
64
64
  if __name__ == "__main__":
examples/env/env_usd.py CHANGED
@@ -44,8 +44,11 @@ class UsdEnvironment(Environment):
44
44
  plot_body_coords = False
45
45
 
46
46
  def create_articulation(self, builder):
47
- settings = wp.sim.parse_usd(
47
+ usd_filename = wp.sim.resolve_usd_from_url(
48
48
  "http://omniverse-content-staging.s3-us-west-2.amazonaws.com/Assets/Isaac/2022.2.1/Isaac/Robots/Franka/franka_instanceable.usd",
49
+ target_folder_name=".panda_usd_files")
50
+ settings = wp.sim.parse_usd(
51
+ usd_filename,
49
52
  builder,
50
53
  default_thickness=0.01,
51
54
  # ignore collision meshes from Franka robot
@@ -5,16 +5,17 @@
5
5
  # distribution of this software and related documentation without an express
6
6
  # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
7
 
8
- import warp as wp
9
- import warp.sim
10
- import warp.sim.render
11
-
12
8
  import argparse
13
9
  import os
14
- import numpy as np
15
10
  from enum import Enum
16
11
  from typing import Tuple
17
12
 
13
+ import numpy as np
14
+
15
+ import warp as wp
16
+ import warp.sim
17
+ import warp.sim.render
18
+
18
19
  wp.init()
19
20
 
20
21
 
@@ -225,7 +226,8 @@ class Environment:
225
226
  show_rigid_contact_points=self.show_rigid_contact_points,
226
227
  contact_points_radius=self.contact_points_radius,
227
228
  show_joints=self.show_joints,
228
- **self.opengl_render_settings)
229
+ **self.opengl_render_settings,
230
+ )
229
231
  if self.use_tiled_rendering and self.num_envs > 1:
230
232
  floor_id = self.model.shape_count - 1
231
233
  # all shapes except the floor
@@ -315,10 +317,7 @@ class Environment:
315
317
  if self.use_graph_capture:
316
318
  # create update graph
317
319
  wp.capture_begin()
318
-
319
- # simulate
320
320
  self.update()
321
-
322
321
  graph = wp.capture_end()
323
322
 
324
323
  if self.plot_body_coords:
examples/example_dem.py CHANGED
@@ -14,13 +14,13 @@
14
14
  #
15
15
  ###########################################################################
16
16
 
17
+ import os
18
+
17
19
  import numpy as np
18
20
 
19
21
  import warp as wp
20
22
  import warp.render
21
23
 
22
- import os
23
-
24
24
  wp.init()
25
25
 
26
26
 
@@ -118,6 +118,8 @@ def integrate(
118
118
 
119
119
  class Example:
120
120
  def __init__(self, stage):
121
+ self.device = wp.get_device()
122
+
121
123
  self.frame_dt = 1.0 / 60
122
124
  self.frame_count = 400
123
125
 
@@ -150,32 +152,32 @@ class Example:
150
152
  self.use_graph = wp.get_device().is_cuda
151
153
 
152
154
  if self.use_graph:
153
- wp.capture_begin()
154
-
155
- for s in range(self.sim_substeps):
156
- with wp.ScopedTimer("forces", active=False):
157
- wp.launch(
158
- kernel=apply_forces,
159
- dim=len(self.x),
160
- inputs=[
161
- self.grid.id,
162
- self.x,
163
- self.v,
164
- self.f,
165
- self.point_radius,
166
- self.k_contact,
167
- self.k_damp,
168
- self.k_friction,
169
- self.k_mu,
170
- ],
171
- )
172
- wp.launch(
173
- kernel=integrate,
174
- dim=len(self.x),
175
- inputs=[self.x, self.v, self.f, (0.0, -9.8, 0.0), self.sim_dt, self.inv_mass],
176
- )
177
-
178
- self.graph = wp.capture_end()
155
+ wp.capture_begin(self.device)
156
+ try:
157
+ for _ in range(self.sim_substeps):
158
+ with wp.ScopedTimer("forces", active=False):
159
+ wp.launch(
160
+ kernel=apply_forces,
161
+ dim=len(self.x),
162
+ inputs=[
163
+ self.grid.id,
164
+ self.x,
165
+ self.v,
166
+ self.f,
167
+ self.point_radius,
168
+ self.k_contact,
169
+ self.k_damp,
170
+ self.k_friction,
171
+ self.k_mu,
172
+ ],
173
+ )
174
+ wp.launch(
175
+ kernel=integrate,
176
+ dim=len(self.x),
177
+ inputs=[self.x, self.v, self.f, (0.0, -9.8, 0.0), self.sim_dt, self.inv_mass],
178
+ )
179
+ finally:
180
+ self.graph = wp.capture_end(self.device)
179
181
 
180
182
  def update(self):
181
183
  with wp.ScopedTimer("simulate", active=True):
@@ -186,12 +188,14 @@ class Example:
186
188
  with wp.ScopedTimer("solve", active=False):
187
189
  wp.capture_launch(self.graph)
188
190
 
191
+ self.sim_time += self.frame_dt
192
+
189
193
  else:
190
194
  with wp.ScopedTimer("grid build", active=False):
191
195
  self.grid.build(self.x, self.point_radius)
192
196
 
193
197
  with wp.ScopedTimer("solve", active=False):
194
- for s in range(self.sim_substeps):
198
+ for _ in range(self.sim_substeps):
195
199
  wp.launch(
196
200
  kernel=apply_forces,
197
201
  dim=len(self.x),
@@ -212,8 +216,7 @@ class Example:
212
216
  dim=len(self.x),
213
217
  inputs=[self.x, self.v, self.f, (0.0, -9.8, 0.0), self.sim_dt, self.inv_mass],
214
218
  )
215
-
216
- wp.synchronize()
219
+ self.sim_time += self.sim_dt
217
220
 
218
221
  def render(self, is_live=False):
219
222
  with wp.ScopedTimer("render", active=True):
@@ -223,8 +226,6 @@ class Example:
223
226
  self.renderer.render_points(points=self.x.numpy(), radius=self.point_radius, name="points")
224
227
  self.renderer.end_frame()
225
228
 
226
- self.sim_time += self.frame_dt
227
-
228
229
  # creates a grid of particles
229
230
  def particle_grid(self, dim_x, dim_y, dim_z, lower, radius, jitter):
230
231
  points = np.meshgrid(np.linspace(0, dim_x, dim_x), np.linspace(0, dim_y, dim_y), np.linspace(0, dim_z, dim_z))