diff --git a/Project.toml b/Project.toml index 830f72a5..da2ce77b 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "SummationByPartsOperators" uuid = "9f78cca6-572e-554e-b819-917d2f1cf240" author = ["Hendrik Ranocha"] -version = "0.5.44" +version = "0.5.45" [deps] ArgCheck = "dce04be8-c92d-5529-be00-80e4d2c0e197" diff --git a/src/periodic_operators.jl b/src/periodic_operators.jl index f964cdba..6d7c5b57 100644 --- a/src/periodic_operators.jl +++ b/src/periodic_operators.jl @@ -82,11 +82,15 @@ end ex_upper = :( nothing ) for i in (UpperOffset-1):-1:0 - ex = :( lower_coef[$LowerOffset]*u[end-$(i+LowerOffset)] ) - for j in LowerOffset-1:-1:1 - ex = :( $ex + lower_coef[$j]*u[end-$(j+i)] ) + if LowerOffset > 0 + ex = :( lower_coef[$LowerOffset]*u[end-$(i+LowerOffset)] ) + for j in LowerOffset-1:-1:1 + ex = :( $ex + lower_coef[$j]*u[end-$(j+i)] ) + end + ex = :( $ex + central_coef*u[end-$i] ) + else + ex = :( central_coef*u[end-$i] ) end - ex = :( $ex + central_coef*u[end-$i] ) for j in 1:UpperOffset if i-j < 0 ex = :( $ex + upper_coef[$j]*u[$(j-i)] ) diff --git a/test/upwind_operators_test.jl b/test/upwind_operators_test.jl index fb54f9e4..a8fcf875 100644 --- a/test/upwind_operators_test.jl +++ b/test/upwind_operators_test.jl @@ -103,3 +103,26 @@ end derivative_operator(Mattsson2017(:plus ), 1, acc_order, xmin, xmax, N) ) end + +@testset "Empty lower/upper coefficients" begin + D = upwind_operators(periodic_derivative_operator, accuracy_order = 2, + xmin = 0.0, xmax = 1.0, N = 10) + x = grid(D) + u = @. sinpi(2 * x) + + du = zero(u) + @test_nowarn mul!(du, D.minus, u) + @test du ≈ D.minus * u + @test_nowarn mul!(du, D.minus, u, 2.0) + @test du ≈ 2 * D.minus * u + @test_nowarn mul!(du, D.minus, u, 2.0, 3.0) + @test du ≈ 8 * D.minus * u # 5 = 2 + 3 * 2 + + du = zero(u) + @test_nowarn mul!(du, D.plus, u) + @test du ≈ D.plus * u + @test_nowarn mul!(du, D.plus, u, 2.0) + @test du ≈ 2 * D.plus * u + @test_nowarn mul!(du, D.plus, u, 2.0, 3.0) + @test du ≈ 8 * D.plus * u # 5 = 2 + 3 * 2 +end