⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 codegenerator.py

📁 finite element library for mathematic majored research
💻 PY
字号:
"Common base class for code generators"__author__ = "Anders Logg (logg@simula.no)"__date__ = "2007-03-06 -- 2007-04-27"__copyright__ = "Copyright (C) 2007 Anders Logg"__license__  = "GNU GPL version 3 or any later version"# Code generation modulesfrom dofmap import *from finiteelement import *from form import *class CodeGenerator:    def __init__(self):        "Constructor"        # Common methods        self.generate_dof_map = generate_dof_map        self.generate_finite_element = generate_finite_element        self.generate_form = generate_form    def generate_form_code(self, form_data, form_representation, format):        "Generator form code according to given format"        code = {}        # Generate code for finite elements        code["finite_elements"] = self.__generate_finite_elements(form_data.elements, format)        # Generate code for dof maps        code["dof_maps"] = self.__generate_dof_maps(form_data.dof_maps, format)        # Generate code for cell integral        debug("Generating code for cell integrals...")        for i in range(form_data.num_cell_integrals):            code[("cell_integral", i)] = self.generate_cell_integral(form_data, form_representation, i, format)        debug("done")        # Generate code for exterior facet integral        debug("Generating code for exterior facet integrals...")        for i in range(form_data.num_exterior_facet_integrals):            code[("exterior_facet_integral", i)] = self.generate_exterior_facet_integral(form_data,\                                                   form_representation, i, format)        debug("done")        # Generate code for interior facet integral        debug("Generating code for interior facet integrals...")        for i in range(form_data.num_interior_facet_integrals):            code[("interior_facet_integral", i)] = self.generate_interior_facet_integral(form_data,\                                                   form_representation, i, format)        debug("done")        # Generate code for form        debug("Generating code for form...")        code["form"] = generate_form(form_data, format)        debug("done")        return code    def generate_element_code(self, element_data, format):        "Generate element code according to given format"        code = {}        # Generate code for finite elements        code["finite_elements"] = self.__generate_finite_elements(element_data.elements, format)        # Generate code for dof maps        code["dof_maps"] = self.__generate_dof_maps(element_data.dof_maps, format)        return code    def __generate_finite_elements(self, elements, format):        "Generate code for finite elements, including recursively nested sub elements"        debug("Generating code for finite elements...")        code = []        # Iterate over form elements        for i in range(len(elements)):            # Extract sub elements            sub_elements = self.__extract_sub_elements(elements[i], (i,))            # Generate code for each element            for (label, sub_element) in sub_elements:                code += [(label, self.generate_finite_element(sub_element, format))]                        debug("done")        return code    def __generate_dof_maps(self, dof_maps, format):        "Generate code for dof maps, including recursively nested dof maps"        debug("Generating code for finite dof maps...")        code = []        # Iterate over form dof maps        for i in range(len(dof_maps)):            # Extract sub dof maps            sub_dof_maps = self.__extract_sub_dof_maps(dof_maps[i], (i,))            # Generate code for each dof map            for (label, sub_dof_map) in sub_dof_maps:                code += [(label, self.generate_dof_map(sub_dof_map, format))]                        debug("done")        return code    def __extract_sub_elements(self, element, parent):        """Recursively extract sub elements as a list of tuples where        each tuple consists of a tuple labeling the sub element and        the sub element itself"""        if element.num_sub_elements() == 1:            return [(parent, element)]        sub_elements = []        for i in range(element.num_sub_elements()):            sub_elements += self.__extract_sub_elements(element.sub_element(i), parent + (i,))        return sub_elements + [(parent, element)]    def __extract_sub_dof_maps(self, dof_map, parent):        """Recursively extract sub dof maps as a list of tuples where        each tuple consists of a tuple labeling the sub dof map and        the sub dof map itself"""        if dof_map.num_sub_dof_maps() == 1:            return [(parent, dof_map)]        sub_dof_maps = []        for i in range(dof_map.num_sub_dof_maps()):            sub_dof_maps += self.__extract_sub_dof_maps(dof_map.sub_dof_map(i), parent + (i,))        return sub_dof_maps + [(parent, dof_map)]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -