Skip to content

Commit

Permalink
Default variant for DPC elements (#457)
Browse files Browse the repository at this point in the history
* DPC variants

* basix branch

* write dpc variant into generated code

* dolfinx branch

* dpc variant

* branch reset

* dolfinx branch
  • Loading branch information
mscroggs committed Feb 15, 2022
1 parent 3b3babb commit e420235
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 6 deletions.
5 changes: 5 additions & 0 deletions ffcx/codegeneration/finite_element.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ def generator(ir, parameters):
else:
d["lagrange_variant"] = int(ir.lagrange_variant)

if ir.dpc_variant is None:
d["dpc_variant"] = -1
else:
d["dpc_variant"] = int(ir.dpc_variant)

if ir.basix_family is None:
d["basix_family"] = -1
else:
Expand Down
1 change: 1 addition & 0 deletions ffcx/codegeneration/finite_element_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
.basix_cell = {basix_cell},
.discontinuous = {discontinuous},
.lagrange_variant = {lagrange_variant},
.dpc_variant = {dpc_variant},
.num_sub_elements = {num_sub_elements},
.sub_elements = {sub_elements}
}};
Expand Down
3 changes: 3 additions & 0 deletions ffcx/codegeneration/ufcx.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,9 @@ extern "C"
/// The Lagrange variant to be passed to Basix's create_element function
int lagrange_variant;

/// The DPC variant to be passed to Basix's create_element function
int dpc_variant;

/// Number of sub elements (for a mixed element)
int num_sub_elements;

Expand Down
41 changes: 36 additions & 5 deletions ffcx/element_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,19 +63,24 @@ def create_element(element: ufl.finiteelement.FiniteElementBase) -> BaseElement:
if family_name == "DPC":
discontinuous = True

if family_name in ["Lagrange", "Q"]:
family_type = basix.finite_element.string_to_family(family_name, element.cell().cellname())
cell_type = basix.cell.string_to_type(element.cell().cellname())

if family_type == basix.ElementFamily.P:
if element.variant() is None:
variant_info.append(basix.LagrangeVariant.gll_warped)
else:
variant_info.append(basix.variants.string_to_lagrange_variant(element.variant()))
elif family_name in ["S", "serendipity"]:
elif family_type == basix.ElementFamily.serendipity:
if element.variant() is None:
variant_info.append(basix.LagrangeVariant.gll_warped)
else:
variant_info.append(basix.variants.string_to_lagrange_variant(element.variant()))

family_type = basix.finite_element.string_to_family(family_name, element.cell().cellname())
cell_type = basix.cell.string_to_type(element.cell().cellname())
elif family_type == basix.ElementFamily.DPC:
if element.variant() is None:
variant_info.append(basix.DPCVariant.diagonal_gll)
else:
variant_info.append(basix.variants.string_to_dpc_variant(element.variant()))

return BasixElement(family_type, cell_type, element.degree(), variant_info, discontinuous)

Expand Down Expand Up @@ -249,6 +254,12 @@ def lagrange_variant(self):
"""Basix Lagrange variant used to initialise the element."""
pass

@property
@abstractmethod
def dpc_variant(self):
"""Basix DPC variant used to initialise the element."""
pass

@property
@abstractmethod
def cell_type(self):
Expand Down Expand Up @@ -342,6 +353,10 @@ def element_family(self):
def lagrange_variant(self):
return self.element.lagrange_variant

@property
def dpc_variant(self):
return self.element.dpc_variant

@property
def cell_type(self):
return self._cell
Expand Down Expand Up @@ -432,6 +447,10 @@ def element_family(self):
def lagrange_variant(self):
return self.element.lagrange_variant

@property
def dpc_variant(self):
return self.element.dpc_variant

@property
def cell_type(self):
return self.element.cell_type
Expand Down Expand Up @@ -550,6 +569,10 @@ def reference_geometry(self):
def lagrange_variant(self):
return None

@property
def dpc_variant(self):
return None

@property
def element_family(self):
return None
Expand Down Expand Up @@ -654,6 +677,10 @@ def reference_geometry(self):
def lagrange_variant(self):
return self.sub_element.lagrange_variant

@property
def dpc_variant(self):
return self.sub_element.dpc_variant

@property
def element_family(self):
return self.sub_element.element_family
Expand Down Expand Up @@ -761,6 +788,10 @@ def family_name(self):
def lagrange_variant(self):
return None

@property
def dpc_variant(self):
return None

@property
def element_family(self):
return None
Expand Down
3 changes: 2 additions & 1 deletion ffcx/ir/representation.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
'id', 'name', 'signature', 'cell_shape', 'topological_dimension',
'geometric_dimension', 'space_dimension', 'value_shape', 'reference_value_shape', 'degree',
'family', 'num_sub_elements', 'block_size', 'sub_elements', 'element_type', 'entity_dofs',
'lagrange_variant', 'basix_family', 'basix_cell', 'discontinuous'])
'lagrange_variant', 'dpc_variant', 'basix_family', 'basix_cell', 'discontinuous'])
ir_dofmap = namedtuple('ir_dofmap', [
'id', 'name', 'signature', 'num_global_support_dofs', 'num_element_support_dofs', 'num_entity_dofs',
'tabulate_entity_dofs', 'num_entity_closure_dofs', 'tabulate_entity_closure_dofs', 'num_sub_dofmaps',
Expand Down Expand Up @@ -135,6 +135,7 @@ def _compute_element_ir(ufl_element, element_numbers, finite_element_names):
ir["space_dimension"] = basix_element.dim
ir["element_type"] = basix_element.element_type
ir["lagrange_variant"] = basix_element.lagrange_variant
ir["dpc_variant"] = basix_element.dpc_variant
ir["basix_family"] = basix_element.element_family
ir["basix_cell"] = basix_element.cell_type
ir["discontinuous"] = basix_element.discontinuous
Expand Down

0 comments on commit e420235

Please sign in to comment.