Source code for ufl.algorithms.map_integrands
# -*- coding: utf-8 -*-
"""Basic algorithms for applying functions to subexpressions."""
# 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
# NOTE: Placing this under algorithms/ because I want corealg/ to stay clean
# as part of a careful refactoring process, and this file depends on ufl.form
# which drags in a lot of stuff.
from ufl.log import error
from ufl.core.expr import Expr
from ufl.corealg.map_dag import map_expr_dag
from ufl.integral import Integral
from ufl.form import Form
from ufl.constantvalue import Zero
[docs]def map_integrands(function, form, only_integral_type=None):
"""Apply transform(expression) to each integrand
expression in form, or to form if it is an Expr.
"""
if isinstance(form, Form):
mapped_integrals = [map_integrands(function, itg, only_integral_type)
for itg in form.integrals()]
nonzero_integrals = [itg for itg in mapped_integrals
if not isinstance(itg.integrand(), Zero)]
return Form(nonzero_integrals)
elif isinstance(form, Integral):
itg = form
if (only_integral_type is None) or (itg.integral_type() in only_integral_type):
return itg.reconstruct(function(itg.integrand()))
else:
return itg
elif isinstance(form, Expr):
integrand = form
return function(integrand)
else:
error("Expecting Form, Integral or Expr.")
[docs]def map_integrand_dags(function, form, only_integral_type=None, compress=True):
return map_integrands(lambda expr: map_expr_dag(function, expr, compress),
form, only_integral_type)