I am trying to interpolate data from a mixed finite element function space on one mesh to another function space on a finer mesh. However, my code fails when attempting to interpolate using f1.sub(0).interpolate(f2.sub(0), nmm_interpolation_data=...)
, while a similar setup works fine for scalar function spaces.
Below is a minimal reproducible example: (dolfinx version is 0.7.2)
from mpi4py import MPI
from dolfinx import fem
from dolfinx.mesh import create_rectangle
from dolfinx.io import XDMFFile
import ufl
domain1 = create_rectangle(MPI.COMM_WORLD, [(0,0),(12.5e-3,12.5e-3)], (10,10))
domain2 = create_rectangle(MPI.COMM_WORLD, [(0,0),(12.5e-3,12.5e-3)], (200,200))
e1 = ufl.FiniteElement("Lagrange", domain1.ufl_cell(), 1)
element_V1 = ufl.MixedElement([e1, e1])
V1 = fem.FunctionSpace(domain1, element_V1)
e2 = ufl.FiniteElement("Lagrange", domain2.ufl_cell(), 1)
element_V2 = ufl.MixedElement([e2, e2])
V2 = fem.FunctionSpace(domain2, element_V2)
f1 = fem.Function(V1)
f2 = fem.Function(V2)
f1.sub(0).interpolate(lambda x: x[0]*2+x[1])
f2.sub(0).interpolate(f1.sub(0).collapse(), nmm_interpolation_data=fem.create_nonmatching_meshes_interpolation_data(
f1.sub(0).collapse().function_space.mesh._cpp_object,
f1.sub(0).collapse().function_space.element,
f2.sub(0).collapse().function_space.mesh._cpp_object,
padding = 1e-14))
with XDMFFile(MPI.COMM_WORLD, "data2D.xdmf", "w") as ufile_xdmf:
ufile_xdmf.write_mesh(domain2)
ufile_xdmf.write_function(f2.sub(0))
There are the following error prompts:
Loguru caught a signal: SIGSEGV
Stack trace:
26 0x5624c9f0bf25 _start + 37
25 0x7fd317e67e40 __libc_start_main + 128
24 0x7fd317e67d90 /lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7fd317e67d90]
23 0x5624c9f0c02d Py_BytesMain + 45
22 0x5624c9f35a5e Py_RunMain + 702
21 0x5624c9f42f83 _PyRun_AnyFileObject + 67
20 0x5624c9f43338 _PyRun_SimpleFileObject + 424
19 0x5624c9f43e55 /bin/python3(+0x25fe55) [0x5624c9f43e55]
18 0x5624c9f3d9cb /bin/python3(+0x2599cb) [0x5624c9f3d9cb]
17 0x5624c9f44108 /bin/python3(+0x260108) [0x5624c9f44108]
16 0x5624c9f19256 PyEval_EvalCode + 134
15 0x5624c9e239c6 /bin/python3(+0x13f9c6) [0x5624c9e239c6]
14 0x5624c9e2853c _PyEval_EvalFrameDefault + 6540
13 0x5624c9e4c7f1 /bin/python3(+0x1687f1) [0x5624c9e4c7f1]
12 0x5624c9e2726d _PyEval_EvalFrameDefault + 1725
11 0x5624c9e3e9fc _PyFunction_Vectorcall + 124
10 0x5624c9e295d7 _PyEval_EvalFrameDefault + 10791
9 0x5624c9e3e9fc _PyFunction_Vectorcall + 124
8 0x5624c9e2ccfa _PyEval_EvalFrameDefault + 24906
7 0x5624c9e4cacb /bin/python3(+0x168acb) [0x5624c9e4cacb]
6 0x5624c9e34a7b _PyObject_MakeTpCall + 603
5 0x5624c9e3e10e /bin/python3(+0x15a10e) [0x5624c9e3e10e]
4 0x7fd30c0d55dc /usr/local/dolfinx-real/lib/python3.10/dist-packages/dolfinx/cpp.cpython-310-x86_64-linux-gnu.so(+0xb25dc) [0x7fd30c0d55dc]
3 0x7fd30c19afc4 /usr/local/dolfinx-real/lib/python3.10/dist-packages/dolfinx/cpp.cpython-310-x86_64-linux-gnu.so(+0x177fc4) [0x7fd30c19afc4]
2 0x7fd30c17eb2c /usr/local/dolfinx-real/lib/python3.10/dist-packages/dolfinx/cpp.cpython-310-x86_64-linux-gnu.so(+0x15bb2c) [0x7fd30c17eb2c]
1 0x7fd30c34e567 /usr/local/dolfinx-real/lib/python3.10/dist-packages/dolfinx/cpp.cpython-310-x86_64-linux-gnu.so(+0x32b567) [0x7fd30c34e567]
0 0x7fd317e80520 /lib/x86_64-linux-gnu/libc.so.6(+0x42520) [0x7fd317e80520]
2025-04-04 19:33:29.024 ( 0.297s) [main ] :0 FATL| Signal: SIGSEGV
Segmentation fault (core dumped)
If I use scalar function spaces instead of MixedElement
as below, the interpolation works without issues:
from mpi4py import MPI
from dolfinx import fem
from dolfinx.mesh import create_rectangle
from dolfinx.io import XDMFFile
domain = create_rectangle(MPI.COMM_WORLD, [(0,0),(12.5e-3,12.5e-3)], (500,500))
domain1 = create_rectangle(MPI.COMM_WORLD, [(0,0),(12.5e-3,12.5e-3)], (200,200))
V = fem.functionspace(domain, ("Lagrange", 1))
V1 = fem.functionspace(domain1, ("Lagrange", 1))
f = fem.Function(V)
f1 = fem.Function(V1)
f.interpolate(lambda x: x[0]*2+x[1])
f1.interpolate(f, nmm_interpolation_data=fem.create_nonmatching_meshes_interpolation_data(
f1.function_space.mesh._cpp_object,
f1.function_space.element,
f.function_space.mesh._cpp_object,
padding = 1e-14))
with XDMFFile(MPI.COMM_WORLD, "data2D.xdmf", "w") as ufile_xdmf:
ufile_xdmf.write_mesh(domain1)
ufile_xdmf.write_function(f1)
Any guidance would be greatly appreciated.