Source code for ufl.formatting.printing
# -*- coding: utf-8 -*-
"""A collection of utility algorithms for printing
of UFL objects, mostly intended for debugging purposes."""
# Copyright (C) 2008-2016 Martin Sandve Alnæs
#
# This file is part of UFL (https://www.fenicsproject.org)
#
# SPDX-License-Identifier: LGPL-3.0-or-later
#
# Modified by Anders Logg 2009, 2014
from ufl.log import error
from ufl.core.expr import Expr
from ufl.form import Form
from ufl.integral import Integral
# --- Utilities for constructing informative strings from UFL objects
[docs]def integral_info(integral):
if not isinstance(integral, Integral):
error("Expecting an Integral.")
s = " Integral:\n"
s += " Type:\n"
s += " %s\n" % integral.integral_type()
s += " Domain:\n"
s += " %s\n" % integral.ufl_domain()
s += " Domain id:\n"
s += " %s\n" % integral.subdomain_id()
s += " Domain data:\n"
s += " %s\n" % integral.subdomain_data()
s += " Compiler metadata:\n"
s += " %s\n" % integral.metadata()
return s
[docs]def form_info(form):
if not isinstance(form, Form):
error("Expecting a Form.")
bf = form.arguments()
cf = form.coefficients()
s = "Form info:\n"
s += " rank: %d\n" % len(bf)
s += " num_coefficients: %d\n" % len(cf)
s += "\n"
for f in cf:
if f._name:
s += "\n"
s += " Coefficient %d is named '%s'" % (f._count, f._name)
s += "\n"
integrals = form.integrals()
integral_types = sorted(set(itg.integral_type() for itg in integrals))
for integral_type in integral_types:
itgs = form.integrals_by_type(integral_type)
s += " num_{0}_integrals: {1}\n".format(integral_type, len(itgs))
s += "\n"
for integral_type in integral_types:
itgs = form.integrals_by_type(integral_type)
for itg in itgs:
s += integral_info(itg)
s += "\n"
return s
def _indent_string(n):
return " " * n
def _tree_format_expression(expression, indentation, parentheses):
ind = _indent_string(indentation)
if expression._ufl_is_terminal_:
s = "%s%s" % (ind, repr(expression))
else:
sops = [_tree_format_expression(o, indentation + 1, parentheses) for o in expression.ufl_operands]
s = "%s%s\n" % (ind, expression._ufl_class_.__name__)
if parentheses and len(sops) > 1:
s += "%s(\n" % (ind,)
s += "\n".join(sops)
if parentheses and len(sops) > 1:
s += "\n%s)" % (ind,)
return s
[docs]def tree_format(expression, indentation=0, parentheses=True):
s = ""
if isinstance(expression, Form):
form = expression
integrals = form.integrals()
integral_types = sorted(set(itg.integral_type() for itg in integrals))
itgs = []
for integral_type in integral_types:
itgs += list(form.integrals_by_type(integral_type))
ind = _indent_string(indentation)
s += ind + "Form:\n"
s += "\n".join(tree_format(itg, indentation + 1, parentheses) for itg in itgs)
elif isinstance(expression, Integral):
ind = _indent_string(indentation)
s += ind + "Integral:\n"
ind = _indent_string(indentation + 1)
s += ind + "integral type: %s\n" % expression.integral_type()
s += ind + "subdomain id: %s\n" % expression.subdomain_id()
s += ind + "integrand:\n"
s += tree_format(expression._integrand, indentation + 2, parentheses)
elif isinstance(expression, Expr):
s += _tree_format_expression(expression, indentation, parentheses)
else:
error("Invalid object type %s" % type(expression))
return s