pymor.vectorarrays.mpi
¶
Wrapper classes for building MPI distributed VectorArrays
.
This module contains several wrapper classes which allow to
transform single rank VectorArrays
into MPI distributed
VectorArrays
which can be used on rank 0 like ordinary
VectorArrays
.
The implementations are based on the event loop provided
by pymor.tools.mpi
.
Module Contents¶
Classes¶
MPI distributed |
|
int([x]) -> integer |
|
MPI distributed |
|
MPI distributed |
|
Functions¶
Attributes¶
- class pymor.vectorarrays.mpi.MPIVectorArray(obj_id, space)[source]¶
Bases:
pymor.vectorarrays.interface.VectorArray
MPI distributed
VectorArray
.Given a local
VectorArray
on each MPI rank, this wrapper class uses the event loop frompymor.tools.mpi
to build a global MPI distributed vector array from these local arrays.Instances of
MPIVectorArray
can be used on rank 0 like any other (non-distributed)VectorArray
.Note, however, that the implementation of the local VectorArrays needs to be MPI aware. For instance,
cls.inner
must perform the needed MPI communication to sum up the local inner products and return the sums on rank 0.Default implementations for all communication requiring interface methods are provided by
MPIVectorArrayAutoComm
(also seeMPIVectorArrayNoComm
).Note that resource cleanup is handled by
object.__del__
. Please be aware of the peculiarities of destructors in Python!The associated
VectorSpace
isMPIVectorSpace
.- __getitem__(self, ind)[source]¶
Return a
VectorArray
view onto a subset of the vectors in the array.
- copy(self, deep=False)[source]¶
Returns a copy of the array.
All
VectorArray
implementations in pyMOR have copy-on-write semantics: if not specified otherwise by settingdeep
toTrue
, the returned copy will hold a handle to the same array data as the original array, and a deep copy of the data will only be performed when one of the arrays is modified.Note that for
NumpyVectorArray
, a deep copy is always performed when only some vectors in the array are copied.Parameters
- deep
Ensure that an actual copy of the array data is made (see above).
Returns
A copy of the
VectorArray
.
- append(self, other, remove_from_other=False)[source]¶
Append vectors to the array.
Parameters
- other
A
VectorArray
containing the vectors to be appended.- remove_from_other
If
True
, the appended vectors are removed fromother
. For list-like implementations this can be used to prevent unnecessary copies of the involved vectors.
- scal(self, alpha)[source]¶
BLAS SCAL operation (in-place scalar multiplication).
This method calculates
self = alpha*self
If
alpha
is a scalar, each vector is multiplied by this scalar. Otherwise,alpha
has to be a one-dimensionalNumPy array
of the same length asself
containing the factors for each vector.Parameters
- alpha
The scalar coefficient or one-dimensional
NumPy array
of coefficients with which the vectors inself
are multiplied.
- axpy(self, alpha, x)[source]¶
BLAS AXPY operation.
This method forms the sum
self = alpha*x + self
If the length of
x
is 1, the samex
vector is used for all vectors inself
. Otherwise, the lengths ofself
andx
have to agree. Ifalpha
is a scalar, eachx
vector is multiplied with the same factoralpha
. Otherwise,alpha
has to be a one-dimensionalNumPy array
of the same length asself
containing the coefficients for eachx
vector.Parameters
- alpha
The scalar coefficient or one-dimensional
NumPy array
of coefficients with which the vectors inx
are multiplied.- x
A
VectorArray
containing the x-summands.
- inner(self, other, product=None)[source]¶
Returns the inner products between
VectorArray
elements.If
product
isNone
, the Euclidean inner product between thedofs
ofself
andother
are returned, i.e.U.inner(V)
is equivalent to:
U.dofs(np.arange(U.dim)) @ V.dofs(np.arange(V.dim)).T
(Note, that
dofs
is only intended to be called for a small number of DOF indices.)If a
product
Operator
is specified, thisOperator
is used to compute the inner products usingapply2
, i.e.U.inner(V, product)
is equivalent to:product.apply2(U, V)
which in turn is, by default, implemented as:
U.inner(product.apply(V))
In the case of complex numbers, this is antilinear in the first argument, i.e. in ‘self’. Complex conjugation is done in the first argument because most numerical software in the community handles it this way: Numpy, DUNE, FEniCS, Eigen, Matlab and BLAS do complex conjugation in the first argument, only PetSc and deal.ii do complex conjugation in the second argument.
Parameters
- other
A
VectorArray
containing the second factors.- product
If not
None
anOperator
representing the inner product bilinear form.
- pairwise_inner(self, other, product=None)[source]¶
Returns the pairwise inner products between
VectorArray
elements.If
product
isNone
, the Euclidean inner product between thedofs
ofself
andother
are returned, i.e.U.pairwise_inner(V)
is equivalent to:
np.sum(U.dofs(np.arange(U.dim)) * V.dofs(np.arange(V.dim)), axis=-1)
(Note, that
dofs
is only intended to be called for a small number of DOF indices.)If a
product
Operator
is specified, thisOperator
is used to compute the inner products usingpairwise_apply2
, i.e.U.inner(V, product)
is equivalent to:product.pairwise_apply2(U, V)
which in turn is, by default, implemented as:
U.pairwise_inner(product.apply(V))
In the case of complex numbers, this is antilinear in the first argument, i.e. in ‘self’. Complex conjugation is done in the first argument because most numerical software in the community handles it this way: Numpy, DUNE, FEniCS, Eigen, Matlab and BLAS do complex conjugation in the first argument, only PetSc and deal.ii do complex conjugation in the second argument.
Parameters
- other
A
VectorArray
containing the second factors.- product
If not
None
anOperator
representing the inner product bilinear form.
- lincomb(self, coefficients)[source]¶
Returns linear combinations of the vectors contained in the array.
Parameters
- coefficients
A
NumPy array
of dimension 1 or 2 containing the linear coefficients.coefficients.shape[-1]
has to agree withlen(self)
.
Returns
A
VectorArray
result
such thatresult[i] = ∑ self[j] * coefficients[i,j]
in case
coefficients
is of dimension 2, otherwiselen(result) == 1
andresult[0] = ∑ self[j] * coefficients[j].
- dofs(self, dof_indices)[source]¶
Extract DOFs of the vectors contained in the array.
Parameters
- dof_indices
List or 1D
NumPy array
of indices of the DOFs that are to be returned.
Returns
A
NumPy array
result
such thatresult[i, j]
is thedof_indices[j]
-th DOF of thei
-th vector of the array.
- amax(self)[source]¶
The maximum absolute value of the DOFs contained in the array.
Returns
- max_ind
NumPy array
containing for each vector a DOF index at which the maximum is attained.- max_val
NumPy array
containing for each vector the maximum absolute value of its DOFs.
- class pymor.vectorarrays.mpi.MPIVectorSpace(local_spaces)[source]¶
Bases:
pymor.vectorarrays.interface.VectorSpace
VectorSpace
ofMPIVectorArrays
.Parameters
- local_spaces
tuple
of the differentVectorSpaces
of the localVectorArrays
on the MPI ranks. Alternatively, the length oflocal_spaces
may be 1, in which case the sameVectorSpace
is assumed for all ranks.
- make_array(self, obj_id)[source]¶
Create array from rank-local
VectorArray
instances.Parameters
- obj_id
ObjectId
of the MPI distributed instances ofcls
wrapped by this array.
Returns
The newly created : class:
MPIVectorArray
.
- zeros(self, count=1, reserve=0)[source]¶
Create a
VectorArray
of null vectorsParameters
- count
The number of vectors.
- reserve
Hint for the backend to which length the array will grow.
Returns
A
VectorArray
containingcount
vectors with each component zero.
- class pymor.vectorarrays.mpi.RegisteredLocalSpace[source]¶
Bases:
int
int([x]) -> integer int(x, base=10) -> integer
Convert a number or string to an integer, or return 0 if no arguments are given. If x is a number, return x.__int__(). For floating point numbers, this truncates towards zero.
If x is not a number or if base is given, then x must be a string, bytes, or bytearray instance representing an integer literal in the given base. The literal can be preceded by ‘+’ or ‘-’ and be surrounded by whitespace. The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to interpret the base from the string as an integer literal. >>> int(‘0b100’, base=0) 4
- class pymor.vectorarrays.mpi.MPIVectorArrayNoComm(obj_id, space)[source]¶
Bases:
MPIVectorArray
MPI distributed
VectorArray
.This is a subclass of
MPIVectorArray
which overrides all communication requiring interface methods to raiseNotImplementedError
.This is mainly useful as a security measure when wrapping arrays for which simply calling the respective method on the wrapped arrays would lead to wrong results and
MPIVectorArrayAutoComm
cannot be used either (for instance in the presence of shared DOFs).The associated
VectorSpace
isMPIVectorSpaceNoComm
.- inner(self, other, product=None)[source]¶
Returns the inner products between
VectorArray
elements.If
product
isNone
, the Euclidean inner product between thedofs
ofself
andother
are returned, i.e.U.inner(V)
is equivalent to:
U.dofs(np.arange(U.dim)) @ V.dofs(np.arange(V.dim)).T
(Note, that
dofs
is only intended to be called for a small number of DOF indices.)If a
product
Operator
is specified, thisOperator
is used to compute the inner products usingapply2
, i.e.U.inner(V, product)
is equivalent to:product.apply2(U, V)
which in turn is, by default, implemented as:
U.inner(product.apply(V))
In the case of complex numbers, this is antilinear in the first argument, i.e. in ‘self’. Complex conjugation is done in the first argument because most numerical software in the community handles it this way: Numpy, DUNE, FEniCS, Eigen, Matlab and BLAS do complex conjugation in the first argument, only PetSc and deal.ii do complex conjugation in the second argument.
Parameters
- other
A
VectorArray
containing the second factors.- product
If not
None
anOperator
representing the inner product bilinear form.
- pairwise_inner(self, other, product=None)[source]¶
Returns the pairwise inner products between
VectorArray
elements.If
product
isNone
, the Euclidean inner product between thedofs
ofself
andother
are returned, i.e.U.pairwise_inner(V)
is equivalent to:
np.sum(U.dofs(np.arange(U.dim)) * V.dofs(np.arange(V.dim)), axis=-1)
(Note, that
dofs
is only intended to be called for a small number of DOF indices.)If a
product
Operator
is specified, thisOperator
is used to compute the inner products usingpairwise_apply2
, i.e.U.inner(V, product)
is equivalent to:product.pairwise_apply2(U, V)
which in turn is, by default, implemented as:
U.pairwise_inner(product.apply(V))
In the case of complex numbers, this is antilinear in the first argument, i.e. in ‘self’. Complex conjugation is done in the first argument because most numerical software in the community handles it this way: Numpy, DUNE, FEniCS, Eigen, Matlab and BLAS do complex conjugation in the first argument, only PetSc and deal.ii do complex conjugation in the second argument.
Parameters
- other
A
VectorArray
containing the second factors.- product
If not
None
anOperator
representing the inner product bilinear form.
- abstract dofs(self, dof_indices)[source]¶
Extract DOFs of the vectors contained in the array.
Parameters
- dof_indices
List or 1D
NumPy array
of indices of the DOFs that are to be returned.
Returns
A
NumPy array
result
such thatresult[i, j]
is thedof_indices[j]
-th DOF of thei
-th vector of the array.
- abstract amax(self)[source]¶
The maximum absolute value of the DOFs contained in the array.
Returns
- max_ind
NumPy array
containing for each vector a DOF index at which the maximum is attained.- max_val
NumPy array
containing for each vector the maximum absolute value of its DOFs.
- class pymor.vectorarrays.mpi.MPIVectorSpaceNoComm(local_spaces)[source]¶
Bases:
MPIVectorSpace
- class pymor.vectorarrays.mpi.MPIVectorArrayAutoComm(obj_id, space)[source]¶
Bases:
MPIVectorArray
MPI distributed
VectorArray
.This is a subclass of
MPIVectorArray
which provides default implementations for all communication requiring interface methods for the case when the wrapped array is not MPI aware.Note, however, that depending on the model these default implementations might lead to wrong results (for instance in the presence of shared DOFs).
The associated
VectorSpace
isMPIVectorSpaceAutoComm
.- inner(self, other, product=None)[source]¶
Returns the inner products between
VectorArray
elements.If
product
isNone
, the Euclidean inner product between thedofs
ofself
andother
are returned, i.e.U.inner(V)
is equivalent to:
U.dofs(np.arange(U.dim)) @ V.dofs(np.arange(V.dim)).T
(Note, that
dofs
is only intended to be called for a small number of DOF indices.)If a
product
Operator
is specified, thisOperator
is used to compute the inner products usingapply2
, i.e.U.inner(V, product)
is equivalent to:product.apply2(U, V)
which in turn is, by default, implemented as:
U.inner(product.apply(V))
In the case of complex numbers, this is antilinear in the first argument, i.e. in ‘self’. Complex conjugation is done in the first argument because most numerical software in the community handles it this way: Numpy, DUNE, FEniCS, Eigen, Matlab and BLAS do complex conjugation in the first argument, only PetSc and deal.ii do complex conjugation in the second argument.
Parameters
- other
A
VectorArray
containing the second factors.- product
If not
None
anOperator
representing the inner product bilinear form.
- pairwise_inner(self, other, product=None)[source]¶
Returns the pairwise inner products between
VectorArray
elements.If
product
isNone
, the Euclidean inner product between thedofs
ofself
andother
are returned, i.e.U.pairwise_inner(V)
is equivalent to:
np.sum(U.dofs(np.arange(U.dim)) * V.dofs(np.arange(V.dim)), axis=-1)
(Note, that
dofs
is only intended to be called for a small number of DOF indices.)If a
product
Operator
is specified, thisOperator
is used to compute the inner products usingpairwise_apply2
, i.e.U.inner(V, product)
is equivalent to:product.pairwise_apply2(U, V)
which in turn is, by default, implemented as:
U.pairwise_inner(product.apply(V))
In the case of complex numbers, this is antilinear in the first argument, i.e. in ‘self’. Complex conjugation is done in the first argument because most numerical software in the community handles it this way: Numpy, DUNE, FEniCS, Eigen, Matlab and BLAS do complex conjugation in the first argument, only PetSc and deal.ii do complex conjugation in the second argument.
Parameters
- other
A
VectorArray
containing the second factors.- product
If not
None
anOperator
representing the inner product bilinear form.
- dofs(self, dof_indices)[source]¶
Extract DOFs of the vectors contained in the array.
Parameters
- dof_indices
List or 1D
NumPy array
of indices of the DOFs that are to be returned.
Returns
A
NumPy array
result
such thatresult[i, j]
is thedof_indices[j]
-th DOF of thei
-th vector of the array.
- amax(self)[source]¶
The maximum absolute value of the DOFs contained in the array.
Returns
- max_ind
NumPy array
containing for each vector a DOF index at which the maximum is attained.- max_val
NumPy array
containing for each vector the maximum absolute value of its DOFs.
- class pymor.vectorarrays.mpi.MPIVectorSpaceAutoComm(local_spaces)[source]¶
Bases:
MPIVectorSpace