I am following the interpolation process from mesh to submesh as listed at https://github.com/FEniCS/dolfinx/blob/e4439ccca81b976d11c6f606d9c612afcf010a31/python/test/unit/fem/test_interpolation.py#L790. However, the speed of execution is slow. Is there a way to speed up the interpolation?
Are you using the main branch? If so, have a look at:
it fixes a regression that I introduced when making the interpolation more stable.
If you interpolation is from a mesh to a sub mesh and between the same space, there are much faster ways of doing the interpolation than using this operator.
If you provide an example with a built in mesh I can sketch out what I would do
1 Like
No, am using conda version 0.7.1. If by builtin mesh you mean mesh created using dolfinx then yeah.
import dolfinx
import numpy as np
from dolfinx.fem import (Expression, Function, FunctionSpace, assemble_scalar,
create_nonmatching_meshes_interpolation_data, form)
from dolfinx.geometry import bb_tree, compute_collisions_points
from dolfinx.mesh import (CellType, create_mesh, create_rectangle,
create_unit_cube, create_unit_square,
locate_entities, locate_entities_boundary, meshtags)
from mpi4py import MPI
xtype = np.float64
mesh1 = dolfinx.mesh.create_rectangle(comm=MPI.COMM_WORLD,
points=((0.0, 0.0), (1.0, 1.0 )), n=(2, 2),
cell_type=dolfinx.mesh.CellType.quadrilateral,)
def submesh_marker(x):
return x[0] <= 0.5
submesh_entities = dolfinx.mesh.locate_entities(mesh1, mesh1.topology.dim, marker = lambda x: submesh_marker(x))
mesh2 = dolfinx.mesh.create_submesh(mesh1, mesh1.topology.dim, submesh_entities)[0]
# Test interpolation from mesh1 to mesh2
u1 = Function(FunctionSpace(mesh1, ("CG", 1)), name="u1", dtype=xtype)
u2 = Function(FunctionSpace(mesh2, ("CG", 1)), name="u2", dtype=xtype)
def f_test1(x):
return 1.0 - x[0] * x[1]
u1.interpolate(f_test1)
u1.x.scatter_forward()
u1_2_u2_nmm_data = \
create_nonmatching_meshes_interpolation_data(
u2.function_space.mesh._cpp_object,
u2.function_space.element,
u1.function_space.mesh._cpp_object)
u2.interpolate(u1, nmm_interpolation_data=u1_2_u2_nmm_data)
u2.x.scatter_forward()