Пример #1
0
def test_contains_h1():
    h1_elements = [
        # Standard Lagrange elements:
        FiniteElement("CG", triangle, 1),
        FiniteElement("CG", triangle, 2),
        # Some special elements:
        FiniteElement("AW", triangle),
        FiniteElement("HER", triangle),
        FiniteElement("MTW", triangle),
        # Tensor product elements:
        TensorProductElement(FiniteElement("CG", interval, 1),
                             FiniteElement("CG", interval, 1)),
        TensorProductElement(FiniteElement("CG", interval, 2),
                             FiniteElement("CG", interval, 2)),
        # Enriched elements:
        EnrichedElement(FiniteElement("CG", triangle, 2),
                        FiniteElement("B", triangle, 3))
    ]
    for h1_element in h1_elements:
        assert h1_element in H1
        assert h1_element in H1dx1dy
        assert h1_element in HDiv
        assert h1_element in HCurl
        assert h1_element in L2
        assert h1_element in H0dx0dy
        assert h1_element not in H2
        assert h1_element not in H2dx2dy
Пример #2
0
def test_contains_l2():
    l2_elements = [
        FiniteElement("Real", triangle, 0),
        FiniteElement("DG", triangle, 0),
        FiniteElement("DG", triangle, 1),
        FiniteElement("DG", triangle, 2),
        FiniteElement("CR", triangle, 1),
        # Tensor product elements:
        TensorProductElement(FiniteElement("DG", interval, 1),
                             FiniteElement("DG", interval, 1)),
        TensorProductElement(FiniteElement("DG", interval, 1),
                             FiniteElement("CG", interval, 2)),
        # Enriched element:
        EnrichedElement(FiniteElement("DG", triangle, 1),
                        FiniteElement("B", triangle, 3))
    ]
    for l2_element in l2_elements:
        assert l2_element in L2
        assert l2_element in H0dx0dy
        assert l2_element not in H1
        assert l2_element not in H1dx1dy
        assert l2_element not in HCurl
        assert l2_element not in HDiv
        assert l2_element not in H2
        assert l2_element not in H2dx2dy
Пример #3
0
def test_enriched_elements_hcurl():
    A = FiniteElement("CG", interval, 1)
    B = FiniteElement("DG", interval, 0)
    AxB = TensorProductElement(A, B)
    BxA = TensorProductElement(B, A)
    C = FiniteElement("RTCE", quadrilateral, 1)
    D = FiniteElement("DQ", quadrilateral, 0)
    Q1 = TensorProductElement(C, B)
    Q2 = TensorProductElement(D, A)
    hcurl_elements = [
        EnrichedElement(HCurl(AxB), HCurl(BxA)),
        EnrichedElement(HCurl(Q1), HCurl(Q2))
    ]
    for hcurl_element in hcurl_elements:
        assert hcurl_element in HCurl
        assert hcurl_element in L2
        assert hcurl_element in H0dx0dy
        assert hcurl_element not in H1
        assert hcurl_element not in H1dx1dy
        assert hcurl_element not in HDiv
        assert hcurl_element not in H2
        assert hcurl_element not in H2dx2dy
Пример #4
0
    def reconstruct_degree(ele, N):
        """
        Reconstruct an element, modifying its polynomial degree.

        By default, reconstructed EnrichedElements, TensorProductElements,
        and MixedElements will have the degree of the sub-elements shifted
        by the same amount so that the maximum degree is N.
        This is useful to coarsen spaces like NCF(N) x DQ(N-1).

        :arg ele: a :class:`ufl.FiniteElement` to reconstruct,
        :arg N: an integer degree.

        :returns: the reconstructed element
        """
        if isinstance(ele, VectorElement):
            return VectorElement(PMGBase.reconstruct_degree(
                ele._sub_element, N),
                                 dim=ele.num_sub_elements())
        elif isinstance(ele, TensorElement):
            return TensorElement(PMGBase.reconstruct_degree(
                ele._sub_element, N),
                                 shape=ele.value_shape(),
                                 symmetry=ele.symmetry())
        elif isinstance(ele, EnrichedElement):
            shift = N - PMGBase.max_degree(ele)
            return EnrichedElement(
                *(PMGBase.reconstruct_degree(e,
                                             PMGBase.max_degree(e) + shift)
                  for e in ele._elements))
        elif isinstance(ele, TensorProductElement):
            shift = N - PMGBase.max_degree(ele)
            return TensorProductElement(*(PMGBase.reconstruct_degree(
                e,
                PMGBase.max_degree(e) + shift) for e in ele.sub_elements()),
                                        cell=ele.cell())
        elif isinstance(ele, MixedElement):
            shift = N - PMGBase.max_degree(ele)
            return MixedElement(
                *(PMGBase.reconstruct_degree(e,
                                             PMGBase.max_degree(e) + shift)
                  for e in ele.sub_elements()))
        else:
            try:
                return type(ele)(PMGBase.reconstruct_degree(ele._element, N))
            except AttributeError:
                return ele.reconstruct(degree=N)