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

📄 compiler.py

📁 finite element library for mathematic majored research
💻 PY
字号:
"""This is the compiler, acting as the main interface for compilationof forms and breaking the compilation into several sequential phases,each represented by a separate module:   0. language        -  expressing the form in the form language   1. analysis        -  simplifying and preprocessing the form   2. representation  -  computing a representation of the form   3. optimization    -  optimizing the form representation   4. codegeneration  -  generating code according to a format   5. format          -  writing the generated code to file"""__author__ = "Anders Logg (logg@simula.no)"__date__ = "2007-02-05 -- 2007-07-22"__copyright__ = "Copyright (C) 2007 Anders Logg"__license__  = "GNU GPL version 3 or any later version"# Modified by Kristian B. Oelgaard 2007# FFC common modulesfrom ffc.common.debug import *from ffc.common.constants import *# FFC fem modulesfrom ffc.fem.finiteelement import *from ffc.fem.vectorelement import *from ffc.fem.mixedelement import *from ffc.fem.mixedfunctions import *# FFC language modulesfrom language.algebra import *# FFC analysis modulesfrom analysis.analyze import *# FFC form representation modulesfrom representation.tensor import *from representation.quadrature import *# FFC code generation modulesfrom codegeneration.tensor import *from codegeneration.quadrature import *from codegeneration.common.finiteelement import *from codegeneration.common.dofmap import *# FFC format modulesfrom format import ufcformatfrom format import dolfinformatdef compile(forms, prefix="Form", representation=FFC_REPRESENTATION, language=FFC_LANGUAGE, options=FFC_OPTIONS):    "Compile the given forms and/or elements"    # Check options    check_options(representation, language, options)    # Check input    (forms, elements) = preprocess_forms(forms)    if len(forms) == 0 and len(elements) == 0:        debug("No forms or elements specified, nothing to do.")        return    # Compile forms    form_data = None    form_representation = None    if len(forms) > 0:        (form_data, form_representation) = __compile_forms(forms, prefix, representation, language, options)    # Compile elements, but only if there are no forms    if len(elements) > 0 and len(forms) == 0:        r1 = __compile_elements(elements, prefix, representation, language, options)    return (form_data, form_representation)def __compile_forms(forms, prefix="Form", representation=FFC_REPRESENTATION, language=FFC_LANGUAGE, options=FFC_OPTIONS):    "Compile the given forms"    # Check form input    if len(forms) == 0:        debug("No forms specified, nothing to do.")        return    # Choose format    format = __choose_format(language)    format.init(options)    # Iterate over forms for stages 1 - 4    generated_forms = []    form_datas = []    form_representations = []    for form in forms:        # Compiler phase 1: analyze form        form_data = analyze_form(form)        form_datas += [form_data]        # Compiler phase 2: compute form representation        form_representation = compute_form_representation(form_data, representation, int(options["quadrature_points="]))        form_representations += [form_representation]        # Compiler phase 3: optimize form representation        optimize_form_representation(form)        # Compiler phase 4: generate form code        form_code = generate_form_code(form_data, form_representation, representation, format.format)        # Add to list of codes        generated_forms += [(form_code, form_data)]    # Compiler phase 5: format code    format_code(generated_forms, prefix, format, options)    return (form_datas, form_representations)def __compile_elements(elements, prefix="Element", representation=FFC_REPRESENTATION, language=FFC_LANGUAGE, options=FFC_OPTIONS):    "Compile the given elements for the given language"    # Check element input    if len(elements) == 0:        debug("No elements specified, nothing to do.")        return    # Compiler phase 1: analyze form    debug_begin("Compiler phase 1: Analyzing elements")    element_data = ElementData(elements)    debug_end()    # Go directly to phase 4, code generation    debug_begin("Compiler phase 2-3: Nothing to do")    debug("-")    debug_end()    debug_begin("Compiler phase 4: Generating code")    # Choose format    format = __choose_format(language)    format.init(options)    # Choose code generator    CodeGenerator = __choose_code_generator(representation)    code_generator = CodeGenerator()    # Generate code    element_code = code_generator.generate_element_code(element_data, format.format)    # Compiler phase 5: format code    debug_end()    debug_begin("Compiler phase 5: Formatting code")    format.write([(element_code, element_data)], prefix, options)    debug_end()    def check_options(representation, language, options):    "Check that options are valid"    # FIXME: We could do more tests here    if options["optimize"]:        debug("*** Warning: " + "Optimization unavailable (will return in a future version)")    if options["blas"]:        debug("*** Warning: " + "BLAS mode unavailable (will return in a future version)")def preprocess_forms(forms):    "Check and possibly convert form input to a list of Forms and a list if elements"    # Check that we get a list    if not isinstance(forms, list):        forms = [forms]    # Check each form    preprocessed_forms = []    preprocessed_elements = []    for form in forms:        if isinstance(form, Form):            preprocessed_forms += [form]        elif isinstance(form, Monomial):            preprocessed_forms += [Form(form)]        elif isinstance(form, FiniteElement) or isinstance(form, MixedElement):            preprocessed_elements += [form]        elif not form == None:            raise RuntimeError, "Not a form: " + str(form)    return (preprocessed_forms, preprocessed_elements)def analyze_form(form):    "Compiler phase 1: analyze form"    debug_begin("Phase 1: Analyzing form")    # Analyze form and extract form data    form_data = analyze(form)    debug_end()    return form_datadef compute_form_representation(form_data, representation, num_quadrature_points):    "Compiler phase 2: compute form representation"    debug_begin("Compiler phase 2: Computing form representation")    # Choose representation    Representation = __choose_representation(representation)    # Compute form representation    form_representation = Representation(form_data, num_quadrature_points)    debug_end()    return form_representation    def optimize_form_representation(form):    "Compiler phase 3: optimize form representation"    debug_begin("Compiler phase 3: Computing optimization")    debug("Not implemented")    debug_end()def generate_form_code(form_data, form_representation, representation, format):    "Compiler phase 4: generate code"    debug_begin("Compiler phase 4: Generating code")    # Choose code generator    CodeGenerator = __choose_code_generator(representation)    # Generate code    code_generator = CodeGenerator()    code = code_generator.generate_form_code(form_data, form_representation, format)            debug_end()    return codedef format_code(generated_forms, prefix, format, options):    "Compiler phase 5: format code"    debug_begin("Compiler phase 5: Formatting code")    format.write(generated_forms, prefix, options)    debug_end()def __choose_format(language):    "Choose format from specified language"    if language.lower() == "ufc":        return ufcformat    elif language.lower() == "dolfin":        return dolfinformat    else:        raise RuntimeError, "Don't know how to compile code for language \"%s\"." % languagedef __choose_representation(form_representation):    "Choose form representation"    if form_representation == "tensor":        return TensorRepresentation    else:        return QuadratureRepresentationdef __choose_code_generator(form_representation):    "Choose code generator"    if form_representation == "tensor":        return TensorGenerator    else:        return QuadratureGenerator

⌨️ 快捷键说明

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