Skip to content

Commit 267358e

Browse files
eliascarvjuliohm
authored andcommitted
Use TiledIteration.TileIterator in RegularCoarsening (#1123)
* Use 'TiledIteration.TileIterator' in 'RegularCoarsening' * Add tests * Update comments * Update src/coarsening/regular.jl Co-authored-by: Júlio Hoffimann <[email protected]> * Add more tests * Apply suggestions --------- Co-authored-by: Júlio Hoffimann <[email protected]>
1 parent 0ca5a14 commit 267358e

File tree

4 files changed

+54
-7
lines changed

4 files changed

+54
-7
lines changed

Project.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ ScopedValues = "7e506255-f358-4e82-b7e4-beb19740aa63"
1818
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
1919
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
2020
StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
21+
TiledIteration = "06e1c1a7-607b-532d-9fad-de7d9aa2abac"
2122
TransformsBase = "28dd2a49-a57a-4bfb-84ca-1a49db9b96b8"
2223
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
2324

@@ -37,6 +38,7 @@ ScopedValues = "1.2"
3738
SparseArrays = "1.9"
3839
StaticArrays = "1.0"
3940
StatsBase = "0.33, 0.34"
41+
TiledIteration = "0.5"
4042
TransformsBase = "1.6"
4143
Unitful = "1.17"
4244
julia = "1.9"

src/Meshes.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ using Distances: Haversine, SphericalAngle
2020
using Distances: evaluate, result_type
2121
using Rotations: Rotation, QuatRotation, Angle2d
2222
using Rotations: rotation_between
23+
using TiledIteration: TileIterator
2324
using CoordRefSystems: Basic, Projected, Geographic
2425
using NearestNeighbors: KDTree, BallTree
2526
using NearestNeighbors: knn, inrange

src/coarsening/regular.jl

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,43 @@ RegularCoarsening(factors::Vararg{Int,N}) where {N} = RegularCoarsening(factors)
2222

2323
function coarsen(grid::OrthoRegularGrid, method::RegularCoarsening)
2424
factors = fitdims(method.factors, paramdim(grid))
25-
RegularGrid(minimum(grid), maximum(grid), dims=size(grid) factors)
25+
dims = _coarsesize(grid, factors)
26+
RegularGrid(minimum(grid), maximum(grid), dims=dims)
2627
end
2728

2829
function coarsen(grid::RectilinearGrid, method::RegularCoarsening)
2930
factors = fitdims(method.factors, paramdim(grid))
30-
dims = vsize(grid)
31-
rngs = ntuple(i -> 1:factors[i]:dims[i], paramdim(grid))
31+
inds = _coarseinds(grid, factors)
3232
xyzₛ = xyz(grid)
33-
xyzₜ = ntuple(i -> xyzₛ[i][rngs[i]], paramdim(grid))
33+
xyzₜ = ntuple(i -> xyzₛ[i][inds[i]], paramdim(grid))
3434
RectilinearGrid{manifold(grid),crs(grid)}(xyzₜ)
3535
end
3636

3737
function coarsen(grid::StructuredGrid, method::RegularCoarsening)
3838
factors = fitdims(method.factors, paramdim(grid))
39-
dims = vsize(grid)
40-
rngs = ntuple(i -> 1:factors[i]:dims[i], paramdim(grid))
39+
inds = _coarseinds(grid, factors)
4140
XYZₛ = XYZ(grid)
42-
XYZₜ = ntuple(i -> XYZₛ[i][rngs...], paramdim(grid))
41+
XYZₜ = ntuple(i -> XYZₛ[i][inds...], paramdim(grid))
4342
StructuredGrid{manifold(grid),crs(grid)}(XYZₜ)
4443
end
4544

4645
coarsen(grid::TransformedGrid, method::RegularCoarsening) =
4746
TransformedGrid(coarsen(parent(grid), method), transform(grid))
47+
48+
# -----------------
49+
# HELPER FUNCTIONS
50+
# -----------------
51+
52+
function _coarsesize(grid, factors)
53+
dims = size(grid)
54+
axes = ntuple(i -> 1:dims[i], paramdim(grid))
55+
size(TileIterator(axes, factors))
56+
end
57+
58+
_coarsevsize(grid, factors) = _coarsesize(grid, factors) .+ .!isperiodic(grid)
59+
60+
function _coarseinds(grid, factors)
61+
dims = vsize(grid)
62+
tdims = _coarsevsize(grid, factors)
63+
ntuple(i -> floor.(Int, range(start=1, stop=dims[i], length=tdims[i])), paramdim(grid))
64+
end

test/coarsening.jl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,22 @@
1616
tgrid = CartesianGrid(cart(0.0, 0.0), cart(10.0, 10.0), dims=(10, 5))
1717
@test coarsen(grid, RegularCoarsening(2, 4)) == tgrid
1818

19+
# non-multiple dimensions
20+
grid = CartesianGrid(cart(0, 0), cart(13, 17), dims=(13, 17))
21+
tgrid = CartesianGrid(cart(0, 0), cart(13, 17), dims=(3, 6))
22+
@test coarsen(grid, RegularCoarsening(5, 3)) == tgrid
23+
rgrid = convert(RectilinearGrid, grid)
24+
@test size(coarsen(rgrid, RegularCoarsening(5, 3))) == (3, 6)
25+
sgrid = convert(StructuredGrid, grid)
26+
@test size(coarsen(sgrid, RegularCoarsening(5, 3))) == (3, 6)
27+
tfgrid = TransformedGrid(grid, Identity())
28+
@test size(coarsen(tfgrid, RegularCoarsening(5, 3))) == (3, 6)
29+
30+
# large grid
31+
grid = CartesianGrid(cart(0, 0), cart(16200, 8100), dims=(16200, 8100))
32+
tgrid = CartesianGrid(cart(0, 0), cart(16200, 8100), dims=(203, 203))
33+
@test coarsen(grid, RegularCoarsening(80, 40)) == tgrid
34+
1935
# 3D grids
2036
grid = cartgrid(100, 100, 100)
2137
tgrid = CartesianGrid(minimum(grid), maximum(grid), dims=(50, 25, 20))
@@ -28,4 +44,15 @@
2844
@test coarsen(sgrid, RegularCoarsening(2, 4, 5)) == tsgrid
2945
tfgrid = TransformedGrid(grid, Identity())
3046
@test coarsen(tfgrid, RegularCoarsening(2, 4, 5)) == coarsen(grid, RegularCoarsening(2, 4, 5))
47+
48+
# non-multiple dimensions
49+
grid = CartesianGrid(cart(0, 0, 0), cart(13, 17, 23), dims=(13, 17, 23))
50+
tgrid = CartesianGrid(cart(0, 0, 0), cart(13, 17, 23), dims=(2, 4, 8))
51+
@test coarsen(grid, RegularCoarsening(7, 5, 3)) == tgrid
52+
rgrid = convert(RectilinearGrid, grid)
53+
@test size(coarsen(rgrid, RegularCoarsening(7, 5, 3))) == (2, 4, 8)
54+
sgrid = convert(StructuredGrid, grid)
55+
@test size(coarsen(sgrid, RegularCoarsening(7, 5, 3))) == (2, 4, 8)
56+
tfgrid = TransformedGrid(grid, Identity())
57+
@test size(coarsen(tfgrid, RegularCoarsening(7, 5, 3))) == (2, 4, 8)
3158
end

0 commit comments

Comments
 (0)