changeset 990:b6238afd3bb0 feature/stencil_set_type

Add methods for creating derivative operators in 1D from stencil sets without providing directions
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Fri, 18 Mar 2022 13:02:46 +0100
parents 7bf3121c6864
children 37fd8c1cadb2
files src/SbpOperators/readoperator.jl src/SbpOperators/volumeops/derivatives/first_derivative.jl src/SbpOperators/volumeops/derivatives/second_derivative.jl test/SbpOperators/volumeops/derivatives/first_derivative_test.jl test/SbpOperators/volumeops/derivatives/second_derivative_test.jl test/SbpOperators/volumeops/laplace/laplace_test.jl
diffstat 6 files changed, 49 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/src/SbpOperators/readoperator.jl	Thu Mar 17 21:31:20 2022 +0100
+++ b/src/SbpOperators/readoperator.jl	Fri Mar 18 13:02:46 2022 +0100
@@ -14,12 +14,7 @@
 
 A `StencilSet` contains a set of associated stencils. The stencils
 are are stored in a table, and can be accesed by indexing into the `StencilSet`.
-"""
-struct StencilSet
-    table
-end
 
-"""
     StencilSet(filename; filters)
 
 Creates a `StencilSet` from a TOML file based on some key-value
@@ -38,7 +33,13 @@
 
 See also [`sbp_operators_path`](@ref), [`get_stencil_set`](@ref), [`parse_stencil`](@ref), [`parse_scalar`](@ref), [`parse_tuple`](@ref),.
 """
-StencilSet(filename; filters...) = StencilSet(get_stencil_set(TOML.parsefile(filename); filters...))
+struct StencilSet
+    table
+    function StencilSet(filename; filters...)
+        return new(get_stencil_set(TOML.parsefile(filename); filters...))
+    end
+end
+
 Base.getindex(set::StencilSet,I...) = set.table[I...]
 
 """
--- a/src/SbpOperators/volumeops/derivatives/first_derivative.jl	Thu Mar 17 21:31:20 2022 +0100
+++ b/src/SbpOperators/volumeops/derivatives/first_derivative.jl	Fri Mar 18 13:02:46 2022 +0100
@@ -16,11 +16,18 @@
     h_inv = inverse_spacing(grid)[direction]
     return SbpOperators.volume_operator(grid, scale(inner_stencil,h_inv), scale.(closure_stencils,h_inv), odd, direction)
 end
-first_derivative(grid::EquidistantGrid{1}, inner_stencil::Stencil, closure_stencils) = first_derivative(grid,inner_stencil,closure_stencils,1)
 
 
 """
-    first_derivative(grid, stencil_set, direction)
+    first_derivative(grid, inner_stencil, closure_stencils)
+
+Creates a `first_derivative` operator on a 1D `grid` given `inner_stencil` and `closure_stencils`.
+"""
+first_derivative(grid::EquidistantGrid{1}, inner_stencil::Stencil, closure_stencils) = first_derivative(grid, inner_stencil, closure_stencils, 1)
+
+
+"""
+    first_derivative(grid, stencil_set::StencilSet, direction)
 
 Creates a `first_derivative` operator on `grid` along coordinate dimension `direction` given a `stencil_set`.
 """
@@ -30,6 +37,10 @@
     first_derivative(grid,inner_stencil,closure_stencils,direction);
 end
 
-# TODO: Not possible to remove ::Stencil from first_derivative(grid::EquidistantGrid{1},...) due to type deduction failing. 
-# Is this due to the type ambuguity of StencilSet? Possible to address in some other way? 
-# If not, should we drop ::StencilSet from the method above (it is not required)?
\ No newline at end of file
+
+"""
+    first_derivative(grid, stencil_set)
+
+Creates a `first_derivative` operator on a 1D `grid` given a `stencil_set`.
+"""
+first_derivative(grid::EquidistantGrid{1}, stencil_set) = first_derivative(grid, stencil_set, 1)
--- a/src/SbpOperators/volumeops/derivatives/second_derivative.jl	Thu Mar 17 21:31:20 2022 +0100
+++ b/src/SbpOperators/volumeops/derivatives/second_derivative.jl	Fri Mar 18 13:02:46 2022 +0100
@@ -16,7 +16,15 @@
     h_inv = inverse_spacing(grid)[direction]
     return SbpOperators.volume_operator(grid, scale(inner_stencil,h_inv^2), scale.(closure_stencils,h_inv^2), even, direction)
 end
-second_derivative(grid::EquidistantGrid{1}, inner_stencil::Stencil, closure_stencils) = second_derivative(grid,inner_stencil,closure_stencils,1)
+
+
+"""
+    second_derivative(grid, inner_stencil, closure_stencils)
+
+Creates a `second_derivative` operator on a 1D `grid` given `inner_stencil` and `closure_stencils`.
+"""
+second_derivative(grid::EquidistantGrid{1}, inner_stencil::Stencil, closure_stencils) = second_derivative(grid, inner_stencil, closure_stencils,1)
+
 
 """
     second_derivative(grid, stencil_set, direction)
@@ -27,8 +35,12 @@
     inner_stencil = parse_stencil(stencil_set["D2"]["inner_stencil"])
     closure_stencils = parse_stencil.(stencil_set["D2"]["closure_stencils"])
     second_derivative(grid,inner_stencil,closure_stencils,direction);
-end 
+end
+
 
-# TODO: Not possible to remove ::Stencil from second_derivative(grid::EquidistantGrid{1},...) due to type deduction failing. 
-# Is this due to the type ambuguity of StencilSet? Possible to address in some other way? 
-# If not, should we drop ::StencilSet from the method above (it is not required)?
\ No newline at end of file
+"""
+    second_derivative(grid, stencil_set)
+
+Creates a `second_derivative` operator on a 1D `grid` given a `stencil_set`.
+"""
+second_derivative(grid::EquidistantGrid{1}, stencil_set) = second_derivative(grid, stencil_set, 1)
\ No newline at end of file
--- a/test/SbpOperators/volumeops/derivatives/first_derivative_test.jl	Thu Mar 17 21:31:20 2022 +0100
+++ b/test/SbpOperators/volumeops/derivatives/first_derivative_test.jl	Fri Mar 18 13:02:46 2022 +0100
@@ -29,12 +29,14 @@
         
         @test first_derivative(g₁, stencil_set, 1) isa TensorMapping{Float64,1,1}
         @test first_derivative(g₂, stencil_set, 2) isa TensorMapping{Float64,2,2}
+        @test first_derivative(g₁, stencil_set, 1) == first_derivative(g₁, stencil_set)
 
         interior_stencil = CenteredStencil(-1,0,1)
         closure_stencils = [Stencil(-1,1, center=1)]
 
         @test first_derivative(g₁, interior_stencil, closure_stencils, 1) isa TensorMapping{Float64,1,1}
         @test first_derivative(g₁, interior_stencil, closure_stencils, 1) isa VolumeOperator
+        @test first_derivative(g₁, interior_stencil, closure_stencils, 1) == first_derivative(g₁, interior_stencil, closure_stencils)
         @test first_derivative(g₂, interior_stencil, closure_stencils, 2) isa TensorMapping{Float64,2,2}
     end
 
--- a/test/SbpOperators/volumeops/derivatives/second_derivative_test.jl	Thu Mar 17 21:31:20 2022 +0100
+++ b/test/SbpOperators/volumeops/derivatives/second_derivative_test.jl	Fri Mar 18 13:02:46 2022 +0100
@@ -21,11 +21,12 @@
             Dₓₓ = second_derivative(g_1D,inner_stencil,closure_stencils,1)
             @test Dₓₓ == second_derivative(g_1D,inner_stencil,closure_stencils)
             @test Dₓₓ == second_derivative(g_1D,stencil_set,1)
+            @test Dₓₓ == second_derivative(g_1D,stencil_set)
             @test Dₓₓ isa VolumeOperator
         end
         @testset "2D" begin
             Dₓₓ = second_derivative(g_2D,inner_stencil,closure_stencils,1)
-            D2 = second_derivative(g_1D,inner_stencil,closure_stencils)
+            D2 = second_derivative(g_1D,inner_stencil,closure_stencils,1)
             I = IdentityMapping{Float64}(size(g_2D)[2])
             @test Dₓₓ == D2⊗I
             @test Dₓₓ == second_derivative(g_2D,stencil_set,1)
@@ -51,9 +52,7 @@
             # implies that L*v should be exact for monomials up to order 2.
             @testset "2nd order" begin
                 stencil_set = StencilSet(operator_path; order=2)
-                inner_stencil = parse_stencil(stencil_set["D2"]["inner_stencil"])
-			    closure_stencils = parse_stencil.(stencil_set["D2"]["closure_stencils"])
-                Dₓₓ = second_derivative(g_1D,inner_stencil,closure_stencils)
+                Dₓₓ = second_derivative(g_1D,stencil_set)
                 @test Dₓₓ*monomials[1] ≈ zeros(Float64,size(g_1D)...) atol = 5e-10
                 @test Dₓₓ*monomials[2] ≈ zeros(Float64,size(g_1D)...) atol = 5e-10
                 @test Dₓₓ*monomials[3] ≈ monomials[1] atol = 5e-10
@@ -64,9 +63,7 @@
             # implies that L*v should be exact for monomials up to order 3.
             @testset "4th order" begin
                 stencil_set = StencilSet(operator_path; order=4)
-                inner_stencil = parse_stencil(stencil_set["D2"]["inner_stencil"])
-			    closure_stencils = parse_stencil.(stencil_set["D2"]["closure_stencils"])
-                Dₓₓ = second_derivative(g_1D,inner_stencil,closure_stencils)
+                Dₓₓ = second_derivative(g_1D,stencil_set)
                 # NOTE: high tolerances for checking the "exact" differentiation
                 # due to accumulation of round-off errors/cancellation errors?
                 @test Dₓₓ*monomials[1] ≈ zeros(Float64,size(g_1D)...) atol = 5e-10
@@ -92,9 +89,7 @@
             # implies that L*v should be exact for binomials up to order 2.
             @testset "2nd order" begin
                 stencil_set = StencilSet(operator_path; order=2)
-                inner_stencil = parse_stencil(stencil_set["D2"]["inner_stencil"])
-                closure_stencils = parse_stencil.(stencil_set["D2"]["closure_stencils"])
-                Dyy = second_derivative(g_2D,inner_stencil,closure_stencils,2)
+                Dyy = second_derivative(g_2D,stencil_set,2)
                 @test Dyy*binomials[1] ≈ zeros(Float64,size(g_2D)...) atol = 5e-9
                 @test Dyy*binomials[2] ≈ zeros(Float64,size(g_2D)...) atol = 5e-9
                 @test Dyy*binomials[3] ≈ evalOn(g_2D,(x,y)->1.) atol = 5e-9
@@ -105,9 +100,7 @@
             # implies that L*v should be exact for binomials up to order 3.
             @testset "4th order" begin
                 stencil_set = StencilSet(operator_path; order=4)
-                inner_stencil = parse_stencil(stencil_set["D2"]["inner_stencil"])
-                closure_stencils = parse_stencil.(stencil_set["D2"]["closure_stencils"])
-                Dyy = second_derivative(g_2D,inner_stencil,closure_stencils,2)
+                Dyy = second_derivative(g_2D,stencil_set,2)
                 # NOTE: high tolerances for checking the "exact" differentiation
                 # due to accumulation of round-off errors/cancellation errors?
                 @test Dyy*binomials[1] ≈ zeros(Float64,size(g_2D)...) atol = 5e-9
--- a/test/SbpOperators/volumeops/laplace/laplace_test.jl	Thu Mar 17 21:31:20 2022 +0100
+++ b/test/SbpOperators/volumeops/laplace/laplace_test.jl	Fri Mar 18 13:02:46 2022 +0100
@@ -69,7 +69,7 @@
 @testset "laplace" begin
     @testset "1D" begin
         Δ = laplace(g_1D, inner_stencil, closure_stencils)
-        @test Δ == second_derivative(g_1D, inner_stencil, closure_stencils)
+        @test Δ == second_derivative(g_1D, inner_stencil, closure_stencils, 1)
         @test Δ isa TensorMapping{T,1,1}  where T
     end
     @testset "3D" begin