From fd5932b6d1ba5a2675ae08f8cd2ff1e5a35c059a Mon Sep 17 00:00:00 2001 From: Christian Merdon Date: Tue, 8 Jul 2025 16:22:38 +0200 Subject: [PATCH 1/4] fixes show method crash for FEVectorBlock --- src/fevector.jl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/fevector.jl b/src/fevector.jl index 9f3858c..ed1f088 100644 --- a/src/fevector.jl +++ b/src/fevector.jl @@ -55,9 +55,13 @@ $(TYPEDSIGNATURES) Custom `show` function for `FEVectorBlock` that prints some information and the view of that block. """ function Base.show(io::IO, ::MIME"text/plain", FEB::FEVectorBlock) - @printf(io, "block %s [%d:%d] = ", FEB.name, FEB.offset + 1, FEB.last_index) return show(io, view(FEB)) end +function Base.show(io::IO, FEB::FEVectorBlock) + @printf(io, "block %s [%d:%d] = ", FEB.name, FEB.offset + 1, FEB.last_index) + show(io, view(FEB)) + return nothing +end """ $(TYPEDEF) From 9105f281c0f457aeeb42d008324d73ba98696e2f Mon Sep 17 00:00:00 2001 From: Christian Merdon Date: Wed, 9 Jul 2025 10:06:34 +0200 Subject: [PATCH 2/4] added show functions for FEEvaluator, PointEvaluator and SegmentIntegrator, added calls of show functions to the tests --- src/feevaluator.jl | 11 +++++++++++ src/point_evaluator.jl | 10 ++++++++++ src/reconstructionoperators.jl | 10 ++++++++++ src/segment_integrator.jl | 11 +++++++++++ test/test_febasis.jl | 1 + test/test_fematrix_and_vector.jl | 11 +++++++---- test/test_interpolators.jl | 5 +++-- test/test_operators.jl | 2 ++ test/test_pointevaluator.jl | 2 ++ test/test_quadrature.jl | 3 +++ test/test_segmentintegrator.jl | 2 ++ 11 files changed, 62 insertions(+), 6 deletions(-) diff --git a/src/feevaluator.jl b/src/feevaluator.jl index 5ab940a..eb2179b 100644 --- a/src/feevaluator.jl +++ b/src/feevaluator.jl @@ -25,6 +25,17 @@ struct SingleFEEvaluator{T <: Real, TvG <: Real, TiG <: Integer, operator, FETyp compressiontargets::Array{Int, 1} # some operators allow for compressed storage (e.g. SymmetricGradient) end +function Base.show(io::IO, FEB::SingleFEEvaluator) + println(io, "SingleFEEvaluator") + println(io, "-----------------") + println(io, "Operator: ", typeof(FEB).parameters[4]) + println(io, "FESpace: ", typeof(FEB.FE)) + println(io, "Element: ", typeof(FEB.FE).parameters[3]) + println(io, "Geometry: ", typeof(FEB.L2G).parameters[3]) + println(io, "Quadrature: ", length(FEB.xref), " points") + return +end + Base.getindex(FEB::FEEvaluator, c, dof, qp) = FEB.cvals[c, dof, qp] diff --git a/src/point_evaluator.jl b/src/point_evaluator.jl index dc2965b..f484575 100644 --- a/src/point_evaluator.jl +++ b/src/point_evaluator.jl @@ -13,6 +13,16 @@ mutable struct PointEvaluator{Tv <: Real, UT, KFT <: Function} parameters::Dict{Symbol, Any} end +function Base.show(io::IO, PE::PointEvaluator) + println(io, "PointEvaluator") + println(io, "--------------") + println(io, "Unknowns: ", PE.u_args) + println(io, "Operators: ", PE.ops_args) + println(io, "Kernel function: ", typeof(PE.kernel)) + println(io, "Parameters: ", PE.parameters) + return +end + default_peval_kwargs() = Dict{Symbol, Tuple{Any, String}}( :name => ("PointEvaluator", "name for operator used in printouts"), :resultdim => (0, "dimension of result field (default = length of operators)"), diff --git a/src/reconstructionoperators.jl b/src/reconstructionoperators.jl index 4270253..853564c 100644 --- a/src/reconstructionoperators.jl +++ b/src/reconstructionoperators.jl @@ -91,3 +91,13 @@ function update_basis!(FEBE::FEReconstEvaluator) end return nothing end + +function Base.show(io::IO, FEB::FEReconstEvaluator) + println(io, "FEReconstEvaluator (reconstruction operator)") + println(io, "-------------------------------------------") + println(io, "Reconstruction FE space: ", typeof(FEB.FEB.FE)) + println(io, "Reconstruction operator: ", typeof(FEB.FEB).parameters[4]) + println(io, "Underlying SingleFEEvaluator:") + show(io, FEB.FEB) + return +end diff --git a/src/segment_integrator.jl b/src/segment_integrator.jl index 53b5335..fe06959 100644 --- a/src/segment_integrator.jl +++ b/src/segment_integrator.jl @@ -11,6 +11,17 @@ mutable struct SegmentIntegrator{Tv <: Real, UT, KFT <: Function, EG} parameters::Dict{Symbol, Any} end +function Base.show(io::IO, SI::SegmentIntegrator) + println(io, "SegmentIntegrator") + println(io, "-----------------") + println(io, "Domain geometry: ", segment_geometry(SI)) + println(io, "Unknowns: ", SI.u_args) + println(io, "Operators: ", SI.ops_args) + println(io, "Kernel function: ", typeof(SI.kernel)) + println(io, "Parameters: ", SI.parameters) + return +end + segment_geometry(::SegmentIntegrator{Tv, UT, KFT, EG}) where {Tv, UT, KFT, EG} = EG diff --git a/test/test_febasis.jl b/test/test_febasis.jl index ef449a4..37ddc77 100644 --- a/test/test_febasis.jl +++ b/test/test_febasis.jl @@ -23,6 +23,7 @@ end function test_vertex_values(EG, FEType, order) qf = VertexRule(EG, order; T = Rational{Int}) + @show qf basis = get_basis(ON_CELLS, FEType, EG) ndofs = get_ndofs(ON_CELLS, FEType, EG) basis_vals = zeros(Rational{Int}, ndofs, 1) diff --git a/test/test_fematrix_and_vector.jl b/test/test_fematrix_and_vector.jl index 87a808a..6a6bd2c 100644 --- a/test/test_fematrix_and_vector.jl +++ b/test/test_fematrix_and_vector.jl @@ -2,21 +2,24 @@ function run_fematrix_tests() @testset "FEMatrixVector" begin println("\n") - println("=======================") - println("Testing FEMatrix&VEctor") - println("=======================") + println("===========================") + println("Testing FEMatrix & FEVector") + println("===========================") xgrid = simplexgrid(0:0.1:1, 0:0.1:1) FES1 = FESpace{H1Pk{1, 1, 1}}(xgrid) + @show FES1 FES2 = FESpace{H1Pk{1, 1, 2}}(xgrid) + @show FES2 A = FEMatrix(FES1, FES2) @test size(A.entries) == (FES1.ndofs, FES2.ndofs) @test size(A[1, 1]) == (FES1.ndofs, FES2.ndofs) + @show A B = FEMatrix([FES1, FES2]) @test length(B) == 4 @test size(B.entries) == (FES1.ndofs + FES2.ndofs, FES1.ndofs + FES2.ndofs) @test size(B[1, 2]) == (FES1.ndofs, FES2.ndofs) - + @show B C = FEMatrix([FES2, FES2], [FES1, FES1]) @test length(C) == 4 diff --git a/test/test_interpolators.jl b/test/test_interpolators.jl index d3251f9..292d58a 100644 --- a/test/test_interpolators.jl +++ b/test/test_interpolators.jl @@ -73,6 +73,7 @@ function run_interpolator_tests() QP = QPInfos(xgrid) qf = VertexRule(EG, order) FEB = FEEvaluator(FES, Identity, qf) + @show FEB for cell::Int in cells update_trafo!(L2G, cell) update_basis!(FEB, cell) @@ -101,15 +102,15 @@ function run_interpolator_tests() # choose FE and generate FESpace FES = FESpace{FEType}(xgrid; broken = broken) AT = ON_CELLS - print("FEType = $FEType $(broken ? "broken" : "") $AT | ndofs = $(FES.ndofs) | order = $order") # interpolate Solution = FEVector(FES) interpolate!(Solution[1], u; bonus_quadorder = order) + @show Solution # compute error error = compute_error(Solution[1], u, order) - println(" | error = $(norm(error, Inf))") + println("FEType = $FEType $(broken ? "broken" : "") $AT | ndofs = $(FES.ndofs) | order = $order | error = $(norm(error, Inf))") return @test norm(error) < tolerance end diff --git a/test/test_operators.jl b/test/test_operators.jl index 8ac6953..96a486c 100644 --- a/test/test_operators.jl +++ b/test/test_operators.jl @@ -32,6 +32,7 @@ function test_derivatives2D() ## define P2-Courant finite element space FEType = H1P2{2, 2} FES = FESpace{FEType}(xgrid) + @show FES ## get midpoint quadrature rule for constants qf = QuadratureRule{Float64, Triangle2D}(0) @@ -113,6 +114,7 @@ function test_derivatives3D() ## define P2-Courant finite element space FEType = H1P2{3, 3} FES = FESpace{FEType}(xgrid) + @show FES ## get midpoint quadrature rule for constants qf = QuadratureRule{Float64, Tetrahedron3D}(0) diff --git a/test/test_pointevaluator.jl b/test/test_pointevaluator.jl index a905a6b..82bf474 100644 --- a/test/test_pointevaluator.jl +++ b/test/test_pointevaluator.jl @@ -17,6 +17,7 @@ function test_pointevaluation2D() Iu = FEVector(FES) interpolate!(Iu[1], (result, qpinfo) -> (result[1] = qpinfo.x[1] + qpinfo.x[2])) PE = PointEvaluator([(1, Identity)]) + @show PE initialize!(PE, Iu) CF = CellFinder(xgrid) eval = zeros(Float64, 1) @@ -38,6 +39,7 @@ function test_pointevaluation3D() Iu = FEVector(FES) interpolate!(Iu[1], (result, qpinfo) -> (result[1] = qpinfo.x[1] + qpinfo.x[2] + qpinfo.x[3])) PE = PointEvaluator([(1, Identity)]) + @show PE initialize!(PE, Iu) CF = CellFinder(xgrid) eval = zeros(Float64, 1) diff --git a/test/test_quadrature.jl b/test/test_quadrature.jl index 403f5bc..60e82c4 100644 --- a/test/test_quadrature.jl +++ b/test/test_quadrature.jl @@ -17,6 +17,7 @@ function run_quadrature_tests() for order in 1:maxorder1D integrand, exactvalue = exact_function(Val(1), order) qf = QuadratureRule{Float64, Edge1D}(order) + @show qf quadvalue = integrate(xgrid, ON_CELLS, integrand, length(exactvalue); force_quadrature_rule = qf) println("EG = Edge1D | order = $order ($(qf.name), $(length(qf.w)) points) | error = $(quadvalue - exactvalue)") @test isapprox(quadvalue, exactvalue) @@ -30,6 +31,7 @@ function run_quadrature_tests() for order in 1:maxorder2D[j] integrand, exactvalue = exact_function(Val(2), order) qf = QuadratureRule{Float64, EG}(order) + @show qf quadvalue = integrate(xgrid, ON_CELLS, integrand, length(exactvalue); force_quadrature_rule = qf) println("EG = $EG | order = $order ($(qf.name), $(length(qf.w)) points) | error = $(quadvalue - exactvalue)") @test isapprox(quadvalue, exactvalue) @@ -44,6 +46,7 @@ function run_quadrature_tests() for order in 1:maxorder3D[j] integrand, exactvalue = exact_function(Val(3), order) qf = QuadratureRule{Float64, EG}(order) + @show qf quadvalue = integrate(xgrid, ON_CELLS, integrand, length(exactvalue); force_quadrature_rule = qf) println("EG = $EG | order = $order ($(qf.name), $(length(qf.w)) points) | error = $(quadvalue - exactvalue)") @test isapprox(quadvalue, exactvalue) diff --git a/test/test_segmentintegrator.jl b/test/test_segmentintegrator.jl index 08a9b2a..cccda7b 100644 --- a/test/test_segmentintegrator.jl +++ b/test/test_segmentintegrator.jl @@ -19,6 +19,7 @@ function test_segmentintegrator_nokernel() ## init segment integrator SI = SegmentIntegrator(Edge1D, [(1, Identity)]) initialize!(SI, uh) + @show SI ## integrate along line [1/4,1/4] to [3/4,1/4] in first triangle ## exact integral should be [3//32,0] @@ -65,6 +66,7 @@ function test_segmentintegrator_withkernel() ## init segment integrator SI = SegmentIntegrator(Edge1D, multiply_r!, [(1, Identity)]; bonus_quadorder = 1) initialize!(SI, uh) + @show SI @show xgrid[Coordinates], xgrid[CellNodes] From a3e68df42fe3ea83fe8b4a0420a6df0c59c6efc7 Mon Sep 17 00:00:00 2001 From: Christian Merdon Date: Wed, 9 Jul 2025 10:09:29 +0200 Subject: [PATCH 3/4] updated changelog, version bump to 1.3 --- CHANGELOG.md | 3 ++- Project.toml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4edf354..1ef22c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,9 @@ # CHANGES -## v1.2.1 July 09, 2025 +## v1.3.0 July 09, 2025 - some bugfixes related to new template parameter from 1.2.0 - @show of FEVectorBlock does not crash anymore + - added show functions for FEBasisEvaluator, PointEvaluator, SegmentEvaluator ## v1.2.0 July 07, 2025 - major documentation and docstring overhaul diff --git a/Project.toml b/Project.toml index 77951b1..c55333d 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "ExtendableFEMBase" uuid = "12fb9182-3d4c-4424-8fd1-727a0899810c" authors = ["Christian Merdon ", "Patrick Jaap "] -version = "1.2.1" +version = "1.3.0" [deps] DiffResults = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" From d153e254d0fcc8ce85f9fc6f0379efcb5d7c0826 Mon Sep 17 00:00:00 2001 From: Christian Merdon Date: Wed, 9 Jul 2025 12:05:21 +0200 Subject: [PATCH 4/4] show(devnull, obj) --- test/runtests.jl | 1 - test/test_febasis.jl | 2 +- test/test_fematrix_and_vector.jl | 10 +++++----- test/test_interpolators.jl | 4 ++-- test/test_operators.jl | 4 ++-- test/test_pointevaluator.jl | 4 ++-- test/test_quadrature.jl | 6 +++--- test/test_segmentintegrator.jl | 6 ++---- 8 files changed, 17 insertions(+), 20 deletions(-) diff --git a/test/runtests.jl b/test/runtests.jl index 9341ff0..9b85cd5 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -6,7 +6,6 @@ using ExampleJuggler using SparseArrays using Aqua - @testset "Aqua.jl" begin Aqua.test_all( ExtendableFEMBase; diff --git a/test/test_febasis.jl b/test/test_febasis.jl index 37ddc77..1276af3 100644 --- a/test/test_febasis.jl +++ b/test/test_febasis.jl @@ -23,7 +23,7 @@ end function test_vertex_values(EG, FEType, order) qf = VertexRule(EG, order; T = Rational{Int}) - @show qf + show(devnull, qf) basis = get_basis(ON_CELLS, FEType, EG) ndofs = get_ndofs(ON_CELLS, FEType, EG) basis_vals = zeros(Rational{Int}, ndofs, 1) diff --git a/test/test_fematrix_and_vector.jl b/test/test_fematrix_and_vector.jl index 6a6bd2c..53843f8 100644 --- a/test/test_fematrix_and_vector.jl +++ b/test/test_fematrix_and_vector.jl @@ -7,26 +7,26 @@ function run_fematrix_tests() println("===========================") xgrid = simplexgrid(0:0.1:1, 0:0.1:1) FES1 = FESpace{H1Pk{1, 1, 1}}(xgrid) - @show FES1 + show(devnull, FES1) FES2 = FESpace{H1Pk{1, 1, 2}}(xgrid) - @show FES2 + show(devnull, FES2) A = FEMatrix(FES1, FES2) @test size(A.entries) == (FES1.ndofs, FES2.ndofs) @test size(A[1, 1]) == (FES1.ndofs, FES2.ndofs) - @show A + show(devnull, A) B = FEMatrix([FES1, FES2]) @test length(B) == 4 @test size(B.entries) == (FES1.ndofs + FES2.ndofs, FES1.ndofs + FES2.ndofs) @test size(B[1, 2]) == (FES1.ndofs, FES2.ndofs) - @show B + show(devnull, B) C = FEMatrix([FES2, FES2], [FES1, FES1]) @test length(C) == 4 @test size(C.entries) == (2 * FES2.ndofs, 2 * FES1.ndofs) @test size(C[1, 2]) == (FES2.ndofs, FES1.ndofs) C.entries.cscmatrix = sprand(2 * FES2.ndofs, 2 * FES1.ndofs, 0.5) - @show C + show(devnull, C) b = FEVector([FES1, FES2]) b.entries .= rand(FES1.ndofs + FES2.ndofs) diff --git a/test/test_interpolators.jl b/test/test_interpolators.jl index 292d58a..c8ef9b1 100644 --- a/test/test_interpolators.jl +++ b/test/test_interpolators.jl @@ -73,7 +73,7 @@ function run_interpolator_tests() QP = QPInfos(xgrid) qf = VertexRule(EG, order) FEB = FEEvaluator(FES, Identity, qf) - @show FEB + show(devnull, FEB) for cell::Int in cells update_trafo!(L2G, cell) update_basis!(FEB, cell) @@ -106,7 +106,7 @@ function run_interpolator_tests() # interpolate Solution = FEVector(FES) interpolate!(Solution[1], u; bonus_quadorder = order) - @show Solution + show(devnull, Solution) # compute error error = compute_error(Solution[1], u, order) diff --git a/test/test_operators.jl b/test/test_operators.jl index 96a486c..d79df05 100644 --- a/test/test_operators.jl +++ b/test/test_operators.jl @@ -32,7 +32,7 @@ function test_derivatives2D() ## define P2-Courant finite element space FEType = H1P2{2, 2} FES = FESpace{FEType}(xgrid) - @show FES + show(devnull, FES) ## get midpoint quadrature rule for constants qf = QuadratureRule{Float64, Triangle2D}(0) @@ -114,7 +114,7 @@ function test_derivatives3D() ## define P2-Courant finite element space FEType = H1P2{3, 3} FES = FESpace{FEType}(xgrid) - @show FES + show(devnull, FES) ## get midpoint quadrature rule for constants qf = QuadratureRule{Float64, Tetrahedron3D}(0) diff --git a/test/test_pointevaluator.jl b/test/test_pointevaluator.jl index 82bf474..8602ec7 100644 --- a/test/test_pointevaluator.jl +++ b/test/test_pointevaluator.jl @@ -17,7 +17,7 @@ function test_pointevaluation2D() Iu = FEVector(FES) interpolate!(Iu[1], (result, qpinfo) -> (result[1] = qpinfo.x[1] + qpinfo.x[2])) PE = PointEvaluator([(1, Identity)]) - @show PE + show(devnull, PE) initialize!(PE, Iu) CF = CellFinder(xgrid) eval = zeros(Float64, 1) @@ -39,7 +39,7 @@ function test_pointevaluation3D() Iu = FEVector(FES) interpolate!(Iu[1], (result, qpinfo) -> (result[1] = qpinfo.x[1] + qpinfo.x[2] + qpinfo.x[3])) PE = PointEvaluator([(1, Identity)]) - @show PE + show(devnull, PE) initialize!(PE, Iu) CF = CellFinder(xgrid) eval = zeros(Float64, 1) diff --git a/test/test_quadrature.jl b/test/test_quadrature.jl index 60e82c4..f7fb8fd 100644 --- a/test/test_quadrature.jl +++ b/test/test_quadrature.jl @@ -17,7 +17,7 @@ function run_quadrature_tests() for order in 1:maxorder1D integrand, exactvalue = exact_function(Val(1), order) qf = QuadratureRule{Float64, Edge1D}(order) - @show qf + show(devnull, qf) quadvalue = integrate(xgrid, ON_CELLS, integrand, length(exactvalue); force_quadrature_rule = qf) println("EG = Edge1D | order = $order ($(qf.name), $(length(qf.w)) points) | error = $(quadvalue - exactvalue)") @test isapprox(quadvalue, exactvalue) @@ -31,7 +31,7 @@ function run_quadrature_tests() for order in 1:maxorder2D[j] integrand, exactvalue = exact_function(Val(2), order) qf = QuadratureRule{Float64, EG}(order) - @show qf + show(devnull, qf) quadvalue = integrate(xgrid, ON_CELLS, integrand, length(exactvalue); force_quadrature_rule = qf) println("EG = $EG | order = $order ($(qf.name), $(length(qf.w)) points) | error = $(quadvalue - exactvalue)") @test isapprox(quadvalue, exactvalue) @@ -46,7 +46,7 @@ function run_quadrature_tests() for order in 1:maxorder3D[j] integrand, exactvalue = exact_function(Val(3), order) qf = QuadratureRule{Float64, EG}(order) - @show qf + show(devnull, qf) quadvalue = integrate(xgrid, ON_CELLS, integrand, length(exactvalue); force_quadrature_rule = qf) println("EG = $EG | order = $order ($(qf.name), $(length(qf.w)) points) | error = $(quadvalue - exactvalue)") @test isapprox(quadvalue, exactvalue) diff --git a/test/test_segmentintegrator.jl b/test/test_segmentintegrator.jl index cccda7b..fdb47b2 100644 --- a/test/test_segmentintegrator.jl +++ b/test/test_segmentintegrator.jl @@ -19,7 +19,7 @@ function test_segmentintegrator_nokernel() ## init segment integrator SI = SegmentIntegrator(Edge1D, [(1, Identity)]) initialize!(SI, uh) - @show SI + show(devnull, SI) ## integrate along line [1/4,1/4] to [3/4,1/4] in first triangle ## exact integral should be [3//32,0] @@ -66,9 +66,7 @@ function test_segmentintegrator_withkernel() ## init segment integrator SI = SegmentIntegrator(Edge1D, multiply_r!, [(1, Identity)]; bonus_quadorder = 1) initialize!(SI, uh) - @show SI - - @show xgrid[Coordinates], xgrid[CellNodes] + show(devnull, SI) L2G = L2GTransformer(Triangle2D, xgrid, ON_CELLS) update_trafo!(L2G, 1)