Skip to content

Commit a48c2a6

Browse files
committed
submesh: introduce CellSequence
1 parent edc2ac2 commit a48c2a6

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
@@ -210,6 +210,9 @@ jobs:
210210
--extra-index-url https://download.pytorch.org/whl/cpu \
211211
"$(echo ./firedrake-repo/dist/firedrake-*.tar.gz)[ci]"
212212
213+
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
214+
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
215+
213216
firedrake-clean
214217
pip list
215218

firedrake/assemble.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1618,6 +1618,7 @@ def __init__(self, form, local_knl, subdomain_id, all_integer_subdomain_ids, dia
16181618
self._constants = _FormHandler.iter_constants(form, local_knl.kinfo)
16191619
self._active_exterior_facets = _FormHandler.iter_active_exterior_facets(form, local_knl.kinfo)
16201620
self._active_interior_facets = _FormHandler.iter_active_interior_facets(form, local_knl.kinfo)
1621+
self._active_orientations_cell = _FormHandler.iter_active_orientations_cell(form, local_knl.kinfo)
16211622
self._active_orientations_exterior_facet = _FormHandler.iter_active_orientations_exterior_facet(form, local_knl.kinfo)
16221623
self._active_orientations_interior_facet = _FormHandler.iter_active_orientations_interior_facet(form, local_knl.kinfo)
16231624

@@ -1640,6 +1641,7 @@ def build(self):
16401641
assert_empty(self._constants)
16411642
assert_empty(self._active_exterior_facets)
16421643
assert_empty(self._active_interior_facets)
1644+
assert_empty(self._active_orientations_cell)
16431645
assert_empty(self._active_orientations_exterior_facet)
16441646
assert_empty(self._active_orientations_interior_facet)
16451647

@@ -1837,6 +1839,17 @@ def _as_global_kernel_arg_interior_facet(_, self):
18371839
return op2.DatKernelArg((2,), m._global_kernel_arg)
18381840

18391841

1842+
@_as_global_kernel_arg.register(kernel_args.OrientationsCellKernelArg)
1843+
def _(_, self):
1844+
mesh = next(self._active_orientations_cell)
1845+
if mesh is self._mesh:
1846+
return op2.DatKernelArg((1,))
1847+
else:
1848+
m, integral_type = mesh.topology.trans_mesh_entity_map(self._mesh.topology, self._integral_type, self._subdomain_id, self._all_integer_subdomain_ids)
1849+
assert integral_type == "cell"
1850+
return op2.DatKernelArg((1,), m._global_kernel_arg)
1851+
1852+
18401853
@_as_global_kernel_arg.register(kernel_args.OrientationsExteriorFacetKernelArg)
18411854
def _(_, self):
18421855
mesh = next(self._active_orientations_exterior_facet)
@@ -1908,6 +1921,7 @@ def __init__(self, form, bcs, local_knl, subdomain_id,
19081921
self._constants = _FormHandler.iter_constants(form, local_knl.kinfo)
19091922
self._active_exterior_facets = _FormHandler.iter_active_exterior_facets(form, local_knl.kinfo)
19101923
self._active_interior_facets = _FormHandler.iter_active_interior_facets(form, local_knl.kinfo)
1924+
self._active_orientations_cell = _FormHandler.iter_active_orientations_cell(form, local_knl.kinfo)
19111925
self._active_orientations_exterior_facet = _FormHandler.iter_active_orientations_exterior_facet(form, local_knl.kinfo)
19121926
self._active_orientations_interior_facet = _FormHandler.iter_active_orientations_interior_facet(form, local_knl.kinfo)
19131927

@@ -2173,6 +2187,17 @@ def _as_parloop_arg_interior_facet(_, self):
21732187
return op2.DatParloopArg(mesh.interior_facets.local_facet_dat, m)
21742188

21752189

2190+
@_as_parloop_arg.register(kernel_args.OrientationsCellKernelArg)
2191+
def _(_, self):
2192+
mesh = next(self._active_orientations_cell)
2193+
if mesh is self._mesh:
2194+
m = None
2195+
else:
2196+
m, integral_type = mesh.topology.trans_mesh_entity_map(self._mesh.topology, self._integral_type, self._subdomain_id, self._all_integer_subdomain_ids)
2197+
assert integral_type == "cell"
2198+
return op2.DatParloopArg(mesh.local_cell_orientation_dat, m)
2199+
2200+
21762201
@_as_parloop_arg.register(kernel_args.OrientationsExteriorFacetKernelArg)
21772202
def _(_, self):
21782203
mesh = next(self._active_orientations_exterior_facet)
@@ -2269,6 +2294,14 @@ def iter_active_interior_facets(form, kinfo):
22692294
mesh = all_meshes[i]
22702295
yield mesh
22712296

2297+
@staticmethod
2298+
def iter_active_orientations_cell(form, kinfo):
2299+
"""Yield the form cell orientations referenced in ``kinfo``."""
2300+
all_meshes = extract_domains(form)
2301+
for i in kinfo.active_domain_numbers.orientations_cell:
2302+
mesh = all_meshes[i]
2303+
yield mesh
2304+
22722305
@staticmethod
22732306
def iter_active_orientations_exterior_facet(form, kinfo):
22742307
"""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
@@ -1200,7 +1200,7 @@ def get_interp_node_map(source_mesh, target_mesh, fs):
12001200
else:
12011201
raise ValueError("Have coefficient with unexpected mesh")
12021202
else:
1203-
m_ = fs.entity_node_map(target_mesh.topology, "cell", None, None)
1203+
m_ = fs.entity_node_map(target_mesh.topology, "cell", "everywhere", None)
12041204
return m_
12051205

12061206

0 commit comments

Comments
 (0)