Skip to content

Commit 4dc066b

Browse files
Enable solving multi-domain problems involving codim-1 submeshes (#4430)
Co-authored-by: Connor Ward <[email protected]>
1 parent f084c21 commit 4dc066b

19 files changed

+1102
-129
lines changed

firedrake/assemble.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1661,6 +1661,7 @@ def __init__(self, form, local_knl, subdomain_id, all_integer_subdomain_ids, dia
16611661
self._constants = _FormHandler.iter_constants(form, local_knl.kinfo)
16621662
self._active_exterior_facets = _FormHandler.iter_active_exterior_facets(form, local_knl.kinfo)
16631663
self._active_interior_facets = _FormHandler.iter_active_interior_facets(form, local_knl.kinfo)
1664+
self._active_orientations_cell = _FormHandler.iter_active_orientations_cell(form, local_knl.kinfo)
16641665
self._active_orientations_exterior_facet = _FormHandler.iter_active_orientations_exterior_facet(form, local_knl.kinfo)
16651666
self._active_orientations_interior_facet = _FormHandler.iter_active_orientations_interior_facet(form, local_knl.kinfo)
16661667

@@ -1683,6 +1684,7 @@ def build(self):
16831684
assert_empty(self._constants)
16841685
assert_empty(self._active_exterior_facets)
16851686
assert_empty(self._active_interior_facets)
1687+
assert_empty(self._active_orientations_cell)
16861688
assert_empty(self._active_orientations_exterior_facet)
16871689
assert_empty(self._active_orientations_interior_facet)
16881690

@@ -1880,6 +1882,17 @@ def _as_global_kernel_arg_interior_facet(_, self):
18801882
return op2.DatKernelArg((2,), m._global_kernel_arg)
18811883

18821884

1885+
@_as_global_kernel_arg.register(kernel_args.OrientationsCellKernelArg)
1886+
def _(_, self):
1887+
mesh = next(self._active_orientations_cell)
1888+
if mesh is self._mesh:
1889+
return op2.DatKernelArg((1,))
1890+
else:
1891+
m, integral_type = mesh.topology.trans_mesh_entity_map(self._mesh.topology, self._integral_type, self._subdomain_id, self._all_integer_subdomain_ids)
1892+
assert integral_type == "cell"
1893+
return op2.DatKernelArg((1,), m._global_kernel_arg)
1894+
1895+
18831896
@_as_global_kernel_arg.register(kernel_args.OrientationsExteriorFacetKernelArg)
18841897
def _(_, self):
18851898
mesh = next(self._active_orientations_exterior_facet)
@@ -1951,6 +1964,7 @@ def __init__(self, form, bcs, local_knl, subdomain_id,
19511964
self._constants = _FormHandler.iter_constants(form, local_knl.kinfo)
19521965
self._active_exterior_facets = _FormHandler.iter_active_exterior_facets(form, local_knl.kinfo)
19531966
self._active_interior_facets = _FormHandler.iter_active_interior_facets(form, local_knl.kinfo)
1967+
self._active_orientations_cell = _FormHandler.iter_active_orientations_cell(form, local_knl.kinfo)
19541968
self._active_orientations_exterior_facet = _FormHandler.iter_active_orientations_exterior_facet(form, local_knl.kinfo)
19551969
self._active_orientations_interior_facet = _FormHandler.iter_active_orientations_interior_facet(form, local_knl.kinfo)
19561970

@@ -2216,6 +2230,17 @@ def _as_parloop_arg_interior_facet(_, self):
22162230
return op2.DatParloopArg(mesh.interior_facets.local_facet_dat, m)
22172231

22182232

2233+
@_as_parloop_arg.register(kernel_args.OrientationsCellKernelArg)
2234+
def _(_, self):
2235+
mesh = next(self._active_orientations_cell)
2236+
if mesh is self._mesh:
2237+
m = None
2238+
else:
2239+
m, integral_type = mesh.topology.trans_mesh_entity_map(self._mesh.topology, self._integral_type, self._subdomain_id, self._all_integer_subdomain_ids)
2240+
assert integral_type == "cell"
2241+
return op2.DatParloopArg(mesh.local_cell_orientation_dat, m)
2242+
2243+
22192244
@_as_parloop_arg.register(kernel_args.OrientationsExteriorFacetKernelArg)
22202245
def _(_, self):
22212246
mesh = next(self._active_orientations_exterior_facet)
@@ -2312,6 +2337,14 @@ def iter_active_interior_facets(form, kinfo):
23122337
mesh = all_meshes[i]
23132338
yield mesh
23142339

2340+
@staticmethod
2341+
def iter_active_orientations_cell(form, kinfo):
2342+
"""Yield the form cell orientations referenced in ``kinfo``."""
2343+
all_meshes = extract_domains(form)
2344+
for i in kinfo.active_domain_numbers.orientations_cell:
2345+
mesh = all_meshes[i]
2346+
yield mesh
2347+
23152348
@staticmethod
23162349
def iter_active_orientations_exterior_facet(form, kinfo):
23172350
"""Yield the form exterior facet orientations referenced in ``kinfo``."""

firedrake/embedding.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66

77
def get_embedding_dg_element(element, value_shape, broken_cg=False):
8-
cell = element.cell
8+
cell, = set(element.cell.cells)
99
family = lambda c: "DG" if c.is_simplex else "DQ"
1010
if isinstance(cell, ufl.TensorProductCell):
1111
degree = element.degree()

firedrake/functionspaceimpl.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import ufl
1414
import finat.ufl
1515

16+
from ufl.cell import CellSequence
1617
from ufl.duals import is_dual, is_primal
1718
from pyop2 import op2, mpi
1819
from pyop2.utils import as_tuple
@@ -52,6 +53,9 @@ def check_element(element, top=True):
5253
ValueError
5354
If the element is illegal.
5455
"""
56+
if isinstance(element.cell, CellSequence) and \
57+
type(element) is not finat.ufl.MixedElement:
58+
raise ValueError("MixedElement modifier must be outermost")
5559
if element.cell.cellname == "hexahedron" and \
5660
element.family() not in ["Q", "DQ", "Real"]:
5761
raise NotImplementedError("Currently can only use 'Q', 'DQ', and/or 'Real' elements on hexahedral meshes, not", element.family())

firedrake/interpolation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1198,7 +1198,7 @@ def get_interp_node_map(source_mesh, target_mesh, fs):
11981198
else:
11991199
raise ValueError("Have coefficient with unexpected mesh")
12001200
else:
1201-
m_ = fs.entity_node_map(target_mesh.topology, "cell", None, None)
1201+
m_ = fs.entity_node_map(target_mesh.topology, "cell", "everywhere", None)
12021202
return m_
12031203

12041204

0 commit comments

Comments
 (0)