00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #ifndef XPETRA_VBRMATRIX_HPP
00047 #define XPETRA_VBRMATRIX_HPP
00048
00049 #include <Kokkos_DefaultNode.hpp>
00050 #include <Kokkos_DefaultKernels.hpp>
00051 #include <Kokkos_VbrMatrix.hpp>
00052
00053 #include "Xpetra_ConfigDefs.hpp"
00054
00055 #include "Xpetra_BlockMap.hpp"
00056 #include "Xpetra_MultiVector.hpp"
00057
00058
00059 #include <Teuchos_SerialDenseMatrix.hpp>
00060
00065 namespace Xpetra {
00066
00068
00096 template <class Scalar,
00097 class LocalOrdinal = int,
00098 class GlobalOrdinal = LocalOrdinal,
00099 class Node = Kokkos::DefaultNode::DefaultNodeType,
00100 class LocalMatOps = typename Kokkos::DefaultKernels<Scalar,LocalOrdinal,Node>::BlockSparseOps >
00101 class VbrMatrix {
00102 public:
00103
00105
00106
00108 virtual ~VbrMatrix();
00109
00111
00112 #ifdef XPETRA_NOT_IMPLEMENTED_FOR_EPETRA
00113
00115
00116 #ifdef XPETRA_NOT_IMPLEMENTED
00117
00118
00123
00124 template <class DomainScalar, class RangeScalar>
00125 void multiply(const MultiVector<DomainScalar,LocalOrdinal,GlobalOrdinal,Node> & X, MultiVector<RangeScalar,LocalOrdinal,GlobalOrdinal,Node> &Y, Teuchos::ETransp trans, RangeScalar alpha, RangeScalar beta) const;
00126 #endif // XPETRA_NOT_IMPLEMENTED
00127
00129
00130 #ifdef XPETRA_NOT_IMPLEMENTED
00131
00132
00144
00145 template <class DomainScalar, class RangeScalar>
00146 void solve(const MultiVector<RangeScalar,LocalOrdinal,GlobalOrdinal,Node> & Y, MultiVector<DomainScalar,LocalOrdinal,GlobalOrdinal,Node> &X, Teuchos::ETransp trans) const;
00147 #endif // XPETRA_NOT_IMPLEMENTED
00148
00150
00152
00153
00155
00157 virtual const Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > & getDomainMap() const =0;
00158
00160
00162 virtual const Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > & getRangeMap() const =0;
00163
00165
00170 virtual void apply(const MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> &X,
00171 MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> &Y,
00172 Teuchos::ETransp trans = Teuchos::NO_TRANS,
00173 Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
00174 Scalar beta = Teuchos::ScalarTraits<Scalar>::zero()) const =0;
00175
00177
00180 virtual void applyInverse(const MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> & Y,
00181 MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> &X,
00182 Teuchos::ETransp trans) const =0;
00183
00185 virtual bool hasTransposeApply() const =0;
00186
00188
00190
00191
00193 virtual const Teuchos::RCP<const BlockMap<LocalOrdinal,GlobalOrdinal,Node> > & getBlockRowMap() const =0;
00194
00196 virtual const Teuchos::RCP<const BlockMap<LocalOrdinal,GlobalOrdinal,Node> > & getBlockColMap() const =0;
00197
00199 virtual const Teuchos::RCP<const BlockMap<LocalOrdinal,GlobalOrdinal,Node> > & getBlockDomainMap() const =0;
00200
00202 virtual const Teuchos::RCP<const BlockMap<LocalOrdinal,GlobalOrdinal,Node> > & getBlockRangeMap() const =0;
00203
00205 virtual const Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > & getPointRowMap() const =0;
00206
00208 virtual const Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > & getPointColMap() const =0;
00209
00211 virtual bool isFillComplete() const =0;
00213
00215
00216
00218
00221 virtual void putScalar(Scalar s) =0;
00222
00224
00233 virtual void setGlobalBlockEntry(GlobalOrdinal globalBlockRow, GlobalOrdinal globalBlockCol, const Teuchos::SerialDenseMatrix<GlobalOrdinal,Scalar>& blockEntry) =0;
00234
00236
00243 virtual void setLocalBlockEntry(LocalOrdinal localBlockRow, LocalOrdinal localBlockCol, const Teuchos::SerialDenseMatrix<LocalOrdinal,Scalar>& blockEntry) =0;
00244
00246
00255 virtual void sumIntoGlobalBlockEntry(GlobalOrdinal globalBlockRow, GlobalOrdinal globalBlockCol, const Teuchos::SerialDenseMatrix<GlobalOrdinal,Scalar>& blockEntry) =0;
00256
00258
00265 virtual void sumIntoLocalBlockEntry(LocalOrdinal localBlockRow, LocalOrdinal localBlockCol, const Teuchos::SerialDenseMatrix<LocalOrdinal,Scalar>& blockEntry) =0;
00266
00268
00277 virtual void setGlobalBlockEntry(GlobalOrdinal globalBlockRow, GlobalOrdinal globalBlockCol, LocalOrdinal blkRowSize, LocalOrdinal blkColSize, LocalOrdinal LDA, const Teuchos::ArrayView<const Scalar>& blockEntry) =0;
00278
00280
00287 virtual void setLocalBlockEntry(LocalOrdinal localBlockRow, LocalOrdinal localBlockCol, LocalOrdinal blkRowSize, LocalOrdinal blkColSize, LocalOrdinal LDA, const Teuchos::ArrayView<const Scalar>& blockEntry) =0;
00288
00290
00299 virtual void sumIntoGlobalBlockEntry(GlobalOrdinal globalBlockRow, GlobalOrdinal globalBlockCol, LocalOrdinal blkRowSize, LocalOrdinal blkColSize, LocalOrdinal LDA, const Teuchos::ArrayView<const Scalar>& blockEntry) =0;
00300
00302
00309 virtual void sumIntoLocalBlockEntry(LocalOrdinal localBlockRow, LocalOrdinal localBlockCol, LocalOrdinal blkRowSize, LocalOrdinal blkColSize, LocalOrdinal LDA, const Teuchos::ArrayView<const Scalar>& blockEntry) =0;
00310
00312
00314
00315
00317
00320 virtual void fillComplete(const Teuchos::RCP<const BlockMap<LocalOrdinal,GlobalOrdinal,Node> >& blockDomainMap, const Teuchos::RCP<const BlockMap<LocalOrdinal,GlobalOrdinal,Node> >& blockRangeMap) =0;
00321
00323
00326 virtual void fillComplete() =0;
00328
00330
00331
00333
00341 virtual void getGlobalBlockEntryView(GlobalOrdinal globalBlockRow,
00342 GlobalOrdinal globalBlockCol,
00343 LocalOrdinal& numPtRows,
00344 LocalOrdinal& numPtCols,
00345 Teuchos::ArrayRCP<const Scalar>& blockEntry) const =0;
00346
00348
00358 virtual void getGlobalBlockEntryViewNonConst(GlobalOrdinal globalBlockRow,
00359 GlobalOrdinal globalBlockCol,
00360 LocalOrdinal& numPtRows,
00361 LocalOrdinal& numPtCols,
00362 Teuchos::ArrayRCP<Scalar>& blockEntry) =0;
00363
00365
00375 virtual void getLocalBlockEntryView(LocalOrdinal localBlockRow,
00376 LocalOrdinal localBlockCol,
00377 LocalOrdinal& numPtRows,
00378 LocalOrdinal& numPtCols,
00379 Teuchos::ArrayRCP<const Scalar>& blockEntry) const =0;
00380
00382
00398 virtual void getLocalBlockEntryViewNonConst(LocalOrdinal localBlockRow,
00399 LocalOrdinal localBlockCol,
00400 LocalOrdinal& numPtRows,
00401 LocalOrdinal& numPtCols,
00402 Teuchos::ArrayRCP<Scalar>& blockEntry) =0;
00403
00404 #ifdef XPETRA_NOT_IMPLEMENTED
00405
00406
00410
00411 virtual void getLocalDiagCopy(Xpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node>& diag) const =0;
00412 #endif // XPETRA_NOT_IMPLEMENTED
00413
00414
00416
00417 virtual std::string description() const =0;
00418
00421 virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const =0;
00423
00424 #endif // XPETRA_NOT_IMPLEMENTED_FOR_EPETRA
00425
00426 };
00427
00428 }
00429
00430 #define XPETRA_VBRMATRIX_SHORT
00431 #endif //XPETRA_VBRMATRIX_DECL_HPP