Skip to content

Commit

Permalink
allow kwargs like Nplot for SBP approximation types (#146)
Browse files Browse the repository at this point in the history
  • Loading branch information
jlchan authored Jun 29, 2023
1 parent 385c4cd commit d7d3623
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 12 deletions.
8 changes: 4 additions & 4 deletions src/RefElemData.jl
Original file line number Diff line number Diff line change
Expand Up @@ -241,12 +241,12 @@ struct SBP{Type} end
SBP() = SBP{DefaultSBPType}() # no-parameter default

# sets default to TensorProductLobatto on Quads
RefElemData(elem::Union{Line, Quad, Hex}, approxT::SBP{DefaultSBPType}, N) =
RefElemData(elem, SBP{TensorProductLobatto}(), N)
RefElemData(elem::Union{Line, Quad, Hex}, approxT::SBP{DefaultSBPType}, N; kwargs...) =
RefElemData(elem, SBP{TensorProductLobatto}(), N; kwargs...)

# sets default to Kubatko{LobattoFaceNodes} on Tris
RefElemData(elem::Tri, approxT::SBP{DefaultSBPType}, N) =
RefElemData(elem, SBP{Kubatko{LobattoFaceNodes}}(), N)
RefElemData(elem::Tri, approxT::SBP{DefaultSBPType}, N; kwargs...) =
RefElemData(elem, SBP{Kubatko{LobattoFaceNodes}}(), N; kwargs...)

# ====================================
# Printing
Expand Down
16 changes: 8 additions & 8 deletions src/RefElemData_SBP.jl
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,17 @@ For `Line()`, `Quad()`, and `Hex()`, `approxType` is `SBP{TensorProductLobatto}`
For `Tri()`, `approxType` can be `SBP{Kubatko{LobattoFaceNodes}}`, `SBP{Kubatko{LegendreFaceNodes}}`, or `SBP{Hicken}`.
"""
function RefElemData(elementType::Line, approxType::SBP{TensorProductLobatto}, N; tol = 100*eps())
function RefElemData(elementType::Line, approxType::SBP{TensorProductLobatto}, N; tol = 100*eps(), kwargs...)

rd = RefElemData(elementType, N, quad_rule_vol = gauss_lobatto_quad(0,0,N))
rd = RefElemData(elementType, N; quad_rule_vol = gauss_lobatto_quad(0,0,N), kwargs...)

rd = @set rd.Vf = droptol!(sparse(rd.Vf), tol)
rd = @set rd.LIFT = Diagonal(rd.wq) \ (rd.Vf' * Diagonal(rd.wf)) # TODO: make this more efficient with LinearMaps?

return _convert_RefElemData_fields_to_SBP(rd, approxType)
end

function RefElemData(elementType::Quad, approxType::SBP{TensorProductLobatto}, N; tol = 100*eps())
function RefElemData(elementType::Quad, approxType::SBP{TensorProductLobatto}, N; tol = 100*eps(), kwargs...)

# make 2D SBP nodes/weights
r1D, w1D = gauss_lobatto_quad(0, 0, N)
Expand All @@ -30,15 +30,15 @@ function RefElemData(elementType::Quad, approxType::SBP{TensorProductLobatto}, N
quad_rule_vol = (rq, sq, wq)
quad_rule_face = (r1D, w1D)

rd = RefElemData(elementType, N, quad_rule_vol = quad_rule_vol, quad_rule_face = quad_rule_face)
rd = RefElemData(elementType, N; quad_rule_vol = quad_rule_vol, quad_rule_face = quad_rule_face, kwargs...)

rd = @set rd.Vf = droptol!(sparse(rd.Vf), tol)
rd = @set rd.LIFT = Diagonal(rd.wq) \ (rd.Vf' * Diagonal(rd.wf)) # TODO: make this more efficient with LinearMaps?

return _convert_RefElemData_fields_to_SBP(rd, approxType)
end

function RefElemData(elementType::Hex, approxType::SBP{TensorProductLobatto}, N; tol = 100*eps())
function RefElemData(elementType::Hex, approxType::SBP{TensorProductLobatto}, N; tol = 100*eps(), kwargs...)

# make 2D SBP nodes/weights
r1D, w1D = gauss_lobatto_quad(0, 0, N)
Expand All @@ -51,20 +51,20 @@ function RefElemData(elementType::Hex, approxType::SBP{TensorProductLobatto}, N;
quad_rule_vol = (rq, sq, tq, wq)
quad_rule_face = (rf, sf, wf)

rd = RefElemData(elementType, N, quad_rule_vol = quad_rule_vol, quad_rule_face = quad_rule_face)
rd = RefElemData(elementType, N; quad_rule_vol = quad_rule_vol, quad_rule_face = quad_rule_face, kwargs...)

rd = @set rd.Vf = droptol!(sparse(rd.Vf), tol)
rd = @set rd.LIFT = Diagonal(rd.wq) \ (rd.Vf' * Diagonal(rd.wf)) # TODO: make this more efficient with LinearMaps?

return _convert_RefElemData_fields_to_SBP(rd, approxType)
end

function RefElemData(elementType::Tri, approxType::SBP, N; tol = 100*eps())
function RefElemData(elementType::Tri, approxType::SBP, N; tol = 100*eps(), kwargs...)

quad_rule_vol, quad_rule_face = diagE_sbp_nodes(elementType, approxType, N)

# build polynomial reference element using quad rules; will be modified to create SBP RefElemData
rd = RefElemData(elementType, Polynomial(), N; quad_rule_vol=quad_rule_vol, quad_rule_face=quad_rule_face)
rd = RefElemData(elementType, Polynomial(), N; quad_rule_vol=quad_rule_vol, quad_rule_face=quad_rule_face, kwargs...)

# determine Fmask = indices of face nodes among volume nodes
Ef, Fmask = build_Ef_Fmask(rd)
Expand Down
6 changes: 6 additions & 0 deletions test/reference_elem_tests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -385,3 +385,9 @@ end
end
end

@testset "RefElemData SBP keyword arguments" begin
for elem in [Line(), Tri(), Quad(), Hex()]
# make sure Nplot is accepted as a kwarg
@test_nowarn rd = RefElemData(elem, SBP(), 1; Nplot=11)
end
end

0 comments on commit d7d3623

Please sign in to comment.