Home | Trees | Indices | Help |
|
---|
|
1 2 from ufl.common import component_to_index, product 3 from ufl.permutation import compute_indices 4 5 """ 6 FIXME: 7 8 Get information: 9 10 - List of required elements with number of derivatives needed 11 12 - Element representation for all required elements 13 14 - Element representation for all required SUBelements 15 16 - Mappings from elements to unique subelements 17 18 19 Without derivatives: 20 21 - Generate array members for precompute struct 22 23 - Fill array members of precompute struct 24 25 - Use precomputed basis functions in argument loops 26 27 - Use linear combinations of dofs and basis functions for coefficients 28 29 30 With derivatives: 31 32 - Generate array members for local gradients for precompute struct 33 34 - Fill array members of precompute struct with local gradients 35 36 - Use precomputed basis function gradients with applied geometry mapping in argument loops 37 38 - Use linear combinations of dofs and mapped basis function gradients for coefficients 39 40 """ 41 42 import ufl 43 from uflacs.codeutils.target_formatter import analyse_terminalish 44 from uflacs.codeutils.format_code_structure import (format_code_structure, 45 ArrayDecl, ArrayAccess) 46 48 return (lhs, " = ", rhs, ";") 495530457 self.pcelm = [] 58 59 fr = self.farep.formrep 60 61 # Figure out how many derivatives we need for which element 62 todo = set() 63 for o in terminalish: 64 t, ngrads, r = analyse_terminalish(o) 65 66 if isinstance(t, ufl.Argument): 67 count = t.count() 68 elif isinstance(t, ufl.Coefficient): 69 count = t.count() + fr.rank 70 else: 71 count = None 72 73 if count is not None: 74 elm = fr.formdata.elements[count] 75 todo.add((elm, ngrads, r)) 76 77 #prefix_template = "pc[%(iq)s]." 78 #phi_template = "%(diff)sphi%(elmnum)d[%(idof)s][%(icomp)s]" 79 80 # Loop over element representations and emit precomputation code 81 for elm, ngrads, r in todo: 82 assert not r # FIXME 83 assert not ngrads # FIXME 84 er = fr.element_reps[elm] 85 86 # Handle both mixed and simple elements same way, 87 # keeps it generic for now, some optimizations lost 88 89 #name = "d%d_phi%d" % (0, 0,) # FIXME: Need unique element count here 90 91 name = "phi%d" % (0,) # FIXME: Need unique element count here 92 shape = (er.local_dimension, er.value_size) 93 decl = ArrayDecl("double", name, shape) 94 data = decl, er, ngrads, r 95 self.pcelm.append(data)9698 if 0: 99 if isinstance(elm, ufl.MixedElement): 100 assert False # FIXME: Support arbitrary mixed elements 101 # Check for unique subelements of er and add to todo: 102 for ser in er.sub_elements: # TODO 103 #name = "d%d_phi%d" % (0, 0,) # FIXME: Need unique element count here 104 name = "phi%d" % (0,) # FIXME: Need unique element count here 105 shape = (er.local_dimension, er.value_size) # FIXME: symmetries? other? 106 decl = ArrayDecl("double", name, shape) 107 data = decl, ser, ngrads, r 108 self.pcelm.append(data) 109 else: 110 #name = "d%d_phi%d" % (0, 0,) # FIXME: Need unique element count here 111 name = "phi%d" % (0,) # FIXME: Need unique element count here 112 shape = (er.local_dimension, er.value_size) 113 decl = ArrayDecl("double", name, shape) 114 data = decl, er, ngrads, r 115 self.pcelm.append(data)116118 prefix = self.iq_prefix() 119 code = [] 120 for data in self.pcelm: 121 decl, er, ngrads, r = data 122 for i in range(er.local_dimension): 123 for j in range(er.value_size): # FIXME: symmetries? other? 124 if ngrads == 0: 125 lhscode = (prefix, ArrayAccess(decl, (i,j))) 126 rhscode = "FIXME" #er.basis_function(...) 127 code.append(format_code_structure(Assignment(lhscode, rhscode))) 128 else: 129 assert False # FIXME 130 lhscode = (prefix, ArrayAccess(decl, (i,j))) 131 rhscode = "FIXME" #er.basis_function_derivative(...) 132 code.append(format_code_structure(Assignment(lhscode, rhscode))) 133 return code134136 code = [] 137 for data in self.pcelm: 138 decl, er, ngrads, r = data 139 code.append(format_code_structure(decl)) 140 return code141 145147 code = [''] 148 basename = "w%d" % coefficient.count() 149 150 shape = coefficient.shape() 151 symmetry = coefficient.element().symmetry() 152 size = product(shape) 153 nsd = self.geomrep.sfc_cell.nsd 154 155 #er = self.FIXME 156 157 restriction = None # FIXME 158 159 if num_derivatives == 0: 160 all_derivatives = [()] 161 else: 162 assert num_derivatives == 1 # FIXME 163 all_derivatives = [(d,) for d in range(nsd)] # FIXME: Permutations of (d,)*num_der.. 164 165 for derivatives in all_derivatives: 166 dstr = self.derivative_prefix(derivatives) 167 cstr = "[%d]" % (size,) if size > 1 else "" 168 decl = "double %s;" % (dstr + basename + cstr) 169 code += [decl] 170 171 # Iterate over components and flattened indices 172 assert not symmetry # FIXME 173 #comp2index, components = build_component_numbering(shape, symmetry) 174 #for index, component in components: 175 for component in compute_indices(shape): 176 compindex = component_to_index(component, shape) 177 178 terms = [] 179 nbf = 1 # er.nbf # FIXME 180 for dofindex in range(nbf): 181 dofname = self.gen_coefficient_dof_name(coefficient, dofindex, restriction) 182 doffunc = "1.0/*FIXME*/" # er.N_dof_code[dofindex][compindex] # "pc[iq]." # FIXME: Add to element ref 183 if doffunc not in ("0", "0.0"): 184 terms.append("%s * %s" % (dofname, doffunc)) 185 assert terms 186 expr = " + ".join(terms) 187 188 name = self.gen_coefficient_name(coefficient, derivatives, component, restriction) 189 assign = "%s = %s;" % (name, expr) 190 code += [assign] 191 192 return code193195 code = [] 196 basename = "v%d" % argument.count() 197 198 shape = argument.shape() 199 symmetry = argument.element().symmetry() 200 size = product(shape) 201 nsd = self.geomrep.sfc_cell.nsd 202 203 restriction = None # FIXME 204 205 if num_derivatives == 0: 206 all_derivatives = [()] 207 else: 208 assert num_derivatives == 1 # FIXME 209 all_derivatives = [(d,) for d in range(nsd)] # FIXME: Permutations of (d,)*num_der.. 210 211 for derivatives in all_derivatives: 212 dstr = self.derivative_prefix(derivatives) 213 cstr = "[%d]" % (size,) if size > 1 else "" 214 decl = "double %s;" % (dstr + basename + cstr) 215 code += [decl] 216 217 # Iterate over components and flattened indices 218 assert not symmetry # FIXME 219 #comp2index, components = build_component_numbering(shape, symmetry) 220 #for index, component in components: 221 for component in compute_indices(shape): 222 index = component_to_index(component, shape) 223 224 name = self.gen_argument_name(argument, derivatives, component, restriction) 225 dstr = self.derivative_prefix(derivatives) 226 assert not restriction 227 # FIXME: If derivatives, apply geometry mapping! 228 element_id, element_index = 0, index # FIXME 229 expr = self.iq_prefix() + dstr + "phi%d[%d]" % (element_id, element_index) 230 #expr = "0.0" # FIXME 231 232 assign = "%s = %s;" % (name, expr) 233 code += [assign] 234 code += [''] 235 return code236238 assert not restriction # FIXME: How does this map into w array? 239 code = "w[%d][%d]" % (o.count(), index) 240 return code241243 assert not restriction # FIXME: How does this map into w array? 244 assert not o.element().symmetry() # FIXME: Ignoring symmetries here! 245 index = component_to_index(component, o.shape()) 246 code = self.gen_coefficient_dof_name(o, index, restriction) 247 return code248250 if self.on_facet: 251 prefix = "pc[facet][iq]." 252 else: 253 prefix = "pc[iq]." 254 return prefix255257 if derivatives: 258 dstr = "d%s_" % ("".join(map(str,sorted(derivatives))),) 259 else: 260 dstr = "" 261 return dstr262264 if shape: 265 index = component_to_index(component, shape) 266 cstr = "[%d]" % index 267 else: 268 cstr = "" 269 return cstr270272 if shape: 273 size = product(shape) # FIXME symmetry 274 cstr = "[%d]" % size 275 else: 276 cstr = "" 277 return cstr278280 assert not restriction # FIXME 281 dstr = self.derivative_prefix(derivatives) 282 cstr = self.component_decl(o.shape()) 283 code = dstr + basename + str(o.count()) + cstr 284 return code285 288 291293 assert not restriction # FIXME 294 dstr = self.derivative_prefix(derivatives) 295 cstr = self.component_prefix(o.shape(), component) 296 code = dstr + basename + str(o.count()) + cstr 297 return code298 301
Home | Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0.1 on Thu Jan 31 03:52:26 2013 | http://epydoc.sourceforge.net |