Package sfc :: Package codegeneration :: Module formcg
[hide private]
[frames] | no frames]

Source Code for Module sfc.codegeneration.formcg

  1  #!/usr/bin/env python 
  2  # -*- coding: utf-8 -*- 
  3  """ 
  4  This module contains code generation tools for the ufc::form class. 
  5  """ 
  6   
  7  # Copyright (C) 2008-2009 Martin Sandve Alnes and Simula Resarch Laboratory 
  8  # 
  9  # This file is part of SyFi. 
 10  # 
 11  # SyFi is free software: you can redistribute it and/or modify 
 12  # it under the terms of the GNU General Public License as published by 
 13  # the Free Software Foundation, either version 2 of the License, or 
 14  # (at your option) any later version. 
 15  # 
 16  # SyFi is distributed in the hope that it will be useful, 
 17  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 18  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
 19  # GNU General Public License for more details. 
 20  # 
 21  # You should have received a copy of the GNU General Public License 
 22  # along with SyFi. If not, see <http://www.gnu.org/licenses/>. 
 23  # 
 24  # First added:  2008-08-13 
 25  # Last changed: 2009-03-05 
 26   
 27  from sfc.codegeneration.codeformatting import indent, CodeFormatter 
 28  from sfc.common.utilities import unique 
 29  import ufc_utils 
 30  from itertools import chain 
 31   
32 -class FormCG:
33 "Code generator for an ufc::form."
34 - def __init__(self, formrep):
35 self.formrep = formrep
36
37 - def hincludes(self):
38 l = [] 39 return l
40
41 - def cincludes(self):
42 l = [] 43 return l
44
45 - def local_includes(self):
46 return unique(sorted("%s.h" % cn 47 for cn in chain(self.formrep.fe_names, 48 self.formrep.dm_names, 49 self.formrep.itg_names.values())))
50
51 - def header_template(self):
52 return ufc_utils.form_header
53
54 - def impl_template(self):
55 return ufc_utils.form_implementation
56
57 - def generate_code_dict(self):
58 form_vars = { 59 "classname" : self.formrep.classname, 60 "constructor" : indent(self.gen_constructor()), 61 "constructor_arguments" : indent(self.gen_constructor_arguments()), 62 "initializer_list" : indent(self.gen_initializer_list()), 63 "destructor" : indent(self.gen_destructor()), 64 "members" : indent(self.gen_members()), 65 "rank" : indent(self.gen_rank()), 66 "num_coefficients" : indent(self.gen_num_coefficients()), 67 "signature" : indent(self.gen_signature()), 68 "create_dofmap" : indent(self.gen_create_dofmap()), 69 "create_finite_element" : indent(self.gen_create_finite_element()), 70 "create_cell_integral" : indent(self.gen_create_cell_integral()), 71 "create_exterior_facet_integral" : indent(self.gen_create_exterior_facet_integral()), 72 "create_interior_facet_integral" : indent(self.gen_create_interior_facet_integral()), 73 "num_cell_domains" : indent(self.gen_num_cell_domains()), 74 "num_exterior_facet_domains" : indent(self.gen_num_exterior_facet_domains()), 75 "num_interior_facet_domains" : indent(self.gen_num_interior_facet_domains()), 76 } 77 return form_vars
78
79 - def generate_support_code(self):
80 return ""
81
82 - def gen_constructor(self):
83 return ""
84
86 return ""
87
88 - def gen_initializer_list(self):
89 return ""
90
91 - def gen_destructor(self):
92 return ""
93
94 - def gen_members(self):
95 return ""
96
97 - def gen_rank(self):
98 return 'return %d;' % self.formrep.rank
99
100 - def gen_num_coefficients(self):
101 return 'return %d;' % self.formrep.num_coefficients
102
103 - def gen_signature(self):
104 return 'return "%s";' % self.formrep.signature
105
106 - def _gen_num_domains(self, names):
107 if names: 108 n = 1 + max(list(names.keys())) 109 else: 110 n = 0 111 return 'return %d;' % n
112
113 - def gen_num_cell_domains(self):
114 return self._gen_num_domains(self.formrep.citg_names)
115
117 return self._gen_num_domains(self.formrep.eitg_names)
118
120 return self._gen_num_domains(self.formrep.iitg_names)
121
122 - def _gen_create_switch(self, classnames, name, indices = None, return_null=False):
123 "Utility function for creating factory functions." 124 code = CodeFormatter() 125 #if options.add_debug_code: # FIXME 126 # code.begin_debug() 127 # code += 'std::cout << "Creating object in %s, index is " << i << std::endl;' % name 128 # code.end_debug() 129 if classnames: 130 if isinstance(classnames, dict): 131 assert indices is None 132 else: 133 if indices is None: 134 indices = range(len(classnames)) 135 classnames = dict((i,c) for (i,c) in zip(indices, classnames)) 136 137 code.begin_switch("i") 138 for i, c in classnames.iteritems(): 139 code.begin_case(i) 140 code += "return new %s();" % c 141 code.end_case() 142 code.end_switch() 143 144 if return_null: 145 code += 'return 0;' 146 else: 147 code += 'throw std::runtime_error("Invalid index in %s()");' % name 148 return str(code)
149
150 - def gen_create_dofmap(self):
151 return self._gen_create_switch(self.formrep.dm_names, "create_dofmap")
152
154 return self._gen_create_switch(self.formrep.fe_names, "create_finite_element")
155
156 - def gen_create_cell_integral(self):
157 return self._gen_create_switch(self.formrep.citg_names, "create_cell_integral", return_null=True)
158
160 return self._gen_create_switch(self.formrep.eitg_names, "create_exterior_facet_integral", return_null=True)
161
163 return self._gen_create_switch(self.formrep.iitg_names, "create_interior_facet_integral", return_null=True)
164 165 if __name__ == '__main__': 166 print "form.py, no test implemented" 167