Skip to content

Commit b17e7ac

Browse files
authored
Ensure that refshapes match when creating FEValues (#1185)
1 parent 0cff487 commit b17e7ac

6 files changed

Lines changed: 38 additions & 0 deletions

File tree

src/FEValues/FunctionValues.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ struct FunctionValues{DiffOrder, IP, N_t, dNdx_t, dNdξ_t, d2Ndx2_t, d2Ndξ2_t}
6262
end
6363
end
6464
function FunctionValues{DiffOrder}(::Type{T}, ip::Interpolation, qr::QuadratureRule, ip_geo::VectorizedInterpolation) where {DiffOrder, T}
65+
assert_same_refshapes(qr, ip, ip_geo)
6566
n_shape = getnbasefunctions(ip)
6667
n_qpoints = getnquadpoints(qr)
6768

src/FEValues/GeometryMapping.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,15 @@ struct GeometryMapping{DiffOrder, IP, M_t, dMdξ_t, d2Mdξ2_t}
5555
end
5656
end
5757
function GeometryMapping{0}(::Type{T}, ip::ScalarInterpolation, qr::QuadratureRule) where {T}
58+
assert_same_refshapes(qr, ip, ip)
5859
n_shape = getnbasefunctions(ip)
5960
n_qpoints = getnquadpoints(qr)
6061
gm = GeometryMapping(ip, zeros(T, n_shape, n_qpoints), nothing, nothing)
6162
precompute_values!(gm, getpoints(qr))
6263
return gm
6364
end
6465
function GeometryMapping{1}(::Type{T}, ip::ScalarInterpolation, qr::QuadratureRule) where {T}
66+
assert_same_refshapes(qr, ip, ip)
6567
n_shape = getnbasefunctions(ip)
6668
n_qpoints = getnquadpoints(qr)
6769

@@ -73,6 +75,7 @@ function GeometryMapping{1}(::Type{T}, ip::ScalarInterpolation, qr::QuadratureRu
7375
return gm
7476
end
7577
function GeometryMapping{2}(::Type{T}, ip::ScalarInterpolation, qr::QuadratureRule) where {T}
78+
assert_same_refshapes(qr, ip, ip)
7679
n_shape = getnbasefunctions(ip)
7780
n_qpoints = getnquadpoints(qr)
7881

src/FEValues/common_values.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,3 +394,16 @@ function reference_shape_hessians_gradients_and_values!(hessians::AbstractMatrix
394394
end
395395
return
396396
end
397+
398+
assert_same_refshapes(::Union{QuadratureRule{RS}, FacetQuadratureRule{RS}}, ::Interpolation{RS}, ::Interpolation{RS}) where {RS} = nothing
399+
function assert_same_refshapes(qr::Union{QuadratureRule, FacetQuadratureRule}, ipf::Interpolation, ipg::Interpolation)
400+
throw(
401+
ArgumentError(
402+
"""
403+
The reference shapes of the quadrature rule ($(getrefshape(qr))),
404+
function interpolation ($(getrefshape(ipf))), and geometric interpolation ($(getrefshape(ipg))),
405+
must be equal.
406+
"""
407+
)
408+
)
409+
end

test/test_cellvalues.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,13 @@
478478
end
479479
end
480480

481+
@testset "construction errors" begin
482+
@test_throws ArgumentError CellValues(QuadratureRule{RefTriangle}(1), Lagrange{RefQuadrilateral, 1}())
483+
@test_throws ArgumentError CellValues(QuadratureRule{RefTriangle}(1), Lagrange{RefTriangle, 1}(), Lagrange{RefQuadrilateral, 1}())
484+
@test_throws ArgumentError CellValues(QuadratureRule{RefTriangle}(1), Lagrange{RefQuadrilateral, 1}(), Lagrange{RefQuadrilateral, 1}())
485+
@test_throws ArgumentError CellValues(QuadratureRule{RefTriangle}(1), Lagrange{RefQuadrilateral, 1}(), Lagrange{RefTriangle, 1}())
486+
end
487+
481488
@testset "show" begin
482489
cv_quad = CellValues(QuadratureRule{RefQuadrilateral}(2), Lagrange{RefQuadrilateral, 2}()^2)
483490
showstring = sprint(show, MIME"text/plain"(), cv_quad)

test/test_facevalues.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,13 @@
177177
end
178178
end
179179

180+
@testset "construction errors" begin
181+
@test_throws ArgumentError FacetValues(FacetQuadratureRule{RefTriangle}(1), Lagrange{RefQuadrilateral, 1}())
182+
@test_throws ArgumentError FacetValues(FacetQuadratureRule{RefTriangle}(1), Lagrange{RefTriangle, 1}(), Lagrange{RefQuadrilateral, 1}())
183+
@test_throws ArgumentError FacetValues(FacetQuadratureRule{RefTriangle}(1), Lagrange{RefQuadrilateral, 1}(), Lagrange{RefQuadrilateral, 1}())
184+
@test_throws ArgumentError FacetValues(FacetQuadratureRule{RefTriangle}(1), Lagrange{RefQuadrilateral, 1}(), Lagrange{RefTriangle, 1}())
185+
end
186+
180187
@testset "show" begin
181188
# Just smoke test to make sure show doesn't error.
182189
fv = FacetValues(FacetQuadratureRule{RefQuadrilateral}(2), Lagrange{RefQuadrilateral, 2}())

test/test_interfacevalues.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,13 @@
155155
test_interfacevalues(grid, iv)
156156
end
157157
end
158+
@testset "construction errors" begin
159+
@test_throws ArgumentError InterfaceValues(FacetQuadratureRule{RefTriangle}(1), Lagrange{RefQuadrilateral, 1}())
160+
@test_throws ArgumentError InterfaceValues(FacetQuadratureRule{RefTriangle}(1), Lagrange{RefTriangle, 1}(), Lagrange{RefQuadrilateral, 1}())
161+
@test_throws ArgumentError InterfaceValues(FacetQuadratureRule{RefTriangle}(1), Lagrange{RefQuadrilateral, 1}(), Lagrange{RefQuadrilateral, 1}())
162+
@test_throws ArgumentError InterfaceValues(FacetQuadratureRule{RefTriangle}(1), Lagrange{RefQuadrilateral, 1}(), Lagrange{RefTriangle, 1}())
163+
@test_throws ArgumentError InterfaceValues(FacetQuadratureRule{RefTriangle}(1), Lagrange{RefTriangle, 1}(), FacetQuadratureRule{RefTriangle}(1), Lagrange{RefQuadrilateral, 1}())
164+
end
158165
# Custom quadrature
159166
@testset "Custom quadrature interface values" begin
160167
cell_shape = Tetrahedron

0 commit comments

Comments
 (0)