1
__author__ = "Kristian B. Oelgaard (k.b.oelgaard@tudelft.nl) and Anders Logg (logg@simula.no)"
2
__date__ = "2009-03-06 -- 2009-08-26"
3
__copyright__ = "Copyright (C) 2009 Kristian B. Oelgaard and Anders Logg"
4
__license__ = "GNU GPL version 3 or any later version"
6
# Modified by Garth N. Wells 2009
9
from ufl import FiniteElement as UFLFiniteElement
10
from ufl import MixedElement as UFLMixedElement
11
from ufl import ElementRestriction as UFLElementRestriction
12
from ufl import TensorElement as UFLTensorElement
15
from ffc.common.log import debug, error
18
from finiteelement import FiniteElement as FFCFiniteElement
19
from mixedelement import MixedElement as FFCMixedElement
20
from quadratureelement import QuadratureElement as FFCQuadratureElement
22
# Cache for computed elements
25
def create_element(ufl_element, domain=None):
26
"Create FFC element (wrapper for FIAT element) from UFL element."
29
if ufl_element in _cache:
30
debug("Found element in element cache: " + str(ufl_element))
31
return _cache[ufl_element]
33
# Save the element that we'll use as hash
34
ufl_element_hash = ufl_element
35
if isinstance(ufl_element, UFLElementRestriction):
36
# If we already have a domain, make sure that it is equal to the domain
37
# of the restricted element
38
if domain and domain != ufl_element.domain():
39
error("Domain of restriction is not equal to the domain of the already restricted element. %s %s"\
40
%(str(domain), str(ufl_element.domain())))
41
# Get element and domain
42
domain = ufl_element.domain()
43
ufl_element = ufl_element.element()
45
# Create equivalent FFC element
46
if isinstance(ufl_element, UFLFiniteElement):
47
if ufl_element.family() == "Quadrature":
48
ffc_element = FFCQuadratureElement(ufl_element, domain)
50
ffc_element = FFCFiniteElement(ufl_element, domain)
51
elif isinstance(ufl_element, UFLMixedElement):
52
sub_elements = [create_element(e, domain) for e in ufl_element.sub_elements()]
53
ffc_element = FFCMixedElement(sub_elements, repr(ufl_element), domain)
54
# FIXME: Temporary hack to 'support' tensor elements
55
if isinstance(ufl_element, UFLTensorElement):
56
ffc_element._rank = len(ufl_element._shape)
58
error("Unable to create equivalent FIAT element: %s" % str(ufl_element))
60
# Add element to cache
61
_cache[ufl_element_hash] = ffc_element