Skip to content

Commit 1794d05

Browse files
committed
Enable solving multi-domain problems involving codim-1 submeshes
1 parent 46b75a8 commit 1794d05

File tree

20 files changed

+1118
-129
lines changed

20 files changed

+1118
-129
lines changed

.github/workflows/core.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ jobs:
211211
--extra-index-url https://download.pytorch.org/whl/cpu \
212212
"$(echo ./firedrake-repo/dist/firedrake-*.tar.gz)[ci]"
213213
214+
pip uninstall firedrake-fiat -y; pip cache remove firedrake_fiat; pip install git+https://github.com/firedrakeproject/fiat.git@ksagiyam/introduce_mixed_map_mixed_cell
215+
pip uninstall fenics-ufl -y; pip cache remove fenics-ufl; pip install git+https://github.com/firedrakeproject/ufl.git@ksagiyam/introduce_mixed_map_mixed_cell
216+
214217
firedrake-clean
215218
pip list
216219

firedrake/assemble.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1627,6 +1627,7 @@ def __init__(self, form, local_knl, subdomain_id, all_integer_subdomain_ids, dia
16271627
self._constants = _FormHandler.iter_constants(form, local_knl.kinfo)
16281628
self._active_exterior_facets = _FormHandler.iter_active_exterior_facets(form, local_knl.kinfo)
16291629
self._active_interior_facets = _FormHandler.iter_active_interior_facets(form, local_knl.kinfo)
1630+
self._active_orientations_cell = _FormHandler.iter_active_orientations_cell(form, local_knl.kinfo)
16301631
self._active_orientations_exterior_facet = _FormHandler.iter_active_orientations_exterior_facet(form, local_knl.kinfo)
16311632
self._active_orientations_interior_facet = _FormHandler.iter_active_orientations_interior_facet(form, local_knl.kinfo)
16321633

@@ -1649,6 +1650,7 @@ def build(self):
16491650
assert_empty(self._constants)
16501651
assert_empty(self._active_exterior_facets)
16511652
assert_empty(self._active_interior_facets)
1653+
assert_empty(self._active_orientations_cell)
16521654
assert_empty(self._active_orientations_exterior_facet)
16531655
assert_empty(self._active_orientations_interior_facet)
16541656

@@ -1846,6 +1848,17 @@ def _as_global_kernel_arg_interior_facet(_, self):
18461848
return op2.DatKernelArg((2,), m._global_kernel_arg)
18471849

18481850

1851+
@_as_global_kernel_arg.register(kernel_args.OrientationsCellKernelArg)
1852+
def _(_, self):
1853+
mesh = next(self._active_orientations_cell)
1854+
if mesh is self._mesh:
1855+
return op2.DatKernelArg((1,))
1856+
else:
1857+
m, integral_type = mesh.topology.trans_mesh_entity_map(self._mesh.topology, self._integral_type, self._subdomain_id, self._all_integer_subdomain_ids)
1858+
assert integral_type == "cell"
1859+
return op2.DatKernelArg((1,), m._global_kernel_arg)
1860+
1861+
18491862
@_as_global_kernel_arg.register(kernel_args.OrientationsExteriorFacetKernelArg)
18501863
def _(_, self):
18511864
mesh = next(self._active_orientations_exterior_facet)
@@ -1917,6 +1930,7 @@ def __init__(self, form, bcs, local_knl, subdomain_id,
19171930
self._constants = _FormHandler.iter_constants(form, local_knl.kinfo)
19181931
self._active_exterior_facets = _FormHandler.iter_active_exterior_facets(form, local_knl.kinfo)
19191932
self._active_interior_facets = _FormHandler.iter_active_interior_facets(form, local_knl.kinfo)
1933+
self._active_orientations_cell = _FormHandler.iter_active_orientations_cell(form, local_knl.kinfo)
19201934
self._active_orientations_exterior_facet = _FormHandler.iter_active_orientations_exterior_facet(form, local_knl.kinfo)
19211935
self._active_orientations_interior_facet = _FormHandler.iter_active_orientations_interior_facet(form, local_knl.kinfo)
19221936

@@ -2182,6 +2196,17 @@ def _as_parloop_arg_interior_facet(_, self):
21822196
return op2.DatParloopArg(mesh.interior_facets.local_facet_dat, m)
21832197

21842198

2199+
@_as_parloop_arg.register(kernel_args.OrientationsCellKernelArg)
2200+
def _(_, self):
2201+
mesh = next(self._active_orientations_cell)
2202+
if mesh is self._mesh:
2203+
m = None
2204+
else:
2205+
m, integral_type = mesh.topology.trans_mesh_entity_map(self._mesh.topology, self._integral_type, self._subdomain_id, self._all_integer_subdomain_ids)
2206+
assert integral_type == "cell"
2207+
return op2.DatParloopArg(mesh.local_cell_orientation_dat, m)
2208+
2209+
21852210
@_as_parloop_arg.register(kernel_args.OrientationsExteriorFacetKernelArg)
21862211
def _(_, self):
21872212
mesh = next(self._active_orientations_exterior_facet)
@@ -2278,6 +2303,14 @@ def iter_active_interior_facets(form, kinfo):
22782303
mesh = all_meshes[i]
22792304
yield mesh
22802305

2306+
@staticmethod
2307+
def iter_active_orientations_cell(form, kinfo):
2308+
"""Yield the form cell orientations referenced in ``kinfo``."""
2309+
all_meshes = extract_domains(form)
2310+
for i in kinfo.active_domain_numbers.orientations_cell:
2311+
mesh = all_meshes[i]
2312+
yield mesh
2313+
22812314
@staticmethod
22822315
def iter_active_orientations_exterior_facet(form, kinfo):
22832316
"""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)