Skip to content

Vector calculus follow-ups from #1663: eager divergence and a user guide fix - #1732

Open
rajeeja wants to merge 3 commits into
mainfrom
rajeeja/vector-calculus-followup
Open

Vector calculus follow-ups from #1663: eager divergence and a user guide fix#1732
rajeeja wants to merge 3 commits into
mainfrom
rajeeja/vector-calculus-followup

Conversation

@rajeeja

@rajeeja rajeeja commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Closes #1731. Follow-up to #1663 / #1662.

Overview

Two things #1663 left behind.

1. divergence is eager on dask input. #1663 added the spherical metric term to both curl and divergence. The two are companions and should behave identically, but divergence reaches for other.values where curl uses self.data:

# curl()
metric = self.data * tan_lat          # stays lazy

# divergence()
metric = other.values * tan_lat       # materializes

That materializes other and drags the whole divergence eager, so curl and divergence return different types for the same chunked input. The mismatch came in when #1588's .values.data sweep was applied during a conflict resolution on the #1663 branch and only reached the curl side.

Measured on test/meshfiles/ugrid/quad-hexagon/grid.nc with a chunked field:

before after
curl Array Array
divergence ndarray Array

No test added. Nothing in test/core/test_vector_calculus.py chunks its input, so the whole gradient/curl/divergence area has no dask coverage to extend; adding just enough scaffolding to pin this one line would be out of proportion to a one-word fix. Worth a separate issue if we want that coverage properly. The existing 38 tests pass unchanged.

2. docs/user-guide/vector_calculus.ipynb still teaches the planar operators. The curl and divergence background cells give

$\text{curl}(\mathbf{F}) = \partial v/\partial x - \partial u/\partial y$ and $\text{div}(\mathbf{F}) = \partial u/\partial x + \partial v/\partial y$

with no metric term, and eight code cells hand-roll the operators out of gradient() components instead of calling curl()/divergence(). So every worked example demonstrated pre-#1663 physics while the library computed something else.

This adds the $u\tan\varphi/a$ and $-v\tan\varphi/a$ terms to the math, switches the examples to the public API, and corrects the residual magnitudes quoted in the prose to what the notebook actually prints.

One result changes materially. Curl and divergence of a constant field are no longer exactly zero — they are $u\tan\varphi/a$ and $-v\tan\varphi/a$, which come to 4.8e-09 and 9.6e-09 on this ±2° MPAS subset. That is correct spherical behaviour, so the notebook now says so and checks both against their closed forms (max deviation 0.00e+00) rather than dropping the examples. Everything else moves by less than a part in 10⁴, except the two "≈ 0" residuals which go from 2.8e-10 to 4.0e-09 and stay ≈ 0.

The notebook is executed by myst_nb at docs build time and stores no outputs, so its printed numbers were always fresh while the prose around them went stale silently. Every cell was run locally before committing.

PR Checklist

General

  • An issue is created and linked
  • Added appropriate labels (if your uxarray repo permissions allow it)
  • Filled out Overview and Expected Usage (if applicable) sections

Testing & Benchmarking

  • There is adequate test coverage of changes from this PR (add new tests if needed)
  • [N/A] If this PR could affect performance, ran ASV benchmarks and confirmed they show expected behavior

Documentation and Examples

  • [N/A] Docstrings updated with any function changes, and included in all new functions
  • [N/A] User (public) functions added to docs/api.rst
  • If touched any notebook files, cleared the output of all cells before committing
  • [N/A] If added new notebook files, put into appropriate directories and referenced in appropriate files

AI Disclosure

AI Usage:

  • I have tested and take responsibility for all AI-generated content in my PR.

The spherical metric term added in #1663 calls `other.values`, which
materializes the field and forces the whole divergence to compute
eagerly. Its companion in `curl` uses `.data` and stays lazy, so switch
divergence to match.
The curl and divergence background cells give the planar formulas, and eight
code cells hand-roll the operators out of gradient() components instead of
calling curl()/divergence(). Since #1663 the library adds the spherical metric
terms, so every worked example demonstrated something the library no longer
computes.

Add the metric terms to the math, switch the examples to the public API, and
rewrite the constant-field discussion: curl and divergence of a constant field
are u*tan(lat)/a and -v*tan(lat)/a, not zero. Both are now checked against
their closed forms. Residual magnitudes in the prose are corrected to match
what the notebook actually prints.
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on  ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

@rajeeja rajeeja added bug Something isn't working documentation Improvements or additions to documentation labels Sep 3, 2026
@cmdupuis3 cmdupuis3 added run-benchmark Run ASV benchmark workflow and removed run-benchmark Run ASV benchmark workflow labels Sep 8, 2026
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown

ASV Benchmarking

Benchmark Comparison Results

Benchmarks that have stayed the same:

Change Before [8d2ac40] After [8bd2fd4] Ratio Benchmark (Parameter)
5.31±0.02ms 5.27±0.04ms 0.99 bench_connectivity.Connectivity.time_edge_face('120km')
1.73±0.02ms 1.69±0.01ms 0.98 bench_connectivity.Connectivity.time_edge_face('480km')
4.23±0.01ms 4.20±0.02ms 0.99 bench_connectivity.Connectivity.time_edge_node('120km')
1.35±0.01ms 1.34±0.01ms 0.99 bench_connectivity.Connectivity.time_edge_node('480km')
4.24±0.01ms 4.19±0.01ms 0.99 bench_connectivity.Connectivity.time_face_edge('120km')
1.37±0.01ms 1.34±0.01ms 0.98 bench_connectivity.Connectivity.time_face_edge('480km')
6.23±0.03ms 6.15±0.03ms 0.99 bench_connectivity.Connectivity.time_face_face('120km')
2.09±0.02ms 2.09±0.01ms 1.00 bench_connectivity.Connectivity.time_face_face('480km')
62.5±1μs 60.0±0.7μs 0.96 bench_connectivity.Connectivity.time_face_node('120km')
58.7±0.7μs 56.9±3μs 0.97 bench_connectivity.Connectivity.time_face_node('480km')
432±10μs 427±5μs 0.99 bench_connectivity.Connectivity.time_n_nodes_per_face('120km')
364±9μs 357±10μs 0.98 bench_connectivity.Connectivity.time_n_nodes_per_face('480km')
5.67±0.03ms 5.61±0.03ms 0.99 bench_connectivity.Connectivity.time_node_edge('120km')
1.76±0.02ms 1.72±0.01ms 0.98 bench_connectivity.Connectivity.time_node_edge('480km')
75.2±1ms 74.8±0.3ms 0.99 bench_connectivity.Connectivity.time_node_face('120km')
4.73±0.05ms 4.72±0.05ms 1.00 bench_connectivity.Connectivity.time_node_face('480km')
6.66±0.03ms 6.60±0.05ms 0.99 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
2.43±0.1ms 2.39±0.06ms 0.98 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
10.3±10s 8.51±10ms ~0.00 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
1.94±0.02ms 1.95±0.02ms 1.01 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
57.3k 57.3k 1.00 face_bounds.FaceBounds.track_nbytes_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
12.3k 12.3k 1.00 face_bounds.FaceBounds.track_nbytes_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
123k 123k 1.00 face_bounds.FaceBounds.track_nbytes_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
128 128 1.00 face_bounds.FaceBounds.track_nbytes_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
1.27M 1.27M 1.00 face_bounds.FaceBounds.track_nbytes_grid_with_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
50.1k 50.1k 1.00 face_bounds.FaceBounds.track_nbytes_grid_with_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
1.48M 1.48M 1.00 face_bounds.FaceBounds.track_nbytes_grid_with_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
712 712 1.00 face_bounds.FaceBounds.track_nbytes_grid_with_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
1.97M 1.97M 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
1.97M 1.97M 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
2.14M 2.14M 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
38.2k 38.3k 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
337M 336M 1.00 face_bounds.FaceBoundsColdStartRss.peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
366M 366M 1.00 face_bounds.FaceBoundsColdStartRss.peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
338M 338M 1.00 face_bounds.FaceBoundsColdStartRss.peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
337M 338M 1.00 face_bounds.FaceBoundsColdStartRss.peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
1.17±0.05μs 1.21±0.02μs 1.03 geometry_kernels.AccucrossKernels.time_accucross
2.55±0.02μs 2.59±0.04μs 1.01 geometry_kernels.AccucrossKernels.time_accucross_pair
425±10ns 395±20ns 0.93 geometry_kernels.EFTPrimitives.time_acc_sqrt_re
401±10ns 410±9ns 1.02 geometry_kernels.EFTPrimitives.time_diff_of_products
360±20ns 380±30ns 1.06 geometry_kernels.EFTPrimitives.time_two_prod
341±6ns 360±5ns 1.06 geometry_kernels.EFTPrimitives.time_two_sum
1.33±0.01μs 1.36±0.04μs 1.03 geometry_kernels.GCAConstLatIntersection.time_accux_constlat_kernel
1.01±0.03μs 1.02±0.02μs 1.02 geometry_kernels.GCAConstLatIntersection.time_gca_const_lat_intersection
1.71±0.03μs 1.72±0.02μs 1.01 geometry_kernels.GCAConstLatIntersection.time_try_gca_const_lat_intersection
3.31±0.05μs 3.36±0.05μs 1.01 geometry_kernels.GCAGCAIntersection.time_accux_gca_kernel
1.12±0.01μs 1.17±0.04μs 1.05 geometry_kernels.GCAGCAIntersection.time_gca_gca_intersection
3.42±0.04μs 3.41±0.07μs 0.99 geometry_kernels.GCAGCAIntersection.time_try_gca_gca_intersection
37.1±0.2μs 37.0±1μs 1.00 geometry_kernels.OrientPredicates.time_on_minor_arc
671±40ns 666±20ns 0.99 geometry_kernels.OrientPredicates.time_orient3d_on_sphere
2.92±0.1ms 2.80±0.01ms 0.96 geometry_samebody.SameBodyConstLat.time_accux_dispatch
1.33±0.01ms 1.33±0.01ms 1.00 geometry_samebody.SameBodyConstLat.time_accux_kernel
1.81±0.01ms 1.83±0.01ms 1.01 geometry_samebody.SameBodyConstLat.time_fp64_dispatch
153±0.4μs 153±0.2μs 1.00 geometry_samebody.SameBodyConstLat.time_fp64_kernel
failed failed n/a geometry_samebody_gcagca.SameBodyGcaGca.time_accux_dispatch
failed failed n/a geometry_samebody_gcagca.SameBodyGcaGca.time_accux_kernel
failed failed n/a geometry_samebody_gcagca.SameBodyGcaGca.time_fp64_dispatch
failed failed n/a geometry_samebody_gcagca.SameBodyGcaGca.time_fp64_kernel
830±8ms 827±5ms 1.00 import.Imports.timeraw_import_uxarray
294M 293M 1.00 import.Imports.track_peakmem_import_uxarray
2.21±0.03ms 2.19±0.02ms 0.99 mpas_ocean.CheckNorm.time_check_norm('120km')
1.81±0.02ms 1.76±0.01ms 0.97 mpas_ocean.CheckNorm.time_check_norm('480km')
1.07±0.01ms 1.05±0ms 0.98 mpas_ocean.ConnectivityConstruction.time_face_face_connectivity('120km')
534±10μs 533±20μs 1.00 mpas_ocean.ConnectivityConstruction.time_face_face_connectivity('480km')
653±6μs 650±6μs 1.00 mpas_ocean.ConnectivityConstruction.time_n_nodes_per_face('120km')
583±10μs 584±6μs 1.00 mpas_ocean.ConnectivityConstruction.time_n_nodes_per_face('480km')
5.03±0.04ms 4.95±0.02ms 0.99 mpas_ocean.ConstructFaceLatLon.time_cartesian_averaging('120km')
3.46±0.03ms 3.49±0.06ms 1.01 mpas_ocean.ConstructFaceLatLon.time_cartesian_averaging('480km')
104±0.7ms 103±0.3ms 0.99 mpas_ocean.ConstructFaceLatLon.time_welzl('120km')
10.2±0.07ms 10.0±0.4ms 0.98 mpas_ocean.ConstructFaceLatLon.time_welzl('480km')
19.7±0.02ms 19.7±0.03ms 1.00 mpas_ocean.ConstructTreeStructures.time_ball_tree('120km')
1.10±0.01ms 1.08±0.02ms 0.98 mpas_ocean.ConstructTreeStructures.time_ball_tree('480km')
10.6±0.02ms 10.6±0.01ms 1.00 mpas_ocean.ConstructTreeStructures.time_kd_tree('120km')
724±20μs 722±20μs 1.00 mpas_ocean.ConstructTreeStructures.time_kd_tree('480km')
519±4ms 513±2ms 0.99 mpas_ocean.CrossSections.time_const_lat('120km', 1)
261±2ms 260±1ms 1.00 mpas_ocean.CrossSections.time_const_lat('120km', 2)
135±0.5ms 136±1ms 1.01 mpas_ocean.CrossSections.time_const_lat('120km', 4)
465±5ms 464±3ms 1.00 mpas_ocean.CrossSections.time_const_lat('480km', 1)
234±0.6ms 232±1ms 0.99 mpas_ocean.CrossSections.time_const_lat('480km', 2)
120±0.3ms 121±0.9ms 1.00 mpas_ocean.CrossSections.time_const_lat('480km', 4)
357M 357M 1.00 mpas_ocean.CrossSectionsPeakMem.peakmem_const_lat('120km', 1)
357M 357M 1.00 mpas_ocean.CrossSectionsPeakMem.peakmem_const_lat('120km', 2)
357M 357M 1.00 mpas_ocean.CrossSectionsPeakMem.peakmem_const_lat('120km', 4)
340M 340M 1.00 mpas_ocean.CrossSectionsPeakMem.peakmem_const_lat('480km', 1)
340M 340M 1.00 mpas_ocean.CrossSectionsPeakMem.peakmem_const_lat('480km', 2)
342M 340M 1.00 mpas_ocean.CrossSectionsPeakMem.peakmem_const_lat('480km', 4)
22.0±0.06ms 21.9±0.02ms 0.99 mpas_ocean.DualMesh.time_dual_mesh_construction('120km')
2.56±0.02ms 2.52±0.02ms 0.98 mpas_ocean.DualMesh.time_dual_mesh_construction('480km')
13.7±0.1ms 13.6±0.1ms 0.99 mpas_ocean.FaceAreas.time_face_areas('120km')
3.74±0.05ms 3.73±0.06ms 1.00 mpas_ocean.FaceAreas.time_face_areas('480km')
229k 229k 1.00 mpas_ocean.FaceAreas.track_nbytes_face_areas('120km')
14.3k 14.3k 1.00 mpas_ocean.FaceAreas.track_nbytes_face_areas('480km')
2.12M 2.12M 1.00 mpas_ocean.FaceAreas.track_peakmem_face_areas('120km')
743k 743k 1.00 mpas_ocean.FaceAreas.track_peakmem_face_areas('480km')
833±5ms 820±4ms 0.98 mpas_ocean.GeoDataFrame.time_to_geodataframe('120km', False)
50.7±0.6ms 50.2±0.7ms 0.99 mpas_ocean.GeoDataFrame.time_to_geodataframe('120km', True)
73.5±1ms 72.2±0.2ms 0.98 mpas_ocean.GeoDataFrame.time_to_geodataframe('480km', False)
5.56±0.1ms 5.51±0.1ms 0.99 mpas_ocean.GeoDataFrame.time_to_geodataframe('480km', True)
14.4±0.06ms 14.3±0.07ms 0.99 mpas_ocean.Gradient.time_gradient('120km')
2.00±0.02ms 2.01±0.02ms 1.00 mpas_ocean.Gradient.time_gradient('480km')
457k 457k 1.00 mpas_ocean.Gradient.track_nbytes_gradient('120km')
28.7k 28.7k 1.00 mpas_ocean.Gradient.track_nbytes_gradient('480km')
3.43M 3.43M 1.00 mpas_ocean.Gradient.track_peakmem_gradient('120km')
218k 218k 1.00 mpas_ocean.Gradient.track_peakmem_gradient('480km')
352M 352M 1.00 mpas_ocean.GradientColdStartRss.peakmem_gradient('120km')
332M 331M 1.00 mpas_ocean.GradientColdStartRss.peakmem_gradient('480km')
351±5μs 351±7μs 1.00 mpas_ocean.HoleEdgeIndices.time_construct_hole_edge_indices('120km')
199±4μs 190±8μs 0.96 mpas_ocean.HoleEdgeIndices.time_construct_hole_edge_indices('480km')
566±7μs 555±10μs 0.98 mpas_ocean.Integrate.time_integrate('120km')
480±4μs 470±8μs 0.98 mpas_ocean.Integrate.time_integrate('480km')
18.4M 18.4M 1.00 mpas_ocean.Integrate.track_nbytes_integrate('120km')
1.2M 1.2M 1.00 mpas_ocean.Integrate.track_nbytes_integrate('480km')
188±0.9ms 187±0.7ms 1.00 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('120km', 'exclude')
188±1ms 187±1ms 1.00 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('120km', 'include')
188±0.9ms 189±2ms 1.01 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('120km', 'split')
14.1±0.05ms 13.8±0.1ms 0.98 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('480km', 'exclude')
14.2±0.2ms 13.8±0.1ms 0.97 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('480km', 'include')
14.1±0.06ms 13.8±0.05ms 0.98 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('480km', 'split')
257±0.3ms 256±0.4ms 1.00 mpas_ocean.NeighborhoodBuild.time_build('120km', 1.0)
1.37±0s 1.37±0s 1.00 mpas_ocean.NeighborhoodBuild.time_build('120km', 15.0)
531±2ms 530±2ms 1.00 mpas_ocean.NeighborhoodBuild.time_build('120km', 5.0)
14.1±0.03ms 14.1±0.06ms 1.00 mpas_ocean.NeighborhoodBuild.time_build('480km', 1.0)
27.4±0.6ms 26.8±0.04ms 0.98 mpas_ocean.NeighborhoodBuild.time_build('480km', 15.0)
17.4±0.02ms 17.4±0.09ms 1.00 mpas_ocean.NeighborhoodBuild.time_build('480km', 5.0)
252±0.2ms 252±0.3ms 1.00 mpas_ocean.NeighborhoodBuild.time_query_radius('120km', 1.0)
1.35±0s 1.35±0s 1.00 mpas_ocean.NeighborhoodBuild.time_query_radius('120km', 15.0)
526±1ms 526±2ms 1.00 mpas_ocean.NeighborhoodBuild.time_query_radius('120km', 5.0)
13.8±0.04ms 13.7±0.01ms 0.99 mpas_ocean.NeighborhoodBuild.time_query_radius('480km', 1.0)
26.3±0.05ms 26.3±0.05ms 1.00 mpas_ocean.NeighborhoodBuild.time_query_radius('480km', 15.0)
17.0±0.1ms 16.9±0.07ms 0.99 mpas_ocean.NeighborhoodBuild.time_query_radius('480km', 5.0)
1.19 1.19 1.00 mpas_ocean.NeighborhoodBuild.track_mean_neighbors('120km', 1.0)
612.76 612.76 1.00 mpas_ocean.NeighborhoodBuild.track_mean_neighbors('120km', 15.0)
74.17 74.17 1.00 mpas_ocean.NeighborhoodBuild.track_mean_neighbors('120km', 5.0)
1.0 1.0 1.00 mpas_ocean.NeighborhoodBuild.track_mean_neighbors('480km', 1.0)
37.29 37.29 1.00 mpas_ocean.NeighborhoodBuild.track_mean_neighbors('480km', 15.0)
6.57 6.57 1.00 mpas_ocean.NeighborhoodBuild.track_mean_neighbors('480km', 5.0)
728k 728k 1.00 mpas_ocean.NeighborhoodBuild.track_nbytes_neighbors('120km', 1.0)
141M 141M 1.00 mpas_ocean.NeighborhoodBuild.track_nbytes_neighbors('120km', 15.0)
17.4M 17.4M 1.00 mpas_ocean.NeighborhoodBuild.track_nbytes_neighbors('120km', 5.0)
43k 43k 1.00 mpas_ocean.NeighborhoodBuild.track_nbytes_neighbors('480km', 1.0)
563k 563k 1.00 mpas_ocean.NeighborhoodBuild.track_nbytes_neighbors('480km', 15.0)
123k 123k 1.00 mpas_ocean.NeighborhoodBuild.track_nbytes_neighbors('480km', 5.0)
5.72M 5.72M 1.00 mpas_ocean.NeighborhoodBuild.track_peakmem_build('120km', 1.0)
145M 145M 1.00 mpas_ocean.NeighborhoodBuild.track_peakmem_build('120km', 15.0)
21.5M 21.5M 1.00 mpas_ocean.NeighborhoodBuild.track_peakmem_build('120km', 5.0)
362k 362k 1.00 mpas_ocean.NeighborhoodBuild.track_peakmem_build('480km', 1.0)
825k 824k 1.00 mpas_ocean.NeighborhoodBuild.track_peakmem_build('480km', 15.0)
384k 384k 1.00 mpas_ocean.NeighborhoodBuild.track_peakmem_build('480km', 5.0)
47.8±1ms 47.0±0.8ms 0.98 mpas_ocean.NeighborhoodDask.time_mean('120km', 'grid_chunks')
25.2±0.2ms 24.9±0.08ms 0.99 mpas_ocean.NeighborhoodDask.time_mean('120km', 'numpy')
44.0±0.6ms 43.7±0.7ms 0.99 mpas_ocean.NeighborhoodDask.time_mean('120km', 'time_chunks')
11.0±0.06ms 10.8±0.1ms 0.98 mpas_ocean.NeighborhoodDask.time_mean('480km', 'grid_chunks')
576±30μs 542±3μs 0.94 mpas_ocean.NeighborhoodDask.time_mean('480km', 'numpy')
7.71±0.1ms 7.78±0.1ms 1.01 mpas_ocean.NeighborhoodDask.time_mean('480km', 'time_chunks')
5.79M 5.83M 1.01 mpas_ocean.NeighborhoodDask.track_peakmem_mean('120km', 'grid_chunks')
2.75M 2.75M 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('120km', 'numpy')
5.68M 5.67M 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('120km', 'time_chunks')
646k 643k 0.99 mpas_ocean.NeighborhoodDask.track_peakmem_mean('480km', 'grid_chunks')
177k 177k 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('480km', 'numpy')
531k 529k 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('480km', 'time_chunks')
13.9±0.3s 13.2±0.01s 0.95 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('120km', 'mean')
14.0±0s 14.0±0.03s 1.00 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('120km', 'median')
243±0.4ms 244±1ms 1.00 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('480km', 'mean')
251±0.2ms 250±0.3ms 1.00 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('480km', 'median')
1.41±0s 1.41±0s 1.00 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('120km', 'mean')
1.62±0s 1.62±0s 1.00 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('120km', 'median')
27.3±0.04ms 27.3±0.06ms 1.00 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('480km', 'mean')
28.8±0.04ms 29.0±0.2ms 1.01 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('480km', 'median')
44.8±0.05ms 44.8±0.06ms 1.00 mpas_ocean.NeighborhoodReduce.time_reduce('120km', 'mean')
259±0.08ms 259±0.2ms 1.00 mpas_ocean.NeighborhoodReduce.time_reduce('120km', 'median')
608±9μs 604±30μs 0.99 mpas_ocean.NeighborhoodReduce.time_reduce('480km', 'mean')
2.09±0ms 2.08±0.01ms 1.00 mpas_ocean.NeighborhoodReduce.time_reduce('480km', 'median')
239k 239k 1.00 mpas_ocean.NeighborhoodReduce.track_peakmem_reduce('120km', 'mean')
245k 245k 1.00 mpas_ocean.NeighborhoodReduce.track_peakmem_reduce('120km', 'median')
19.4k 19.4k 1.00 mpas_ocean.NeighborhoodReduce.track_peakmem_reduce('480km', 'mean')
19.9k 19.9k 1.00 mpas_ocean.NeighborhoodReduce.track_peakmem_reduce('480km', 'median')
348±10μs 352±9μs 1.01 mpas_ocean.PointInPolygon.time_face_search_lonlat('120km')
332±9μs 338±9μs 1.02 mpas_ocean.PointInPolygon.time_face_search_lonlat('480km')
335±10μs 322±10μs 0.96 mpas_ocean.PointInPolygon.time_face_search_xyz('120km')
311±5μs 310±9μs 1.00 mpas_ocean.PointInPolygon.time_face_search_xyz('480km')
200±0.6ms 201±0.2ms 1.01 mpas_ocean.RemapDownsample.time_bilinear_remapping
228±0.8ms 229±1ms 1.00 mpas_ocean.RemapDownsample.time_inverse_distance_weighted_remapping
15.4±0.02ms 15.3±0.03ms 1.00 mpas_ocean.RemapDownsample.time_nearest_neighbor_remapping
1.12±0s 1.10±0s 0.99 mpas_ocean.RemapUpsample.time_bilinear_remapping
35.5±0.3ms 34.6±0.3ms 0.97 mpas_ocean.RemapUpsample.time_inverse_distance_weighted_remapping
11.0±0.1ms 10.9±0.07ms 0.99 mpas_ocean.RemapUpsample.time_nearest_neighbor_remapping
9.18±0.04ms 9.12±0.02ms 0.99 mpas_ocean.ZonalAverage.time_zonal_average('120km')
4.81±0.03ms 4.83±0.02ms 1.00 mpas_ocean.ZonalAverage.time_zonal_average('480km')
358M 358M 1.00 mpas_ocean.ZonalAveragePeakMem.peakmem_zonal_average('120km')
342M 342M 1.00 mpas_ocean.ZonalAveragePeakMem.peakmem_zonal_average('480km')
6.14±0.02ms 6.13±0.01ms 1.00 quad_hexagon.QuadHexagon.time_open_dataset
5.21±0.03ms 5.20±0.01ms 1.00 quad_hexagon.QuadHexagon.time_open_grid
408 408 1.00 quad_hexagon.QuadHexagon.track_nbytes_open_dataset
392 392 1.00 quad_hexagon.QuadHexagon.track_nbytes_open_grid
73.8k 73.8k 1.00 quad_hexagon.QuadHexagon.track_peakmem_open_dataset
73k 73k 1.00 quad_hexagon.QuadHexagon.track_peakmem_open_grid

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Vector calculus follow-ups from #1663: eager divergence and a user guide fix

2 participants