Skip to content
This repository was archived by the owner on Jul 19, 2023. It is now read-only.

Commit ffe0f4d

Browse files
committed
Adding Biased Upwind Operator
1 parent bb0d379 commit ffe0f4d

12 files changed

Lines changed: 224 additions & 109 deletions

src/derivative_operators/convolutions.jl

Lines changed: 98 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -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
151158
end
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
404440
end
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

Comments
 (0)