@@ -305,10 +305,6 @@ struct IJKFVH{S, Nij, Nk, Nv, Nh, A} <: Data3D{S, Nij, Nk}
305
305
array:: A
306
306
end
307
307
308
- parent_array_type (
309
- :: Type{IJKFVH{S, Nij, Nk, Nv, Nh, A}} ,
310
- ) where {S, Nij, Nk, Nv, Nh, A} = A
311
-
312
308
function IJKFVH {S, Nij, Nk, Nv, Nh} (
313
309
array:: AbstractArray{T, 6} ,
314
310
) where {S, Nij, Nk, Nv, Nh, T}
@@ -348,8 +344,6 @@ struct IJFH{S, Nij, Nh, A} <: Data2D{S, Nij}
348
344
array:: A
349
345
end
350
346
351
- parent_array_type (:: Type{IJFH{S, Nij, Nh, A}} ) where {S, Nij, Nh, A} = A
352
-
353
347
function IJFH {S, Nij, Nh} (array:: AbstractArray{T, 4} ) where {S, Nij, Nh, T}
354
348
check_basetype (T, S)
355
349
@assert size (array, 1 ) == Nij
@@ -452,8 +446,6 @@ struct IFH{S, Ni, Nh, A} <: Data1D{S, Ni}
452
446
array:: A
453
447
end
454
448
455
- parent_array_type (:: Type{IFH{S, Ni, Nh, A}} ) where {S, Ni, Nh, A} = A
456
-
457
449
function IFH {S, Ni, Nh} (array:: AbstractArray{T, 3} ) where {S, Ni, Nh, T}
458
450
check_basetype (T, S)
459
451
@assert size (array, 1 ) == Ni
@@ -522,8 +514,6 @@ struct DataF{S, A} <: Data0D{S}
522
514
array:: A
523
515
end
524
516
525
- parent_array_type (:: Type{DataF{S, A}} ) where {S, A} = A
526
-
527
517
function DataF {S} (array:: AbstractVector{T} ) where {S, T}
528
518
check_basetype (T, S)
529
519
@assert size (array, 1 ) == typesize (T, S)
@@ -610,8 +600,6 @@ struct IJF{S, Nij, A} <: DataSlab2D{S, Nij}
610
600
array:: A
611
601
end
612
602
613
- parent_array_type (:: Type{IJF{S, Nij, A}} ) where {S, Nij, A} = A
614
-
615
603
function IJF {S, Nij} (array:: AbstractArray{T, 3} ) where {S, Nij, T}
616
604
@assert size (array, 1 ) == Nij
617
605
@assert size (array, 2 ) == Nij
@@ -702,8 +690,6 @@ struct IF{S, Ni, A} <: DataSlab1D{S, Ni}
702
690
array:: A
703
691
end
704
692
705
- parent_array_type (:: Type{IF{S, Ni, A}} ) where {S, Ni, A} = A
706
-
707
693
function IF {S, Ni} (array:: AbstractArray{T, 2} ) where {S, Ni, T}
708
694
@assert size (array, 1 ) == Ni
709
695
check_basetype (T, S)
@@ -771,8 +757,6 @@ struct VF{S, Nv, A} <: DataColumn{S, Nv}
771
757
array:: A
772
758
end
773
759
774
- parent_array_type (:: Type{VF{S, Nv, A}} ) where {S, Nv, A} = A
775
-
776
760
function VF {S, Nv} (array:: AbstractArray{T, 2} ) where {S, Nv, T}
777
761
check_basetype (T, S)
778
762
@assert size (array, 1 ) == Nv
@@ -855,9 +839,6 @@ struct VIJFH{S, Nv, Nij, Nh, A} <: Data2DX{S, Nv, Nij}
855
839
array:: A
856
840
end
857
841
858
- parent_array_type (:: Type{VIJFH{S, Nv, Nij, Nh, A}} ) where {S, Nv, Nij, Nh, A} =
859
- A
860
-
861
842
function VIJFH {S, Nv, Nij, Nh} (
862
843
array:: AbstractArray{T, 5} ,
863
844
) where {S, Nv, Nij, Nh, T}
@@ -972,8 +953,6 @@ struct VIFH{S, Nv, Ni, Nh, A} <: Data1DX{S, Nv, Ni}
972
953
array:: A
973
954
end
974
955
975
- parent_array_type (:: Type{VIFH{S, Nv, Ni, Nh, A}} ) where {S, Nv, Ni, Nh, A} = A
976
-
977
956
function VIFH {S, Nv, Ni, Nh} (
978
957
array:: AbstractArray{T, 4} ,
979
958
) where {S, Nv, Ni, Nh, T}
@@ -1083,8 +1062,6 @@ struct IH1JH2{S, Nij, A} <: Data2D{S, Nij}
1083
1062
array:: A
1084
1063
end
1085
1064
1086
- parent_array_type (:: Type{IH1JH2{S, Nij, A}} ) where {S, Nij, A} = A
1087
-
1088
1065
function IH1JH2 {S, Nij} (array:: AbstractMatrix{S} ) where {S, Nij}
1089
1066
@assert size (array, 1 ) % Nij == 0
1090
1067
@assert size (array, 2 ) % Nij == 0
@@ -1126,8 +1103,6 @@ struct IV1JH2{S, n1, Ni, A} <: Data1DX{S, n1, Ni}
1126
1103
array:: A
1127
1104
end
1128
1105
1129
- parent_array_type (:: Type{IV1JH2{S, n1, Ni, A}} ) where {S, n1, Ni, A} = A
1130
-
1131
1106
function IV1JH2 {S, n1, Ni} (array:: AbstractMatrix{S} ) where {S, n1, Ni}
1132
1107
@assert size (array, 2 ) % Ni == 0
1133
1108
IV1JH2 {S, n1, Ni, typeof(array)} (array)
@@ -1323,6 +1298,33 @@ type parameters.
1323
1298
@inline slab_index (i, j) = CartesianIndex (i, j, 1 , 1 , 1 )
1324
1299
@inline slab_index (i) = CartesianIndex (i, 1 , 1 , 1 , 1 )
1325
1300
@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
+
1326
1328
# ! format: on
1327
1329
1328
1330
Base. ndims (data:: AbstractData ) = Base. ndims (typeof (data))
@@ -1355,29 +1357,10 @@ Reshapes `array` (of scalars) to fit into the given `DataLayout`.
1355
1357
The dimensions of `array` are assumed to be
1356
1358
- `([number of vertical nodes], number of horizontal nodes)`.
1357
1359
"""
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
+ )
1381
1364
1382
1365
"""
1383
1366
device_dispatch(data::AbstractData)
0 commit comments