@@ -46,19 +46,34 @@ float_type(::Type{FieldArray{FD, N, T}}) where {FD, N, T} = eltype(T)
46
46
parent_array_type (:: Type{FieldArray{FD, N, T}} ) where {FD, N, T} =
47
47
parent_array_type (T)
48
48
# field_array_type(::Type{FieldArray{N,T}}, ::Val{Nf}) where {N,T, Nf} = FieldArray{Nf, parent_array_type(T, Val(ndims(T)))}
49
- field_array_type (
49
+ # field_array_type(
50
+ # ::Type{FieldArray{FD, N, T}},
51
+ # ::Val{Nf},
52
+ # ::Val{ND},
53
+ # ) where {FD, N, T, Nf, ND} = FieldArray{FD, Nf, parent_array_type(T, Val(ND))}
54
+
55
+ rebuild_type (
56
+ :: Type{FieldArray{FD, N, T}} ,
57
+ as:: ArraySize{FD,Nf} ,
58
+ ) where {FD, N, T, Nf} = FieldArray{FD, Nf, parent_array_type (T, Val (ndims (as)))}
59
+
60
+ rebuild_field_array_type (
50
61
:: Type{FieldArray{FD, N, T}} ,
51
- :: Val{Nf} ,
52
- :: Val{ND} ,
53
- ) where {FD, N, T, Nf, ND} = FieldArray{FD, Nf, parent_array_type (T, Val (ND))}
54
- # field_array_type(::Type{T}, ::Val{Nf}) where {T <: AbstractArray, Nf} = FieldArray{Nf, parent_array_type(T, Val(ndims(T)))}
55
- field_array_type (
62
+ as:: ArraySize{FD,Nf} ,
63
+ ) where {FD, N, T, Nf} = FieldArray{FD, Nf, parent_array_type (T, Val (ndims (as)))}
64
+
65
+ rebuild_field_array_type (
56
66
:: Type{T} ,
57
- :: Val{FD} ,
58
- :: Val{Nf} ,
59
- :: Val{ND} ,
60
- ) where {T <: AbstractArray , FD, Nf, ND} =
61
- FieldArray{FD, Nf, parent_array_type (T, Val (ND))}
67
+ as:: ArraySize{FD,Nf,S} ,
68
+ ) where {FD, T<: AbstractArray , Nf, S} = FieldArray{FD, Nf, parent_array_type (T, as)}
69
+
70
+ # field_array_type(
71
+ # ::Type{T},
72
+ # ::Val{FD},
73
+ # ::Val{Nf},
74
+ # ::Val{ND},
75
+ # ) where {T <: AbstractArray, FD, Nf, ND} =
76
+ # FieldArray{FD, Nf, parent_array_type(T, Val(ND))}
62
77
Base. ndims (:: Type{FieldArray{FD, N, T}} ) where {FD, N, T} = Base. ndims (T) + 1
63
78
Base. eltype (:: Type{FieldArray{FD, N, T}} ) where {FD, N, T} = eltype (T)
64
79
array_type (:: Type{FieldArray{FD, N, T}} ) where {FD, N, T} = T
101
116
end
102
117
end
103
118
104
- Base. similar (fa:: FieldArray{FD, N, T} ) where {FD, N, T} =
105
- FieldArray {FD, N, T} (ntuple (i -> similar (T, ndims (T)), N))
119
+ Base. similar (fa:: FieldArray{FD, N, T} , dims) where {FD, N, T} =
120
+ FieldArray {FD, N, T} (ntuple (i -> similar (T, dims), N))
121
+ function Base. similar (:: Type{FieldArray{FD, N, T}} , dims) where {FD, N, T}
122
+ FieldArray {FD, N, T} (ntuple (i -> similar (T, dims), N))
123
+ end
124
+
125
+ function Base. similar (:: Type{FieldArray{FD, N, T}} ) where {FD, N, T}
126
+ isconcretetype (T) || error (" Array type $T is not concrete, pass `dims` to similar or use concrete array type." )
127
+ FieldArray {FD, N, T} (ntuple (i -> similar (T), N))
128
+ end
106
129
107
130
@inline insertafter (t:: Tuple , i:: Int , j:: Int ) =
108
131
0 <= i <= length (t) ? _insertafter (t, i, j) : throw (BoundsError (t, i))
@@ -124,13 +147,12 @@ function Base.collect(fa::FieldArray{FD, N, T}) where {FD, N, T}
124
147
return a
125
148
end
126
149
127
- function Base. similar (:: Type{<:FieldArray{FD, N, T}} , s) where {FD, N, T}
128
- FieldArray {FD, N} (ntuple (i -> similar (T, s), N))
129
- end
130
-
131
150
field_array (array:: AbstractArray , s:: AbstractDataLayoutSingleton ) =
132
151
field_array (array, field_dim (s))
133
152
153
+ field_arrays (fa:: FieldArray ) = getfield (fa, :arrays )
154
+ field_arrays (data:: AbstractData ) = field_arrays (parent (data))
155
+
134
156
FieldArray {FD, N} (
135
157
fa:: FA ,
136
158
) where {FD, N, T <: AbstractArray , FA <: NTuple{N, T} } =
@@ -164,7 +186,13 @@ function field_array(array::AbstractArray, fdim::Integer)
164
186
return FieldArray {fdim, Nf, eltype(arrays)} (arrays)
165
187
end
166
188
167
- function Base. getindex (fa:: FieldArray{FD} , I:: CartesianIndex ) where {FD}
189
+ function Base.:(== )(fa:: FieldArray , array:: AbstractArray )
190
+ return collect (fa) == array
191
+ end
192
+
193
+ Base. getindex (fa:: FieldArray , I:: Integer... ) = getindex (fa, CartesianIndex (I))
194
+
195
+ function Base. getindex (fa:: FieldArray{FD} , I:: CartesianIndex{5} ) where {FD}
168
196
FDI = I. I[FD]
169
197
ND = length (I. I)
170
198
Ipre = ntuple (i -> I. I[i], Val (FD - 1 ))
@@ -173,7 +201,7 @@ function Base.getindex(fa::FieldArray{FD}, I::CartesianIndex) where {FD}
173
201
return fa. arrays[FDI][IA]
174
202
end
175
203
176
- function Base. setindex! (fa:: FieldArray{FD} , val, I:: CartesianIndex ) where {FD}
204
+ function Base. setindex! (fa:: FieldArray{FD} , val, I:: CartesianIndex{5} ) where {FD}
177
205
FDI = I. I[FD]
178
206
ND = length (I. I)
179
207
Ipre = ntuple (i -> I. I[i], Val (FD - 1 ))
0 commit comments