1
2 """
3 This module contains code generation tools for the ufc::cell_integral class.
4 """
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 from itertools import tee
27 import swiginac
28 from sfc.common.output import sfc_debug, sfc_error, sfc_assert, sfc_warning
29 from sfc.quadrature import gen_quadrature_rule_definition, gen_quadrature_rule_definitions
30 from sfc.codegeneration.codeformatting import indent, CodeFormatter, gen_const_token_definitions, gen_token_prints
31 from sfc.codegeneration.codeformatting import gen_symbol_declarations, gen_token_declarations, gen_token_assignments, gen_token_additions
32 from sfc.codegeneration.integralcg import IntegralCG
33
36 IntegralCG.__init__(self, itgrep)
37
38
39
40
41
42 for integral in self.itgrep.quadrature_integrals:
43 sfc_assert(len(self.itgrep.quadrature_integrals) <= 1, "Not implemented!")
44 data = self.itgrep.integral_data[integral.measure()]
45
46 a, b = tee(self.itgrep.iter_member_quad_tokens(data))
47 self._iter_member_quad_tokens1 = a
48 self._iter_member_quad_tokens2 = b
49
51 sfc_debug("entering CellIntegral.gen_members")
52 code = ""
53
54
55 for integral in self.itgrep.quadrature_integrals:
56 sfc_assert(len(self.itgrep.quadrature_integrals) <= 1, "Not implemented!")
57 data = self.itgrep.integral_data[integral.measure()]
58
59 member_quad_tokens = self._iter_member_quad_tokens1
60 member_quad_token_names = (str(s[0]).split(".")[-1] for s in member_quad_tokens)
61 decl = gen_symbol_declarations(member_quad_token_names)
62 if decl:
63 code += "\n\n"
64 code += "struct member_quad_tokens\n{\n"
65 code += indent(decl)
66 code += "\n};\n"
67 code += "member_quad_tokens qt[%d];\n" % data.quad_rule.num_points
68
69 sfc_debug("leaving CellIntegral.gen_members")
70 return code
71
73 sfc_debug("entering CellIntegral.gen_constructor")
74 code = ""
75
76
77 for integral in self.itgrep.quadrature_integrals:
78 sfc_assert(len(self.itgrep.quadrature_integrals) <= 1, "Not implemented!")
79 data = self.itgrep.integral_data[integral.measure()]
80
81 member_quad_tokens = self._iter_member_quad_tokens2
82 member_quad_tokens_assignments = gen_token_assignments(member_quad_tokens)
83 if member_quad_tokens_assignments:
84
85 quad_loop_start_code = self.gen_quadrature_begin_block(data)
86
87
88 code += quad_loop_start_code + "\n"
89 code += indent(member_quad_tokens_assignments)
90 code += "\n}\n"
91
92 sfc_debug("leaving CellIntegral.gen_constructor")
93 return code
94
97