Tpetra parallel linear algebra
Version of the Day
|
Vector for multiple degrees of freedom per mesh point. More...
#include <Tpetra_BlockVector_decl.hpp>
Public Types | |
Typedefs to facilitate template metaprogramming. | |
typedef base_type::scalar_type | scalar_type |
The type of entries in the vector. More... | |
typedef base_type::impl_scalar_type | impl_scalar_type |
The implementation type of entries in the vector. More... | |
typedef base_type::local_ordinal_type | local_ordinal_type |
The type of local indices. More... | |
typedef base_type::global_ordinal_type | global_ordinal_type |
The type of global indices. More... | |
typedef base_type::node_type | node_type |
The Kokkos Node type. More... | |
typedef Node::device_type | device_type |
The Kokkos Device type. More... | |
typedef Tpetra::Map< LO, GO, Node > | map_type |
The specialization of Tpetra::Map that this class uses. More... | |
typedef Tpetra::MultiVector < Scalar, LO, GO, Node > | mv_type |
The specialization of Tpetra::MultiVector that this class uses. More... | |
typedef Tpetra::Vector< Scalar, LO, GO, Node > | vec_type |
The specialization of Tpetra::Vector that this class uses. More... | |
typedef base_type::little_vec_type | little_vec_type |
"Block view" of all degrees of freedom at a mesh point. More... | |
typedef base_type::little_host_vec_type | little_host_vec_type |
typedef base_type::const_little_vec_type | const_little_vec_type |
"Const block view" of all degrees of freedom at a mesh point. More... | |
typedef base_type::const_little_host_vec_type | const_little_host_vec_type |
Typedefs to facilitate template metaprogramming. | |
using | buffer_device_type = typename dist_object_type::buffer_device_type |
Kokkos::Device specialization used for communication buffers. More... | |
typedef mv_type::dual_view_type::t_host::device_type | host_device_type |
Typedefs | |
using | execution_space = typename device_type::execution_space |
The Kokkos execution space. More... | |
Public Member Functions | |
Constructors | |
BlockVector () | |
Default constructor. More... | |
BlockVector (const BlockVector< Scalar, LO, GO, Node > &)=default | |
Copy constructor (shallow copy). More... | |
BlockVector (BlockVector< Scalar, LO, GO, Node > &&)=default | |
Move constructor (shallow move). More... | |
BlockVector< Scalar, LO, GO, Node > & | operator= (const BlockVector< Scalar, LO, GO, Node > &)=default |
Copy assigment (shallow copy). More... | |
BlockVector< Scalar, LO, GO, Node > & | operator= (BlockVector< Scalar, LO, GO, Node > &&)=default |
Move assigment (shallow move). More... | |
BlockVector (const BlockVector< Scalar, LO, GO, Node > &in, const Teuchos::DataAccess copyOrView) | |
"Copy constructor" with option to deep copy. More... | |
BlockVector (const map_type &meshMap, const LO blockSize) | |
Constructor that takes a mesh Map and a block size. More... | |
BlockVector (const map_type &meshMap, const map_type &pointMap, const LO blockSize) | |
Constructor that takes a mesh Map, a point Map, and a block size. More... | |
BlockVector (const mv_type &X_mv, const map_type &meshMap, const LO blockSize) | |
View an existing Vector or MultiVector. More... | |
BlockVector (const vec_type &X_vec, const map_type &meshMap, const LO blockSize) | |
View an existing Vector. More... | |
BlockVector (const BlockVector< Scalar, LO, GO, Node > &X, const map_type &newMeshMap, const map_type &newPointMap, const size_t offset=0) | |
View an existing BlockVector using a different mesh Map, supplying the corresponding point Map. More... | |
BlockVector (const BlockVector< Scalar, LO, GO, Node > &X, const map_type &newMeshMap, const size_t offset=0) | |
View an existing BlockVector using a different mesh Map; compute the new point Map. More... | |
Access to Maps, the block size, and a Vector view. | |
vec_type | getVectorView () |
Get a Tpetra::Vector that views this BlockVector's data. More... | |
Fine-grained data access | |
bool | replaceLocalValues (const LO localRowIndex, const Scalar vals[]) |
Replace all values at the given mesh point, using a local index. More... | |
bool | replaceGlobalValues (const GO globalRowIndex, const Scalar vals[]) |
Replace all values at the given mesh point, using a global index. More... | |
bool | sumIntoLocalValues (const LO localRowIndex, const Scalar vals[]) |
Sum into all values at the given mesh point, using a local index. More... | |
bool | sumIntoGlobalValues (const GO globalRowIndex, const Scalar vals[]) |
Sum into all values at the given mesh point, using a global index. More... | |
const_little_host_vec_type | getLocalBlockHost (const LO localRowIndex, Access::ReadOnlyStruct) const |
Get a view of the degrees of freedom at the given mesh point, using a local index. More... | |
little_host_vec_type | getLocalBlockHost (const LO localRowIndex, Access::OverwriteAllStruct) |
little_host_vec_type | getLocalBlockHost (const LO localRowIndex, Access::ReadWriteStruct) |
Coarse-grained operations | |
void | putScalar (const Scalar &val) |
Fill all entries with the given value val . More... | |
void | scale (const Scalar &val) |
Multiply all entries in place by the given value val . More... | |
void | update (const Scalar &alpha, const BlockMultiVector< Scalar, LO, GO, Node > &X, const Scalar &beta) |
Update: this = beta*this + alpha*X . More... | |
void | blockWiseMultiply (const Scalar &alpha, const Kokkos::View< const impl_scalar_type ***, device_type, Kokkos::MemoryUnmanaged > &D, const BlockMultiVector< Scalar, LO, GO, Node > &X) |
*this := alpha * D * X , where D is a block diagonal matrix. More... | |
void | blockJacobiUpdate (const Scalar &alpha, const Kokkos::View< const impl_scalar_type ***, device_type, Kokkos::MemoryUnmanaged > &D, const BlockMultiVector< Scalar, LO, GO, Node > &X, BlockMultiVector< Scalar, LO, GO, Node > &Z, const Scalar &beta) |
Block Jacobi update . More... | |
template<class TargetMemorySpace > | |
bool | need_sync () const |
Whether this object needs synchronization to the given memory space. More... | |
bool | need_sync_host () const |
Whether this object needs synchronization to the host. More... | |
bool | need_sync_device () const |
Whether this object needs synchronization to the device. More... | |
Fine-grained data access | |
bool | replaceLocalValues (const LO localRowIndex, const LO colIndex, const Scalar vals[]) |
Replace all values at the given mesh point, using local row and column indices. More... | |
bool | replaceGlobalValues (const GO globalRowIndex, const LO colIndex, const Scalar vals[]) |
Replace all values at the given mesh point, using a global index. More... | |
bool | sumIntoLocalValues (const LO localRowIndex, const LO colIndex, const Scalar vals[]) |
Sum into all values at the given mesh point, using a local index. More... | |
bool | sumIntoGlobalValues (const GO globalRowIndex, const LO colIndex, const Scalar vals[]) |
Sum into all values at the given mesh point, using a global index. More... | |
const_little_host_vec_type | getLocalBlockHost (const LO localRowIndex, const LO colIndex, const Access::ReadOnlyStruct) const |
little_host_vec_type | getLocalBlockHost (const LO localRowIndex, const LO colIndex, const Access::ReadWriteStruct) |
little_host_vec_type | getLocalBlockHost (const LO localRowIndex, const LO colIndex, const Access::OverwriteAllStruct) |
Get a local block on host, with the intent to overwrite all blocks in the BlockMultiVector before accessing the data on device. If you intend to modify only some blocks on host, use Access::ReadWrite instead (otherwise, previous changes on device may be lost) More... | |
Public methods for redistributing data | |
void | doImport (const SrcDistObject &source, const Import< LO, GO, Node > &importer, const CombineMode CM, const bool restrictedMode=false) |
Import data into this object using an Import object ("forward mode"). More... | |
void | doImport (const SrcDistObject &source, const Export< LO, GO, Node > &exporter, const CombineMode CM, const bool restrictedMode=false) |
Import data into this object using an Export object ("reverse mode"). More... | |
void | doExport (const SrcDistObject &source, const Export< LO, GO, Node > &exporter, const CombineMode CM, const bool restrictedMode=false) |
Export data into this object using an Export object ("forward mode"). More... | |
void | doExport (const SrcDistObject &source, const Import< LO, GO, Node > &importer, const CombineMode CM, const bool restrictedMode=false) |
Export data into this object using an Import object ("reverse mode"). More... | |
void | beginImport (const SrcDistObject &source, const Import< LO, GO, Node > &importer, const CombineMode CM, const bool restrictedMode=false) |
void | beginImport (const SrcDistObject &source, const Export< LO, GO, Node > &exporter, const CombineMode CM, const bool restrictedMode=false) |
void | beginExport (const SrcDistObject &source, const Export< LO, GO, Node > &exporter, const CombineMode CM, const bool restrictedMode=false) |
void | beginExport (const SrcDistObject &source, const Import< LO, GO, Node > &importer, const CombineMode CM, const bool restrictedMode=false) |
void | endImport (const SrcDistObject &source, const Import< LO, GO, Node > &importer, const CombineMode CM, const bool restrictedMode=false) |
void | endImport (const SrcDistObject &source, const Export< LO, GO, Node > &exporter, const CombineMode CM, const bool restrictedMode=false) |
void | endExport (const SrcDistObject &source, const Export< LO, GO, Node > &exporter, const CombineMode CM, const bool restrictedMode=false) |
void | endExport (const SrcDistObject &source, const Import< LO, GO, Node > &importer, const CombineMode CM, const bool restrictedMode=false) |
bool | transferArrived () const |
Whether the data from an import/export operation has arrived, and is ready for the unpack and combine step. More... | |
Attribute accessor methods | |
bool | isDistributed () const |
Whether this is a globally distributed object. More... | |
virtual Teuchos::RCP< const map_type > | getMap () const |
The Map describing the parallel distribution of this object. More... | |
I/O methods | |
void | print (std::ostream &os) const |
Print this object to the given output stream. More... | |
Implementation of Teuchos::Describable | |
virtual std::string | description () const |
One-line descriptiion of this object. More... | |
virtual void | describe (Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const |
Print a descriptiion of this object to the given output stream. More... | |
Methods for use only by experts | |
virtual void | removeEmptyProcessesInPlace (const Teuchos::RCP< const map_type > &newMap) |
Remove processes which contain no entries in this object's Map. More... | |
Protected Member Functions | |
size_t | getStrideX () const |
Stride between consecutive local entries in the same column. More... | |
size_t | getStrideY () const |
Stride between consecutive local entries in the same row. More... | |
bool | isValidLocalMeshIndex (const LO meshLocalIndex) const |
True if and only if meshLocalIndex is a valid local index in the mesh Map. More... | |
virtual size_t | constantNumberOfPackets () const |
Whether the implementation's instance promises always to have a constant number of packets per LID (local index), and if so, how many packets per LID there are. More... | |
virtual void | doTransfer (const SrcDistObject &src, const ::Tpetra::Details::Transfer< local_ordinal_type, global_ordinal_type, node_type > &transfer, const char modeString[], const ReverseOption revOp, const CombineMode CM, const bool restrictedMode) |
Redistribute data across (MPI) processes. More... | |
virtual bool | reallocArraysForNumPacketsPerLid (const size_t numExportLIDs, const size_t numImportLIDs) |
Reallocate numExportPacketsPerLID_ and/or numImportPacketsPerLID_, if necessary. More... | |
void | beginTransfer (const SrcDistObject &src, const ::Tpetra::Details::Transfer< local_ordinal_type, global_ordinal_type, node_type > &transfer, const char modeString[], const ReverseOption revOp, const CombineMode CM, const bool restrictedMode) |
Implementation detail of doTransfer. More... | |
Implementation of Tpetra::DistObject. | |
The methods here implement Tpetra::DistObject. They let BlockMultiVector participate in Import and Export operations. Users don't have to worry about these methods. | |
virtual bool | checkSizes (const Tpetra::SrcDistObject &source) override |
Compare the source and target (this) objects for compatibility. More... | |
virtual void | copyAndPermute (const SrcDistObject &source, const size_t numSameIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteToLIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteFromLIDs, const CombineMode CM) override |
virtual void | packAndPrepare (const SrcDistObject &source, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &exportLIDs, Kokkos::DualView< packet_type *, buffer_device_type > &exports, Kokkos::DualView< size_t *, buffer_device_type > numPacketsPerLID, size_t &constantNumPackets) override |
virtual void | unpackAndCombine (const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &importLIDs, Kokkos::DualView< packet_type *, buffer_device_type > imports, Kokkos::DualView< size_t *, buffer_device_type > numPacketsPerLID, const size_t constantNumPackets, const CombineMode combineMode) override |
Protected Attributes | |
map_type | meshMap_ |
Mesh Map given to constructor. More... | |
mv_type | mv_ |
The Tpetra::MultiVector used to represent the data. More... | |
Access to Maps, the block size, and a MultiVector view. | |
const map_type | getPointMap () const |
Get this BlockMultiVector's (previously computed) point Map. More... | |
LO | getBlockSize () const |
Get the number of degrees of freedom per mesh point. More... | |
LO | getNumVectors () const |
Get the number of columns (vectors) in the BlockMultiVector. More... | |
const mv_type & | getMultiVectorView () const |
Get a Tpetra::MultiVector that views this BlockMultiVector's data. More... | |
mv_type & | getMultiVectorView () |
static map_type | makePointMap (const map_type &meshMap, const LO blockSize) |
Create and return the point Map corresponding to the given mesh Map and block size. More... | |
static Teuchos::RCP< const map_type > | makePointMapRCP (const map_type &meshMap, const LO blockSize) |
Create and return an owning RCP to the point Map corresponding to the given mesh Map and block size. More... | |
Methods implemented by subclasses and used by doTransfer(). | |
The doTransfer() method uses the subclass' implementations of these methods to implement data transfer. Subclasses of DistObject must implement these methods. This is an instance of the Template Method Pattern. ("Template" here doesn't mean "C++ template"; it means "pattern with holes that are filled in by the subclass' method implementations.") | |
Teuchos::RCP< const map_type > | map_ |
The Map over which this object is distributed. More... | |
Kokkos::DualView< packet_type *, buffer_device_type > | imports_ |
Buffer into which packed data are imported (received from other processes). More... | |
Kokkos::DualView< size_t *, buffer_device_type > | numImportPacketsPerLID_ |
Number of packets to receive for each receive operation. More... | |
Kokkos::DualView< packet_type *, buffer_device_type > | exports_ |
Buffer from which packed data are exported (sent to other processes). More... | |
Kokkos::DualView< size_t *, buffer_device_type > | numExportPacketsPerLID_ |
Number of packets to send for each send operation. More... | |
virtual void | copyAndPermute (const SrcDistObject &source, const size_t numSameIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteToLIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteFromLIDs, const CombineMode CM) |
Perform copies and permutations that are local to the calling (MPI) process. More... | |
virtual void | copyAndPermute (const SrcDistObject &source, const size_t numSameIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteToLIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteFromLIDs, const CombineMode CM, const execution_space &space) |
Same as copyAndPermute, but do operations in space . More... | |
virtual void | packAndPrepare (const SrcDistObject &source, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &exportLIDs, Kokkos::DualView< packet_type *, buffer_device_type > &exports, Kokkos::DualView< size_t *, buffer_device_type > numPacketsPerLID, size_t &constantNumPackets) |
Pack data and metadata for communication (sends). More... | |
virtual void | packAndPrepare (const SrcDistObject &source, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &exportLIDs, Kokkos::DualView< packet_type *, buffer_device_type > &exports, Kokkos::DualView< size_t *, buffer_device_type > numPacketsPerLID, size_t &constantNumPackets, const execution_space &space) |
Same as packAndPrepare, but in an execution space instance. More... | |
virtual void | unpackAndCombine (const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &importLIDs, Kokkos::DualView< packet_type *, buffer_device_type > imports, Kokkos::DualView< size_t *, buffer_device_type > numPacketsPerLID, const size_t constantNumPackets, const CombineMode combineMode) |
Perform any unpacking and combining after communication. More... | |
virtual void | unpackAndCombine (const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &importLIDs, Kokkos::DualView< packet_type *, buffer_device_type > imports, Kokkos::DualView< size_t *, buffer_device_type > numPacketsPerLID, const size_t constantNumPackets, const CombineMode combineMode, const execution_space &space) |
std::unique_ptr< std::string > | createPrefix (const char className[], const char methodName[]) const |
virtual bool | reallocImportsIfNeeded (const size_t newSize, const bool verbose, const std::string *prefix, const bool remoteLIDsContiguous=false, const CombineMode CM=INSERT) |
Reallocate imports_ if needed. More... | |
Vector for multiple degrees of freedom per mesh point.
Scalar | The type of each entry of the block vector. (You can use real-valued or complex-valued types here, unlike in Epetra, where the scalar type is always double .) |
LO | The type of local indices. See the documentation of the first template parameter of Map for requirements. |
GO | The type of global indices. See the documentation of the second template parameter of Map for requirements. |
Node | The Kokkos Node type. See the documentation of the third template parameter of Map for requirements. |
BlockVector is like Tpetra::MultiVector, but its interface supports multiple degrees of freedom per mesh point. You can specify a mesh point by its local or global index, and read or write the values at that point. Every mesh point must have the same number of degrees of freedom. We call the number of degrees of freedom per mesh point the block size.
BlockVector is a special case of BlockMultiVector, for "multivectors" that are not "multi." That is, a BlockVector has a single vector (column). Please refer to the documentation of BlockMultiVector for details.
Definition at line 48 of file Tpetra_BlockVector_decl.hpp.
typedef base_type::scalar_type Tpetra::BlockVector< Scalar, LO, GO, Node >::scalar_type |
The type of entries in the vector.
Definition at line 58 of file Tpetra_BlockVector_decl.hpp.
typedef base_type::impl_scalar_type Tpetra::BlockVector< Scalar, LO, GO, Node >::impl_scalar_type |
The implementation type of entries in the vector.
Definition at line 60 of file Tpetra_BlockVector_decl.hpp.
typedef base_type::local_ordinal_type Tpetra::BlockVector< Scalar, LO, GO, Node >::local_ordinal_type |
The type of local indices.
Definition at line 62 of file Tpetra_BlockVector_decl.hpp.
typedef base_type::global_ordinal_type Tpetra::BlockVector< Scalar, LO, GO, Node >::global_ordinal_type |
The type of global indices.
Definition at line 64 of file Tpetra_BlockVector_decl.hpp.
typedef base_type::node_type Tpetra::BlockVector< Scalar, LO, GO, Node >::node_type |
The Kokkos Node type.
Definition at line 66 of file Tpetra_BlockVector_decl.hpp.
typedef Node::device_type Tpetra::BlockVector< Scalar, LO, GO, Node >::device_type |
The Kokkos Device type.
Definition at line 68 of file Tpetra_BlockVector_decl.hpp.
typedef Tpetra::Map<LO, GO, Node> Tpetra::BlockVector< Scalar, LO, GO, Node >::map_type |
The specialization of Tpetra::Map that this class uses.
Definition at line 71 of file Tpetra_BlockVector_decl.hpp.
typedef Tpetra::MultiVector<Scalar, LO, GO, Node> Tpetra::BlockVector< Scalar, LO, GO, Node >::mv_type |
The specialization of Tpetra::MultiVector that this class uses.
Definition at line 73 of file Tpetra_BlockVector_decl.hpp.
typedef Tpetra::Vector<Scalar, LO, GO, Node> Tpetra::BlockVector< Scalar, LO, GO, Node >::vec_type |
The specialization of Tpetra::Vector that this class uses.
Definition at line 75 of file Tpetra_BlockVector_decl.hpp.
typedef base_type::little_vec_type Tpetra::BlockVector< Scalar, LO, GO, Node >::little_vec_type |
"Block view" of all degrees of freedom at a mesh point.
A "block view" lets you address all degrees of freedom at a mesh point. You don't have to use this class to access the degrees of freedom. If you do choose to use this class, it implements operator()(LO i), so you can access and modify its entries.
The preferred way to refer to the little_vec_type and const_little_vec_type types, is to get them from the typedefs below. This is because different specializations of BlockVector reserve the right to use different types to implement little_vec_type or const_little_vec_type. This gives us a porting strategy to move from "classic" Tpetra to the Kokkos refactor version.
Definition at line 92 of file Tpetra_BlockVector_decl.hpp.
typedef base_type::const_little_vec_type Tpetra::BlockVector< Scalar, LO, GO, Node >::const_little_vec_type |
"Const block view" of all degrees of freedom at a mesh point.
This is just like little_vec_type, except that you can't modify its entries.
Definition at line 101 of file Tpetra_BlockVector_decl.hpp.
|
inherited |
Kokkos::Device specialization used for communication buffers.
Definition at line 146 of file Tpetra_BlockMultiVector_decl.hpp.
|
inherited |
The Kokkos execution space.
Definition at line 315 of file Tpetra_DistObject_decl.hpp.
Tpetra::BlockVector< Scalar, LO, GO, Node >::BlockVector | ( | ) |
Default constructor.
Creates an empty BlockVector. An empty BlockVector has zero rows, and block size zero.
Definition at line 17 of file Tpetra_BlockVector_def.hpp.
|
default |
Copy constructor (shallow copy).
|
default |
Move constructor (shallow move).
Tpetra::BlockVector< Scalar, LO, GO, Node >::BlockVector | ( | const BlockVector< Scalar, LO, GO, Node > & | in, |
const Teuchos::DataAccess | copyOrView | ||
) |
"Copy constructor" with option to deep copy.
Definition at line 23 of file Tpetra_BlockVector_def.hpp.
Tpetra::BlockVector< Scalar, LO, GO, Node >::BlockVector | ( | const map_type & | meshMap, |
const LO | blockSize | ||
) |
Constructor that takes a mesh Map and a block size.
meshMap | [in] Map that describes the distribution of mesh points (rather than the distribution of unknowns for those mesh points). |
blockSize | [in] The number of degrees of freedom per mesh point. We assume that this is the same for all mesh points in the above Map. |
The mesh Map describes the distribution of mesh points. Its corresponding point Map describes the distribution of degrees of freedom corresponding to those mesh points. If you have already computed the point Map corresponding to the above mesh Map, then it is more efficient to call the three-argument constructor below, that takes both the mesh Map and the point Map.
There are two ways to get the point Map corresponding to a given mesh Map and block size. You may either call the class method makePointMap() (inherited from the parent class BlockMultiVector), or you may call this two-argument constructor, and then call getPointMap().
The point Map enables reinterpretation of a BlockVector as a standard Tpetra::Vector, or as a Tpetra::MultiVector with one column. This lets users solve linear systems with Trilinos' solvers and preconditioners, that expect vectors as Tpetra::MultiVector or Tpetra::Vector instances.
Definition at line 30 of file Tpetra_BlockVector_def.hpp.
Tpetra::BlockVector< Scalar, LO, GO, Node >::BlockVector | ( | const map_type & | meshMap, |
const map_type & | pointMap, | ||
const LO | blockSize | ||
) |
Constructor that takes a mesh Map, a point Map, and a block size.
See the documentation of the two-argument constructor above.
Definition at line 36 of file Tpetra_BlockVector_def.hpp.
Tpetra::BlockVector< Scalar, LO, GO, Node >::BlockVector | ( | const mv_type & | X_mv, |
const map_type & | meshMap, | ||
const LO | blockSize | ||
) |
View an existing Vector or MultiVector.
X_mv | [in/out] The Vector or MultiVector to view. It MUST have view semantics; otherwise this constructor throws. Its Map must be the same (in the sense of isSameAs) as the point Map corresponding to the given mesh Map and block size. If this is a MultiVector, it must have only one column. |
meshMap | [in] The mesh Map to use for interpreting the given MultiVector or Vector (in place) as a BlockVector. |
blockSize | [in] The number of degrees of freedom per mesh point. We assume that this is the same for all mesh points. |
Definition at line 44 of file Tpetra_BlockVector_def.hpp.
Tpetra::BlockVector< Scalar, LO, GO, Node >::BlockVector | ( | const vec_type & | X_vec, |
const map_type & | meshMap, | ||
const LO | blockSize | ||
) |
View an existing Vector.
X_vec | [in/out] The Vector view. It MUST have view semantics; otherwise this constructor throws. Its Map must be the same (in the sense of isSameAs) as the point Map corresponding to the given mesh Map and block size. |
meshMap | [in] The mesh Map to use for interpreting the given Vector (in place) as a BlockVector. |
blockSize | [in] The number of degrees of freedom per mesh point. We assume that this is the same for all mesh points. |
Definition at line 57 of file Tpetra_BlockVector_def.hpp.
Tpetra::BlockVector< Scalar, LO, GO, Node >::BlockVector | ( | const BlockVector< Scalar, LO, GO, Node > & | X, |
const map_type & | newMeshMap, | ||
const map_type & | newPointMap, | ||
const size_t | offset = 0 |
||
) |
View an existing BlockVector using a different mesh Map, supplying the corresponding point Map.
This method corresponds to MultiVector's "offset view" constructor.
Definition at line 65 of file Tpetra_BlockVector_def.hpp.
Tpetra::BlockVector< Scalar, LO, GO, Node >::BlockVector | ( | const BlockVector< Scalar, LO, GO, Node > & | X, |
const map_type & | newMeshMap, | ||
const size_t | offset = 0 |
||
) |
View an existing BlockVector using a different mesh Map; compute the new point Map.
This method corresponds to MultiVector's "offset view" constructor.
Definition at line 74 of file Tpetra_BlockVector_def.hpp.
|
default |
Copy assigment (shallow copy).
|
default |
Move assigment (shallow move).
BlockVector< Scalar, LO, GO, Node >::vec_type Tpetra::BlockVector< Scalar, LO, GO, Node >::getVectorView | ( | ) |
Get a Tpetra::Vector that views this BlockVector's data.
This is how you can give a BlockVector to Trilinos' solvers and preconditioners.
Definition at line 82 of file Tpetra_BlockVector_def.hpp.
bool Tpetra::BlockVector< Scalar, LO, GO, Node >::replaceLocalValues | ( | const LO | localRowIndex, |
const Scalar | vals[] | ||
) |
Replace all values at the given mesh point, using a local index.
localRowIndex | [in] Local index of the mesh point. |
vals | [in] Input values with which to replace whatever existing values are at the mesh point. |
Definition at line 90 of file Tpetra_BlockVector_def.hpp.
bool Tpetra::BlockVector< Scalar, LO, GO, Node >::replaceGlobalValues | ( | const GO | globalRowIndex, |
const Scalar | vals[] | ||
) |
Replace all values at the given mesh point, using a global index.
globalRowIndex | [in] Global index of the mesh point. |
vals | [in] Input values with which to sum into whatever existing values are at the mesh point. |
Definition at line 97 of file Tpetra_BlockVector_def.hpp.
bool Tpetra::BlockVector< Scalar, LO, GO, Node >::sumIntoLocalValues | ( | const LO | localRowIndex, |
const Scalar | vals[] | ||
) |
Sum into all values at the given mesh point, using a local index.
localRowIndex | [in] Local index of the mesh point. |
vals | [in] Input values with which to replace whatever existing values are at the mesh point. |
Definition at line 104 of file Tpetra_BlockVector_def.hpp.
bool Tpetra::BlockVector< Scalar, LO, GO, Node >::sumIntoGlobalValues | ( | const GO | globalRowIndex, |
const Scalar | vals[] | ||
) |
Sum into all values at the given mesh point, using a global index.
globalRowIndex | [in] Global index of the mesh point. |
vals | [in] Input values with which to replace whatever existing values are at the mesh point. |
Definition at line 111 of file Tpetra_BlockVector_def.hpp.
BlockVector< Scalar, LO, GO, Node >::const_little_host_vec_type Tpetra::BlockVector< Scalar, LO, GO, Node >::getLocalBlockHost | ( | const LO | localRowIndex, |
Access::ReadOnlyStruct | |||
) | const |
Get a view of the degrees of freedom at the given mesh point, using a local index.
The preferred way to refer to little_vec_type is to get it from BlockVector's typedef. This is because different specializations of BlockVector reserve the right to use different types to implement little_vec_type. This gives us a porting strategy to move from "classic" Tpetra to the Kokkos refactor version.
Definition at line 118 of file Tpetra_BlockVector_def.hpp.
|
staticinherited |
Create and return the point Map corresponding to the given mesh Map and block size.
This is a class ("static") method so that you can make and reuse a point Map for creating different BlockMultiVector instances, using the more efficient four-argument constructor.
Definition at line 177 of file Tpetra_BlockMultiVector_def.hpp.
|
staticinherited |
Create and return an owning RCP to the point Map corresponding to the given mesh Map and block size.
This is a class ("static") method so that you can make and reuse a point Map for creating different BlockMultiVector instances, using the more efficient four-argument constructor.
Definition at line 223 of file Tpetra_BlockMultiVector_def.hpp.
|
inlineinherited |
Get this BlockMultiVector's (previously computed) point Map.
It is always valid to call this method. A BlockMultiVector always has a point Map. We do not compute the point Map lazily.
Definition at line 310 of file Tpetra_BlockMultiVector_decl.hpp.
|
inlineinherited |
Get the number of degrees of freedom per mesh point.
Definition at line 315 of file Tpetra_BlockMultiVector_decl.hpp.
|
inlineinherited |
Get the number of columns (vectors) in the BlockMultiVector.
Definition at line 320 of file Tpetra_BlockMultiVector_decl.hpp.
|
inherited |
Get a Tpetra::MultiVector that views this BlockMultiVector's data.
This is how you can give a BlockMultiVector to Trilinos' solvers and preconditioners.
Definition at line 24 of file Tpetra_BlockMultiVector_def.hpp.
|
inherited |
Fill all entries with the given value val
.
Definition at line 513 of file Tpetra_BlockMultiVector_def.hpp.
|
inherited |
Multiply all entries in place by the given value val
.
Definition at line 520 of file Tpetra_BlockMultiVector_def.hpp.
|
inherited |
Update: this = beta*this + alpha*X
.
Update this BlockMultiVector with scaled values of X. If beta is zero, overwrite *this
unconditionally, even if it contains NaN entries. It is legal for the input X to alias this MultiVector.
Definition at line 527 of file Tpetra_BlockMultiVector_def.hpp.
|
inherited |
*this := alpha * D * X
, where D is a block diagonal matrix.
Compute *this := alpha * D * X
, where D is a block diagonal matrix, stored as a 3-D Kokkos::View. This method is the block analog of Tpetra::MultiVector::elementWiseMultiply, and is likewise useful for implementing (block) Jacobi.
alpha | [in] Coefficient by which to scale the result. We treat alpha = 0 as a special case, following the BLAS rules. That is, if alpha = 0, this method does this->putScalar(0) . |
D | [in] Block diagonal, as a 3-D Kokkos::View. The leftmost index indicates which block, the middle index the row within a block, and the rightmost index the column within a block. |
pivots | [in] Pivots (from LU factorization of the blocks) |
X | [in] Input Block(Multi)Vector; may alias *this . |
D is really the inverse of some BlockCrsMatrix's block diagonal. You may compute the inverse of each block however you like. One way is to use GETRF, then GETRI.
Definition at line 720 of file Tpetra_BlockMultiVector_def.hpp.
|
inherited |
Block Jacobi update .
This method computes the block Jacobi update , where Y is *this<>, D the (explicitly stored) inverse block diagonal of a BlockCrsMatrix A, and . The method may use Z as scratch space.
Folks who optimize sparse matrix-vector multiply kernels tend not to write special-purpose kernels like this one. Thus, this kernel consolidates all the other code that block Jacobi needs, while exploiting the existing sparse matrix-vector multiply kernel in BlockCrsMatrix. That consolidation minimizes thread-parallel kernel launch overhead.
alpha | [in] Coefficient of the "block scaled" term. We treat alpha = 0 as a special case, following the BLAS rules. That is, if alpha = 0, this method does Y = beta * Y. |
D | [in] Block diagonal, as a 3-D Kokkos::View. The leftmost index indicates which block, the middle index the row within a block, and the rightmost index the column within a block. |
X | [in] The first of two block (multi)vectors whose difference is "block scaled" |
Z | [in/out] On input: The second of two block (multi)vectors whose difference is "block scaled." This method may use Z as scratch space. |
beta | [in] Coefficient of Y. We treat beta = 0 as a special case, following the BLAS rules. That is, if beta = 0, the initial contents of Y are ignored. |
Definition at line 751 of file Tpetra_BlockMultiVector_def.hpp.
|
inlineinherited |
Whether this object needs synchronization to the given memory space.
Definition at line 421 of file Tpetra_BlockMultiVector_decl.hpp.
|
inlineinherited |
Whether this object needs synchronization to the host.
Definition at line 426 of file Tpetra_BlockMultiVector_decl.hpp.
|
inlineinherited |
Whether this object needs synchronization to the device.
Definition at line 431 of file Tpetra_BlockMultiVector_decl.hpp.
|
inherited |
Replace all values at the given mesh point, using local row and column indices.
localRowIndex | [in] Local index of the mesh point. |
colIndex | [in] Column (vector) to modify. |
vals | [in] Input values with which to replace whatever existing values are at the mesh point. |
Definition at line 284 of file Tpetra_BlockMultiVector_def.hpp.
|
inherited |
Replace all values at the given mesh point, using a global index.
globalRowIndex | [in] Global index of the mesh point. |
colIndex | [in] Column (vector) to modify. |
vals | [in] Input values with which to sum into whatever existing values are at the mesh point. |
Definition at line 299 of file Tpetra_BlockMultiVector_def.hpp.
|
inherited |
Sum into all values at the given mesh point, using a local index.
localRowIndex | [in] Local index of the mesh point. |
colIndex | [in] Column (vector) to modify. |
vals | [in] Input values with which to replace whatever existing values are at the mesh point. |
Definition at line 328 of file Tpetra_BlockMultiVector_def.hpp.
|
inherited |
Sum into all values at the given mesh point, using a global index.
globalRowIndex | [in] Global index of the mesh point. |
colIndex | [in] Column (vector) to modify. |
vals | [in] Input values with which to replace whatever existing values are at the mesh point. |
Definition at line 343 of file Tpetra_BlockMultiVector_def.hpp.
|
inherited |
Get a local block on host, with the intent to overwrite all blocks in the BlockMultiVector before accessing the data on device. If you intend to modify only some blocks on host, use Access::ReadWrite instead (otherwise, previous changes on device may be lost)
Definition at line 379 of file Tpetra_BlockMultiVector_def.hpp.
|
overrideprotectedvirtualinherited |
Compare the source and target (this) objects for compatibility.
Implements Tpetra::DistObject< Scalar, LO, GO, Node >.
Definition at line 445 of file Tpetra_BlockMultiVector_def.hpp.
|
overrideprotectedvirtualinherited |
< DistObject copyAndPermute has multiple overloads – use copyAndPermutes for anything we don't override
Definition at line 453 of file Tpetra_BlockMultiVector_def.hpp.
|
protectedvirtualinherited |
Perform copies and permutations that are local to the calling (MPI) process.
Subclasses must reimplement this function. Its default implementation does nothing. Note that the <t>target object of the Export or Import, namely *this
, packs the source object's data.
permuteToLIDs.need_sync_host()
, permuteToLIDs.need_sync_device()
, permuteFromLIDs.need_sync_host()
, and permuteFromLIDs.need_sync_device()
are all false.source | [in] On entry, the source object of the Export or Import operation. |
numSameIDs | [in] The number of elements that are the same on the source and target objects. These elements live on the same process in both the source and target objects. |
permuteToLIDs | [in] List of the elements that are permuted. They are listed by their local index (LID) in the destination object. |
permuteFromLIDs | [in] List of the elements that are permuted. They are listed by their local index (LID) in the source object. |
CM | [in] CombineMode to be used during copyAndPermute; may or may not be used by the particular object being called; behavior with respect to CombineMode may differ by object. |
|
protectedvirtualinherited |
Same as copyAndPermute, but do operations in space
.
|
overrideprotectedvirtualinherited |
< DistObject overloads packAndPrepare. Explicitly use DistObject's packAndPrepare for anything we don't override
Definition at line 470 of file Tpetra_BlockMultiVector_def.hpp.
|
protectedvirtualinherited |
Pack data and metadata for communication (sends).
Subclasses must reimplement this function. Its default implementation does nothing. Note that the <t>target object of the Export or Import, namely *this
, packs the source object's data.
exportLIDs.need_sync_host ()
and exportLIDs.need_sync_device()
are both false.source | [in] Source object for the redistribution. |
exportLIDs | [in] List of the entries (as local IDs in the source object) that Tpetra will send to other processes. |
exports | [out] On exit, the packed data to send. Implementations must reallocate this as needed (prefer reusing the existing allocation if possible), and may modify and/or sync this wherever they like. |
numPacketsPerLID | [out] On exit, the implementation of this method must do one of two things: either set numPacketsPerLID[i] to the number of packets to be packed for exportLIDs[i] and set constantNumPackets to zero, or set constantNumPackets to a nonzero value. If the latter, the implementation must not modify the entries of numPacketsPerLID . If the former, the implementation may sync numPacketsPerLID this wherever it likes, either to host or to device. The allocation belongs to DistObject, not to subclasses; don't be tempted to change this to pass by reference. |
constantNumPackets | [out] On exit, 0 if the number of packets per LID could differ, else (if nonzero) the number of packets per LID (which must be constant). |
|
protectedvirtualinherited |
Same as packAndPrepare, but in an execution space instance.
|
overrideprotectedvirtualinherited |
< DistObject has overloaded unpackAndCombine, use the DistObject's implementation for anything we don't override.
Definition at line 488 of file Tpetra_BlockMultiVector_def.hpp.
|
protectedvirtualinherited |
Perform any unpacking and combining after communication.
Subclasses must reimplement this function. Its default implementation does nothing. Note that the <t>target object of the Export or Import, namely *this
, unpacks the received data into itself, possibly modifying its entries.
importLIDs.need_sync_host ()
and importLIDs.need_sync_device()
are both false.importLIDs | [in] List of the entries (as LIDs in the destination object) we received from other processes. |
imports | [in/out] On input: Buffer of received data to unpack. DistObject promises nothing about where this is sync'd. Implementations may sync this wherever they like, either to host or to device. The allocation belongs to DistObject, not to subclasses; don't be tempted to change this to pass by reference. |
numPacketsPerLID | [in/out] On input: If constantNumPackets is zero, then numPacketsPerLID[i] contains the number of packets imported for importLIDs[i]. DistObject promises nothing about where this is sync'd. Implementations may sync this wherever they like, either to host or to device. The allocation belongs to DistObject, not to subclasses; don't be tempted to change this to pass by reference. |
constantNumPackets | [in] If nonzero, then the number of packets per LID is the same for all entries ("constant") and constantNumPackets is that number. If zero, then numPacketsPerLID[i] is the number of packets to unpack for LID importLIDs[i] . |
combineMode | [in] The CombineMode to use when combining the imported entries with existing entries. |
|
inlineprotectedinherited |
Stride between consecutive local entries in the same column.
Definition at line 580 of file Tpetra_BlockMultiVector_decl.hpp.
|
inlineprotectedinherited |
Stride between consecutive local entries in the same row.
Definition at line 585 of file Tpetra_BlockMultiVector_decl.hpp.
|
protectedinherited |
True if and only if meshLocalIndex
is a valid local index in the mesh Map.
Definition at line 505 of file Tpetra_BlockMultiVector_def.hpp.
|
inherited |
Import data into this object using an Import object ("forward mode").
The input DistObject is always the source of the data redistribution operation, and the *this
object is always the target.
If you don't know the difference between forward and reverse mode, then you probably want forward mode. Use this method with your precomputed Import object if you want to do an Import, else use doExport() with a precomputed Export object.
"Restricted Mode" does two things:
*this
, in a "locallyFitted" sense. This cannot be used if (2) is not true, OR there are permutes. The "source" maps still need to match.
source | [in] The "source" object for redistribution. |
importer | [in] Precomputed data redistribution plan. Its source Map must be the same as the input DistObject's Map, and its target Map must be the same as this->getMap() . |
CM | [in] How to combine incoming data with the same global index. |
|
inherited |
Import data into this object using an Export object ("reverse mode").
The input DistObject is always the source of the data redistribution operation, and the *this
object is always the target.
If you don't know the difference between forward and reverse mode, then you probably want forward mode. Use the version of doImport() that takes a precomputed Import object in that case.
"Restricted Mode" does two things:
*this
, in a "locallyFitted" sense. This cannot be used if (2) is not true, OR there are permutes. The "source" maps still need to match.
source | [in] The "source" object for redistribution. |
exporter | [in] Precomputed data redistribution plan. Its target Map must be the same as the input DistObject's Map, and its source Map must be the same as this->getMap() . (Note the difference from forward mode.) |
CM | [in] How to combine incoming data with the same global index. |
|
inherited |
Export data into this object using an Export object ("forward mode").
The input DistObject is always the source of the data redistribution operation, and the *this
object is always the target.
If you don't know the difference between forward and reverse mode, then you probably want forward mode. Use this method with your precomputed Export object if you want to do an Export, else use doImport() with a precomputed Import object.
"Restricted Mode" does two things:
*this
, in a "locallyFitted" sense. This cannot be used if (2) is not true, OR there are permutes. The "source" maps still need to match.
source | [in] The "source" object for redistribution. |
exporter | [in] Precomputed data redistribution plan. Its source Map must be the same as the input DistObject's Map, and its target Map must be the same as this->getMap() . |
CM | [in] How to combine incoming data with the same global index. |
|
inherited |
Export data into this object using an Import object ("reverse mode").
The input DistObject is always the source of the data redistribution operation, and the *this
object is always the target.
If you don't know the difference between forward and reverse mode, then you probably want forward mode. Use the version of doExport() that takes a precomputed Export object in that case.
"Restricted Mode" does two things:
*this
, in a "locallyFitted" sense. This cannot be used if (2) is not true, OR there are permutes. The "source" maps still need to match.
source | [in] The "source" object for redistribution. |
importer | [in] Precomputed data redistribution plan. Its target Map must be the same as the input DistObject's Map, and its source Map must be the same as this->getMap() . (Note the difference from forward mode.) |
CM | [in] How to combine incoming data with the same global index. |
|
inherited |
Whether the data from an import/export operation has arrived, and is ready for the unpack and combine step.
|
inherited |
Whether this is a globally distributed object.
For a definition of "globally distributed" (and its opposite, "locally replicated"), see the documentation of Map's isDistributed() method.
|
inlinevirtualinherited |
The Map describing the parallel distribution of this object.
Note that some Tpetra objects might be distributed using multiple Map objects. For example, CrsMatrix has both a row Map and a column Map. It is up to the subclass to decide which Map to use when invoking the DistObject constructor.
Definition at line 559 of file Tpetra_DistObject_decl.hpp.
|
inherited |
Print this object to the given output stream.
We generally assume that all MPI processes can print to the given stream.
|
virtualinherited |
One-line descriptiion of this object.
We declare this method virtual so that subclasses of DistObject may override it.
|
virtualinherited |
Print a descriptiion of this object to the given output stream.
We declare this method virtual so that subclasses of Distobject may override it.
|
virtualinherited |
Remove processes which contain no entries in this object's Map.
On input, this object is distributed over the Map returned by getMap() (the "original Map," with its communicator, the "original communicator"). The input newMap
of this method must be the same as the result of calling getMap()->removeEmptyProcesses()
. On processes in the original communicator which contain zero entries ("excluded processes," as opposed to "included processes"), the input newMap
must be Teuchos::null
(which is what getMap()->removeEmptyProcesses()
returns anyway).
On included processes, reassign this object's Map (that would be returned by getMap()) to the input newMap
, and do any work that needs to be done to restore correct semantics. On excluded processes, free any data that needs freeing, and do any other work that needs to be done to restore correct semantics.
This method has collective semantics over the original communicator. On exit, the only method of this object which is safe to call on excluded processes is the destructor. This implies that subclasses' destructors must not contain communication operations.
|
protectedvirtualinherited |
Whether the implementation's instance promises always to have a constant number of packets per LID (local index), and if so, how many packets per LID there are.
If this method returns zero, the instance says that it might possibly have a different number of packets for each LID (local index) to send or receive. If it returns nonzero, the instance promises that the number of packets is the same for all LIDs, and that the return value is this number of packets per LID.
The default implementation of this method returns zero. This does not affect the behavior of doTransfer() in any way. If a nondefault implementation returns nonzero, doTransfer() will use this information to avoid unnecessary allocation and / or resizing of arrays.
|
protectedvirtualinherited |
Redistribute data across (MPI) processes.
src | [in] The source object, to redistribute into the target object, which is *this object. |
transfer | [in] The Export or Import object representing the communication pattern. (Details::Transfer is the common base class of these two objects.) |
modeString | [in] Human-readable string, for verbose debugging output and error output, explaining what function called this method. Example: "doImport (forward)", "doExport (reverse)". |
revOp | [in] Whether to do a forward or reverse mode redistribution. |
CM | [in] The combine mode that describes how to combine values that map to the same global ID on the same process. |
|
protectedvirtualinherited |
Reallocate numExportPacketsPerLID_ and/or numImportPacketsPerLID_, if necessary.
numExportLIDs | [in] Number of entries in the exportLIDs input array argument of doTransfer(). |
numImportLIDs | [in] Number of entries in the remoteLIDs input array argument of doTransfer(). |
|
protectedinherited |
Implementation detail of doTransfer.
LID DualViews come from the Transfer object given to doTransfer. They are always sync'd on both host and device. Users must never attempt to modify or sync them.
|
protectedvirtualinherited |
Reallocate imports_ if needed.
This unfortunately must be declared protected, for the same reason that imports_ is declared protected.
newSize | [in] New size of imports_. |
verbose | [in] Whether to print verbose debugging output to stderr on every (MPI) process in the communicator. |
prefix | [in] If verbose is true , then this is a nonnull prefix to print at the beginning of each line of verbose debugging output. Otherwise, not used. |
We don't need a "reallocExportsIfNeeded" method, because exports_
always gets passed into packAndPrepare() by nonconst reference. Thus, that method can resize the DualView without needing to call other DistObject methods.
|
protectedinherited |
Mesh Map given to constructor.
This is stored by value, not as a Teuchos::RCP, because the latter is not thread-safe. I would like GID->LID lookups to be thread-safe.
Definition at line 598 of file Tpetra_BlockMultiVector_decl.hpp.
|
protectedinherited |
The Tpetra::MultiVector used to represent the data.
Definition at line 606 of file Tpetra_BlockMultiVector_decl.hpp.
|
protectedinherited |
The Map over which this object is distributed.
Definition at line 968 of file Tpetra_DistObject_decl.hpp.
|
protectedinherited |
Buffer into which packed data are imported (received from other processes).
Unfortunately, I had to declare these protected, because CrsMatrix uses them at one point. Please, nobody else use them.
Definition at line 981 of file Tpetra_DistObject_decl.hpp.
|
protectedinherited |
Number of packets to receive for each receive operation.
This array is used in Distributor::doPosts() (and doReversePosts()) when starting the ireceive operation.
This may be ignored in doTransfer() if constantNumPackets is nonzero, indicating a constant number of packets per LID. (For example, MultiVector sets the constantNumPackets output argument of packAndPrepare() to the number of columns in the multivector.)
Unfortunately, I had to declare this protected, because CrsMatrix uses it at one point. Please, nobody else use it.
Definition at line 1021 of file Tpetra_DistObject_decl.hpp.
|
protectedinherited |
Buffer from which packed data are exported (sent to other processes).
Unfortunately, I had to declare this protected, because CrsMatrix uses it at one point. Please, nobody else use it.
Definition at line 1028 of file Tpetra_DistObject_decl.hpp.
|
protectedinherited |
Number of packets to send for each send operation.
This array is used in Distributor::doPosts() (and doReversePosts()) for preparing for the send operation.
This may be ignored in doTransfer() if constantNumPackets is nonzero, indicating a constant number of packets per LID. (For example, MultiVector sets the constantNumPackets output argument of packAndPrepare() to the number of columns in the multivector.)
Unfortunately, I had to declare this protected, because CrsMatrix uses them at one point. Please, nobody else use it.
Definition at line 1043 of file Tpetra_DistObject_decl.hpp.