~ubuntu-branches/ubuntu/vivid/ffc/vivid

« back to all changes in this revision

Viewing changes to ffc/wrappers.py

  • Committer: Package Import Robot
  • Author(s): Johannes Ring
  • Date: 2015-01-12 21:08:58 UTC
  • mfrom: (1.1.16)
  • Revision ID: package-import@ubuntu.com-20150112210858-16bep8qwomfo4dvi
Tags: 1.5.0-1
* New upstream release.
* debian/control:
  - Bump Standards-Version to 3.9.6 (no changes needed).
  - Bump X-Python-Version to >= 2.7.
  - Bump minimum required version for python-fiat, python-instant and
    python-ufl to 1.5.0.
  - Add python-numpy and python-six to Depends field.
  - Bump python-all-dev in Build-Depends to >= 2.7.

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
#
15
15
# You should have received a copy of the GNU Lesser General Public License
16
16
# along with FFC. If not, see <http://www.gnu.org/licenses/>.
17
 
#
18
 
# First added:  2010-01-18
19
 
# Last changed: 2014-02-20
20
17
 
21
18
# Python modules
22
19
from itertools import chain
32
29
 
33
30
# FIXME: More clean-ups needed here.
34
31
 
35
 
def generate_wrapper_code(analysis, prefix, parameters):
 
32
def generate_wrapper_code(analysis, prefix, object_names, parameters):
36
33
    "Generate code for additional wrappers."
37
34
 
38
35
    # Skip if wrappers not requested
40
37
        return None
41
38
 
42
39
    # Return dolfin wrapper
43
 
    return _generate_dolfin_wrapper(analysis, prefix, parameters)
 
40
    return _generate_dolfin_wrapper(analysis, prefix, object_names, parameters)
44
41
 
45
 
def _generate_dolfin_wrapper(analysis, prefix, parameters):
 
42
def _generate_dolfin_wrapper(analysis, prefix, object_names, parameters):
46
43
 
47
44
    begin("Compiler stage 4.1: Generating additional wrapper code")
48
45
 
49
46
    # Encapsulate data
50
 
    (capsules, common_space) = _encapsulate(prefix, analysis, parameters)
 
47
    (capsules, common_space) = _encapsulate(prefix, object_names, analysis, parameters)
51
48
 
52
49
    # Generate code
53
50
    info("Generating wrapper code for DOLFIN")
59
56
 
60
57
    return code
61
58
 
62
 
def _encapsulate(prefix, analysis, parameters):
 
59
def _encapsulate(prefix, object_names, analysis, parameters):
63
60
 
64
61
    # Extract data from analysis
65
62
    form_datas, elements, element_map = analysis
73
70
 
74
71
    # Special case: with error control
75
72
    elif (parameters["error_control"] and num_form_datas == 11):
76
 
        capsules = [_encapsule_form(prefix, form_data, i, element_map) for
 
73
        capsules = [_encapsule_form(prefix, object_names, form_data, i, element_map) for
77
74
                    (i, form_data) in enumerate(form_datas[:num_form_datas-1])]
78
 
        capsules += [_encapsule_form(prefix, form_datas[-1], num_form_datas-1,
 
75
        capsules += [_encapsule_form(prefix, object_names, form_datas[-1], num_form_datas-1,
79
76
                                     element_map, "GoalFunctional")]
80
77
 
81
78
    # Otherwise: generate standard capsules for each form
82
79
    else:
83
 
        capsules = [_encapsule_form(prefix, form_data, i, element_map) for
 
80
        capsules = [_encapsule_form(prefix, object_names, form_data, i, element_map) for
84
81
                    (i, form_data) in enumerate(form_datas)]
85
82
 
86
83
        # Check if all elements are equal
92
89
    return (capsules, common_space)
93
90
 
94
91
 
95
 
def _encapsule_form(prefix, form_data, i, element_map, superclassname=None):
 
92
def _encapsule_form(prefix, object_names, form_data, i, element_map, superclassname=None):
96
93
    element_numbers = [element_map[e] for e in form_data.elements]
97
94
 
98
95
    if superclassname is None:
99
96
        superclassname = "Form"
100
97
 
101
 
    form_names = UFCFormNames(form_data.name or "%d" % i,
102
 
                              form_data.coefficient_names,
103
 
                              format["classname form"](prefix, i),
104
 
                              [format["classname finite_element"](prefix, j)
105
 
                               for j in element_numbers],
106
 
                              [format["classname dofmap"](prefix, j)
107
 
                               for j in element_numbers],
108
 
                              superclassname)
 
98
    form_names = UFCFormNames(
 
99
        object_names.get(id(form_data.original_form), "%d" % i),
 
100
        [object_names.get(id(obj), "w%d" % j)
 
101
         for j, obj in enumerate(form_data.reduced_coefficients)],
 
102
        format["classname form"](prefix, i),
 
103
        [format["classname finite_element"](prefix, j)
 
104
         for j in element_numbers],
 
105
        [format["classname dofmap"](prefix, j)
 
106
         for j in element_numbers],
 
107
        superclassname)
 
108
 
109
109
    return form_names
110
110
 
111
111
def _encapsule_element(prefix, elements):