comparison test/SbpOperators/boundaryops/normal_derivative_test.jl @ 1692:de2c4b2663b4 feature/sbp_operators/laplace_curvilinear

Add accuracy tests for normal derivative
author Jonatan Werpers <jonatan@werpers.com>
date Mon, 26 Aug 2024 16:15:25 +0200
parents b30db2ea34ed
children f3d7e2d7a43f
comparison
equal deleted inserted replaced
1680:b30db2ea34ed 1692:de2c4b2663b4
5 using Sbplib.LazyTensors 5 using Sbplib.LazyTensors
6 using Sbplib.RegionIndices 6 using Sbplib.RegionIndices
7 import Sbplib.SbpOperators.BoundaryOperator 7 import Sbplib.SbpOperators.BoundaryOperator
8 8
9 using StaticArrays 9 using StaticArrays
10 using LinearAlgebra
10 11
11 @testset "normal_derivative" begin 12 @testset "normal_derivative" begin
12 stencil_set = read_stencil_set(sbp_operators_path()*"standard_diagonal.toml"; order=4) 13 stencil_set = read_stencil_set(sbp_operators_path()*"standard_diagonal.toml"; order=4)
13 14
14 @testset "EquidistantGrid" begin 15 @testset "EquidistantGrid" begin
104 end 105 end
105 end 106 end
106 end 107 end
107 108
108 @testset "Accuracy" begin 109 @testset "Accuracy" begin
109 v = map(x̄ -> NaN, mg) 110 v = function(x̄)
110 dₙv = map(x̄ -> NaN, mg) 111 sin(norm(x̄+@SVector[1,1]))
111 112 end
112 @testset "2nd order" begin 113 ∇v = function(x̄)
113 stencil_set = read_stencil_set(sbp_operators_path()*"standard_diagonal.toml"; order=2) 114 ȳ = x̄+@SVector[1,1]
114 d_w, d_e, d_s, d_n = normal_derivative.(Ref(mg), Ref(stencil_set), boundary_identifiers(mg)) 115 cos(norm(ȳ))*(ȳ/norm(ȳ))
115
116 @test_broken d_w*v ≈ dₙv atol = 1e-13
117 @test_broken d_e*v ≈ dₙv atol = 1e-13
118 @test_broken d_s*v ≈ dₙv atol = 1e-13
119 @test_broken d_n*v ≈ dₙv atol = 1e-13
120 end 116 end
121 117
122 @testset "4th order" begin 118 mg = equidistant_grid(c, 80,80)
123 stencil_set = read_stencil_set(sbp_operators_path()*"standard_diagonal.toml"; order=4) 119 v̄ = map(v, mg)
124 d_w, d_e, d_s, d_n = normal_derivative.(Ref(mg), Ref(stencil_set), boundary_identifiers(mg))
125 120
126 @test_broken d_w*v ≈ dₙv atol = 1e-13 121 @testset for (order, atol) ∈ [(2,4e-2),(4,2e-3)]
127 @test_broken d_e*v ≈ dₙv atol = 1e-13 122 stencil_set = read_stencil_set(sbp_operators_path()*"standard_diagonal.toml"; order=order)
128 @test_broken d_s*v ≈ dₙv atol = 1e-13 123
129 @test_broken d_n*v ≈ dₙv atol = 1e-13 124 @testset for bId ∈ boundary_identifiers(mg)
125 ∂ₙv = map(boundary_grid(mg,bId),normal(mg,bId)) do x̄,n̂
126 n̂⋅∇v(x̄)
127 end
128
129 dₙ = normal_derivative(mg, stencil_set, bId)
130 @test dₙ*v̄ ≈ ∂ₙv atol=atol
131 end
130 end 132 end
131 end 133 end
132 end 134 end
133 end 135 end