From 7c4b0a157960ca85b29948c5a4ea782aa6b8ef71 Mon Sep 17 00:00:00 2001 From: jorgensd Date: Fri, 15 May 2026 12:36:57 +0000 Subject: [PATCH 1/2] Simplify pullback of interpolation coordinates from facet in reference cell to reference facet by using an affine cmap. Avoids Newton covergence issues for non-affine problems --- src/scifem/bcs.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/scifem/bcs.py b/src/scifem/bcs.py index 3f08dbe..39d52f5 100644 --- a/src/scifem/bcs.py +++ b/src/scifem/bcs.py @@ -34,23 +34,35 @@ def interpolate_function_onto_facet_dofs( interpolation_points = Q_el.basix_element.x - c_el = domain.ufl_domain().ufl_coordinate_element() - ref_top = c_el.reference_topology - ref_geom = c_el.reference_geometry facet_types = set(basix.cell.subentity_types(domain.basix_cell())[fdim]) assert len(facet_types) == 1, "All facets must have the same topology" # Pull back interpolation points from reference coordinate element to facet reference element + # We create affine versions of each of them as we are in reference mode. + # Then we avoid Newton convergence issues + ref_cmap = basix.ufl.element( + "Lagrange", + domain.basix_cell(), + 1, + shape=(domain.topology.dim,), + dtype=np.float64, + ) + c_el = dolfinx.fem.CoordinateElement( + dolfinx.cpp.fem.CoordinateElement_float64(ref_cmap.basix_element._e) + ) + ref_top = ref_cmap.reference_topology + ref_geom = ref_cmap.reference_geometry facet_cmap = basix.ufl.element( "Lagrange", facet_types.pop(), - c_el.degree, - shape=(domain.geometry.dim,), + 1, + shape=(domain.topology.dim,), dtype=np.float64, ) facet_cel = dolfinx.fem.CoordinateElement( dolfinx.cpp.fem.CoordinateElement_float64(facet_cmap.basix_element._e) ) + reference_facet_points = None for i, points in enumerate(interpolation_points[fdim]): geom = ref_geom[ref_top[fdim][i]] From 9eec6bf1bbf87ed590d1cef76d1e145ab3748908 Mon Sep 17 00:00:00 2001 From: jorgensd Date: Fri, 15 May 2026 12:46:57 +0000 Subject: [PATCH 2/2] Only need reference geom and topology for cell, ot the actual coordinate map --- src/scifem/bcs.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/scifem/bcs.py b/src/scifem/bcs.py index 39d52f5..b657c53 100644 --- a/src/scifem/bcs.py +++ b/src/scifem/bcs.py @@ -47,9 +47,6 @@ def interpolate_function_onto_facet_dofs( shape=(domain.topology.dim,), dtype=np.float64, ) - c_el = dolfinx.fem.CoordinateElement( - dolfinx.cpp.fem.CoordinateElement_float64(ref_cmap.basix_element._e) - ) ref_top = ref_cmap.reference_topology ref_geom = ref_cmap.reference_geometry facet_cmap = basix.ufl.element(