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/>.
18
# First added: 2010-01-18
19
# Last changed: 2014-02-20
22
19
from itertools import chain
33
30
# FIXME: More clean-ups needed here.
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."
38
35
# Skip if wrappers not requested
42
39
# Return dolfin wrapper
43
return _generate_dolfin_wrapper(analysis, prefix, parameters)
40
return _generate_dolfin_wrapper(analysis, prefix, object_names, parameters)
45
def _generate_dolfin_wrapper(analysis, prefix, parameters):
42
def _generate_dolfin_wrapper(analysis, prefix, object_names, parameters):
47
44
begin("Compiler stage 4.1: Generating additional wrapper code")
50
(capsules, common_space) = _encapsulate(prefix, analysis, parameters)
47
(capsules, common_space) = _encapsulate(prefix, object_names, analysis, parameters)
53
50
info("Generating wrapper code for DOLFIN")
62
def _encapsulate(prefix, analysis, parameters):
59
def _encapsulate(prefix, object_names, analysis, parameters):
64
61
# Extract data from analysis
65
62
form_datas, elements, element_map = analysis
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")]
81
78
# Otherwise: generate standard capsules for each form
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)]
86
83
# Check if all elements are equal
92
89
return (capsules, common_space)
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]
98
95
if superclassname is None:
99
96
superclassname = "Form"
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],
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],
109
109
return form_names
111
111
def _encapsule_element(prefix, elements):