11# Fallback mul! implementation for a single DerivativeOperator operating on an AbstractArray
2- function LinearAlgebra. mul! (x_temp:: AbstractArray{T} , A:: DerivativeOperator{T,N} , M:: AbstractArray{T} ) where {T,N}
2+ function LinearAlgebra. mul! (x_temp:: AbstractArray{T} , A:: DerivativeOperator{T,N} , M:: AbstractArray{T} ; overwrite = true ) where {T,N}
33
44 # Check that x_temp has correct dimensions
55 v = zeros (ndims (x_temp))
@@ -22,37 +22,7 @@ function LinearAlgebra.mul!(x_temp::AbstractArray{T}, A::DerivativeOperator{T,N}
2222 setindex! (idx, :, N)
2323 for I in indices
2424 Base. replace_tuples! (nidx, idx, idx, otherdims, I)
25- mul! (view (x_temp, idx... ), A, view (M, idx... ))
26- end
27- end
28-
29- # Additive mul! fallback that is necessary for handling compositions
30- function mul_add! (x_temp:: AbstractArray{T} , A:: DerivativeOperator{T,N} , M:: AbstractArray{T} ) where {T,N}
31-
32- # Check that x_temp has correct dimensions
33- v = zeros (ndims (x_temp))
34- v[N] = 2
35- @assert [size (x_temp)... ]+ v == [size (M)... ]
36-
37- # Check that axis of differentiation is in the dimensions of M and x_temp
38- ndimsM = ndims (M)
39- @assert N <= ndimsM
40-
41- dimsM = [axes (M)... ]
42- alldims = [1 : ndims (M);]
43- otherdims = setdiff (alldims, N)
44-
45- idx = Any[first (ind) for ind in axes (M)]
46- itershape = tuple (dimsM[otherdims]. .. )
47- nidx = length (otherdims)
48- indices = Iterators. drop (CartesianIndices (itershape), 0 )
49-
50- setindex! (idx, :, N)
51- for I in indices
52- Base. replace_tuples! (nidx, idx, idx, otherdims, I)
53- convolve_interior_add! (view (x_temp, idx... ), view (M, idx... ), A)
54- convolve_BC_right_add! (view (x_temp, idx... ), view (M, idx... ), A)
55- convolve_BC_left_add! (view (x_temp, idx... ), view (M, idx... ), A)
25+ mul! (view (x_temp, idx... ), A, view (M, idx... ), overwrite = overwrite)
5626 end
5727end
5828
@@ -252,10 +222,10 @@ function LinearAlgebra.mul!(x_temp::AbstractArray{T,2}, A::AbstractDiffEqComposi
252222
253223 for Lidx in ops_1
254224 if Lidx != ops_1_max_bpc_idx[1 ]
255- convolve_BC_left_add ! (view (x_temp,:,i), view (M,:,i+ offset_x), opsA[Lidx])
256- convolve_BC_right_add ! (view (x_temp,:,i), view (M,:,i+ offset_x), opsA[Lidx])
225+ convolve_BC_left ! (view (x_temp,:,i), view (M,:,i+ offset_x), opsA[Lidx], overwrite = false )
226+ convolve_BC_right ! (view (x_temp,:,i), view (M,:,i+ offset_x), opsA[Lidx], overwrite = false )
257227 if i <= pad[2 ] || i > size (x_temp)[2 ]- pad[2 ]
258- convolve_interior_add ! (view (x_temp,:,i), view (M,:,i+ offset_x), opsA[Lidx])
228+ convolve_interior ! (view (x_temp,:,i), view (M,:,i+ offset_x), opsA[Lidx], overwrite = false )
259229 elseif pad[1 ] - opsA[Lidx]. boundary_point_count > 0
260230 convolve_interior_add_range! (view (x_temp,:,i), view (M,:,i+ offset_x), opsA[Lidx], pad[1 ] - opsA[Lidx]. boundary_point_count)
261231 end
@@ -275,19 +245,19 @@ function LinearAlgebra.mul!(x_temp::AbstractArray{T,2}, A::AbstractDiffEqComposi
275245 end
276246
277247 else
278- convolve_BC_left_add ! (view (x_temp,i,:), view (M,i+ offset_y,:), opsA[ops_2_max_bpc_idx... ])
279- convolve_BC_right_add ! (view (x_temp,i,:), view (M,i+ offset_y,:), opsA[ops_2_max_bpc_idx... ])
248+ convolve_BC_left ! (view (x_temp,i,:), view (M,i+ offset_y,:), opsA[ops_2_max_bpc_idx... ], overwrite = false )
249+ convolve_BC_right ! (view (x_temp,i,:), view (M,i+ offset_y,:), opsA[ops_2_max_bpc_idx... ], overwrite = false )
280250 if i <= pad[1 ] || i > size (x_temp)[1 ]- pad[1 ]
281- convolve_interior_add ! (view (x_temp,i,:), view (M,i+ offset_y,:), opsA[ops_2_max_bpc_idx... ])
251+ convolve_interior ! (view (x_temp,i,:), view (M,i+ offset_y,:), opsA[ops_2_max_bpc_idx... ], overwrite = false )
282252 end
283253
284254 end
285255 for Lidx in ops_2
286256 if Lidx != ops_2_max_bpc_idx[1 ]
287- convolve_BC_left_add ! (view (x_temp,i,:), view (M,i+ offset_y,:), opsA[Lidx])
288- convolve_BC_right_add ! (view (x_temp,i,:), view (M,i+ offset_y,:), opsA[Lidx])
257+ convolve_BC_left ! (view (x_temp,i,:), view (M,i+ offset_y,:), opsA[Lidx], overwrite = false )
258+ convolve_BC_right ! (view (x_temp,i,:), view (M,i+ offset_y,:), opsA[Lidx], overwrite = false )
289259 if i <= pad[1 ] || i > size (x_temp)[1 ]- pad[1 ]
290- convolve_interior_add ! (view (x_temp,i,:), view (M,i+ offset_y,:), opsA[Lidx])
260+ convolve_interior ! (view (x_temp,i,:), view (M,i+ offset_y,:), opsA[Lidx], overwrite = false )
291261 elseif pad[2 ] - opsA[Lidx]. boundary_point_count > 0
292262 convolve_interior_add_range! (view (x_temp,i,:), view (M,i+ offset_y,:), opsA[Lidx], pad[2 ] - opsA[Lidx]. boundary_point_count)
293263 end
@@ -316,15 +286,15 @@ function LinearAlgebra.mul!(x_temp::AbstractArray{T,2}, A::AbstractDiffEqComposi
316286 N = diff_axis (L)
317287 if N == 1
318288 if operating_dims[2 ] == 1
319- mul_add ! (x_temp,L,view (M,1 : x_temp_1+ 2 ,1 : x_temp_2))
289+ mul ! (x_temp,L,view (M,1 : x_temp_1+ 2 ,1 : x_temp_2), overwrite = false )
320290 else
321- mul_add ! (x_temp,L,M)
291+ mul ! (x_temp,L,M, overwrite = false )
322292 end
323293 else
324294 if operating_dims[1 ] == 1
325- mul_add ! (x_temp,L,view (M,1 : x_temp_1,1 : x_temp_2+ 2 ))
295+ mul ! (x_temp,L,view (M,1 : x_temp_1,1 : x_temp_2+ 2 ), overwrite = false )
326296 else
327- mul_add ! (x_temp,L,M)
297+ mul ! (x_temp,L,M, overwrite = false )
328298 end
329299 end
330300 end
@@ -363,15 +333,15 @@ function LinearAlgebra.mul!(x_temp::AbstractArray{T,2}, A::AbstractDiffEqComposi
363333 N = diff_axis (L)
364334 if N == 1
365335 if operating_dims[2 ] == 1
366- mul_add ! (x_temp,L,view (M,1 : x_temp_1+ 2 ,1 : x_temp_2))
336+ mul ! (x_temp,L,view (M,1 : x_temp_1+ 2 ,1 : x_temp_2), overwrite = false )
367337 else
368- mul_add ! (x_temp,L,M)
338+ mul ! (x_temp,L,M, overwrite = false )
369339 end
370340 else
371341 if operating_dims[1 ] == 1
372- mul_add ! (x_temp,L,view (M,1 : x_temp_1,1 : x_temp_2+ 2 ))
342+ mul ! (x_temp,L,view (M,1 : x_temp_1,1 : x_temp_2+ 2 ), overwrite = false )
373343 else
374- mul_add ! (x_temp,L,M)
344+ mul ! (x_temp,L,M, overwrite = false )
375345 end
376346 end
377347 end
0 commit comments