示例#1
0
def create_element(ufl_element):

    # Create element signature for caching (just use UFL element)
    element_signature = ufl_element

    # Check cache
    if element_signature in _cache:
        logger.debug("Reusing element from cache")
        return _cache[element_signature]

    if isinstance(ufl_element, ufl.FiniteElement):
        element = _create_fiat_element(ufl_element)
    elif isinstance(ufl_element, ufl.MixedElement):
        elements = _extract_elements(ufl_element)
        element = MixedElement(elements)
    elif isinstance(ufl_element, ufl.EnrichedElement):
        elements = [create_element(e) for e in ufl_element._elements]
        element = EnrichedElement(*elements)
    elif isinstance(ufl_element, ufl.NodalEnrichedElement):
        elements = [create_element(e) for e in ufl_element._elements]
        element = NodalEnrichedElement(*elements)
    elif isinstance(ufl_element, ufl.RestrictedElement):
        element = _create_restricted_element(ufl_element)
        raise RuntimeError("Cannot handle this element type: {}".format(ufl_element))

    # Store in cache
    _cache[element_signature] = element

    return element
示例#2
0
文件: test_fiat.py 项目: tj-sun/fiat
def test_mixed_is_not_nodal():
    element = MixedElement([
        EnrichedElement(
            RaviartThomas(T, 1),
            RestrictedElement(RaviartThomas(T, 2),
                              restriction_domain="interior")),
        DiscontinuousLagrange(T, 1)
    ])

    assert not element.is_nodal()
示例#3
0
def test_TFE_2Dx1D_vector_quad_hdiv():
    T = UFCInterval()
    P1 = Lagrange(T, 1)
    P0 = DiscontinuousLagrange(T, 0)
    P1_DG = DiscontinuousLagrange(T, 1)

    P1P0 = Hdiv(TensorProductElement(P1, P0))
    P0P1 = Hdiv(TensorProductElement(P0, P1))
    horiz_elt = EnrichedElement(P1P0, P0P1)
    elt = Hdiv(TensorProductElement(horiz_elt, P1_DG))
    assert elt.value_shape() == (3, )
    tab = elt.tabulate(1, [(0.1, 0.2, 0.3)])
    tA = P1.tabulate(1, [(0.1, )])
    tB = P0.tabulate(1, [(0.2, )])
    tC = P0.tabulate(1, [(0.1, )])
    tD = P1.tabulate(1, [(0.2, )])
    tE = P1_DG.tabulate(1, [(0.3, )])
    for da, db, dc in [[(0, ), (0, ), (0, )], [(1, ), (0, ), (0, )],
                       [(0, ), (1, ), (0, )], [(0, ), (0, ), (1, )]]:
        dd = da + db + dc
        assert np.isclose(tab[dd][0][0][0],
                          -tA[da][0][0] * tB[db][0][0] * tE[dc][0][0])
        assert np.isclose(tab[dd][1][0][0],
                          -tA[da][0][0] * tB[db][0][0] * tE[dc][1][0])
        assert np.isclose(tab[dd][2][0][0],
                          -tA[da][1][0] * tB[db][0][0] * tE[dc][0][0])
        assert np.isclose(tab[dd][3][0][0],
                          -tA[da][1][0] * tB[db][0][0] * tE[dc][1][0])
        assert tab[dd][4][0][0] == 0.0
        assert tab[dd][5][0][0] == 0.0
        assert tab[dd][6][0][0] == 0.0
        assert tab[dd][7][0][0] == 0.0
        assert tab[dd][0][1][0] == 0.0
        assert tab[dd][1][1][0] == 0.0
        assert tab[dd][2][1][0] == 0.0
        assert tab[dd][3][1][0] == 0.0
        assert np.isclose(tab[dd][4][1][0],
                          tC[da][0][0] * tD[db][0][0] * tE[dc][0][0])
        assert np.isclose(tab[dd][5][1][0],
                          tC[da][0][0] * tD[db][0][0] * tE[dc][1][0])
        assert np.isclose(tab[dd][6][1][0],
                          tC[da][0][0] * tD[db][1][0] * tE[dc][0][0])
        assert np.isclose(tab[dd][7][1][0],
                          tC[da][0][0] * tD[db][1][0] * tE[dc][1][0])
        assert tab[dd][0][2][0] == 0.0
        assert tab[dd][1][2][0] == 0.0
        assert tab[dd][2][2][0] == 0.0
        assert tab[dd][3][2][0] == 0.0
        assert tab[dd][4][2][0] == 0.0
        assert tab[dd][5][2][0] == 0.0
        assert tab[dd][6][2][0] == 0.0
        assert tab[dd][7][2][0] == 0.0
示例#4
0
def create_element(ufl_element):

    # Create element signature for caching (just use UFL element)
    element_signature = ufl_element

    # Check cache
    if element_signature in _cache:
        debug("Reusing element from cache")
        return _cache[element_signature]

    # Create regular FIAT finite element
    if isinstance(ufl_element, ufl.FiniteElement):
        element = _create_fiat_element(ufl_element)

    # Create mixed element (implemented by FFC)
    elif isinstance(ufl_element, ufl.MixedElement):
        elements = _extract_elements(ufl_element)
        element = MixedElement(elements)

    # Create element union
    elif isinstance(ufl_element, ufl.EnrichedElement):
        elements = [create_element(e) for e in ufl_element._elements]
        element = EnrichedElement(*elements)

    # Create nodal element union
    elif isinstance(ufl_element, ufl.NodalEnrichedElement):
        elements = [create_element(e) for e in ufl_element._elements]
        element = NodalEnrichedElement(*elements)

    # Create restricted element
    elif isinstance(ufl_element, ufl.RestrictedElement):
        element = _create_restricted_element(ufl_element)

    else:
        error("Cannot handle this element type: %s" % str(ufl_element))

    # Store in cache
    _cache[element_signature] = element

    return element