@@ -175,15 +175,6 @@ function Base.similar(
175
175
error (" Cannot construct FieldVector" )
176
176
end
177
177
178
- @inline function Base. copyto! (dest:: FV , src:: FV ) where {FV <: FieldVector }
179
- for symb in propertynames (dest)
180
- pd = parent (getproperty (dest, symb))
181
- ps = parent (getproperty (src, symb))
182
- copyto! (pd, ps)
183
- end
184
- return dest
185
- end
186
-
187
178
"""
188
179
Spaces.create_dss_buffer(fv::FieldVector)
189
180
@@ -218,32 +209,6 @@ function Spaces.weighted_dss!(
218
209
Spaces. weighted_dss! (pairs... )
219
210
end
220
211
221
-
222
- # Recursively call transform_bc_args() on broadcast arguments in a way that is statically reducible by the optimizer
223
- # see Base.Broadcast.preprocess_args
224
- @inline transform_bc_args (args:: Tuple , inds... ) = (
225
- transform_broadcasted (args[1 ], inds... ),
226
- transform_bc_args (Base. tail (args), inds... )... ,
227
- )
228
- @inline transform_bc_args (args:: Tuple{Any} , inds... ) =
229
- (transform_broadcasted (args[1 ], inds... ),)
230
- @inline transform_bc_args (args:: Tuple{} , inds... ) = ()
231
-
232
- @inline function transform_broadcasted (
233
- bc:: Base.Broadcast.Broadcasted{FieldVectorStyle} ,
234
- symb,
235
- axes,
236
- )
237
- Base. Broadcast. Broadcasted (
238
- bc. f,
239
- transform_bc_args (bc. args, symb, axes),
240
- axes,
241
- )
242
- end
243
- @inline transform_broadcasted (fv:: FieldVector , symb, axes) =
244
- parent (getfield (_values (fv), symb))
245
- @inline transform_broadcasted (x, symb, axes) = x
246
-
247
212
@inline function first_fieldvector_in_bc (args:: Tuple , rargs... )
248
213
x1 = first_fieldvector_in_bc (args[1 ], rargs... )
249
214
x1 isa FieldVector && return x1
@@ -330,26 +295,83 @@ function Base.Broadcast.instantiate(
330
295
return Base. Broadcast. Broadcasted {FieldVectorStyle} (bc. f, bc. args, axes)
331
296
end
332
297
333
- @inline function Base. copyto! (
334
- dest:: FieldVector ,
298
+ # Recursively call transform_bc_args() on broadcast arguments in a way that is statically reducible by the optimizer
299
+ # see Base.Broadcast.preprocess_args
300
+ @inline transform_bc_args (args:: Tuple , inds... ) = (
301
+ transform_broadcasted (args[1 ], inds... ),
302
+ transform_bc_args (Base. tail (args), inds... )... ,
303
+ )
304
+ @inline transform_bc_args (args:: Tuple{Any} , inds... ) =
305
+ (transform_broadcasted (args[1 ], inds... ),)
306
+ @inline transform_bc_args (args:: Tuple{} , inds... ) = ()
307
+
308
+ @inline function transform_broadcasted (
335
309
bc:: Base.Broadcast.Broadcasted{FieldVectorStyle} ,
310
+ symb,
311
+ axes,
312
+ )
313
+ Base. Broadcast. Broadcasted (
314
+ bc. f,
315
+ transform_bc_args (bc. args, symb, axes),
316
+ axes,
317
+ )
318
+ end
319
+ @inline transform_broadcasted (fv:: FieldVector , symb, axes) =
320
+ parent (getfield (_values (fv), symb))
321
+ @inline transform_broadcasted (x, symb, axes) = x
322
+
323
+ @inline Base. copyto! (
324
+ dest:: FieldVector ,
325
+ bc:: Union{FieldVector, Base.Broadcast.Broadcasted{FieldVectorStyle}} ,
326
+ ) = copyto_per_field! (dest, bc)
327
+
328
+ @inline function copyto_per_field! (
329
+ dest:: FieldVector ,
330
+ bc:: Union{FieldVector, Base.Broadcast.Broadcasted{FieldVectorStyle}} ,
336
331
)
337
332
map (propertynames (dest)) do symb
338
333
Base. @_inline_meta
339
- p = parent (getfield (_values (dest), symb))
340
- copyto! (p, transform_broadcasted (bc, symb, axes (p)))
334
+ array = parent (getfield (_values (dest), symb))
335
+ bct = transform_broadcasted (bc, symb, axes (array))
336
+ if array isa FieldVector # recurse
337
+ copyto_per_field! (array, bct)
338
+ else
339
+ copyto_per_field! (
340
+ array,
341
+ Base. Broadcast. instantiate (bct),
342
+ DataLayouts. device_dispatch (array),
343
+ )
344
+ end
341
345
end
342
346
return dest
343
347
end
344
348
345
- @inline function Base. copyto! (
349
+ @inline Base. copyto! (
350
+ dest:: FieldVector ,
351
+ bc:: Base.Broadcast.Broadcasted{<:Base.Broadcast.Style{Tuple}} ,
352
+ ) = copyto_per_field_scalar! (dest, bc)
353
+
354
+ @inline Base. copyto! (
346
355
dest:: FieldVector ,
347
356
bc:: Base.Broadcast.Broadcasted{<:Base.Broadcast.AbstractArrayStyle{0}} ,
348
- )
357
+ ) = copyto_per_field_scalar! (dest, bc)
358
+
359
+ @inline Base. copyto! (dest:: FieldVector , bc:: Real ) =
360
+ copyto_per_field_scalar! (dest, bc)
361
+
362
+ @inline function copyto_per_field_scalar! (dest:: FieldVector , bc)
349
363
map (propertynames (dest)) do symb
350
364
Base. @_inline_meta
351
- p = parent (getfield (_values (dest), symb))
352
- copyto! (p, bc)
365
+ array = parent ((getfield (_values (dest), symb)))
366
+ if array isa FieldVector # recurse
367
+ copyto_per_field_scalar! (array, bc)
368
+ else
369
+ copyto_per_field_scalar! (
370
+ array,
371
+ Base. Broadcast. instantiate (bc),
372
+ DataLayouts. device_dispatch (array),
373
+ )
374
+ end
353
375
nothing
354
376
end
355
377
return dest
0 commit comments