Spaces:
Sleeping
Sleeping
from itertools import chain | |
from sympy.codegen.fnodes import Module | |
from sympy.core.symbol import Dummy | |
from sympy.printing.fortran import FCodePrinter | |
""" This module collects utilities for rendering Fortran code. """ | |
def render_as_module(definitions, name, declarations=(), printer_settings=None): | |
""" Creates a ``Module`` instance and renders it as a string. | |
This generates Fortran source code for a module with the correct ``use`` statements. | |
Parameters | |
========== | |
definitions : iterable | |
Passed to :class:`sympy.codegen.fnodes.Module`. | |
name : str | |
Passed to :class:`sympy.codegen.fnodes.Module`. | |
declarations : iterable | |
Passed to :class:`sympy.codegen.fnodes.Module`. It will be extended with | |
use statements, 'implicit none' and public list generated from ``definitions``. | |
printer_settings : dict | |
Passed to ``FCodePrinter`` (default: ``{'standard': 2003, 'source_format': 'free'}``). | |
""" | |
printer_settings = printer_settings or {'standard': 2003, 'source_format': 'free'} | |
printer = FCodePrinter(printer_settings) | |
dummy = Dummy() | |
if isinstance(definitions, Module): | |
raise ValueError("This function expects to construct a module on its own.") | |
mod = Module(name, chain(declarations, [dummy]), definitions) | |
fstr = printer.doprint(mod) | |
module_use_str = ' %s\n' % ' \n'.join(['use %s, only: %s' % (k, ', '.join(v)) for | |
k, v in printer.module_uses.items()]) | |
module_use_str += ' implicit none\n' | |
module_use_str += ' private\n' | |
module_use_str += ' public %s\n' % ', '.join([str(node.name) for node in definitions if getattr(node, 'name', None)]) | |
return fstr.replace(printer.doprint(dummy), module_use_str) | |