示例#1
0
    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