From 1a17d40d3110fb5c058f75bea2de4366f5fa96e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Mas=C3=B3?= Date: Tue, 25 Aug 2026 15:59:52 +0200 Subject: [PATCH 1/2] Added `interpolate_L2_field` --- .../ComputationalModels.jl | 3 +++ src/ComputationalModels/PostProcessors.jl | 20 ++++++++++++++++++- src/Exports.jl | 2 ++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/ComputationalModels/ComputationalModels.jl b/src/ComputationalModels/ComputationalModels.jl index b27f582..c2188ee 100644 --- a/src/ComputationalModels/ComputationalModels.jl +++ b/src/ComputationalModels/ComputationalModels.jl @@ -85,5 +85,8 @@ export reset! export interpolate_L2_tensor export interpolate_L2_vector export interpolate_L2_scalar +export interpolate_L2_field +export L2_projection export L2_Projection + end diff --git a/src/ComputationalModels/PostProcessors.jl b/src/ComputationalModels/PostProcessors.jl index 986b606..96f2a76 100644 --- a/src/ComputationalModels/PostProcessors.jl +++ b/src/ComputationalModels/PostProcessors.jl @@ -194,9 +194,27 @@ function interpolate_L2_scalar(x, Ω, dΩ, Γ=Ω) end -function L2_Projection(u, dΩ, V) +""" +Interpolate an L2 field into an H1 field. +""" +function interpolate_L2_field(x, Ω, dΩ, valuetype) + refL2 = ReferenceFE(lagrangian, valuetype, 0) + reffe = ReferenceFE(lagrangian, valuetype, 1) + VL2 = FESpace(Ω, refL2, conformity=:L2) + VH1 = FESpace(Ω, reffe, conformity=:H1) + interpolate_everywhere(L2_projection(x, dΩ, VL2), VH1) +end + + +""" +Perform an L2 projection of a function `u` onto a finite element +space `V` defined over the domain `Ω` with measure `dΩ`. +""" +function L2_projection(u, dΩ, V) a(w, v) = ∫(w ⊙ v) * dΩ l(v) = ∫(v ⊙ u) * dΩ op = AffineFEOperator(a, l, V, V) solve(op) end + +L2_Projection = L2_projection diff --git a/src/Exports.jl b/src/Exports.jl index ad033c4..0417462 100644 --- a/src/Exports.jl +++ b/src/Exports.jl @@ -165,6 +165,8 @@ end @publish ComputationalModels InterpolableBC @publish ComputationalModels InterpolableBC! @publish ComputationalModels TrialFESpace! # Exporting internal function of Gridap +@publish ComputationalModels interpolate_L2_field +@publish ComputationalModels L2_projection @publish ComputationalModels L2_Projection @publish DiscreteModeling CartesianTags From 27477190aa3d60765007c0981fa290e5bb0052a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Mas=C3=B3?= Date: Tue, 25 Aug 2026 16:46:03 +0200 Subject: [PATCH 2/2] inferring field type --- src/ComputationalModels/PostProcessors.jl | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/ComputationalModels/PostProcessors.jl b/src/ComputationalModels/PostProcessors.jl index 96f2a76..5a9b5e5 100644 --- a/src/ComputationalModels/PostProcessors.jl +++ b/src/ComputationalModels/PostProcessors.jl @@ -194,12 +194,21 @@ function interpolate_L2_scalar(x, Ω, dΩ, Γ=Ω) end +function get_cell_field_type(f::CellField, dΩ::Measure) + pts = get_cell_points(dΩ) + f_x = f(pts) + T = eltype(Gridap.Arrays.testitem(f_x)) + return T +end + + """ Interpolate an L2 field into an H1 field. +The type of the field is inferred from the cell field `x` and the measure `dΩ`. """ -function interpolate_L2_field(x, Ω, dΩ, valuetype) - refL2 = ReferenceFE(lagrangian, valuetype, 0) - reffe = ReferenceFE(lagrangian, valuetype, 1) +function interpolate_L2_field(x, Ω, dΩ, T::Type=get_cell_field_type(x, dΩ)) + refL2 = ReferenceFE(lagrangian, T, 0) + reffe = ReferenceFE(lagrangian, T, 1) VL2 = FESpace(Ω, refL2, conformity=:L2) VH1 = FESpace(Ω, reffe, conformity=:H1) interpolate_everywhere(L2_projection(x, dΩ, VL2), VH1)