forked from FEniCS/fiat
-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
BR Bubbles, and non-Piola mapped Arnold-Qin
- Loading branch information
Showing
6 changed files
with
210 additions
and
169 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,7 +4,8 @@ | |
# | ||
# Written by Pablo D. Brubeck ([email protected]), 2024 | ||
|
||
from FIAT import finite_element, polynomial_set | ||
from FIAT import finite_element, polynomial_set, dual_set | ||
from FIAT.functional import ComponentPointEvaluation | ||
from FIAT.bernardi_raugel import BernardiRaugelDualSet | ||
from FIAT.quadrature_schemes import create_quadrature | ||
from FIAT.reference_element import TRIANGLE | ||
|
@@ -55,12 +56,35 @@ def ArnoldQinSpace(ref_el, degree, reduced=False): | |
C0.get_expansion_set(), coeffs) | ||
|
||
|
||
class VectorLagrangeDualSet(dual_set.DualSet): | ||
|
||
def __init__(self, ref_el, degree, variant=None): | ||
sd = ref_el.get_spatial_dimension() | ||
top = ref_el.get_topology() | ||
entity_ids = {dim: {entity: [] for entity in sorted(top[dim])} for dim in sorted(top)} | ||
|
||
# Point evaluation at lattice points | ||
nodes = [] | ||
for dim in sorted(top): | ||
for entity in sorted(top[dim]): | ||
cur = len(nodes) | ||
pts = ref_el.make_points(dim, entity, degree, variant=variant) | ||
nodes.extend(ComponentPointEvaluation(ref_el, comp, (sd,), pt) | ||
for pt in pts for comp in range(sd)) | ||
entity_ids[dim][entity].extend(range(cur, len(nodes))) | ||
super().__init__(nodes, ref_el, entity_ids) | ||
|
||
|
||
class ArnoldQin(finite_element.CiarletElement): | ||
"""The Arnold-Qin C^0(Alfeld) quadratic macroelement with divergence in P0. | ||
This element belongs to a Stokes complex, and is paired with unsplit DG0.""" | ||
def __init__(self, ref_el, degree=2): | ||
def __init__(self, ref_el, degree=2, reduced=False): | ||
poly_set = ArnoldQinSpace(ref_el, degree) | ||
ref_complex = poly_set.get_reference_element() | ||
dual = BernardiRaugelDualSet(ref_complex, degree) | ||
if reduced: | ||
dual = BernardiRaugelDualSet(ref_el, degree) | ||
mapping = "contravariant piola" | ||
else: | ||
dual = VectorLagrangeDualSet(ref_el, degree) | ||
mapping = "affine" | ||
formdegree = ref_el.get_spatial_dimension() - 1 # (n-1)-form | ||
super().__init__(poly_set, dual, degree, formdegree, mapping="contravariant piola") | ||
super().__init__(poly_set, dual, degree, formdegree, mapping=mapping) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.