def _build_lam(self, remove_unused=None): # Carry out equation and operator simplifications self._simplify_operators() self._simplify_equations() self._own_ccodes() # Build the dependency tree self._build_dependency_tree() # Remove unused objects, if required if (remove_unused is True or (remove_unused is None and len(self.targets) > 0)): self._remove_unused(self.targets) # First build all the elements field_quants = self.quantities._by_type.get('SpaceField', []) field_quants += self.quantities._by_type.get('SpaceTimeField', []) param_quants = self.quantities._by_type.get('TimeField', []) for field_quant in field_quants: self._build_elems(field_quant.name, field_quant.shape, on_material=field_quant.def_on_mat) # Now build all the MWEs for field_quant in field_quants: self._build_mwe(field_quant.name) # Build the simplified operators operators = self._build_operators() equations = self._build_equations() bems = self._build_bems() ksps = self._build_ksps() ccodes = self._build_ccodes() jacobi = {} # Not used (should clean this) timesteppers = self._build_timesteppers() programs = self._build_programs() debugfile = None # Build LAM vector dictionary vectors = {} for mwe_name in self.mwes.copy(): vec_name = "v_%s" % mwe_name assert not vec_name in vectors, \ "Duplicate definition of vector '%s'" % vec_name quantity = self.quantities[mwe_name] vectors[vec_name] = \ nlam.lam_vector(name=vec_name, mwe_name=mwe_name, restriction=quantity.restrictions) lam = nlam.make_lam(self.name, intensive_params=self.intensive_params, mwes=self.mwes.values(), vectors=vectors.values(), operators=operators.values(), bem_matrices=bems.values(), ksps=ksps.values(), local_operations=(equations.values() + ccodes.values()), jacobi_plans=jacobi.values(), programs=programs.values(), timesteppers=timesteppers.values(), lam_debugfile=debugfile) self.lam = lam