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
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
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
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)