|
| 1 | +"""Brezzi-Douglas-Duran-Fortin elements.""" |
| 2 | + |
| 3 | +from ..core.finite_element import FiniteElement |
| 4 | +from ..core.moments import make_integral_moment_dofs |
| 5 | +from ..core.polynomials import polynomial_set |
| 6 | +from ..core.symbolic import x, zero |
| 7 | +from ..core.calculus import curl |
| 8 | +from ..core.functionals import NormalIntegralMoment, IntegralMoment |
| 9 | +from .lagrange import DiscontinuousLagrange, VectorDiscontinuousLagrange |
| 10 | + |
| 11 | + |
| 12 | +def bddf_polyset(reference, order): |
| 13 | + """Create the polynomial basis for a BDDF element.""" |
| 14 | + dim = reference.tdim |
| 15 | + pset = [] |
| 16 | + assert reference.name == "hexahedron" |
| 17 | + pset = polynomial_set(dim, dim, order) |
| 18 | + pset.append(curl((zero, zero, x[0] ** (order + 1) * x[1]))) |
| 19 | + pset.append(curl((zero, x[0] * x[2] ** (order + 1), zero))) |
| 20 | + pset.append(curl((x[1] ** (order + 1) * x[2], zero, zero))) |
| 21 | + for i in range(1, order + 1): |
| 22 | + pset.append(curl((zero, zero, x[0] * x[1] ** (i + 1) * x[2] ** (order - i)))) |
| 23 | + pset.append(curl((zero, x[0] ** (i + 1) * x[1] ** (order - i) * x[2], zero))) |
| 24 | + pset.append(curl((x[0] ** (order - i) * x[1] * x[2] ** (i + 1), zero, zero))) |
| 25 | + |
| 26 | + return pset |
| 27 | + |
| 28 | + |
| 29 | +class BDDF(FiniteElement): |
| 30 | + """Brezzi-Douglas-Duran-Fortin Hdiv finite element.""" |
| 31 | + |
| 32 | + def __init__(self, reference, order): |
| 33 | + poly = bddf_polyset(reference, order) |
| 34 | + |
| 35 | + dofs = make_integral_moment_dofs( |
| 36 | + reference, |
| 37 | + facets=(NormalIntegralMoment, DiscontinuousLagrange, order), |
| 38 | + cells=(IntegralMoment, VectorDiscontinuousLagrange, order - 2), |
| 39 | + ) |
| 40 | + |
| 41 | + super().__init__(reference, order, poly, dofs, reference.tdim, reference.tdim) |
| 42 | + |
| 43 | + names = ["Brezzi-Douglas-Duran-Fortin", "BDDF"] |
| 44 | + references = ["hexahedron"] |
| 45 | + min_order = 1 |
| 46 | + mapping = "contravariant" |
| 47 | + continuity = "H(div)" |
0 commit comments