@@ -90,13 +90,13 @@ function convolve_interior!(x_temp::AbstractVector{T}, x::AbstractVector{T}, A::
9090 stencil = A. stencil_coefs
9191 coeff = A. coefficients
9292
93- for i in (1 + A. boundary_point_count) : (length (x_temp)- A. boundary_point_count)
93+ for i in (1 + A. boundary_point_count) : (length (x_temp)- A. boundary_point_count - A . offside )
9494 xtempi = zero (T)
9595 cur_stencil = eltype (stencil) <: AbstractVector ? stencil[i- A. boundary_point_count] : stencil
9696 cur_coeff = typeof (coeff) <: AbstractVector ? coeff[i] : coeff isa Number ? coeff : true
9797 cur_stencil = cur_coeff >= 0 ? cur_stencil : A. derivative_order % 2 == 0 ? reverse (cur_stencil) : - 1 * reverse (cur_stencil)
9898 for idx in 1 : A. stencil_length
99- x_idx = cur_coeff < 0 ? x[i - A. stencil_length + 1 + idx] : x[i + idx]
99+ x_idx = cur_coeff < 0 ? x[i - A. stencil_length + 1 + idx + A . offside ] : x[i + idx - A . offside ]
100100 xtempi += cur_coeff * cur_stencil[idx] * x_idx
101101 end
102102 x_temp[i] = xtempi + ! overwrite* x_temp[i]
@@ -110,10 +110,10 @@ function convolve_BC_left!(x_temp::AbstractVector{T}, x::AbstractVector{T}, A::D
110110 for i in 1 : A. boundary_point_count
111111 cur_coeff = coeff[i]
112112 xtempi = 0.0
113- if cur_coeff >= 0 && i+ A. stencil_length <= length (x)
113+ if cur_coeff >= 0 && i+ A. stencil_length <= length (x) && i >= A . offside
114114 cur_stencil = eltype (upwind_stencils) <: AbstractVector ? upwind_stencils[i] : upwind_stencils
115115 for idx in 1 : A. stencil_length
116- xtempi += cur_coeff* cur_stencil[idx]* x[i+ idx]
116+ xtempi += cur_coeff* cur_stencil[idx]* x[i+ idx- A . offside ]
117117 end
118118 else
119119 cur_stencil = downwind_stencils[i]
@@ -131,22 +131,29 @@ function convolve_BC_right!(x_temp::AbstractVector{T}, x::AbstractVector{T}, A::
131131 downwind_stencils = A. stencil_coefs
132132 x_temp_len = length (x_temp)
133133 x_len = length (x)
134- for i in 1 : A. boundary_point_count
135- cur_coeff = coeff[x_temp_len- A. boundary_point_count+ i]
134+ for i in 1 : A. boundary_point_count + A . offside
135+ cur_coeff = coeff[x_temp_len- A. boundary_point_count+ i - A . offside ]
136136 xtempi = 0.0
137- if cur_coeff < 0 && x_len- A. stencil_length - A. boundary_point_count + i >= 1
137+ if cur_coeff < 0 && x_len- A. stencil_length - A. boundary_point_count + i >= 1 && i <= A . boundary_point_count + 1
138138 cur_stencil = eltype (downwind_stencils) <: AbstractVector ? downwind_stencils[i] : downwind_stencils
139139 cur_stencil = ((- 1 )^ A. derivative_order)* reverse (cur_stencil)
140140 for idx in 1 : A. stencil_length
141141 xtempi += cur_coeff* cur_stencil[idx]* x[x_len- A. stencil_length + idx - A. boundary_point_count + i - 1 ]
142142 end
143+ elseif cur_coeff < 0 && _x_len- A. stencil_length - A. boundary_point_count + i >= 1 && i > A. boundary_point_count + 1
144+ cur_stencil = upwind_stencils[A. boundary_point_count + A. offside + 1 - i]
145+ cur_stencil = ((- 1 )^ A. derivative_order)* reverse (cur_stencil)
146+ for idx in 1 : A. boundary_stencil_length
147+ x_idx = _x_len- A. boundary_stencil_length+ idx == _x_len ? _x. r : x[_x_len- A. boundary_stencil_length+ idx- 1 ]
148+ xtempi += cur_coeff* cur_stencil[idx]* x_idx
149+ end
143150 else
144151 cur_stencil = upwind_stencils[i]
145152 for idx in 1 : A. boundary_stencil_length
146153 xtempi += cur_coeff* cur_stencil[idx]* x[x_len- A. boundary_stencil_length+ idx]
147154 end
148155 end
149- x_temp[x_temp_len- A. boundary_point_count+ i] = xtempi + ! overwrite* x_temp[x_temp_len- A. boundary_point_count+ i]
156+ x_temp[x_temp_len- A. boundary_point_count+ i - A . offside ] = xtempi + ! overwrite* x_temp[x_temp_len- A. boundary_point_count+ i - A . offside ]
150157 end
151158end
152159
@@ -162,20 +169,20 @@ function convolve_interior!(x_temp::AbstractVector{T}, x::AbstractVector{T}, A::
162169 stl = A. stencil_length
163170 coeff = A. coefficients
164171
165- for i in bpc+ 1 : len- bpc
172+ for i in bpc+ 1 : len- bpc- A . offside
166173 cur_coeff = coeff[i]
167174 if cur_coeff >= 0
168175 xtempi = zero (T)
169176 cur_stencil = A. stencil_coefs[1 ,i- bpc]
170177 for idx in 1 : stl
171- xtempi += cur_coeff * cur_stencil[idx]* x[i+ idx]
178+ xtempi += cur_coeff * cur_stencil[idx]* x[i+ idx- A . offside ]
172179 end
173180 x_temp[i] = xtempi + ! overwrite* x_temp[i]
174181 else
175182 xtempi = zero (T)
176183 cur_stencil = A. stencil_coefs[2 ,i- bpc]
177184 for idx in 1 : stl
178- xtempi += cur_coeff * cur_stencil[idx]* x[i- stl+ 1 + idx]
185+ xtempi += cur_coeff * cur_stencil[idx]* x[i- stl+ 1 + idx + A . offside ]
179186 end
180187 x_temp[i] = xtempi + ! overwrite* x_temp[i]
181188 end
@@ -191,13 +198,27 @@ function convolve_BC_left!(x_temp::AbstractVector{T}, x::AbstractVector{T}, A::D
191198
192199 for i in 1 : bpc
193200 cur_coeff = coeff[i]
194- if cur_coeff >= 0
201+ if cur_coeff >= 0 && A . offside == 0
195202 xtempi = zero (T)
196203 cur_stencil = A. low_boundary_coefs[1 ,i]
197204 for idx in 1 : stl
198205 xtempi += cur_coeff * cur_stencil[idx]* x[i+ idx]
199206 end
200207 x_temp[i] = xtempi + ! overwrite* x_temp[i]
208+ elseif cur_coeff >= 0 && i < A. offside
209+ xtempi = zero (T)
210+ cur_stencil = A. low_boundary_coefs[1 ,i]
211+ for idx in 1 : stl
212+ xtempi += cur_coeff * cur_stencil[idx]* x[idx]
213+ end
214+ x_temp[i] = xtempi + ! overwrite* x_temp[i]
215+ elseif cur_coeff >= 0 && i >= A. offside
216+ xtempi = zero (T)
217+ cur_stencil = A. low_boundary_coefs[1 ,i]
218+ for idx in 1 : stl
219+ xtempi += cur_coeff * cur_stencil[idx]* x[i+ idx- A. offside]
220+ end
221+ x_temp[i] = xtempi + ! overwrite* x_temp[i]
201222 else
202223 xtempi = zero (T)
203224 cur_stencil = A. low_boundary_coefs[2 ,i]
@@ -216,19 +237,27 @@ function convolve_BC_right!(x_temp::AbstractVector{T}, x::AbstractVector{T}, A::
216237 stl = A. stencil_length
217238 bstl = A. boundary_stencil_length
218239 coeff = A. coefficients
240+ off = A. offside
219241
220- for i in len- bpc+ 1 : len
242+ for i in len- bpc+ 1 - off : len
221243 cur_coeff = coeff[i]
222244 if cur_coeff < 0
223245 xtempi = zero (T)
224- cur_stencil = A. high_boundary_coefs[2 ,i- len+ bpc]
225- for idx in 1 : stl
226- xtempi += cur_coeff* cur_stencil[idx]* x[i- stl+ 1 + idx]
246+ cur_stencil = A. high_boundary_coefs[2 ,i- len+ bpc+ off]
247+ if i <= len - off
248+ for idx in 1 : stl
249+ xtempi += cur_coeff* cur_stencil[idx]* x[i- stl+ 1 + idx+ off]
250+ end
251+ x_temp[i] = xtempi + ! overwrite* x_temp[i]
252+ else
253+ for idx in 1 : stl
254+ xtempi += cur_coeff* cur_stencil[idx]* x[len- stl+ 2 + idx]
255+ end
256+ x_temp[i] = xtempi + ! overwrite* x_temp[i]
227257 end
228- x_temp[i] = xtempi + ! overwrite* x_temp[i]
229258 else
230259 xtempi = zero (T)
231- cur_stencil = A. high_boundary_coefs[1 ,i- len+ bpc]
260+ cur_stencil = A. high_boundary_coefs[1 ,i- len+ bpc+ off ]
232261 for idx in 1 : bstl
233262 xtempi += cur_coeff* cur_stencil[idx]* x[len- bstl+ 2 + idx]
234263 end
@@ -328,13 +357,13 @@ function convolve_interior!(x_temp::AbstractVector{T}, _x::BoundaryPaddedVector,
328357 x = _x. u
329358 _x_len = length (_x)
330359
331- for i in (1 + A. boundary_point_count) : (length (x_temp)- A. boundary_point_count)
360+ for i in (1 + A. boundary_point_count) : (length (x_temp)- A. boundary_point_count - A . offside )
332361 xtempi = zero (T)
333362 cur_stencil = eltype (stencil) <: AbstractVector ? stencil[i- A. boundary_point_count] : stencil
334363 cur_coeff = typeof (coeff) <: AbstractVector ? coeff[i] : coeff isa Number ? coeff : true
335364 cur_stencil = cur_coeff >= 0 ? cur_stencil : A. derivative_order % 2 == 0 ? reverse (cur_stencil) : - 1 * reverse (cur_stencil)
336365 for idx in 1 : A. stencil_length
337- index = cur_coeff < 0 ? i - A. stencil_length + 1 + idx : i + idx
366+ index = cur_coeff < 0 ? i - A. stencil_length + 1 + idx + A . offside : i + idx - A . offside
338367 if index == _x_len
339368 x_idx = _x. r
340369 elseif index == 1
@@ -357,10 +386,10 @@ function convolve_BC_left!(x_temp::AbstractVector{T}, _x::BoundaryPaddedVector,
357386 for i in 1 : A. boundary_point_count
358387 cur_coeff = coeff[i]
359388 xtempi = 0.0
360- if cur_coeff >= 0 && i+ A. stencil_length <= length (_x)
389+ if cur_coeff >= 0 && i+ A. stencil_length <= length (_x) && i >= A . offside
361390 cur_stencil = eltype (upwind_stencils) <: AbstractVector ? upwind_stencils[i] : upwind_stencils
362391 for idx in 1 : A. stencil_length
363- x_idx = x[i+ idx- 1 ]
392+ x_idx = i + idx - A . offside == 1 ? _x . l : x[i+ idx- 1 - A . offside ]
364393 xtempi += cur_coeff* cur_stencil[idx]* x_idx
365394 end
366395 else
@@ -382,24 +411,31 @@ function convolve_BC_right!(x_temp::AbstractVector{T}, _x::BoundaryPaddedVector,
382411 x = _x. u
383412 _x_len = length (_x)
384413
385- for i in 1 : A. boundary_point_count
386- cur_coeff = coeff[x_temp_len- A. boundary_point_count+ i]
414+ for i in 1 : A. boundary_point_count + A . offside
415+ cur_coeff = coeff[x_temp_len- A. boundary_point_count+ i - A . offside ]
387416 xtempi = 0.0
388- if cur_coeff < 0 && _x_len- A. stencil_length - A. boundary_point_count + i >= 1
417+ if cur_coeff < 0 && _x_len- A. stencil_length - A. boundary_point_count + i >= 1 && i <= A . boundary_point_count + 1
389418 cur_stencil = eltype (downwind_stencils) <: AbstractVector ? downwind_stencils[i] : downwind_stencils
390419 cur_stencil = ((- 1 )^ A. derivative_order)* reverse (cur_stencil)
391420 for idx in 1 : A. stencil_length
392421 x_idx = _x_len- A. stencil_length + idx - A. boundary_point_count + i - 1 == _x_len ? _x. r : x[_x_len- A. stencil_length + idx - A. boundary_point_count + i - 2 ]
393422 xtempi += cur_coeff* cur_stencil[idx]* x_idx
394423 end
424+ elseif cur_coeff < 0 && _x_len- A. stencil_length - A. boundary_point_count + i >= 1 && i > A. boundary_point_count + 1
425+ cur_stencil = upwind_stencils[A. boundary_point_count + A. offside + 1 - i]
426+ cur_stencil = ((- 1 )^ A. derivative_order)* reverse (cur_stencil)
427+ for idx in 1 : A. boundary_stencil_length
428+ x_idx = _x_len- A. boundary_stencil_length+ idx == _x_len ? _x. r : x[_x_len- A. boundary_stencil_length+ idx- 1 ]
429+ xtempi += cur_coeff* cur_stencil[idx]* x_idx
430+ end
395431 else
396432 cur_stencil = upwind_stencils[i]
397433 for idx in 1 : A. boundary_stencil_length
398434 x_idx = _x_len- A. boundary_stencil_length+ idx == _x_len ? _x. r : x[_x_len- A. boundary_stencil_length+ idx- 1 ]
399435 xtempi += cur_coeff* cur_stencil[idx]* x_idx
400436 end
401437 end
402- x_temp[x_temp_len- A. boundary_point_count+ i] = xtempi + ! overwrite* x_temp[x_temp_len- A. boundary_point_count+ i]
438+ x_temp[x_temp_len- A. boundary_point_count+ i - A . offside ] = xtempi + ! overwrite* x_temp[x_temp_len- A. boundary_point_count+ i- A . offside ]
403439 end
404440end
405441
@@ -418,21 +454,21 @@ function convolve_interior!(x_temp::AbstractVector{T}, _x::BoundaryPaddedVector,
418454 _x_len = length (_x)
419455
420456
421- for i in bpc+ 1 : len- bpc
457+ for i in bpc+ 1 : len- bpc - A . offside
422458 cur_coeff = coeff[i]
423459 if cur_coeff >= 0
424460 xtempi = zero (T)
425461 cur_stencil = A. stencil_coefs[1 ,i- bpc]
426462 for idx in 1 : stl
427- x_idx = i+ idx < _x_len ? x[i+ idx- 1 ] : _x . r
463+ x_idx = i+ idx - A . offside == _x_len ? _x . r : i + idx - A . offside == 1 ? _x . l : x[i+ idx- 1 - A . offside]
428464 xtempi += cur_coeff * cur_stencil[idx]* x_idx
429465 end
430466 x_temp[i] = xtempi + ! overwrite* x_temp[i]
431467 else
432468 xtempi = zero (T)
433469 cur_stencil = A. stencil_coefs[2 ,i- bpc]
434470 for idx in 1 : stl
435- x_idx = i- stl+ 1 + idx > 1 ? x[i- stl+ idx] : _x. l
471+ x_idx = i- stl+ 1 + idx + A . offside > 1 ? x[i- stl+ idx + A . offside ] : _x. l
436472 xtempi += cur_coeff * cur_stencil[idx]* x_idx
437473 end
438474 x_temp[i] = xtempi + ! overwrite* x_temp[i]
@@ -451,14 +487,30 @@ function convolve_BC_left!(x_temp::AbstractVector{T}, _x::BoundaryPaddedVector,
451487
452488 for i in 1 : bpc
453489 cur_coeff = coeff[i]
454- if cur_coeff >= 0
490+ if cur_coeff >= 0 && A . offside == 0
455491 xtempi = zero (T)
456492 cur_stencil = A. low_boundary_coefs[1 ,i]
457493 for idx in 1 : stl
458494 x_idx = i+ idx < _x_len ? x[i+ idx- 1 ] : _x. r
459495 xtempi += cur_coeff * cur_stencil[idx]* x_idx
460496 end
461497 x_temp[i] = xtempi + ! overwrite* x_temp[i]
498+ elseif cur_coeff >= 0 && i < A. offside
499+ xtempi = zero (T)
500+ cur_stencil = A. low_boundary_coefs[1 ,i]
501+ for idx in 1 : stl
502+ x_idx = idx == 1 ? _x. l : x[idx- 1 ]
503+ xtempi += cur_coeff * cur_stencil[idx]* x_idx
504+ end
505+ x_temp[i] = xtempi + ! overwrite* x_temp[i]
506+ elseif cur_coeff >= 0 && i >= A. offside
507+ xtempi = zero (T)
508+ cur_stencil = A. low_boundary_coefs[1 ,i]
509+ for idx in 1 : stl
510+ x_idx = i+ idx - A. offside == 1 ? _x. l : x[i+ idx- A. offside- 1 ]
511+ xtempi += cur_coeff * cur_stencil[idx]* x_idx
512+ end
513+ x_temp[i] = xtempi + ! overwrite* x_temp[i]
462514 else
463515 xtempi = zero (T)
464516 cur_stencil = A. low_boundary_coefs[2 ,i]
@@ -478,22 +530,31 @@ function convolve_BC_right!(x_temp::AbstractVector{T}, _x::BoundaryPaddedVector,
478530 stl = A. stencil_length
479531 bstl = A. boundary_stencil_length
480532 coeff = A. coefficients
533+ off = A. offside
481534 x = _x. u
482535 _x_len = length (_x)
483536
484- for i in len- bpc+ 1 : len
537+ for i in len- bpc+ 1 - off : len
485538 cur_coeff = coeff[i]
486539 if cur_coeff < 0
487540 xtempi = zero (T)
488- cur_stencil = A. high_boundary_coefs[2 ,i- len+ bpc]
489- for idx in 1 : stl
490- x_idx = i- stl+ 1 + idx > 1 ? x[i- stl+ idx] : _x. l
491- xtempi += cur_coeff* cur_stencil[idx]* x_idx
541+ cur_stencil = A. high_boundary_coefs[2 ,i- len+ bpc+ off]
542+ if i <= len - off
543+ for idx in 1 : stl
544+ x_idx = i- stl+ 1 + idx+ off > 1 ? x[i- stl+ idx+ off] : _x. l
545+ xtempi += cur_coeff* cur_stencil[idx]* x_idx
546+ end
547+ x_temp[i] = xtempi + ! overwrite* x_temp[i]
548+ else
549+ for idx in 1 : stl
550+ x_idx = len- stl+ 2 + idx < _x_len ? x[len- stl+ 1 + idx] : _x. r
551+ xtempi += cur_coeff* cur_stencil[idx]* x_idx
552+ end
553+ x_temp[i] = xtempi + ! overwrite* x_temp[i]
492554 end
493- x_temp[i] = xtempi + ! overwrite* x_temp[i]
494555 else
495556 xtempi = zero (T)
496- cur_stencil = A. high_boundary_coefs[1 ,i- len+ bpc]
557+ cur_stencil = A. high_boundary_coefs[1 ,i- len+ bpc+ off ]
497558 for idx in 1 : bstl
498559 x_idx = len- bstl+ 2 + idx < _x_len ? x[len- bstl+ 1 + idx] : _x. r
499560 xtempi += cur_coeff* cur_stencil[idx]* x_idx
0 commit comments