Skip to content

Commit f6e3b25

Browse files
committed
submesh: introduce CellSequence
1 parent ac4d886 commit f6e3b25

File tree

20 files changed

+1005
-96
lines changed

20 files changed

+1005
-96
lines changed

.github/workflows/core.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,9 @@ jobs:
202202
--extra-index-url https://download.pytorch.org/whl/cpu \
203203
"$(echo ./firedrake-repo/dist/firedrake-*.tar.gz)[ci]"
204204
205+
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
206+
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
207+
205208
firedrake-clean
206209
pip list
207210

firedrake/assemble.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1646,6 +1646,7 @@ def __init__(self, form, local_knl, subdomain_id, all_integer_subdomain_ids, dia
16461646
self._constants = _FormHandler.iter_constants(form, local_knl.kinfo)
16471647
self._active_exterior_facets = _FormHandler.iter_active_exterior_facets(form, local_knl.kinfo)
16481648
self._active_interior_facets = _FormHandler.iter_active_interior_facets(form, local_knl.kinfo)
1649+
self._active_orientations_cell = _FormHandler.iter_active_orientations_cell(form, local_knl.kinfo)
16491650
self._active_orientations_exterior_facet = _FormHandler.iter_active_orientations_exterior_facet(form, local_knl.kinfo)
16501651
self._active_orientations_interior_facet = _FormHandler.iter_active_orientations_interior_facet(form, local_knl.kinfo)
16511652

@@ -1668,6 +1669,7 @@ def build(self):
16681669
assert_empty(self._constants)
16691670
assert_empty(self._active_exterior_facets)
16701671
assert_empty(self._active_interior_facets)
1672+
assert_empty(self._active_orientations_cell)
16711673
assert_empty(self._active_orientations_exterior_facet)
16721674
assert_empty(self._active_orientations_interior_facet)
16731675

@@ -1865,6 +1867,17 @@ def _as_global_kernel_arg_interior_facet(_, self):
18651867
return op2.DatKernelArg((2,), m._global_kernel_arg)
18661868

18671869

1870+
@_as_global_kernel_arg.register(kernel_args.OrientationsCellKernelArg)
1871+
def _(_, self):
1872+
mesh = next(self._active_orientations_cell)
1873+
if mesh is self._mesh:
1874+
return op2.DatKernelArg((1,))
1875+
else:
1876+
m, integral_type = mesh.topology.trans_mesh_entity_map(self._mesh.topology, self._integral_type, self._subdomain_id, self._all_integer_subdomain_ids)
1877+
assert integral_type == "cell"
1878+
return op2.DatKernelArg((1,), m._global_kernel_arg)
1879+
1880+
18681881
@_as_global_kernel_arg.register(kernel_args.OrientationsExteriorFacetKernelArg)
18691882
def _(_, self):
18701883
mesh = next(self._active_orientations_exterior_facet)
@@ -1936,6 +1949,7 @@ def __init__(self, form, bcs, local_knl, subdomain_id,
19361949
self._constants = _FormHandler.iter_constants(form, local_knl.kinfo)
19371950
self._active_exterior_facets = _FormHandler.iter_active_exterior_facets(form, local_knl.kinfo)
19381951
self._active_interior_facets = _FormHandler.iter_active_interior_facets(form, local_knl.kinfo)
1952+
self._active_orientations_cell = _FormHandler.iter_active_orientations_cell(form, local_knl.kinfo)
19391953
self._active_orientations_exterior_facet = _FormHandler.iter_active_orientations_exterior_facet(form, local_knl.kinfo)
19401954
self._active_orientations_interior_facet = _FormHandler.iter_active_orientations_interior_facet(form, local_knl.kinfo)
19411955

@@ -2201,6 +2215,17 @@ def _as_parloop_arg_interior_facet(_, self):
22012215
return op2.DatParloopArg(mesh.interior_facets.local_facet_dat, m)
22022216

22032217

2218+
@_as_parloop_arg.register(kernel_args.OrientationsCellKernelArg)
2219+
def _(_, self):
2220+
mesh = next(self._active_orientations_cell)
2221+
if mesh is self._mesh:
2222+
m = None
2223+
else:
2224+
m, integral_type = mesh.topology.trans_mesh_entity_map(self._mesh.topology, self._integral_type, self._subdomain_id, self._all_integer_subdomain_ids)
2225+
assert integral_type == "cell"
2226+
return op2.DatParloopArg(mesh.local_cell_orientation_dat, m)
2227+
2228+
22042229
@_as_parloop_arg.register(kernel_args.OrientationsExteriorFacetKernelArg)
22052230
def _(_, self):
22062231
mesh = next(self._active_orientations_exterior_facet)
@@ -2297,6 +2322,14 @@ def iter_active_interior_facets(form, kinfo):
22972322
mesh = all_meshes[i]
22982323
yield mesh
22992324

2325+
@staticmethod
2326+
def iter_active_orientations_cell(form, kinfo):
2327+
"""Yield the form cell orientations referenced in ``kinfo``."""
2328+
all_meshes = extract_domains(form)
2329+
for i in kinfo.active_domain_numbers.orientations_cell:
2330+
mesh = all_meshes[i]
2331+
yield mesh
2332+
23002333
@staticmethod
23012334
def iter_active_orientations_exterior_facet(form, kinfo):
23022335
"""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: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,11 @@ def check_element(element, top=True):
5252
ValueError
5353
If the element is illegal.
5454
"""
55-
if element.cell.cellname() == "hexahedron" and \
55+
if isinstance(element.cell, ufl.cell.CellSequence):
56+
# vector element of mixed eleemtns
57+
# tests/firedrake/regression/test_function_spaces.py::test_validation
58+
pass
59+
elif 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())
5862
if type(element) in (finat.ufl.BrokenElement, finat.ufl.RestrictedElement,

firedrake/interpolation.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,7 +1149,6 @@ def _interpolator(V, tensor, expr, subset, arguments, access, bcs=None):
11491149
assert tensor.handle.getSize() == (Vrow.dim(), Vcol.dim())
11501150
rows_map = get_interp_node_map(source_mesh, target_mesh, Vrow)
11511151
columns_map = get_interp_node_map(source_mesh, target_mesh, Vcol)
1152-
11531152
lgmaps = None
11541153
if bcs:
11551154
if ufl.duals.is_dual(Vrow):
@@ -1237,7 +1236,7 @@ def get_interp_node_map(source_mesh, target_mesh, fs):
12371236
else:
12381237
raise ValueError("Have coefficient with unexpected mesh")
12391238
else:
1240-
m_ = fs.entity_node_map(target_mesh.topology, "cell", None, None)
1239+
m_ = fs.entity_node_map(target_mesh.topology, "cell", "everywhere", None)
12411240
return m_
12421241

12431242

0 commit comments

Comments
 (0)