~ubuntu-branches/ubuntu/trusty/ffc/trusty

« back to all changes in this revision

Viewing changes to ffc/analysis.py

  • Committer: Bazaar Package Importer
  • Author(s): Johannes Ring
  • Date: 2010-02-16 11:52:36 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20100216115236-n1yxo7mlyqq6kzuv
Tags: 0.9.1-1
* New upstream release.
* Update debian/copyright and debian/copyright_hints.

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
__copyright__ = "Copyright (C) 2007-2010 " + __author__
13
13
__license__  = "GNU GPL version 3 or any later version"
14
14
 
15
 
# Last changed: 2010-01-31
 
15
# Last changed: 2010-02-15
16
16
 
17
17
# UFL modules
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
32
32
 
33
 
def analyze_forms(forms, object_names, parameters):
 
33
def analyze_forms(forms, object_names, parameters, common_cell=None):
34
34
    """
35
35
    Analyze form(s), returning
36
36
 
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
40
40
    """
42
42
    begin("Compiler stage 1: Analyzing form(s)")
43
43
 
44
44
    # Analyze forms
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)
46
46
 
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:
 
49
    for form in forms:
 
50
        for element in form.form_data().unique_sub_elements:
51
51
            if not element in unique_elements:
52
52
                unique_elements.append(element)
53
53
 
59
59
 
60
60
    end()
61
61
 
62
 
    return form_and_data, unique_elements, element_map
 
62
    return forms, unique_elements, element_map
63
63
 
64
64
def analyze_elements(elements):
65
65
 
66
66
    begin("Compiler stage 1: Analyzing form(s)")
67
67
 
68
 
    # Empty form and data
69
 
    form_and_data = []
70
 
 
71
68
    # Extract unique elements
72
69
    unique_elements = []
73
70
    element_map = {}
85
82
    element_map = _build_element_map(unique_elements)
86
83
 
87
84
    end()
88
 
    return form_and_data, unique_elements, element_map
 
85
 
 
86
    return (), unique_elements, element_map
89
87
 
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)
103
101
 
104
 
def _analyze_form(form, object_names, parameters):
105
 
    "Analyze form, returning preprocessed form and form data."
106
 
 
107
 
    # Get name before pre-processing.
108
 
    if id(form) in object_names:
109
 
        name = object_names[id(form)]
110
 
    else:
111
 
        name = "a"
112
 
 
113
 
    # Preprocess form
114
 
    if not form.is_preprocessed():
115
 
        form = preprocess(form)
116
 
 
117
 
    # Compute form data
118
 
    form_data = FormData(form, name, object_names=object_names)
119
 
    info(str(form_data))
 
102
def _analyze_form(form, object_names, parameters, common_cell=None):
 
103
    "Analyze form, returning preprocessed form."
 
104
 
 
105
    # Preprocess form if necessary
 
106
    if form.form_data() is None:
 
107
        form = preprocess(form, object_names, common_cell)
 
108
    info("")
 
109
    info(str(form.form_data()))
120
110
 
121
111
    # Adjust cell and degree for elements when unspecified
122
 
    _adjust_elements(form_data)
 
112
    _adjust_elements(form.form_data())
123
113
 
124
114
    # Extract integral metadata
125
 
    _extract_metadata(form_data, parameters)
 
115
    _extract_metadata(form.form_data(), parameters)
126
116
 
127
 
    return form, form_data
 
117
    return form
128
118
 
129
119
def _adjust_elements(form_data):
130
120
    "Adjust cell and degree for elements when unspecified."
205
195
                info("quadrature_degree: %d" % q)
206
196
            integral_metadata["quadrature_degree"] = q
207
197
 
208
 
            info("")
209
 
 
210
198
            # Append to list of metadata
211
199
            integral_metadatas.append(integral_metadata)
212
200