/usr/lib/python2.7/dist-packages/ufl/argument.py is in python-ufl 2016.2.0-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 | # -*- coding: utf-8 -*-
"""This module defines the class Argument and a number of related
classes (functions), including TestFunction and TrialFunction."""
# Copyright (C) 2008-2016 Martin Sandve Alnæs
#
# This file is part of UFL.
#
# UFL is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# UFL is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with UFL. If not, see <http://www.gnu.org/licenses/>.
#
# Modified by Anders Logg, 2008-2009.
# Modified by Massimiliano Leoni, 2016.
import numbers
from ufl.utils.py23 import as_native_str
from ufl.utils.py23 import as_native_strings
from ufl.log import error
from ufl.core.ufl_type import ufl_type
from ufl.core.terminal import FormArgument
from ufl.split_functions import split
from ufl.finiteelement import FiniteElementBase
from ufl.domain import default_domain
from ufl.functionspace import AbstractFunctionSpace, FunctionSpace
# Export list for ufl.classes (TODO: not actually classes: drop? these are in ufl.*)
__all_classes__ = as_native_strings(["TestFunction", "TrialFunction", "TestFunctions", "TrialFunctions"])
# --- Class representing an argument (basis function) in a form ---
@ufl_type()
class Argument(FormArgument):
"""UFL value: Representation of an argument to a form."""
__slots__ = as_native_strings((
"_ufl_function_space",
"_ufl_shape",
"_number",
"_part",
"_repr",
))
def __init__(self, function_space, number, part=None):
FormArgument.__init__(self)
if isinstance(function_space, FiniteElementBase):
# For legacy support for .ufl files using cells, we map the cell to
# the default Mesh
element = function_space
domain = default_domain(element.cell())
function_space = FunctionSpace(domain, element)
elif not isinstance(function_space, AbstractFunctionSpace):
error("Expecting a FunctionSpace or FiniteElement.")
self._ufl_function_space = function_space
self._ufl_shape = function_space.ufl_element().value_shape()
if not isinstance(number, numbers.Integral):
error("Expecting an int for number, not %s" % (number,))
if part is not None and not isinstance(part, numbers.Integral):
error("Expecting None or an int for part, not %s" % (part,))
self._number = number
self._part = part
self._repr = as_native_str("Argument(%s, %s, %s)" % (
repr(self._ufl_function_space), repr(self._number), repr(self._part)))
@property
def ufl_shape(self):
"Return the associated UFL shape."
return self._ufl_shape
def ufl_function_space(self):
"Get the function space of this Argument."
return self._ufl_function_space
def ufl_domain(self):
"Deprecated, please use .ufl_function_space().ufl_domain() instead."
# TODO: deprecate("Argument.ufl_domain() is deprecated, please
# use .ufl_function_space().ufl_domain() instead.")
return self._ufl_function_space.ufl_domain()
def ufl_element(self):
"Deprecated, please use .ufl_function_space().ufl_element() instead."
# TODO: deprecate("Argument.ufl_domain() is deprecated, please
# use .ufl_function_space().ufl_element() instead.")
return self._ufl_function_space.ufl_element()
# def element(self):
# "Deprecated, please use .ufl_function_space().ufl_element() instead."
# deprecate("Argument.element() is deprecated, please use Argument.ufl_element() instead.")
# return self.ufl_element()
def number(self):
"Return the Argument number."
return self._number
def part(self):
return self._part
def is_cellwise_constant(self):
"Return whether this expression is spatially constant over each cell."
# TODO: Should in principle do like with Coefficient,
# but that may currently simplify away some arguments
# we want to keep, or? See issue#13.
# When we can annotate zero with arguments, we can change this.
return False
def ufl_domains(self):
"Deprecated, please use .ufl_function_space().ufl_domains() instead."
# TODO: deprecate("Argument.ufl_domains() is deprecated,
# please use .ufl_function_space().ufl_domains() instead.")
return self._ufl_function_space.ufl_domains()
def _ufl_signature_data_(self, renumbering):
"Signature data for form arguments depend on the global numbering of the form arguments and domains."
fsdata = self._ufl_function_space._ufl_signature_data_(renumbering)
return ("Argument", self._number, self._part, fsdata)
def __str__(self):
number = str(self._number)
if len(number) == 1:
s = "v_%s" % number
else:
s = "v_{%s}" % number
if self._part is not None:
part = str(self._part)
if len(part) == 1:
s = "%s^%s" % (s, part)
else:
s = "%s^{%s}" % (s, part)
return s
def __repr__(self):
return self._repr
def __eq__(self, other):
"""Deliberately comparing exact type and not using isinstance here,
meaning eventual subclasses must reimplement this function to work
correctly, and instances of this class will compare not equal to
instances of eventual subclasses. The overloading allows
subclasses to distinguish between test and trial functions
with a different non-ufl payload, such as dolfin FunctionSpace
with different mesh. This is necessary because arguments with the
same element and argument number are always equal from a pure ufl
point of view, e.g. TestFunction(V1) == TestFunction(V2) if V1 and V2
are the same ufl element but different dolfin function spaces.
"""
return (type(self) == type(other) and
self._number == other._number and
self._part == other._part and
self._ufl_function_space == other._ufl_function_space)
# --- Helper functions for pretty syntax ---
def TestFunction(function_space, part=None):
"""UFL value: Create a test function argument to a form."""
return Argument(function_space, 0, part)
def TrialFunction(function_space, part=None):
"""UFL value: Create a trial function argument to a form."""
return Argument(function_space, 1, part)
# --- Helper functions for creating subfunctions on mixed elements ---
def Arguments(function_space, number):
"""UFL value: Create an Argument in a mixed space, and return a
tuple with the function components corresponding to the subelements."""
return split(Argument(function_space, number))
def TestFunctions(function_space):
"""UFL value: Create a TestFunction in a mixed space, and return a
tuple with the function components corresponding to the subelements."""
return Arguments(function_space, 0)
def TrialFunctions(function_space):
"""UFL value: Create a TrialFunction in a mixed space, and return a
tuple with the function components corresponding to the subelements."""
return Arguments(function_space, 1)
|