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: 2013-02-12
19
# Last changed: 2013-03-04
18
from ffc.log import info
21
19
from ffc.representationutils import initialize_integral_code
22
from ffc.log import info, error, begin, end, debug_ir, ffc_assert, warning
23
from ffc.cpp import format, indent
21
from uflacs.codeutils.cpp_expr_formatting_rules import CppExprFormatter
22
from uflacs.backends.ffc.ffc_backend import FFCAccessBackend, FFCDefinitionsBackend
23
from uflacs.generation.integralgenerator import IntegralGenerator
25
25
def generate_integral_code(ir, prefix, parameters):
26
26
"Generate code for integral from intermediate representation."
30
30
# Generate generic ffc code snippets
31
31
code = initialize_integral_code(ir, prefix, parameters)
33
# Delegate to uflacs to generate tabulate_tensor body
34
import uflacs.backends.ffc
35
ucode = uflacs.backends.ffc.generate_tabulate_tensor_code(ir, parameters)
36
code["tabulate_tensor"] = ucode["tabulate_tensor"]
37
code["additional_includes_set"] = ir.get("additional_includes_set",set()) | set(ucode["additional_includes_set"])
33
# Generate tabulate_tensor body using uflacs algorithms
34
uflacs_code = generate_tabulate_tensor_code(ir, parameters)
36
code["tabulate_tensor"] = uflacs_code["tabulate_tensor"]
38
code["additional_includes_set"] = set()
39
code["additional_includes_set"].update(ir.get("additional_includes_set",()))
40
code["additional_includes_set"].update(uflacs_code["additional_includes_set"])
44
def generate_tabulate_tensor_code(ir, parameters):
47
language_formatter = CppExprFormatter()
50
backend_access = FFCAccessBackend(ir, parameters)
51
backend_definitions = FFCDefinitionsBackend(ir, parameters)
53
# Create code generator for integral body
54
ig = IntegralGenerator(ir, language_formatter, backend_access, backend_definitions)
56
# Generate code for the tabulate_tensor body
61
includes.update(ig.get_includes())
62
includes.update(backend_definitions.get_includes())
64
# Format uflacs specific code structures into a single
65
# string and place in dict before returning to ffc
67
"tabulate_tensor": body,
68
"additional_includes_set": includes,