Skip to content

Commit 432de4d

Browse files
Merge pull request #1943 from CliMA/ck/data_layout_utils
Reduce code duplication in DataLayouts
2 parents 2572b39 + 6a81465 commit 432de4d

File tree

2 files changed

+34
-51
lines changed

2 files changed

+34
-51
lines changed

benchmarks/scripts/indexing_and_static_ndranges.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ setting where linear indexing is allowed.
3030
nearly the same benefit as linear indexing.
3131
3232
# References:
33-
- https://githubSR.com/CliMA/ClimaCore.jl/issues/1889
34-
- https://githubSR.com/JuliaLang/julia/issues/28126
35-
- https://githubSR.com/JuliaLang/julia/issues/32051
33+
- https://github.com/CliMA/ClimaCore.jl/issues/1889
34+
- https://github.com/JuliaLang/julia/issues/28126
35+
- https://github.com/JuliaLang/julia/issues/32051
3636
3737
# Benchmark results:
3838

src/DataLayouts/DataLayouts.jl

Lines changed: 31 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -305,10 +305,6 @@ struct IJKFVH{S, Nij, Nk, Nv, Nh, A} <: Data3D{S, Nij, Nk}
305305
array::A
306306
end
307307

308-
parent_array_type(
309-
::Type{IJKFVH{S, Nij, Nk, Nv, Nh, A}},
310-
) where {S, Nij, Nk, Nv, Nh, A} = A
311-
312308
function IJKFVH{S, Nij, Nk, Nv, Nh}(
313309
array::AbstractArray{T, 6},
314310
) where {S, Nij, Nk, Nv, Nh, T}
@@ -348,8 +344,6 @@ struct IJFH{S, Nij, Nh, A} <: Data2D{S, Nij}
348344
array::A
349345
end
350346

351-
parent_array_type(::Type{IJFH{S, Nij, Nh, A}}) where {S, Nij, Nh, A} = A
352-
353347
function IJFH{S, Nij, Nh}(array::AbstractArray{T, 4}) where {S, Nij, Nh, T}
354348
check_basetype(T, S)
355349
@assert size(array, 1) == Nij
@@ -452,8 +446,6 @@ struct IFH{S, Ni, Nh, A} <: Data1D{S, Ni}
452446
array::A
453447
end
454448

455-
parent_array_type(::Type{IFH{S, Ni, Nh, A}}) where {S, Ni, Nh, A} = A
456-
457449
function IFH{S, Ni, Nh}(array::AbstractArray{T, 3}) where {S, Ni, Nh, T}
458450
check_basetype(T, S)
459451
@assert size(array, 1) == Ni
@@ -522,8 +514,6 @@ struct DataF{S, A} <: Data0D{S}
522514
array::A
523515
end
524516

525-
parent_array_type(::Type{DataF{S, A}}) where {S, A} = A
526-
527517
function DataF{S}(array::AbstractVector{T}) where {S, T}
528518
check_basetype(T, S)
529519
@assert size(array, 1) == typesize(T, S)
@@ -610,8 +600,6 @@ struct IJF{S, Nij, A} <: DataSlab2D{S, Nij}
610600
array::A
611601
end
612602

613-
parent_array_type(::Type{IJF{S, Nij, A}}) where {S, Nij, A} = A
614-
615603
function IJF{S, Nij}(array::AbstractArray{T, 3}) where {S, Nij, T}
616604
@assert size(array, 1) == Nij
617605
@assert size(array, 2) == Nij
@@ -702,8 +690,6 @@ struct IF{S, Ni, A} <: DataSlab1D{S, Ni}
702690
array::A
703691
end
704692

705-
parent_array_type(::Type{IF{S, Ni, A}}) where {S, Ni, A} = A
706-
707693
function IF{S, Ni}(array::AbstractArray{T, 2}) where {S, Ni, T}
708694
@assert size(array, 1) == Ni
709695
check_basetype(T, S)
@@ -771,8 +757,6 @@ struct VF{S, Nv, A} <: DataColumn{S, Nv}
771757
array::A
772758
end
773759

774-
parent_array_type(::Type{VF{S, Nv, A}}) where {S, Nv, A} = A
775-
776760
function VF{S, Nv}(array::AbstractArray{T, 2}) where {S, Nv, T}
777761
check_basetype(T, S)
778762
@assert size(array, 1) == Nv
@@ -855,9 +839,6 @@ struct VIJFH{S, Nv, Nij, Nh, A} <: Data2DX{S, Nv, Nij}
855839
array::A
856840
end
857841

858-
parent_array_type(::Type{VIJFH{S, Nv, Nij, Nh, A}}) where {S, Nv, Nij, Nh, A} =
859-
A
860-
861842
function VIJFH{S, Nv, Nij, Nh}(
862843
array::AbstractArray{T, 5},
863844
) where {S, Nv, Nij, Nh, T}
@@ -972,8 +953,6 @@ struct VIFH{S, Nv, Ni, Nh, A} <: Data1DX{S, Nv, Ni}
972953
array::A
973954
end
974955

975-
parent_array_type(::Type{VIFH{S, Nv, Ni, Nh, A}}) where {S, Nv, Ni, Nh, A} = A
976-
977956
function VIFH{S, Nv, Ni, Nh}(
978957
array::AbstractArray{T, 4},
979958
) where {S, Nv, Ni, Nh, T}
@@ -1083,8 +1062,6 @@ struct IH1JH2{S, Nij, A} <: Data2D{S, Nij}
10831062
array::A
10841063
end
10851064

1086-
parent_array_type(::Type{IH1JH2{S, Nij, A}}) where {S, Nij, A} = A
1087-
10881065
function IH1JH2{S, Nij}(array::AbstractMatrix{S}) where {S, Nij}
10891066
@assert size(array, 1) % Nij == 0
10901067
@assert size(array, 2) % Nij == 0
@@ -1126,8 +1103,6 @@ struct IV1JH2{S, n1, Ni, A} <: Data1DX{S, n1, Ni}
11261103
array::A
11271104
end
11281105

1129-
parent_array_type(::Type{IV1JH2{S, n1, Ni, A}}) where {S, n1, Ni, A} = A
1130-
11311106
function IV1JH2{S, n1, Ni}(array::AbstractMatrix{S}) where {S, n1, Ni}
11321107
@assert size(array, 2) % Ni == 0
11331108
IV1JH2{S, n1, Ni, typeof(array)}(array)
@@ -1323,6 +1298,33 @@ type parameters.
13231298
@inline slab_index(i, j) = CartesianIndex(i, j, 1, 1, 1)
13241299
@inline slab_index(i) = CartesianIndex(i, 1, 1, 1, 1)
13251300
@inline vindex(v) = CartesianIndex(1, 1, 1, v, 1)
1301+
1302+
"""
1303+
parent_array_type(data::AbstractData)
1304+
1305+
This is an internal function, please do not use outside of ClimaCore.
1306+
1307+
Returns the the backing array type.
1308+
1309+
This function is helpful for writing generic
1310+
code, when reconstructing new datalayouts with new
1311+
type parameters.
1312+
"""
1313+
@inline parent_array_type(data::AbstractData) = parent_array_type(typeof(data))
1314+
# Equivalent to:
1315+
# @generated parent_array_type(::Type{A}) where {A <: AbstractData} = Tuple(A.parameters)[end]
1316+
@inline parent_array_type(::Type{IFH{S, Ni, Nh, A}}) where {S, Ni, Nh, A} = A
1317+
@inline parent_array_type(::Type{DataF{S, A}}) where {S, A} = A
1318+
@inline parent_array_type(::Type{IJF{S, Nij, A}}) where {S, Nij, A} = A
1319+
@inline parent_array_type(::Type{IF{S, Ni, A}}) where {S, Ni, A} = A
1320+
@inline parent_array_type(::Type{VF{S, Nv, A}}) where {S, Nv, A} = A
1321+
@inline parent_array_type(::Type{VIJFH{S, Nv, Nij, Nh, A}}) where {S, Nv, Nij, Nh, A} = A
1322+
@inline parent_array_type(::Type{VIFH{S, Nv, Ni, Nh, A}}) where {S, Nv, Ni, Nh, A} = A
1323+
@inline parent_array_type(::Type{IJFH{S, Nij, Nh, A}}) where {S, Nij, Nh, A} = A
1324+
@inline parent_array_type(::Type{IH1JH2{S, Nij, A}}) where {S, Nij, A} = A
1325+
@inline parent_array_type(::Type{IV1JH2{S, n1, Ni, A}}) where {S, n1, Ni, A} = A
1326+
@inline parent_array_type(::Type{IJKFVH{S, Nij, Nk, Nv, Nh, A}}) where {S, Nij, Nk, Nv, Nh, A} = A
1327+
13261328
#! format: on
13271329

13281330
Base.ndims(data::AbstractData) = Base.ndims(typeof(data))
@@ -1355,29 +1357,10 @@ Reshapes `array` (of scalars) to fit into the given `DataLayout`.
13551357
The dimensions of `array` are assumed to be
13561358
- `([number of vertical nodes], number of horizontal nodes)`.
13571359
"""
1358-
function array2data end
1359-
1360-
array2data(array::AbstractArray{T, 1}, ::IF{<:Any, Ni}) where {T, Ni} =
1361-
IF{T, Ni}(reshape(array, Ni, 1))
1362-
array2data(array::AbstractArray{T, 1}, ::IFH{<:Any, Ni, Nh}) where {T, Ni, Nh} =
1363-
IFH{T, Ni, Nh}(reshape(array, Ni, 1, Nh))
1364-
array2data(array::AbstractArray{T, 1}, ::IJF{<:Any, Nij}) where {T, Nij} =
1365-
IJF{T, Nij}(reshape(array, Nij, Nij, 1))
1366-
array2data(
1367-
array::AbstractArray{T, 1},
1368-
::IJFH{<:Any, Nij, Nh},
1369-
) where {T, Nij, Nh} = IJFH{T, Nij, Nh}(reshape(array, Nij, Nij, 1, Nh))
1370-
array2data(array::AbstractArray{T, 2}, ::VF{<:Any, Nv}) where {T, Nv} =
1371-
VF{T, Nv}(reshape(array, Nv, 1))
1372-
array2data(
1373-
array::AbstractArray{T, 2},
1374-
::VIFH{<:Any, Nv, Ni, Nh},
1375-
) where {T, Nv, Ni, Nh} = VIFH{T, Nv, Ni, Nh}(reshape(array, Nv, Ni, 1, Nh))
1376-
array2data(
1377-
array::AbstractArray{T, 2},
1378-
::VIJFH{<:Any, Nv, Nij, Nh},
1379-
) where {T, Nv, Nij, Nh} =
1380-
VIJFH{T, Nv, Nij, Nh}(reshape(array, Nv, Nij, Nij, 1, Nh))
1360+
array2data(array::AbstractArray{T}, data::AbstractData) where {T} =
1361+
union_all(data){T, Base.tail(type_params(data))...}(
1362+
reshape(array, array_size(data)...),
1363+
)
13811364

13821365
"""
13831366
device_dispatch(data::AbstractData)

0 commit comments

Comments
 (0)