Source code for pybamm.expression_tree.array
#
# NumpyArray class
#
import numpy as np
import pybamm
from scipy.sparse import issparse, csr_matrix
[docs]class Array(pybamm.Symbol):
"""node in the expression tree that holds an tensor type variable
(e.g. :class:`numpy.array`)
Parameters
----------
entries : numpy.array or list
the array associated with the node. If a list is provided, it is converted to a
numpy array
name : str, optional
the name of the node
domain : iterable of str, optional
list of domains the parameter is valid over, defaults to empty list
auxiliary_domainds : dict, optional
dictionary of auxiliary domains, defaults to empty dict
entries_string : str
String representing the entries (slow to recalculate when copying)
*Extends:* :class:`Symbol`
"""
def __init__(
self,
entries,
name=None,
domain=None,
auxiliary_domains=None,
entries_string=None,
):
if isinstance(entries, list):
entries = np.array(entries)
if entries.ndim == 1:
entries = entries[:, np.newaxis]
if name is None:
name = "Array of shape {!s}".format(entries.shape)
self._entries = entries
# Use known entries string to avoid re-hashing, where possible
self.entries_string = entries_string
super().__init__(name, domain=domain, auxiliary_domains=auxiliary_domains)
@property
def entries(self):
return self._entries
@property
def ndim(self):
""" returns the number of dimensions of the tensor"""
return self._entries.ndim
@property
def shape(self):
""" returns the number of entries along each dimension"""
return self._entries.shape
@property
def entries_string(self):
return self._entries_string
@entries_string.setter
def entries_string(self, value):
# We must include the entries in the hash, since different arrays can be
# indistinguishable by class, name and domain alone
# Slightly different syntax for sparse and non-sparse matrices
if value is not None:
self._entries_string = value
else:
entries = self._entries
if issparse(entries):
self._entries_string = str(entries.__dict__)
else:
self._entries_string = entries.tobytes()
[docs] def set_id(self):
""" See :meth:`pybamm.Symbol.set_id()`. """
self._id = hash(
(self.__class__, self.name, self.entries_string) + tuple(self.domain)
)
def _jac(self, variable):
""" See :meth:`pybamm.Symbol._jac()`. """
# Return zeros of correct size
jac = csr_matrix((self.size, variable.evaluation_array.count(True)))
return pybamm.Matrix(jac)
[docs] def new_copy(self):
""" See :meth:`pybamm.Symbol.new_copy()`. """
return self.__class__(
self.entries,
self.name,
self.domain,
self.auxiliary_domains,
self.entries_string,
)
def _base_evaluate(self, t=None, y=None, y_dot=None, inputs=None):
""" See :meth:`pybamm.Symbol._base_evaluate()`. """
return self._entries
[docs] def is_constant(self):
""" See :meth:`pybamm.Symbol.is_constant()`. """
return True
[docs]def linspace(start, stop, num=50, **kwargs):
"""
Creates a linearly spaced array by calling `numpy.linspace` with keyword
arguments 'kwargs'. For a list of 'kwargs' see the
`numpy linspace documentation <https://tinyurl.com/yc4ne47x>`_
"""
return pybamm.Array(np.linspace(start, stop, num, **kwargs))
[docs]def meshgrid(x, y, **kwargs):
"""
Return coordinate matrices as from coordinate vectors by calling
`numpy.meshgrid` with keyword arguments 'kwargs'. For a list of 'kwargs'
see the `numpy meshgrid documentation <https://tinyurl.com/y8azewrj>`_
"""
[X, Y] = np.meshgrid(x.entries, y.entries)
X = pybamm.Array(X)
Y = pybamm.Array(Y)
return X, Y