Mercurial > repos > public > sbplib_julia
changeset 1479:b96858a50e35 feature/boundary_conditions
Add tests for SAT
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Sat, 23 Dec 2023 23:01:28 +0100 |
parents | fefc81a9c155 |
children | 4550beef9694 |
files | test/BoundaryConditions/sat_test.jl |
diffstat | 1 files changed, 53 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/test/BoundaryConditions/sat_test.jl Fri Aug 25 16:08:21 2023 +0200 +++ b/test/BoundaryConditions/sat_test.jl Sat Dec 23 23:01:28 2023 +0100 @@ -3,38 +3,64 @@ using Sbplib.BoundaryConditions using Sbplib.Grids -using Sbplib.RegionIndices using Sbplib.LazyTensors +using Sbplib.SbpOperators -grid = equidistant_grid(11, 0.0, 1.0) -(id_l,id_r) = boundary_identifiers(grid) +stencil_set = read_stencil_set(sbp_operators_path()*"standard_diagonal.toml"; order = 4) + struct MockOp end -function BoundaryConditions.sat_tensors(op::MockOp, grid, bc::DirichletCondition) - sz = size(grid) - m = sz[1] - ind = (region(bc.id) == Lower()) ? 1 : m - e = zeros(m); - e[ind] = 1. - eᵀ = ones(Float64,m,0); - e[ind] = 1. - c_tensor = LazyTensors.DiagonalTensor(e) - p_tensor = DenseTensor(eᵀ, (1,), (2,)) - closure(u) = c_tensor*u - function penalty(g) - @show g - return p_tensor*g - end - return closure, penalty +function BoundaryConditions.sat_tensors(op::MockOp, g::TensorGrid, bc::DirichletCondition) + e = boundary_restriction(g, stencil_set, id(bc)) + L = e + sat_op = e' + return sat_op, L +end + +function BoundaryConditions.sat_tensors(op::MockOp, g::TensorGrid, bc::DirichletCondition, a) + e = boundary_restriction(g, stencil_set, id(bc)) + L = a*e + sat_op = e' + return sat_op, L +end + +function BoundaryConditions.sat_tensors(op::MockOp, g::TensorGrid, bc::NeumannCondition) + e = boundary_restriction(g, stencil_set, id(bc)) + d = normal_derivative(g, stencil_set, id(bc)) + L = d + sat_op = e' + return sat_op, L end +@testset "sat" begin + op = MockOp() + grid = equidistant_grid((11,13), (0.,0.), (1.,1.)) + W, E, S, N = boundary_identifiers(grid) + u = eval_on(grid, (x,y) -> x+y^2) -# @testset "sat" begin -# g = ConstantBoundaryData(2.0) -# dc = DirichletCondition(g,id_l) -# op = MockOp() -# f = sat(op, grid, dc) -# u = eval_on(grid, x-> -1/2 + x^2) -# @show f(0.,u) -# end + + dc_W = DirichletCondition(1.0, W) + SAT_W = sat(op, grid, dc_W) + g_W = discretize_data(grid, dc_W) + r_W = zeros(size(grid)) + r_W[1,:] .= map(y -> (y^2-1.), range(0., 1., length=13)) + @test SAT_W(u, g_W) ≈ r_W atol = 1e-13 + + dc_E = DirichletCondition(2, E) + SAT_E = sat(op, grid, dc_E, 2.) + g_E = discretize_data(grid, dc_E) + r_E = zeros(size(grid)) + r_E[end,:] .= map(y -> (2*(1. + y^2)-2.), range(0., 1., length=13)) + @test SAT_E(u, g_E) ≈ r_E atol = 1e-13 + + nc_S = NeumannCondition(.0, S) + SAT_S = sat(op, grid, nc_S) + g_S = discretize_data(grid, nc_S) + @test SAT_S(u, g_S) ≈ zeros(size(grid)) atol = 1e-13 + + nc_N = NeumannCondition(2.0, N) + SAT_S = sat(op, grid, nc_N) + g_N = discretize_data(grid, nc_N) + @test SAT_S(u, g_N) ≈ zeros(size(grid)) atol = 1e-13 +end