function

class nutils.function.LowerArg(space, transforms, index, coordinates)

Bases: object

Argument for Lowerable.lower().

space
Type:

str

transforms
Type:

nutils.transformseq.Transforms

index
Type:

nutils.evaluable.Array

coordinates
Type:

nutils.evaluable.Array, optional

replace(obj, /, **changes)

Return a new object replacing specified fields with new values.

This is especially useful for frozen classes. Example usage:

@dataclass(frozen=True)
class C:
    x: int
    y: int

c = C(1, 2)
c1 = replace(c, x=3)
assert c1.x == 3 and c1.y == 2
property without_points: LowerArg

A copy of the LowerArg with coordinates set to None.

map_coordinates(self, map)

Return a copy of the LowerArg with coordinates mapped using map.

rename_spaces(self, map)

Return a copy of the LowerArg with space renamed using map.

If the old space is not found in map, the LowerArg is returned unchanged.

__weakref__

list of weak references to the object

class nutils.function.LowerArgs(points_shape, args)

Bases: object

An ordered sequence of LowerArgs with common points_shape.

points_shape

The shape of the leading points axes that are to be added to the lowered nutils.evaluable.Array.

Type:

tuple of scalar, integer nutils.evaluable.Array

args

Tuple of transforms, index and coordinates per space.

Type:

tuple of LowerArg

classmethod empty(points_shape=())

Returns an empty instance of LowerArgs, optionally with the provided points_shape.

property without_points: LowerArgs

A copy of the LowerArgs without points (empty points_shape and LowerArg.coordinates).

map_coordinates(self, points_shape, map)

Return a copy of the LowerArgs with the given points_shape and LowerArg.coordinates mapped using map.

rename_spaces(self, map)

Return a copy of the LowerArgs with spaces renamed using map.

Spaces that are not found in map are unchanged. The order of the args remains the same.

It is allowed to map different old spaces to the same new space. Note that LowerArgs.__getitem__() only returns the last entry of args that matches the given space.

__mul__(self, other)

Return the outer product of two LowerArgs.

The points_shape of the product is the concatenation of the points_shapes of the factors; likewise for the args. If both factors contain LowerArgs for a certain space, the LowerArg of the right factor will be exposed.

__add__(self, other)

Join two LowerArgs with the same points_shape.

The args is the concatenation of the args of the terms. If both terms contain LowerArgs for a certain space, the LowerArg of the right term will be exposed.

__getitem__(self, space)

Return the exposed LowerArg with the given space.

Raises:

KeyError – If the space is unknown.

property exposed

Subset of args that are exposed.

An item a of args is exposed if there exists no item b in args to the right of a with the same LowerArg.space as a.

property spaces: FrozenSet[str]

The set of spaces of the args

__weakref__

list of weak references to the object

class nutils.function.Lowerable

Bases: object

Protocol for lowering to nutils.evaluable.Array.

lower(self, args)

Lower this object to a nutils.evaluable.Array.

Parameters:

args (LowerArgs)

__weakref__

list of weak references to the object

class nutils.function.Array(shape, dtype, spaces, arguments)

Bases: NDArrayOperatorsMixin

Base class for array valued functions.

Parameters:
  • shape (tuple of int) – The shape of the array function.

  • dtype (bool, int, float or complex) – The dtype of the array elements.

  • spaces (frozenset of str) – The spaces this array function is defined on.

  • arguments (mapping of str) – The mapping of argument names to their shapes and dtypes for all arguments of this array function.

shape

The shape of this array function.

Type:

tuple of int

ndim

The dimension of this array function.

Type:

int

dtype

The dtype of the array elements.

Type:

bool, int, float or complex

spaces

The spaces this array function is defined on.

Type:

frozenset of str

arguments

The mapping of argument names to their shapes and dtypes for all arguments of this array function.

Type:

mapping of str

classmethod cast(_Array__value, dtype=None, ndim=None)

Cast a value to an Array.

Parameters:

value (Array, or a numpy.ndarray or similar) – The value to cast.

__len__(self)

Length of the first axis.

__iter__(self)

Iterator over the first axis.

property size: int | Array

The total number of elements in this array.

property T: Array

The transposed array.

sum(self, axis=None)

Return the sum of array elements over the given axes.

Warning

This method will change in future to match Numpy’s equivalent method, which sums over all axes by default. During transition, use of this method without an axis argument will raise an error if the input array is of ndim >= 2.

Parameters:
  • arg (Array or something that can be cast() into one)

  • axis (int, a sequence of int, or None) – The axis or axes to sum. None, the default, implies summation over the last axis.

Return type:

Array

prod(self, _Array__axis)

Return the product of array elements over the given axes.

Parameters:

axis (int, a sequence of int, or None) – The axis or axes along which the product is performed. None, the default, implies all axes.

Return type:

Array

dot(self, _Array__other, axes=None)

Return the inner product of the arguments over the given axes, elementwise over the remanining axes.

Warning

This method will change in future to match Numpy’s equivalent method, which does not support an axis argument and has different behaviour in case of higher dimensional input. During transition, use of this method for any situation other than the contraction of two vectors will raise a warning, and later an error. For continuity, use numpy.dot, numpy.matmul, or the @ operator instead.

Parameters:
  • arg (Array or something that can be cast() into one)

  • axis (int, a sequence of int, or None) – The axis or axes along which the inner product is performed. If the second argument has one dimension and axes is None, the default, the inner product of the second argument with the first axis of the first argument is computed. Otherwise axes=None is not allowed.

Return type:

Array

normalized(self, _Array__axis=-1)

See normalized().

normal(self, refgeom=None, *, spaces=None)

See normal().

curvature(self, ndims=-1, *, spaces=None)

See curvature().

add_T(self, axes)

See add_T().

grad(self, geom, /, ndims=0, *, spaces=None)

See grad().

laplace(self, geom, /, ndims=0, *, spaces=None)

See laplace().

symgrad(self, geom, /, ndims=0, *, spaces=None)

See symgrad().

div(self, geom, /, ndims=0, *, spaces=None)

See div().

curl(self, geom, /, *, spaces=None)

See curl().

dotnorm(self, geom, /, axis=-1, spaces=None)

See dotnorm().

tangent(self, vec, /, *, spaces=None)

See tangent().

ngrad(self, geom, /, ndims=0, *, spaces=None)

See ngrad().

nsymgrad(self, geom, /, ndims=0, *, spaces=None)

See nsymgrad().

choose(self, _Array__choices)

See choose().

eval(self, /, arguments=None, *, legacy=None, **kwargs)

Evaluate this function.

derivative(self, _Array__var)

See derivative().

replace(self, _Array__arguments)

Return a copy with arguments applied.

contains(self, _Array__name)

Test if target occurs in this function.

conjugate(self)

Return the complex conjugate, elementwise.

Returns:

The complex conjugate.

Return type:

Array

conj(self)

Return the complex conjugate, elementwise.

Returns:

The complex conjugate.

Return type:

Array

property real

Return the real part of the complex argument.

Returns:

The real part of the complex argument.

Return type:

Array

property imag

Return the imaginary part of the complex argument.

Returns:

The imaginary part of the complex argument.

Return type:

Array

__weakref__

list of weak references to the object

class nutils.function.Custom(args, shape, dtype, npointwise=0)

Bases: Array

Combined nutils.function and nutils.evaluable array base class.

Ordinary Array subclasses should define the Array.lower method, which returns the corresponding nutils.evaluable.Array with the proper amount of points axes. In many cases the Array subclass is trivial and the corresponding nutils.evaluable.Array contains all the specifics. For those situations the Custom base class exists. Rather than defining the Array.lower method, this base class allows you to define a Custom.evalf() and optionally a Custom.partial_derivative(), which are used to instantiate a generic nutils.evaluable.Array automatically during lowering.

By default the Array arguments passed to the constructor are unmodified. Broadcasting and singleton expansion, if required, should be applied before passing the arguments to the constructor of Custom. It is possible to declare npointwise leading axes as being pointwise. In that case Custom applies singleton expansion to the leading pointwise axes and the shape of the result passed to Custom should not include the pointwise axes.

For internal reasons, both evalf and partial_derivative must be static methods, meaning that they will not receive a reference to self when called. Instead, all relevant data should be passed to evalf via the constructor argument args. The constructor will automatically distinguish between Array and non-Array arguments, and pass the latter on to evalf unchanged. The partial_derivative will not be called for those arguments. Furthermore, evalf and partial_derivative must be hashable. The nutils.types.hashable_function() decorator both defines a hash for the decorated function and makes the decorated function static.

Parameters:
  • args (iterable of Array objects or immutable and hashable objects) – The arguments of this array function.

  • shape (tuple of int or Array) – The shape of the array function without leading pointwise axes.

  • dtype (bool, int, float or complex) – The dtype of the array elements.

  • npointwise (int) – The number of leading pointwise axis.

Example

The following class implements multiplication using Custom without broadcasting and for float arrays only.

>>> from nutils.types import hashable_function
>>> class Multiply(Custom):
...
...   def __init__(self, left: IntoArray, right: IntoArray) -> None:
...     # Broadcast the arrays. `broadcast_arrays` automatically casts the
...     # arguments to `Array`.
...     left, right = broadcast_arrays(left, right)
...     # Dtype coercion is beyond the scope of this example.
...     if left.dtype != float or right.dtype != float:
...       raise ValueError('left and right arguments should have dtype float')
...     # We treat all axes as pointwise, hence parameter `shape`, the shape
...     # of the remainder, is empty and `npointwise` is the dimension of the
...     # arrays.
...     super().__init__(args=(left, right), shape=(), dtype=float, npointwise=left.ndim)
...
...   @hashable_function
...   def evalf(left: numpy.ndarray, right: numpy.ndarray) -> numpy.ndarray:
...     # Because all axes are pointwise, the evaluated `left` and `right`
...     # arrays are 1d.
...     return left * right
...
...   @hashable_function
...   def partial_derivative(iarg: int, left: Array, right: Array) -> IntoArray:
...     # The arguments passed to this function are of type `Array` and the
...     # pointwise axes are omitted, hence `left` and `right` are 0d.
...     if iarg == 0:
...       return right
...     elif iarg == 1:
...       return left
...     else:
...       raise NotImplementedError
...
>>> Multiply([1., 2.], [3., 4.]).eval()
array([ 3.,  8.])
>>> a = Argument('a', (2,))
>>> Multiply(a, [3., 4.]).derivative(a).eval(a=numpy.array([1., 2.])).export('dense')
array([[ 3.,  0.],
       [ 0.,  4.]])

The following class wraps numpy.roll(), applied to the last axis of the array argument, with constant shift.

>>> class Roll(Custom):
...
...   def __init__(self, array: IntoArray, shift: int) -> None:
...     array = asarray(array)
...     # We are being nit-picky here and cast `exponent` to an `int` without
...     # truncation.
...     shift = shift.__index__()
...     # We treat all but the last axis of `array` as pointwise.
...     super().__init__(args=(array, shift), shape=array.shape[-1:], dtype=array.dtype, npointwise=array.ndim-1)
...
...   @hashable_function
...   def evalf(array: numpy.ndarray, shift: int) -> numpy.ndarray:
...     # `array` is evaluated to a `numpy.ndarray` because we passed `array`
...     # as an `Array` to the constructor. `shift`, however, is untouched
...     # because it is not an `Array`. The `array` has two axes: a points
...     # axis and the axis to be rolled.
...     return numpy.roll(array, shift, 1)
...
...   @hashable_function
...   def partial_derivative(iarg, array: Array, shift: int) -> IntoArray:
...     if iarg == 0:
...       return Roll(eye(array.shape[0]), shift).T
...     else:
...       # We don't implement the derivative to `shift`, because this is
...       # a constant `int`.
...       raise NotImplementedError
...
>>> Roll([1, 2, 3], 1).eval()
array([3, 1, 2])
>>> b = Argument('b', (3,))
>>> Roll(b, 1).derivative(b).eval().export('dense')
array([[ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  1.,  0.]])
evalf(*args)

Evaluate this function for the given evaluated arguments.

This function is called with arguments that correspond to the arguments that are passed to the constructor of Custom: every instance of Array is evaluated to a numpy.ndarray with one leading axis compared to the Array and all other instances are passed as is. The return value of this method should also include a leading axis with the same length as the other array arguments have, or length one if there are no array arguments. If constructor argument npointwise is nonzero, the pointwise axes of the Array arguments are raveled and included in the single leading axis of the evaluated array arguments as well.

If possible this method should not use self, e.g. by decorating this method with staticmethod(). The result of this function must only depend on the arguments and must not mutate the arguments.

This method is equivalent to nutils.evaluable.Array.evalf up to the treatment of the leading axis.

Parameters:

*args – The evaluated arguments corresponding to the args parameter of the Custom constructor.

Returns:

The result of this function with one leading points axis.

Return type:

numpy.ndarray

partial_derivative(iarg, *args)

Return the partial derivative of this function to Custom constructor argument number iarg.

This method is only called for those arguments that are instances of Array with dtype float and have the derivative target as a dependency. It is therefor allowed to omit an implementation for some or all arguments if the above conditions are not met.

Axes that are declared pointwise via the npointwise constructor argument are omitted.

Parameters:
  • iarg (int) – The index of the argument to compute the derivative for.

  • *args – The arguments as passed to the constructor of Custom.

Returns:

The partial derivative of this function to the given argument.

Return type:

Array or similar

class nutils.function.Argument(name, shape, dtype=<class 'float'>)

Bases: Array

Array valued function argument.

Parameters:
  • name (str) – The name of this argument.

  • shape (tuple of int) – The shape of this argument.

  • dtype (bool, int, float or complex) – The dtype of the array elements.

name

The name of this argument.

Type:

str

nutils.function.asarray(__arg)

Cast a value to an Array.

Parameters:

value (Array, or a numpy.ndarray or similar) – The value to cast.

Return type:

Array

nutils.function.zeros(shape, dtype=<class 'float'>)

Create a new Array of given shape and dtype, filled with zeros.

Parameters:
  • shape (tuple of int or Array) – The shape of the new array.

  • dtype (bool, int or float) – The dtype of the array elements.

Return type:

Array

nutils.function.ones(shape, dtype=<class 'float'>)

Create a new Array of given shape and dtype, filled with ones.

Parameters:
  • shape (tuple of int or Array) – The shape of the new array.

  • dtype (bool, int or float) – The dtype of the array elements.

Return type:

Array

nutils.function.eye(__n, dtype=<class 'float'>)

Create a 2-D Array with ones on the diagonal and zeros elsewhere.

Parameters:
  • n (int) – The number of rows and columns.

  • dtype (bool, int or float) – The dtype of the array elements.

Return type:

Array

nutils.function.levicivita(__n, dtype=<class 'float'>)

Create an n-D Levi-Civita symbol.

Parameters:
  • n (int) – The dimension of the Levi-Civita symbol.

  • dtype (bool, int or float) – The dtype of the array elements.

Return type:

Array

nutils.function.swap_spaces(arg, space0, space1, /)

Swap the two spaces of arg.

If arg is invariant to the spaces swap_spaces() does nothing. Also, swapping arg twice with the same set of spaces results in the original arg.

Parameters:
  • arg (Array or something that can be cast() into one)

  • space0 (str) – Space to swap.

  • space1 (str) – Space to swap.

nutils.function.opposite(__arg)

Evaluate this function at the opposite side.

When evaluating a function arg at an interface, the function will be evaluated at one side of the interface. opposite() selects the opposite side.

Parameters:

arg (Array or something that can be cast() into one)

Return type:

Array

Example

We create a one dimensional topology with two elements and a discontinuous function f that is 1 on the first element and 2 on the second:

>>> from nutils import mesh, function
>>> topo, geom = mesh.rectilinear([2])
>>> f = topo.basis('discont', 0).dot([1, 2])

Evaluating this function at the interface gives (for this particular topology) the value at the side of the first element:

>>> topo.interfaces.sample('bezier', 1).eval(f)
array([ 1.])

Using opposite() we obtain the value at the side of second element:

>>> topo.interfaces.sample('bezier', 1).eval(function.opposite(f))
array([ 2.])

It is allowed to nest opposites:

>>> topo.interfaces.sample('bezier', 1).eval(function.opposite(function.opposite(f)))
array([ 1.])

See also

mean()

the mean at an interface

jump()

the jump at an interface

nutils.function.mean(__arg)

Return the mean of the argument at an interface.

Parameters:

arg (Array or something that can be cast() into one)

Return type:

Array

Example

We create a one dimensional topology with two elements and a discontinuous function f that is 1 on the first element and 2 on the second:

>>> from nutils import mesh, function
>>> topo, geom = mesh.rectilinear([2])
>>> f = topo.basis('discont', 0).dot([1, 2])

Evaluating the mean of this function at the interface gives:

>>> topo.interfaces.sample('bezier', 1).eval(function.mean(f))
array([ 1.5])
nutils.function.jump(__arg)

Return the jump of the argument at an interface.

The sign of the jump depends on the orientation of the interfaces in a Topology. Usually the jump is used as part of an inner product with the normal() of the geometry is used, which is independent of the orientation of the interfaces.

Parameters:

arg (Array or something that can be cast() into one)

Return type:

Array

Example

We create a one dimensional topology with two elements and a discontinuous function f that is 1 on the first element and 2 on the second:

>>> from nutils import mesh, function
>>> topo, geom = mesh.rectilinear([2])
>>> f = topo.basis('discont', 0).dot([1, 2])

Evaluating the jump of this function at the interface gives (for this particular topology):

>>> topo.interfaces.sample('bezier', 1).eval(function.jump(f))
array([ 1.])
nutils.function.normalized(__arg, axis=-1)

Return the argument normalized over the given axis, elementwise over the remanining axes.

Parameters:
  • arg (Array or something that can be cast() into one)

  • axis (int) – The axis along which the norm is computed. Defaults to the last axis.

Return type:

Array

nutils.function.matmat(__arg0, *args)

helper function, contracts last axis of arg0 with first axis of arg1, etc

nutils.function.diagonalize(__arg, __axis=-1, __newaxis=-1)

Return argument with newaxis such that axis and newaxis` is diagonal.

Parameters:
  • arg (Array or something that can be cast() into one)

  • axis (int) – The axis to diagonalize. Defaults to the last axis w.r.t. the argument.

  • newaxis (int) – The axis to add. Defaults to the last axis w.r.t. the return value.

Return type:

Array

nutils.function.outer(arg1, arg2=None, axis=0)

outer product

nutils.function.insertaxis(__array, axis, length)

Insert an axis with given length.

Parameters:
  • array (Array or something that can be cast() into one)

  • axis (class:int) – The position of the inserted axis. Negative values count from the end of the resulting array.

  • length (int or Array) – The length of the inserted axis.

Return type:

Array

nutils.function.expand_dims(__array, axis)

Insert a singleton axis.

Parameters:
  • array (Array or something that can be cast() into one)

  • axis (class:int) – The position of the inserted axis. Negative values count from the end of the resulting array.

Return type:

Array

nutils.function.unravel(__array, axis, shape)

Unravel an axis to the given shape.

Parameters:
  • array (Array or something that can be cast() into one)

  • axis (int) – The axis to unravel.

  • shape (two-tuple of int) – The shape of the unraveled axes.

Returns:

The resulting array with unraveled axes axis and axis+1.

Return type:

Array

nutils.function.get(__array, __axis, __index)

Get one element from an array along an axis.

Parameters:
  • array (Array or something that can be cast() into one)

  • axis (int) – The axis to get an element from.

  • index (int or Array) – The index of the element to get.

Return type:

Array

See also

kronecker()

The complement operation.

nutils.function.scatter(__array, length, indices)

Distribute the last dimensions of an array over a new axis.

Parameters:
  • array (Array or something that can be cast() into one)

  • length (int) – The target length of the scattered axis.

  • indices (Array) – The indices of the elements in the resulting array.

Return type:

Array

Notes

Scatter strictly reorganizes array entries, it cannot assign multiple entries to the same position. In other words, the provided indices must be unique.

nutils.function.kronecker(__array, axis, length, pos)

Position an element in an axis of given length.

Parameters:
  • array (Array or something that can be cast() into one)

  • axis (int) – The axis to inflate. The elements are inflated from axes axis to axis+indices.ndim of the input array.

  • length (int) – The length of the inflated axis.

  • pos (int or Array) – The index of the element in the resulting array.

Return type:

Array

See also

get()

The complement operation.

nutils.function.replace_arguments(__array, __arguments)

Replace arguments with Array objects.

Parameters:
  • array (Array or something that can be cast() into one)

  • arguments (dict of str and Array) – The argument name to array mapping.

Return type:

Array

nutils.function.linearize(__array, __arguments)

Linearize functional.

Similar to derivative(), linearize takes the derivative of an array to one or more arguments, but with the derivative directions represented by arguments rather than array axes. The result is by definition linear in the new arguments.

Parameters:
  • array (Array or something that can be cast() into one)

  • arguments (str, dict or iterable of strings)

Example

The following example demonstrates the use of linearize with four equivalent argument specifications:

>>> u, v, p, q = [Argument(s, (), float) for s in 'uvpq']
>>> f = u**2 + p
>>> lin1 = linearize(f, 'u:v,p:q')
>>> lin2 = linearize(f, dict(u='v', p='q'))
>>> lin3 = linearize(f, ('u:v', 'p:q'))
>>> lin4 = linearize(f, (('u', 'v'), ('p', 'q')))
>>> # lin1 = lin2 == lin3 == lin4 == 2 * u * v + q
nutils.function.broadcast_arrays(*arrays)

Broadcast the given arrays.

Parameters:

*arrays (Array or similar)

Returns:

The broadcasted arrays.

Return type:

tuple of Array

nutils.function.typecast_arrays(*arrays, min_dtype=<class 'bool'>)

Cast the given arrays to the same dtype.

Parameters:

*arrays (Array or similar)

Returns:

The typecasted arrays.

Return type:

tuple of Array

nutils.function.broadcast_shapes(*shapes)

Broadcast the given shapes into a single shape.

Parameters:

*shapes (tuple or int)

Returns:

The broadcasted shape.

Return type:

tuple of int

nutils.function.derivative(__arg, __var)

Differentiate arg to var.

Parameters:
Return type:

Array

nutils.function.grad(arg, geom, /, ndims=0, *, spaces=None)

Return the gradient of the argument to the given geometry.

Parameters:
  • arg (Array or something that can be cast() into one)

  • geom (Array or something that can be cast() into one)

  • ndims (int) – The dimension of the local coordinate system.

  • spaces (iterable of str, optional) – Compute the gradient in spaces. If absent all spaces of geom are used.

Return type:

Array

nutils.function.curl(arg, geom, /, *, spaces=None)

Return the curl of the argument w.r.t. the given geometry.

Parameters:
  • arg (Array or something that can be cast() into one)

  • geom (Array or something that can be cast() into one)

  • spaces (iterable of str, optional) – Compute the curl in spaces. If absent all spaces of geom are used.

Return type:

Array

nutils.function.normal(geom, /, refgeom=None, *, spaces=None)

Return the normal of the geometry.

Parameters:
  • geom (Array or something that can be cast() into one)

  • refgeom (Array, optional`) – The reference geometry. If None, the reference geometry is the tip coordinate system of the spaces on which geom is defined. The dimension of the reference geometry must be exactly one smaller than the dimension of the geometry.

  • spaces (iterable of str, optional) – Compute the normal in spaces. If absent all spaces of geom are used.

Return type:

Array

nutils.function.dotnorm(arg, geom, /, axis=-1, *, spaces=None)

Return the inner product of an array with the normal of the given geometry.

Parameters:
  • arg (Array or something that can be cast() into one) – The array.

  • geom (Array or something that can be cast() into one) – The geometry. This must be a 1-D array.

  • axis (int) – The axis of arg along which the inner product should be performed. Defaults to the last axis.

  • spaces (iterable of str, optional) – Compute the inner product with the normal in spaces. If absent all spaces of geom are used.

Return type:

Array

nutils.function.tangent(geom, vec, /, *, spaces=None)

Return the tangent.

Parameters:
  • geom (Array or something that can be cast() into one)

  • vec (Array or something that can be cast() into one)

  • spaces (iterable of str, optional) – Compute the tangent in spaces. If absent all spaces of geom are used.

Return type:

Array

nutils.function.jacobian(geom, ndims=None, /, *, spaces=None)

Return the absolute value of the determinant of the Jacobian matrix of the given geometry.

Parameters:
  • geom (Array or something that can be cast() into one) – The geometry.

  • spaces (iterable of str, optional) – Compute the jacobian in spaces. If absent all spaces of geom are used.

Return type:

Array

nutils.function.J(geom, ndims=None, /, *, spaces=None)

Return the absolute value of the determinant of the Jacobian matrix of the given geometry.

Alias of jacobian().

nutils.function.surfgrad(arg, /, geom, *, spaces=None)

Return the surface gradient of the argument to the given geometry.

Parameters:
  • arg (Array or something that can be cast() into one)

  • geom (Array or something that can be cast() into one)

  • spaces (iterable of str, optional) – Compute the surface gradient in spaces. If absent all spaces of geom are used.

Return type:

Array

nutils.function.curvature(geom, /, ndims=-1, *, spaces=None)

Return the curvature of the given geometry.

Parameters:
  • geom (Array or something that can be cast() into one)

  • ndims (int)

  • spaces (iterable of str, optional) – Compute the curvature in spaces. If absent all spaces of geom are used.

Return type:

Array

nutils.function.div(arg, geom, /, ndims=0, spaces=None)

Return the divergence of arg w.r.t. the given geometry.

Parameters:
  • arg (Array or something that can be cast() into one)

  • geom (Array or something that can be cast() into one)

  • ndims (int)

  • spaces (iterable of str, optional) – Compute the divergence in spaces. If absent all spaces of geom are used.

Return type:

Array

nutils.function.laplace(arg, geom, /, ndims=0, spaces=None)

Return the Laplacian of arg w.r.t. the given geometry.

Parameters:
  • arg (Array or something that can be cast() into one)

  • geom (Array or something that can be cast() into one)

  • ndims (int)

  • spaces (iterable of str, optional) – Compute the Laplacian in spaces. If absent all spaces of geom are used.

Return type:

Array

nutils.function.symgrad(arg, geom, /, ndims=0, *, spaces=None)

Return the symmetric gradient of arg w.r.t. the given geometry.

Parameters:
  • arg (Array or something that can be cast() into one)

  • geom (Array or something that can be cast() into one)

  • ndims (int)

  • spaces (iterable of str, optional) – Compute the symmetric gradient in spaces. If absent all spaces of geom are used.

Return type:

Array

nutils.function.ngrad(arg, geom, /, ndims=0, *, spaces=None)

Return the inner product of the gradient of arg with the normal of the given geometry.

Parameters:
  • arg (Array or something that can be cast() into one)

  • geom (Array or something that can be cast() into one)

  • ndims (int)

  • spaces (iterable of str, optional) – Compute the inner product of the gradient with the normal in spaces. If absent all spaces of geom are used.

Return type:

Array

nutils.function.nsymgrad(arg, geom, /, ndims=0, *, spaces=None)

Return the inner product of the symmetric gradient of arg with the normal of the given geometry.

Parameters:
  • arg (Array or something that can be cast() into one)

  • geom (Array or something that can be cast() into one)

  • ndims (int)

  • spaces (iterable of str, optional) – Compute the inner product of the symmetric gradient with the normal in spaces. If absent all spaces of geom are used.

Return type:

Array

nutils.function.eval(funcs, /, arguments=None, **kwargs)

Evaluate one or several Array objects.

Parameters:
  • funcs (tuple of Array objects) – Arrays to be evaluated.

  • arguments (dict (default: None)) – Optional arguments for function evaluation.

Returns:

results

Return type:

tuple of arrays

nutils.function.as_coo(array)

Convert any array to an evaluable tuple of sparse COO data.

The tuple consists of the array values, followed by the corresponding indices in all axes. Indices are lexicographically ordered and unique, but values are not guaranteed to be nonzero.

nutils.function.as_csr(array)

Convert a 2D array to an evaluable tuple of sparse CSR data.

The tuple consists of the array values, row pointers, and column indices.

nutils.function.integral(func, sample)

Integrate a function over a sample.

Parameters:
nutils.function.sample(func, sample)

Evaluate a function in all sample points.

Parameters:
nutils.function.isarray(__arg)

Test if the argument is an instance of Array.

nutils.function.rootcoords(space, __dim)

Return the root coordinates.

nutils.function.piecewise(level, intervals, *funcs)
nutils.function.partition(f, *levels)

Create a partition of unity for a scalar function f.

When n levels are specified, n+1 indicator functions are formed that evaluate to one if and only if the following condition holds:

indicator 0: f < levels[0]
indicator 1: levels[0] < f < levels[1]
...
indicator n-1: levels[n-2] < f < levels[n-1]
indicator n: f > levels[n-1]

At the interval boundaries the indicators evaluate to one half, in the remainder of the domain they evaluate to zero such that the whole forms a partition of unity. The partitions can be used to create a piecewise continuous function by means of multiplication and addition.

The following example creates a topology consiting of three elements, and a function f that is zero in the first element, parabolic in the second, and zero again in the third element.

>>> from nutils import mesh
>>> domain, x = mesh.rectilinear([3])
>>> left, center, right = partition(x[0], 1, 2)
>>> f = (1 - (2*x[0]-3)**2) * center
Parameters:
  • f (Array) – Scalar-valued function

  • levels (scalar constants or Arrays) – The interval endpoints.

Returns:

The indicator functions.

Return type:

list of scalar Arrays

nutils.function.heaviside(f)

Create a heaviside step-function based on a scalar function f.

\[ \begin{align}\begin{aligned}H(f) &= 0 && f < 0\\H(f) &= 0.5 && f = 0\\H(f) &= 1 && f > 0\end{aligned}\end{align} \]
Parameters:

f (Array) – Scalar-valued function

Returns:

The heaviside function.

Return type:

Array

See also

partition()

generalized version of heaviside()

nutils.function.chain(_funcs)
nutils.function.vectorize(args)

Combine scalar-valued bases into a vector-valued basis.

Parameters:

args (iterable of 1-dimensional nutils.function.Array objects)

Return type:

Array

nutils.function.add_T(__arg, axes=(-2, -1))

add transposed

nutils.function.dotarg(*args, **kwargs)

Alias for field().

nutils.function.field(name, /, *arrays, shape=(), dtype=<class 'float'>)

Return the inner product of the first axes of the given arrays with an argument with the given name.

An argument with shape (arrays[0].shape[0], ..., arrays[-1].shape[0]) + shape will be created. Repeatedly the inner product of the result, starting with the argument, with every array from arrays is taken, where all but the first axis are treated as an outer product.

Parameters:
  • name (str) – The name of the argument.

  • *arrays (Array or something that can be cast() into one) – The arrays to take inner products with.

  • shape (tuple of int, optional) – The shape to be appended to the argument.

  • dtype (bool, int, float or complex) – The dtype of the argument.

Returns:

The inner product with shape shape + arrays[0].shape[1:] + ... + arrays[-1].shape[1:].

Return type:

Array

nutils.function.arguments_for(*arrays)

Get all arguments that array(s) depend on.

Given any number of arrays, return a dictionary of all arguments involved, mapping the name to the Argument object. Raise a ValueError if arrays have conflicting arguments, i.e. sharing a name but differing in shape and/or dtype.

class nutils.function.Basis(ndofs, nelems, index, coords)

Bases: Array

Abstract base class for bases.

A basis is a sequence of elementwise polynomial functions.

Parameters:
  • ndofs (int) – The number of functions in this basis.

  • index (Array) – The element index.

  • coords (Array) – The element local coordinates.

Notes

Subclasses must implement get_dofs() and get_coefficients() and if possible should redefine get_support().

get_support(self, dof)

Return the support of basis function dof.

If dof is an int, return the indices of elements that form the support of dof. If dof is an array, return the union of supports of the selected dofs as a unique array. The returned array is always unique, i.e. strict monotonic increasing.

Parameters:

dof (int or array of int or bool) – Index or indices of basis function or a mask.

Returns:

support – The elements (as indices) where function dof has support.

Return type:

sorted and unique numpy.ndarray

get_dofs(self, ielem)

Return an array of indices of basis functions with support on element ielem.

If ielem is an int, return the dofs on element ielem matching the coefficients array as returned by get_coefficients(). If ielem is an array, return the union of dofs on the selected elements as a unique array, i.e. a strict monotonic increasing array.

Parameters:

ielem (int or array of int or bool) – Element number(s) or mask.

Returns:

dofs – A 1D Array of indices.

Return type:

numpy.ndarray

get_ndofs(self, ielem)

Return the number of basis functions with support on element ielem.

get_coefficients(self, ielem)

Return an array of coefficients for all basis functions with support on element ielem.

Parameters:

ielem (int) – Element number.

Returns:

coefficients – Array of coefficients with shape (nlocaldofs,)+(degree,)*ndims, where the first axis corresponds to the dofs returned by get_dofs().

Return type:

numpy.ndarray

discontinuous_at_partition_interfaces(self, part_indices)

Returns a basis that is discontinuous at element partition interfaces.

Given a partition of elements, this basis is made discontinuous at the partition interfaces. All elements that have the same part index belong to the same part.

The returned basis is formed by clipping each function of the basis to each part individually and stacking all nonzero clipped functions. As a consequence, if a basis function has support on three topologically adjacent elements of which the first and the last element belong to one part and the middle to another, this function will not be clipped to each of the three elements individually, but to the first and the last element and to the middle element.

Parameters:

part_indices (sequence or numpy.ndarray of int) – For each element the index of the part the element belongs to.

class nutils.function.PlainBasis(coefficients, dofs, ndofs, index, coords)

Bases: Basis

A general purpose implementation of a Basis.

Use this class only if there exists no specific implementation of Basis for the basis at hand.

Parameters:
  • coefficients (tuple of numpy.ndarray objects) – The coefficients of the basis functions per transform. The order should match the transforms argument.

  • dofs (tuple of numpy.ndarray objects) – The dofs corresponding to the coefficients argument.

  • ndofs (int) – The number of basis functions.

  • index (Array) – The element index.

  • coords (Array) – The element local coordinates.

class nutils.function.DiscontBasis(coefficients, index, coords)

Bases: Basis

A discontinuous basis with monotonic increasing dofs.

Parameters:
  • coefficients (tuple of numpy.ndarray objects) – The coefficients of the basis functions per transform. The order should match the transforms argument.

  • index (Array) – The element index.

  • coords (Array) – The element local coordinates.

class nutils.function.LegendreBasis(degree, nelems, index, coords)

Bases: Basis

A discontinuous Legendre basis.

Parameters:
  • degree (int) – The degree of the basis.

  • nelems (int) – The number of elements.

  • index (Array) – The element index.

  • coords (Array) – The element local coordinates.

class nutils.function.MaskedBasis(parent, indices)

Bases: Basis

An order preserving subset of another Basis.

Parameters:
  • parent (Basis) – The basis to mask.

  • indices (array of ints) – The strict monotonic increasing indices of parent basis functions to keep.

class nutils.function.StructuredBasis(coeffs, start_dofs, stop_dofs, dofs_shape, transforms_shape, index, coords)

Bases: Basis

A basis for class:nutils.transformseq.StructuredTransforms.

Parameters:
  • coeffs (tuple of tuples of arrays) – Per dimension the coefficients of the basis functions per transform.

  • start_dofs (tuple of arrays of ints) – Per dimension the dof of the first entry in coeffs per transform.

  • stop_dofs (tuple of arrays of ints) – Per dimension one plus the dof of the last entry in coeffs per transform.

  • dofs_shape (tuple of ints) – The tensor shape of the dofs.

  • transforms_shape (tuple of ints) – The tensor shape of the transforms.

  • index (Array) – The element index.

  • coords (Array) – The element local coordinates.

class nutils.function.PrunedBasis(parent, transmap, index, coords)

Bases: Basis

A subset of another Basis.

Parameters:
  • parent (Basis) – The basis to prune.

  • transmap (one-dimensional array of ints) – The indices of transforms in parent that form this subset.

  • index (Array) – The element index.

  • coords (Array) – The element local coordinates.