All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
Xpetra_VbrMatrix.hpp
Go to the documentation of this file.
00001 // @HEADER
00002 //
00003 // ***********************************************************************
00004 //
00005 //             Xpetra: A linear algebra interface package
00006 //                  Copyright 2012 Sandia Corporation
00007 //
00008 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00009 // the U.S. Government retains certain rights in this software.
00010 //
00011 // Redistribution and use in source and binary forms, with or without
00012 // modification, are permitted provided that the following conditions are
00013 // met:
00014 //
00015 // 1. Redistributions of source code must retain the above copyright
00016 // notice, this list of conditions and the following disclaimer.
00017 //
00018 // 2. Redistributions in binary form must reproduce the above copyright
00019 // notice, this list of conditions and the following disclaimer in the
00020 // documentation and/or other materials provided with the distribution.
00021 //
00022 // 3. Neither the name of the Corporation nor the names of the
00023 // contributors may be used to endorse or promote products derived from
00024 // this software without specific prior written permission.
00025 //
00026 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00027 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00028 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00029 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00030 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00031 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00032 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00033 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00034 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00035 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00036 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00037 //
00038 // Questions? Contact
00039 //                    Jeremie Gaidamour (jngaida@sandia.gov)
00040 //                    Jonathan Hu       (jhu@sandia.gov)
00041 //                    Ray Tuminaro      (rstumin@sandia.gov)
00042 //
00043 // ***********************************************************************
00044 //
00045 // @HEADER
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 // #include "Xpetra_Operator.hpp"
00055 #include "Xpetra_BlockMap.hpp"
00056 #include "Xpetra_MultiVector.hpp"
00057 // #include "Xpetra_BlockCrsGraph.hpp"
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 { //: public Xpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> {
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   //TODO virtual
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   //TODO virtual
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   //TODO: need Vector  
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 };//class VbrMatrix
00427 
00428 }//namespace Xpetra
00429 
00430 #define XPETRA_VBRMATRIX_SHORT
00431 #endif //XPETRA_VBRMATRIX_DECL_HPP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines