Hi,
I took me while but I understood how to use entity_maps. But now I can compute form_a corresponding to a = ufl.inner(ufl.grad(u) * fa, ufl.grad(v)) * ds in the example below.
However, I don’t know how to compute form_b (see again in the example below) corresponding to b = ufl.inner(ufl.grad(u) * fa, ufl.grad(v)) * ds + ufl.inner(u, v) * dx, the following code raises the error when creating form_b:
Point dim (2) does not match element dim (1).
import dolfinx
from mpi4py import MPI
import numpy as np
from dolfinx.fem.petsc import assemble_matrix
import ufl
msh = dolfinx.mesh.create_rectangle(comm=MPI.COMM_WORLD, points=((0.0, 0.0), (2.0, 1.0)), n=(5, 1), cell_type=dolfinx.mesh.CellType.quadrilateral)
gdim = msh.geometry.dim
dx = ufl.Measure('dx', domain=msh)
ds = ufl.Measure('ds', domain=msh)
V = dolfinx.fem.functionspace(msh, ("DG", 1))
u = ufl.TrialFunction(V)
v = ufl.TestFunction(V)
def compute_facet_area(mesh):
gdim = mesh.geometry.dim
bdry_facets = dolfinx.mesh.locate_entities(mesh, gdim-1, lambda x: np.full_like(x[0], 1, dtype=np.int8))
submesh_facets, entity_map, _, _ = dolfinx.mesh.create_submesh(mesh, gdim-1, bdry_facets)
dx_e = ufl.Measure("dx", domain=submesh_facets, metadata={"quadrature_degree": 20})
DG0 = dolfinx.fem.functionspace(submesh_facets, ("DG", 0))
fa = dolfinx.fem.Function(DG0)
v = ufl.TestFunction(DG0)
fa.x.array[:] = dolfinx.fem.petsc.assemble_vector(dolfinx.fem.form(v * dx_e))
fa.x.scatter_forward()
return fa, entity_map
fa, entity_map = compute_facet_area(msh)
a = ufl.inner(ufl.grad(u) * fa, ufl.grad(v)) * ds
form_a = dolfinx.fem.form(a, entity_maps=[entity_map])
b = ufl.inner(ufl.grad(u) * fa, ufl.grad(v)) * ds + ufl.inner(u, v) * dx
# form_b = dolfinx.fem.form(b) # KO
form_b = dolfinx.fem.form(b, entity_maps=[entity_map]) # KO