Xpetra Version of the Day
Loading...
Searching...
No Matches
Xpetra_BlockedCrsMatrix_decl.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Xpetra: A linear algebra interface package
4//
5// Copyright 2012 NTESS and the Xpetra contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef XPETRA_BLOCKEDCRSMATRIX_DECL_HPP
11#define XPETRA_BLOCKEDCRSMATRIX_DECL_HPP
12
13#include <Tpetra_KokkosCompat_DefaultNode.hpp>
14
16#include <Teuchos_Hashtable.hpp>
17
18#include "Xpetra_ConfigDefs.hpp"
19#include "Xpetra_Exceptions.hpp"
20
21#include "Xpetra_MapFactory.hpp"
22#include "Xpetra_MultiVector.hpp"
23#include "Xpetra_BlockedMultiVector.hpp"
24#include "Xpetra_MultiVectorFactory.hpp"
25#include "Xpetra_BlockedVector.hpp"
26#include "Xpetra_CrsGraph.hpp"
27#include "Xpetra_CrsMatrix.hpp"
29
30#include "Xpetra_MapExtractor.hpp"
32
33#include "Xpetra_Matrix.hpp"
34#include "Xpetra_MatrixFactory.hpp"
35#include "Xpetra_CrsMatrixWrap.hpp"
36
37#ifdef HAVE_XPETRA_THYRA
38#include <Thyra_ProductVectorSpaceBase.hpp>
39#include <Thyra_VectorSpaceBase.hpp>
40#include <Thyra_LinearOpBase.hpp>
41#include <Thyra_BlockedLinearOpBase.hpp>
42#include <Thyra_PhysicallyBlockedLinearOpBase.hpp>
43#include "Xpetra_ThyraUtils.hpp"
44#endif
45
46#include "Xpetra_VectorFactory.hpp"
47
52namespace Xpetra {
53
54#ifdef HAVE_XPETRA_THYRA
55template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
56class ThyraUtils;
57#endif
58
59typedef std::string viewLabel_t;
60
61template <class Scalar,
62 class LocalOrdinal,
63 class GlobalOrdinal,
64 class Node = Tpetra::KokkosClassic::DefaultNode::DefaultNodeType>
65class BlockedCrsMatrix : public Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> {
66 public:
67 typedef Scalar scalar_type;
68 typedef LocalOrdinal local_ordinal_type;
69 typedef GlobalOrdinal global_ordinal_type;
70 typedef Node node_type;
72 private:
73#undef XPETRA_BLOCKEDCRSMATRIX_SHORT
75
76 public:
78
79
81
86 BlockedCrsMatrix(const Teuchos::RCP<const BlockedMap>& rangeMaps,
87 const Teuchos::RCP<const BlockedMap>& domainMaps,
88 size_t numEntriesPerRow);
91
98 BlockedCrsMatrix(Teuchos::RCP<const MapExtractor>& rangeMapExtractor,
99 Teuchos::RCP<const MapExtractor>& domainMapExtractor,
100 size_t numEntriesPerRow);
101
102#ifdef HAVE_XPETRA_THYRA
104
109 BlockedCrsMatrix(const Teuchos::RCP<const Thyra::BlockedLinearOpBase<Scalar> >& thyraOp, const Teuchos::RCP<const Teuchos::Comm<int> >& /* comm */);
110
111 private:
113
121
122 public:
123#endif
124
127
129
131
132
134
142 \post <tt>isGloballyIndexed() == true</tt>
144 \note If \c globalRow does not belong to the matrix on this node, then it
145 will be communicated to the appropriate node when globalAssemble() is
146 called (which will, at the latest, occur during the next call to
147 fillComplete().) Otherwise, the entries will be inserted in the local
148 matrix.
150 \note If the matrix row already contains values at the indices
151 corresponding to values in \c cols, then the new values will be summed
152 with the old values; this may happen at insertion or during the next call
153 to fillComplete().
155 \note If <tt>hasColMap() == true</tt>, only (cols[i],vals[i]) where
156 cols[i] belongs to the column map on this node will be inserted into the
157 matrix.
158 */
159 void insertGlobalValues(GlobalOrdinal globalRow, const ArrayView<const GlobalOrdinal>& cols, const ArrayView<const Scalar>& vals);
160
162
172 void insertLocalValues(LocalOrdinal localRow, const ArrayView<const LocalOrdinal>& cols, const ArrayView<const Scalar>& vals);
173
174 void removeEmptyProcessesInPlace(const Teuchos::RCP<const Map>& newMap);
175
182
185 void replaceGlobalValues(GlobalOrdinal globalRow,
187 const ArrayView<const Scalar>& vals);
188
190
194 void replaceLocalValues(LocalOrdinal localRow,
196 const ArrayView<const Scalar>& vals);
197
199 virtual void setAllToScalar(const Scalar& alpha);
200
202 void scale(const Scalar& alpha);
203
205
207
208
210 After calling fillComplete(), resumeFill() must be called before initiating any changes to the matrix.
211
212 For BlockedCrsMatrix objects we call the routine iteratively for all sub-blocks.
214 resumeFill() may be called repeatedly.
215 */
216 void resumeFill(const RCP<ParameterList>& params = null);
217
220 Note: for blocked operators the specified domain and range maps have no meaning.
221 We just call fillComplete for all underlying blocks
222 */
223 void fillComplete(const RCP<const Map>& domainMap, const RCP<const Map>& rangeMap, const RCP<ParameterList>& params = null);
226
230 \note This method calls fillComplete( getRowMap(), getRowMap(), os ).
231
232 \pre <tt>isFillActive() == true<tt>
233 \pre <tt>isFillComplete()() == false<tt>
234
235 \post <tt>isFillActive() == false<tt>
236 \post <tt>isFillComplete() == true<tt>
237 \post if <tt>os == DoOptimizeStorage<tt>, then <tt>isStorageOptimized() == true</tt>
238 */
239 void fillComplete(const RCP<ParameterList>& params = null);
240
241
242
244
246 global_size_t getGlobalNumRows() const;
247
249
251 global_size_t getGlobalNumCols() const;
252
254 size_t getLocalNumRows() const;
255
257 global_size_t getGlobalNumEntries() const;
258
260 size_t getLocalNumEntries() const;
261
263
264 size_t getNumEntriesInLocalRow(LocalOrdinal localRow) const;
265
267
268 size_t getNumEntriesInGlobalRow(GlobalOrdinal globalRow) const;
269
271
273 size_t getGlobalMaxNumRowEntries() const;
274
276
278 size_t getLocalMaxNumRowEntries() const;
279
281
284 bool isLocallyIndexed() const;
285
287
290 bool isGloballyIndexed() const;
291
293 bool isFillComplete() const;
294
296
310 virtual void getLocalRowCopy(LocalOrdinal LocalRow,
311 const ArrayView<LocalOrdinal>& Indices,
312 const ArrayView<Scalar>& Values,
313 size_t& NumEntries) const;
314
316
325 void getGlobalRowView(GlobalOrdinal GlobalRow, ArrayView<const GlobalOrdinal>& indices, ArrayView<const Scalar>& values) const;
326
328
337 void getLocalRowView(LocalOrdinal LocalRow, ArrayView<const LocalOrdinal>& indices, ArrayView<const Scalar>& values) const;
338
340
343 void getLocalDiagCopy(Vector& diag) const;
344
346 void leftScale(const Vector& x);
347
349 void rightScale(const Vector& x);
350
352 virtual typename ScalarTraits<Scalar>::magnitudeType getFrobeniusNorm() const;
353
355 virtual bool haveGlobalConstants() const;
356
358
360
361
363
381
383
385
386
388 virtual void apply(const MultiVector& X, MultiVector& Y, Teuchos::ETransp mode, Scalar alpha, Scalar beta, bool sumInterfaceValues,
389 const RCP<Xpetra::Import<LocalOrdinal, GlobalOrdinal, Node> >& regionInterfaceImporter,
390 const Teuchos::ArrayRCP<LocalOrdinal>& regionInterfaceLIDs) const;
391
393
396 virtual void apply(const MultiVector& X, MultiVector& Y,
398 Scalar alpha = ScalarTraits<Scalar>::one(),
399 Scalar beta = ScalarTraits<Scalar>::zero()) const;
400
402 RCP<const Map> getFullDomainMap() const;
403
405 RCP<const BlockedMap> getBlockedDomainMap() const;
406
408 const RCP<const Map> getDomainMap() const;
409
411 RCP<const Map> getDomainMap(size_t i) const;
412
414 RCP<const Map> getDomainMap(size_t i, bool bThyraMode) const;
415
417 RCP<const Map> getFullRangeMap() const;
418
420 RCP<const BlockedMap> getBlockedRangeMap() const;
421
423 const RCP<const Map> getRangeMap() const;
424
426 RCP<const Map> getRangeMap(size_t i) const;
427
429 RCP<const Map> getRangeMap(size_t i, bool bThyraMode) const;
430
432 RCP<const MapExtractor> getRangeMapExtractor() const;
433
435 RCP<const MapExtractor> getDomainMapExtractor() const;
436
438
440 //{@
441
450 virtual void bgs_apply(
451 const MultiVector& X,
452 MultiVector& Y,
453 size_t row,
455 Scalar alpha = ScalarTraits<Scalar>::one(),
456 Scalar beta = ScalarTraits<Scalar>::zero()
457 ) const;
458
460
462 //{@
463
465 const Teuchos::RCP<const Map> getMap() const;
466
468 void doImport(const Matrix& source, const Import& importer, CombineMode CM);
469
471 void doExport(const Matrix& dest, const Import& importer, CombineMode CM);
472
474 void doImport(const Matrix& source, const Export& exporter, CombineMode CM);
475
477 void doExport(const Matrix& dest, const Export& exporter, CombineMode CM);
478
479 // @}
480
482
483
485 std::string description() const;
486
489
491
492 void setObjectLabel(const std::string& objectLabel);
494
496 bool hasCrsGraph() const;
497
499 RCP<const CrsGraph> getCrsGraph() const;
500
502
504
505
506 virtual bool isDiagonal() const;
507
509 virtual size_t Rows() const;
510
512 virtual size_t Cols() const;
513
515 Teuchos::RCP<Matrix> getCrsMatrix() const;
516
518 Teuchos::RCP<Matrix> getInnermostCrsMatrix();
519
521 Teuchos::RCP<Matrix> getMatrix(size_t r, size_t c) const;
522
524 // void setMatrix(size_t r, size_t c, Teuchos::RCP<CrsMatrix> mat) {
525 void setMatrix(size_t r, size_t c, Teuchos::RCP<Matrix> mat);
526
528 // NOTE: This is a rather expensive operation, since all blocks are copied
529 // into a new big CrsMatrix
530 Teuchos::RCP<Matrix> Merge() const;
532
537 typename local_matrix_type::HostMirror getLocalMatrixHost() const;
538
539#ifdef HAVE_XPETRA_THYRA
541#endif
543 LocalOrdinal GetStorageBlockSize() const;
544
546 void residual(const MultiVector& X,
547 const MultiVector& B,
548 MultiVector& R) const;
549
550 private:
553
555
565 void Add(const Matrix& A, const Scalar scalarA, Matrix& B, const Scalar scalarB) const;
566
568
569 // Default view is created after fillComplete()
570 // Because ColMap might not be available before fillComplete().
571 void CreateDefaultView();
572
573 private:
577
578 std::vector<Teuchos::RCP<Matrix> > blocks_;
579#ifdef HAVE_XPETRA_THYRA
581#endif
584};
585
586} // namespace Xpetra
587
588#define XPETRA_BLOCKEDCRSMATRIX_SHORT
589#endif /* XPETRA_BLOCKEDCRSMATRIX_DECL_HPP */
static const EVerbosityLevel verbLevel_default
Teuchos::RCP< const MapExtractor > domainmaps_
full domain map together with all partial domain maps
virtual ~BlockedCrsMatrix()
Destructor.
Teuchos::RCP< const MapExtractor > rangemaps_
full range map together with all partial domain maps
BlockedCrsMatrix(const Teuchos::RCP< const BlockedMap > &rangeMaps, const Teuchos::RCP< const BlockedMap > &domainMaps, size_t numEntriesPerRow)
Constructor.
bool bDomainThyraMode_
boolean flag, which is true, if BlockedCrsMatrix has been created using Thyra-style numbering for sub...
std::vector< Teuchos::RCP< Matrix > > blocks_
row major matrix block storage
local_matrix_type::HostMirror getLocalMatrixHost() const
Access the underlying local Kokkos::CrsMatrix object.
void residual(const MultiVector &X, const MultiVector &B, MultiVector &R) const
Compute a residual R = B - (*this) * X.
bool is_diagonal_
If we're diagonal, a bunch of the extraction stuff should work.
void Add(const Matrix &A, const Scalar scalarA, Matrix &B, const Scalar scalarB) const
Add a Xpetra::CrsMatrix to another: B = B*scalarB + A*scalarA.
bool bRangeThyraMode_
boolean flag, which is true, if BlockedCrsMatrix has been created using Thyra-style numbering for sub...
LocalOrdinal GetStorageBlockSize() const
Returns the block size of the storage mechanism.
CrsMatrix::local_matrix_type local_matrix_type
local_matrix_type getLocalMatrixDevice() const
Access the underlying local Kokkos::CrsMatrix object.
KokkosSparse::CrsMatrix< impl_scalar_type, LocalOrdinal, execution_space, void, typename local_graph_type::size_type > local_matrix_type
basic_FancyOStream< char > FancyOStream
size_t global_size_t
Global size_t object.
CombineMode
Xpetra::Combine Mode enumerable type.