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 //                    Jonathan Hu       (jhu@sandia.gov)
00040 //                    Andrey Prokopenko (aprokop@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_VbrMatrix.hpp> // FIXME (mfh 03 Sep 2014) Do we need to include this???
00051 
00052 #include "Xpetra_ConfigDefs.hpp"
00053 // #include "Xpetra_Matrix.hpp"
00054 #include "Xpetra_BlockMap.hpp"
00055 #include "Xpetra_MultiVector.hpp"
00056 // #include "Xpetra_BlockCrsGraph.hpp"
00057 
00058 #include <Teuchos_SerialDenseMatrix.hpp>
00059 
00064 namespace Xpetra {
00065 
00067 
00096 template <class Scalar = MultiVector<>::scalar_type,
00097           class LocalOrdinal = Map<>::local_ordinal_type,
00098           class GlobalOrdinal =
00099             typename Map<LocalOrdinal>::global_ordinal_type,
00100           class Node =
00101             typename Map<LocalOrdinal, GlobalOrdinal>::node_type>
00102 class VbrMatrix { //: public Xpetra::Matrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> {
00103  public:
00104   typedef Scalar scalar_type;
00105   typedef LocalOrdinal local_ordinal_type;
00106   typedef GlobalOrdinal global_ordinal_type;
00107   typedef Node node_type;
00108 
00110 
00111 
00113   virtual ~VbrMatrix();
00114 
00116 
00117 #ifdef XPETRA_NOT_IMPLEMENTED_FOR_EPETRA
00118 
00120 
00121 #ifdef XPETRA_NOT_IMPLEMENTED
00122 
00123 
00128   //TODO virtual
00129   template <class DomainScalar, class RangeScalar>
00130   void multiply(const MultiVector<DomainScalar,LocalOrdinal,GlobalOrdinal,Node> & X, MultiVector<RangeScalar,LocalOrdinal,GlobalOrdinal,Node> &Y, Teuchos::ETransp trans, RangeScalar alpha, RangeScalar beta) const;
00131 #endif // XPETRA_NOT_IMPLEMENTED
00132 
00134 
00135 #ifdef XPETRA_NOT_IMPLEMENTED
00136 
00137 
00149   //TODO virtual
00150   template <class DomainScalar, class RangeScalar>
00151   void solve(const MultiVector<RangeScalar,LocalOrdinal,GlobalOrdinal,Node> & Y, MultiVector<DomainScalar,LocalOrdinal,GlobalOrdinal,Node> &X, Teuchos::ETransp trans) const;
00152 #endif // XPETRA_NOT_IMPLEMENTED
00153 
00155 
00157 
00158 
00160 
00162   virtual const Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > & getDomainMap() const =0;
00163 
00165 
00167   virtual const Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > & getRangeMap() const =0;
00168 
00170 
00175   virtual void apply(const MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> &X,
00176                     MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> &Y,
00177                     Teuchos::ETransp trans = Teuchos::NO_TRANS,
00178                     Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
00179                     Scalar beta = Teuchos::ScalarTraits<Scalar>::zero()) const =0;
00180 
00182 
00185   virtual void applyInverse(const MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> & Y,
00186                    MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> &X,
00187                    Teuchos::ETransp trans) const =0;
00188 
00190   virtual bool hasTransposeApply() const =0;
00191 
00193 
00195 
00196 
00198   virtual const Teuchos::RCP<const BlockMap<LocalOrdinal,GlobalOrdinal,Node> > & getBlockRowMap() const =0;
00199 
00201   virtual const Teuchos::RCP<const BlockMap<LocalOrdinal,GlobalOrdinal,Node> > & getBlockColMap() const =0;
00202 
00204   virtual const Teuchos::RCP<const BlockMap<LocalOrdinal,GlobalOrdinal,Node> > & getBlockDomainMap() const =0;
00205 
00207   virtual const Teuchos::RCP<const BlockMap<LocalOrdinal,GlobalOrdinal,Node> > & getBlockRangeMap() const =0;
00208 
00210   virtual const Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > & getPointRowMap() const =0;
00211 
00213   virtual const Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > & getPointColMap() const =0;
00214 
00216   virtual bool isFillComplete() const =0;
00218 
00220 
00221 
00223 
00226   virtual void putScalar(Scalar s) =0;
00227 
00229 
00238   virtual void setGlobalBlockEntry(GlobalOrdinal globalBlockRow, GlobalOrdinal globalBlockCol, const Teuchos::SerialDenseMatrix<GlobalOrdinal,Scalar>& blockEntry) =0;
00239 
00241 
00248   virtual void setLocalBlockEntry(LocalOrdinal localBlockRow, LocalOrdinal localBlockCol, const Teuchos::SerialDenseMatrix<LocalOrdinal,Scalar>& blockEntry) =0;
00249 
00251 
00260   virtual void sumIntoGlobalBlockEntry(GlobalOrdinal globalBlockRow, GlobalOrdinal globalBlockCol, const Teuchos::SerialDenseMatrix<GlobalOrdinal,Scalar>& blockEntry) =0;
00261 
00263 
00270   virtual void sumIntoLocalBlockEntry(LocalOrdinal localBlockRow, LocalOrdinal localBlockCol, const Teuchos::SerialDenseMatrix<LocalOrdinal,Scalar>& blockEntry) =0;
00271 
00273 
00282   virtual void setGlobalBlockEntry(GlobalOrdinal globalBlockRow, GlobalOrdinal globalBlockCol, LocalOrdinal blkRowSize, LocalOrdinal blkColSize, LocalOrdinal LDA, const Teuchos::ArrayView<const Scalar>& blockEntry) =0;
00283 
00285 
00292   virtual void setLocalBlockEntry(LocalOrdinal localBlockRow, LocalOrdinal localBlockCol, LocalOrdinal blkRowSize, LocalOrdinal blkColSize, LocalOrdinal LDA, const Teuchos::ArrayView<const Scalar>& blockEntry) =0;
00293 
00295 
00304   virtual void sumIntoGlobalBlockEntry(GlobalOrdinal globalBlockRow, GlobalOrdinal globalBlockCol, LocalOrdinal blkRowSize, LocalOrdinal blkColSize, LocalOrdinal LDA, const Teuchos::ArrayView<const Scalar>& blockEntry) =0;
00305 
00307 
00314   virtual void sumIntoLocalBlockEntry(LocalOrdinal localBlockRow, LocalOrdinal localBlockCol, LocalOrdinal blkRowSize, LocalOrdinal blkColSize, LocalOrdinal LDA, const Teuchos::ArrayView<const Scalar>& blockEntry) =0;
00315 
00317 
00319 
00320 
00322 
00325   virtual void fillComplete(const Teuchos::RCP<const BlockMap<LocalOrdinal,GlobalOrdinal,Node> >& blockDomainMap, const Teuchos::RCP<const BlockMap<LocalOrdinal,GlobalOrdinal,Node> >& blockRangeMap) =0;
00326 
00328 
00331   virtual void fillComplete() =0;
00333 
00335 
00336 
00338 
00346   virtual void getGlobalBlockEntryView(GlobalOrdinal globalBlockRow,
00347                               GlobalOrdinal globalBlockCol,
00348                               LocalOrdinal& numPtRows,
00349                               LocalOrdinal& numPtCols,
00350                               Teuchos::ArrayRCP<const Scalar>& blockEntry) const =0;
00351 
00353 
00363   virtual void getGlobalBlockEntryViewNonConst(GlobalOrdinal globalBlockRow,
00364                                       GlobalOrdinal globalBlockCol,
00365                                       LocalOrdinal& numPtRows,
00366                                       LocalOrdinal& numPtCols,
00367                                       Teuchos::ArrayRCP<Scalar>& blockEntry) =0;
00368 
00370 
00380   virtual void getLocalBlockEntryView(LocalOrdinal localBlockRow,
00381                              LocalOrdinal localBlockCol,
00382                              LocalOrdinal& numPtRows,
00383                              LocalOrdinal& numPtCols,
00384                              Teuchos::ArrayRCP<const Scalar>& blockEntry) const =0;
00385 
00387 
00403   virtual void getLocalBlockEntryViewNonConst(LocalOrdinal localBlockRow,
00404                                      LocalOrdinal localBlockCol,
00405                                      LocalOrdinal& numPtRows,
00406                                      LocalOrdinal& numPtCols,
00407                                      Teuchos::ArrayRCP<Scalar>& blockEntry) =0;
00408 
00409 #ifdef XPETRA_NOT_IMPLEMENTED
00410 
00411 
00415   //TODO: need Vector
00416 virtual void getLocalDiagCopy(Xpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node>& diag) const =0;
00417 #endif // XPETRA_NOT_IMPLEMENTED
00418 
00419 
00421 
00422   virtual std::string description() const =0;
00423 
00426   virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const =0;
00428 
00429 #endif // XPETRA_NOT_IMPLEMENTED_FOR_EPETRA
00430 
00431 };//class VbrMatrix
00432 
00433 }//namespace Xpetra
00434 
00435 #define XPETRA_VBRMATRIX_SHORT
00436 #endif //XPETRA_VBRMATRIX_DECL_HPP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines