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        typename LocalMatOps >
00095   struct MatrixTraits<
00096     Tpetra::CrsMatrix<Scalar,
00097           LocalOrdinal,
00098           GlobalOrdinal,
00099           Node,
00100           LocalMatOps> > {
00101     typedef Scalar scalar_t;
00102     typedef LocalOrdinal local_ordinal_t;
00103     typedef GlobalOrdinal global_ordinal_t;
00104     typedef Node node_t;
00105 
00106     typedef row_access major_access;
00107   };
00108 
00109 #ifdef HAVE_AMESOS2_EPETRA
00110 
00111   template <>
00112   struct MatrixTraits<Epetra_RowMatrix> {
00113     typedef double scalar_t;
00114     typedef int local_ordinal_t;
00115     typedef int global_ordinal_t;
00116     typedef Tpetra::DefaultPlatform::DefaultPlatformType::NodeType node_t;
00117     
00118     typedef row_access major_access;
00119   };
00120 
00121   template <>
00122   struct MatrixTraits<Epetra_CrsMatrix> {
00123     typedef double scalar_t;
00124     typedef int local_ordinal_t;
00125     typedef int global_ordinal_t;
00126     typedef Tpetra::DefaultPlatform::DefaultPlatformType::NodeType node_t;
00127     
00128     typedef row_access major_access;
00129   };
00130 
00131   // template <>
00132   // struct MatrixTraits<Epetra_MsrMatrix> {
00133   //   typedef double scalar_t;
00134   //   typedef int local_ordinal_t;
00135   //   typedef int global_ordinal_t;
00136   //   typedef Tpetra::DefaultPlatform::DefaultPlatformType::NodeType node_t;
00137     
00138   //   typedef row_access major_access;
00139   // };
00140 
00141   template <>
00142   struct MatrixTraits<Epetra_VbrMatrix> {
00143     typedef double scalar_t;
00144     typedef int local_ordinal_t;
00145     typedef int global_ordinal_t;
00146     typedef Tpetra::DefaultPlatform::DefaultPlatformType::NodeType node_t;
00147     
00148     typedef row_access major_access;
00149   };
00150 
00151 #endif
00152 
00153 }
00154 
00155 #endif  // AMESOS2_MATRIXTRAITS_HPP