Zoltan2
Zoltan2_InputTraits.hpp
Go to the documentation of this file.
00001 // @HEADER
00002 //
00003 // ***********************************************************************
00004 //
00005 //   Zoltan2: A package of combinatorial algorithms for scientific computing
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 Karen Devine      (kddevin@sandia.gov)
00039 //                    Erik Boman        (egboman@sandia.gov)
00040 //                    Siva Rajamanickam (srajama@sandia.gov)
00041 //
00042 // ***********************************************************************
00043 //
00044 // @HEADER
00045 
00050 #ifndef ZOLTAN2_INPUTTRAITS_HPP
00051 #define ZOLTAN2_INPUTTRAITS_HPP
00052 
00053 #include <Zoltan2_Standards.hpp>
00054 
00055 #include <Tpetra_CrsMatrix.hpp>
00056 #include <Tpetra_RowMatrix.hpp>
00057 #include <Tpetra_CrsGraph.hpp>
00058 #include <Epetra_CrsMatrix.h>
00059 #include <Epetra_CrsGraph.h>
00060 #include <Xpetra_CrsMatrix.hpp>
00061 #include <Xpetra_RowMatrix.hpp>
00062 #include <Xpetra_TpetraRowMatrix.hpp>
00063 #include <Xpetra_CrsGraph.hpp>
00064 
00065 namespace Zoltan2{
00066 
00067 typedef int default_lno_t;
00068 
00069 typedef int default_part_t;  // Default part number type.
00070                              // Restrictions in MPI interface will make it
00071                              // somewhat difficult to change default_part_t to
00072                              // long long, since we use part_t for ranks
00073                              // and we sometimes broadcast arrays whose
00074                              // size has type part_t.
00075 
00076 #ifdef HAVE_ZOLTAN2_INST_FLOAT_INT_LONG
00077 typedef float default_scalar_t;
00078 typedef long default_gno_t;
00079 #else
00080  #ifdef HAVE_ZOLTAN2_INST_DOUBLE_INT_LONG
00081  typedef double default_scalar_t;
00082  typedef long default_gno_t;
00083  #else
00084   #ifdef HAVE_ZOLTAN2_INST_FLOAT_INT_INT
00085   typedef float default_scalar_t;
00086   typedef int default_gno_t;
00087   #else
00088    #ifdef HAVE_ZOLTAN2_INST_DOUBLE_INT_INT
00089    typedef double default_scalar_t;
00090    typedef int default_gno_t;
00091    #else
00092    typedef double default_scalar_t;
00093    typedef int default_gno_t;
00094    #endif
00095   #endif
00096  #endif
00097 #endif
00098 
00141 template <typename scalar=double, typename gid=int,
00142           typename lno=int, typename gno=int>
00143 class BasicUserTypes{
00144 };
00145 
00180 template <typename User>
00181 struct InputTraits {
00182 
00185   typedef default_scalar_t scalar_t;
00186 
00190   typedef default_lno_t lno_t;
00191 
00195   typedef default_gno_t gno_t;
00196 
00203   typedef default_gno_t zgid_t;
00204 
00207   typedef default_part_t part_t;
00208 
00212   typedef KokkosClassic::DefaultNode::DefaultNodeType node_t;
00213 
00216   static inline std::string name() {return "InputAdapter";}
00217 };
00218 
00219 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00220 
00221 template <typename Scalar,
00222           typename GID,
00223           typename LNO,
00224           typename GNO>
00225 struct InputTraits<BasicUserTypes<Scalar, GID, LNO, GNO> >
00226 {
00227   typedef Scalar        scalar_t;
00228   typedef LNO lno_t;
00229   typedef GNO gno_t;
00230   typedef GID zgid_t;
00231   typedef Zoltan2::default_part_t  part_t;
00232   typedef Zoltan2::default_node_t node_t;
00233   static inline std::string name() {return "BasicUserTypes";}
00234 };
00235 
00236 template <typename Scalar,
00237           typename LocalOrdinal,
00238           typename GlobalOrdinal,
00239           typename Node>
00240 struct InputTraits<Xpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
00241 {
00242   typedef Scalar        scalar_t;
00243   typedef LocalOrdinal  lno_t;
00244   typedef GlobalOrdinal gno_t;
00245   typedef GlobalOrdinal zgid_t;
00246   typedef Zoltan2::default_part_t  part_t;
00247   typedef Node          node_t;
00248   static inline std::string name() {return "Xpetra::CrsMatrix";}
00249 };
00250 
00251 template <typename Scalar,
00252           typename LocalOrdinal,
00253           typename GlobalOrdinal,
00254           typename Node>
00255 struct InputTraits<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
00256 {
00257   typedef Scalar        scalar_t;
00258   typedef LocalOrdinal  lno_t;
00259   typedef GlobalOrdinal gno_t;
00260   typedef GlobalOrdinal zgid_t;
00261   typedef Zoltan2::default_part_t  part_t;
00262   typedef Node          node_t;
00263   static inline std::string name() {return "Tpetra::CrsMatrix";}
00264 };
00265 
00266 template < >
00267 struct InputTraits<Epetra_CrsMatrix>
00268 {
00269   typedef double scalar_t;
00270   typedef int lno_t;
00271   typedef int gno_t;
00272   typedef int zgid_t;
00273   typedef Zoltan2::default_part_t  part_t;
00274   typedef KokkosClassic::DefaultNode::DefaultNodeType node_t;
00275   static inline std::string name() {return "Epetra_CrsMatrix";}
00276 };
00277 
00278 template <typename Scalar,
00279           typename LocalOrdinal,
00280           typename GlobalOrdinal,
00281           typename Node>
00282 struct InputTraits<Xpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
00283 {
00284   typedef Scalar        scalar_t;
00285   typedef LocalOrdinal  lno_t;
00286   typedef GlobalOrdinal gno_t;
00287   typedef GlobalOrdinal zgid_t;
00288   typedef Zoltan2::default_part_t  part_t;
00289   typedef Node          node_t;
00290   static inline std::string name() {return "Xpetra::RowMatrix";}
00291 };
00292 
00293 template <typename Scalar,
00294           typename LocalOrdinal,
00295           typename GlobalOrdinal,
00296           typename Node>
00297 struct InputTraits<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
00298 {
00299   typedef Scalar        scalar_t;
00300   typedef LocalOrdinal  lno_t;
00301   typedef GlobalOrdinal gno_t;
00302   typedef GlobalOrdinal zgid_t;
00303   typedef Zoltan2::default_part_t  part_t;
00304   typedef Node          node_t;
00305   static inline std::string name() {return "Tpetra::RowMatrix";}
00306 };
00307 
00308 template <typename LocalOrdinal,
00309           typename GlobalOrdinal,
00310           typename Node>
00311 struct InputTraits<Xpetra::CrsGraph<LocalOrdinal,GlobalOrdinal,Node> >
00312 {
00313   typedef default_scalar_t scalar_t;
00314   typedef LocalOrdinal  lno_t;
00315   typedef GlobalOrdinal gno_t;
00316   typedef GlobalOrdinal zgid_t;
00317   typedef Zoltan2::default_part_t  part_t;
00318   typedef Node          node_t;
00319   static inline std::string name() {return "Xpetra::CrsGraph";}
00320 };
00321 
00322 template <typename LocalOrdinal,
00323           typename GlobalOrdinal,
00324           typename Node>
00325 struct InputTraits<Tpetra::CrsGraph<LocalOrdinal,GlobalOrdinal,Node> >
00326 {
00327   typedef default_scalar_t scalar_t;
00328   typedef LocalOrdinal  lno_t;
00329   typedef GlobalOrdinal gno_t;
00330   typedef GlobalOrdinal zgid_t;
00331   typedef Zoltan2::default_part_t  part_t;
00332   typedef Node          node_t;
00333   static inline std::string name() {return "Tpetra::CrsGraph";}
00334 };
00335 
00336 template < >
00337 struct InputTraits<Epetra_CrsGraph>
00338 {
00339   typedef double scalar_t;
00340   typedef int   lno_t;
00341   typedef int   gno_t;
00342   typedef int   zgid_t;
00343   typedef Zoltan2::default_part_t  part_t;
00344   typedef KokkosClassic::DefaultNode::DefaultNodeType node_t;
00345   static inline std::string name() {return "Epetra_CrsGraph";}
00346 };
00347 
00348 template <typename Scalar,
00349           typename LocalOrdinal,
00350           typename GlobalOrdinal,
00351           typename Node>
00352 struct InputTraits<Xpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
00353 {
00354   typedef Scalar        scalar_t;
00355   typedef LocalOrdinal  lno_t;
00356   typedef GlobalOrdinal gno_t;
00357   typedef GlobalOrdinal zgid_t;
00358   typedef Zoltan2::default_part_t  part_t;
00359   typedef Node          node_t;
00360   static inline std::string name() {return "Xpetra::Vector";}
00361 };
00362 
00366 template <typename Scalar,
00367           typename LocalOrdinal,
00368           typename GlobalOrdinal,
00369           typename Node>
00370 struct InputTraits<Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
00371 {
00372   typedef Scalar        scalar_t;
00373   typedef LocalOrdinal  lno_t;
00374   typedef GlobalOrdinal gno_t;
00375   typedef GlobalOrdinal zgid_t;
00376   typedef Zoltan2::default_part_t  part_t;
00377   typedef Node          node_t;
00378   static inline std::string name() {return "Tpetra::Vector";}
00379 };
00380 
00381 template < >
00382 struct InputTraits<Epetra_Vector>
00383 {
00384   typedef double scalar_t;
00385   typedef int   lno_t;
00386   typedef int   gno_t;
00387   typedef int   zgid_t;
00388   typedef Zoltan2::default_part_t  part_t;
00389   typedef KokkosClassic::DefaultNode::DefaultNodeType node_t;
00390   static inline std::string name() {return "Epetra_Vector";}
00391 };
00392 
00393 template <typename Scalar,
00394           typename LocalOrdinal,
00395           typename GlobalOrdinal,
00396           typename Node>
00397 struct InputTraits<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
00398 {
00399   typedef Scalar        scalar_t;
00400   typedef LocalOrdinal  lno_t;
00401   typedef GlobalOrdinal gno_t;
00402   typedef GlobalOrdinal zgid_t;
00403   typedef Zoltan2::default_part_t  part_t;
00404   typedef Node          node_t;
00405   static inline std::string name() {return "Xpetra::MultiVector";}
00406 };
00407 
00408 template <typename Scalar,
00409           typename LocalOrdinal,
00410           typename GlobalOrdinal,
00411           typename Node>
00412 struct InputTraits<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
00413 {
00414   typedef Scalar        scalar_t;
00415   typedef LocalOrdinal  lno_t;
00416   typedef GlobalOrdinal gno_t;
00417   typedef GlobalOrdinal zgid_t;
00418   typedef Zoltan2::default_part_t  part_t;
00419   typedef Node          node_t;
00420   static inline std::string name() {return "Tpetra::MultiVector";}
00421 };
00422 
00423 template < >
00424 struct InputTraits<Epetra_MultiVector>
00425 {
00426   typedef double scalar_t;
00427   typedef int   lno_t;
00428   typedef int   gno_t;
00429   typedef int   zgid_t;
00430   typedef Zoltan2::default_part_t  part_t;
00431   typedef KokkosClassic::DefaultNode::DefaultNodeType node_t;
00432   static inline std::string name() {return "Epetra_MultiVector";}
00433 };
00434 
00435 #endif // DOXYGEN_SHOULD_SKIP_THIS
00436 
00437 
00438 }  // namespace Zoltan2
00439 #endif // ZOLTAN2_INPUTTRAITS_HPP