|
| 1 | +"""Bubble elements on simplices.""" |
| 2 | + |
| 3 | +import sympy |
| 4 | +from itertools import product |
| 5 | +from ..core.symbolic import x |
| 6 | +from ..core.finite_element import FiniteElement |
| 7 | +from ..core.polynomials import polynomial_set |
| 8 | +from ..core.functionals import PointEvaluation |
| 9 | + |
| 10 | + |
| 11 | +class Bubble(FiniteElement): |
| 12 | + """Bubble finite element.""" |
| 13 | + |
| 14 | + def __init__(self, reference, order): |
| 15 | + if reference.name == "interval": |
| 16 | + poly = [x[0] * (1 - x[0]) * p for p in polynomial_set(reference.tdim, 1, order - 2)] |
| 17 | + elif reference.name == "triangle": |
| 18 | + poly = [x[0] * x[1] * (1 - x[0] - x[1]) * p |
| 19 | + for p in polynomial_set(reference.tdim, 1, order - 3)] |
| 20 | + else: |
| 21 | + assert reference.name == "tetrahedron" |
| 22 | + poly = [x[0] * x[1] * x[2] * (1 - x[0] - x[1] - x[2]) * p |
| 23 | + for p in polynomial_set(reference.tdim, 1, order - 4)] |
| 24 | + |
| 25 | + dofs = [] |
| 26 | + for i in product(range(1, order), repeat=reference.tdim): |
| 27 | + if sum(i) < order: |
| 28 | + dofs.append( |
| 29 | + PointEvaluation( |
| 30 | + tuple(o + sum(sympy.Rational(a[j] * b, order) |
| 31 | + for a, b in zip(reference.axes, i)) |
| 32 | + for j, o in enumerate(reference.origin)), |
| 33 | + entity_dim=reference.tdim)) |
| 34 | + |
| 35 | + super().__init__( |
| 36 | + reference, poly, dofs, reference.tdim, 1 |
| 37 | + ) |
| 38 | + |
| 39 | + names = ["bubble"] |
| 40 | + references = ["interval", "triangle", "tetrahedron"] |
| 41 | + min_order = {"interval": 2, "triangle": 3, "tetrahedron": 4} |
0 commit comments