Source code for ufl.algorithms.apply_function_pullbacks

"""Algorithm for replacing gradients in an expression."""

# 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

from ufl.algorithms.map_integrands import map_integrand_dags
from ufl.classes import ReferenceValue
from ufl.corealg.multifunction import MultiFunction, memoized_handler


[docs]class FunctionPullbackApplier(MultiFunction): """A pull back applier.""" def __init__(self): """Initalise.""" MultiFunction.__init__(self) expr = MultiFunction.reuse_if_untouched
[docs] def terminal(self, t): """Apply to a terminal.""" return t
@memoized_handler def form_argument(self, o): """Apply to a form_argument.""" # Represent 0-derivatives of form arguments on reference # element r = ReferenceValue(o) space = o.ufl_function_space() element = o.ufl_element() if r.ufl_shape != element.reference_value_shape: raise ValueError( "Expecting reference space expression with shape " f"'{element.reference_value_shape}', got '{r.ufl_shape}'" ) f = element.pullback.apply(r) if f.ufl_shape != space.value_shape: raise ValueError( f"Expecting pulled back expression with shape '{space.value_shape}', " f"got '{f.ufl_shape}'" ) assert f.ufl_shape == o.ufl_shape return f
[docs]def apply_function_pullbacks(expr): """Change representation of coefficients and arguments in an expression. Applies Piola mappings where applicable and represents all form arguments in reference value. Args: expr: An Expression """ return map_integrand_dags(FunctionPullbackApplier(), expr)