Amesos2 - Direct Sparse Solver Interfaces  Version of the Day
Amesos2_MatrixTraits.hpp
00001 // @HEADER
00002 //
00003 // ***********************************************************************
00004 //
00005 //           Amesos2: Templated Direct Sparse Solver Package
00006 //                  Copyright 2011 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 Michael A. Heroux (maherou@sandia.gov)
00039 //
00040 // ***********************************************************************
00041 //
00042 // @HEADER
00043 
00044 
00045 #ifndef AMESOS2_MATRIXTRAITS_HPP
00046 #define AMESOS2_MATRIXTRAITS_HPP
00047 
00048 #include "Amesos2_config.h"
00049 
00050 #include <Tpetra_CrsMatrix.hpp>
00051 
00052 #ifdef HAVE_AMESOS2_EPETRA
00053 #  include <Tpetra_DefaultPlatform.hpp>
00054 #  include <Epetra_RowMatrix.h>
00055 #  include <Epetra_CrsMatrix.h>
00056 // #  include <Epetra_MsrMatrix.h>
00057 #  include <Epetra_VbrMatrix.h>
00058 // and perhaps some others later...
00059 #endif
00060 
00061 #include "Amesos2_Util.hpp"
00062 
00063 namespace Amesos2 {
00064 
00065   // The declaration
00066   template <class Matrix>
00067   struct MatrixTraits {};
00068 
00069   /*******************
00070    * Specializations *
00071    *******************/
00072 
00073   template < typename Scalar,
00074              typename LocalOrdinal,
00075              typename GlobalOrdinal,
00076              typename Node >
00077   struct MatrixTraits<
00078     Tpetra::RowMatrix<Scalar,
00079                       LocalOrdinal,
00080                       GlobalOrdinal,
00081                       Node> > {
00082     typedef Scalar scalar_t;
00083     typedef LocalOrdinal local_ordinal_t;
00084     typedef GlobalOrdinal global_ordinal_t;
00085     typedef Node node_t;
00086 
00087     typedef row_access major_access;
00088   };
00089 
00090   template < typename Scalar,
00091              typename LocalOrdinal,
00092              typename GlobalOrdinal,
00093              typename Node >
00094   struct MatrixTraits<
00095     Tpetra::CrsMatrix<Scalar,
00096                       LocalOrdinal,
00097                       GlobalOrdinal,
00098                       Node> > {
00099     typedef Scalar scalar_t;
00100     typedef LocalOrdinal local_ordinal_t;
00101     typedef GlobalOrdinal global_ordinal_t;
00102     typedef Node node_t;
00103 
00104     typedef row_access major_access;
00105   };
00106 
00107 #ifdef HAVE_AMESOS2_EPETRA
00108 
00109   template <>
00110   struct MatrixTraits<Epetra_RowMatrix> {
00111     typedef double scalar_t;
00112     typedef int local_ordinal_t;
00113     typedef int global_ordinal_t;
00114     typedef Tpetra::DefaultPlatform::DefaultPlatformType::NodeType node_t;
00115 
00116     typedef row_access major_access;
00117   };
00118 
00119   template <>
00120   struct MatrixTraits<Epetra_CrsMatrix> {
00121     typedef double scalar_t;
00122     typedef int local_ordinal_t;
00123     typedef int global_ordinal_t;
00124     typedef Tpetra::DefaultPlatform::DefaultPlatformType::NodeType node_t;
00125 
00126     typedef row_access major_access;
00127   };
00128 
00129   // template <>
00130   // struct MatrixTraits<Epetra_MsrMatrix> {
00131   //   typedef double scalar_t;
00132   //   typedef int local_ordinal_t;
00133   //   typedef int global_ordinal_t;
00134   //   typedef Tpetra::DefaultPlatform::DefaultPlatformType::NodeType node_t;
00135 
00136   //   typedef row_access major_access;
00137   // };
00138 
00139   template <>
00140   struct MatrixTraits<Epetra_VbrMatrix> {
00141     typedef double scalar_t;
00142     typedef int local_ordinal_t;
00143     typedef int global_ordinal_t;
00144     typedef Tpetra::DefaultPlatform::DefaultPlatformType::NodeType node_t;
00145 
00146     typedef row_access major_access;
00147   };
00148 
00149 #endif
00150 
00151 }
00152 
00153 #endif  // AMESOS2_MATRIXTRAITS_HPP