12
12
__copyright__ = "Copyright (C) 2007-2010 " + __author__
13
13
__license__ = "GNU GPL version 3 or any later version"
15
# Last changed: 2010-01-31
15
# Last changed: 2010-02-15
18
18
from ufl.common import istr, tstr
19
19
from ufl.finiteelement import MixedElement
20
from ufl.algorithms import preprocess, FormData
20
from ufl.algorithms import preprocess
21
21
from ufl.algorithms import estimate_max_polynomial_degree
22
22
from ufl.algorithms import estimate_total_polynomial_degree
23
23
from ufl.algorithms import extract_unique_elements
30
30
from ffc.utils import all_equal
31
31
from ffc.tensor import estimate_cost
33
def analyze_forms(forms, object_names, parameters):
33
def analyze_forms(forms, object_names, parameters, common_cell=None):
35
35
Analyze form(s), returning
37
form_and_data - a tuple of pairs (forms, form_data)
37
forms - a tuple of preprocessed forms
38
38
unique_elements - a tuple of unique elements across all forms
39
39
element_map - a map from elements to unique element numbers
42
42
begin("Compiler stage 1: Analyzing form(s)")
45
form_and_data = [_analyze_form(form, object_names, parameters) for form in forms]
45
forms = tuple(_analyze_form(form, object_names, parameters, common_cell) for form in forms)
47
47
# Extract unique elements
48
48
unique_elements = []
49
for (form, form_data) in form_and_data:
50
for element in form_data.unique_sub_elements:
50
for element in form.form_data().unique_sub_elements:
51
51
if not element in unique_elements:
52
52
unique_elements.append(element)
62
return form_and_data, unique_elements, element_map
62
return forms, unique_elements, element_map
64
64
def analyze_elements(elements):
66
66
begin("Compiler stage 1: Analyzing form(s)")
71
68
# Extract unique elements
72
69
unique_elements = []
85
82
element_map = _build_element_map(unique_elements)
88
return form_and_data, unique_elements, element_map
86
return (), unique_elements, element_map
90
88
def _build_element_map(elements):
91
89
"Build map from elements to element numbers."
101
99
nested_elements += _get_nested_elements(e)
102
100
return set(nested_elements)
104
def _analyze_form(form, object_names, parameters):
105
"Analyze form, returning preprocessed form and form data."
107
# Get name before pre-processing.
108
if id(form) in object_names:
109
name = object_names[id(form)]
114
if not form.is_preprocessed():
115
form = preprocess(form)
118
form_data = FormData(form, name, object_names=object_names)
102
def _analyze_form(form, object_names, parameters, common_cell=None):
103
"Analyze form, returning preprocessed form."
105
# Preprocess form if necessary
106
if form.form_data() is None:
107
form = preprocess(form, object_names, common_cell)
109
info(str(form.form_data()))
121
111
# Adjust cell and degree for elements when unspecified
122
_adjust_elements(form_data)
112
_adjust_elements(form.form_data())
124
114
# Extract integral metadata
125
_extract_metadata(form_data, parameters)
115
_extract_metadata(form.form_data(), parameters)
127
return form, form_data
129
119
def _adjust_elements(form_data):
130
120
"Adjust cell and degree for elements when unspecified."