Tpetra Matrix/Vector Services Version of the Day
Tpetra_ViewAccepter.hpp
00001 // @HEADER
00002 // ***********************************************************************
00003 // 
00004 //          Tpetra: Templated Linear Algebra Services Package
00005 //                 Copyright (2008) Sandia Corporation
00006 // 
00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00008 // the U.S. Government retains certain rights in this software.
00009 // 
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov) 
00038 // 
00039 // ************************************************************************
00040 // @HEADER
00041 
00042 #ifndef TPETRA_VIEWACCEPTER_HPP
00043 #define TPETRA_VIEWACCEPTER_HPP
00044 
00045 #include "Tpetra_ConfigDefs.hpp"
00046 #include <Teuchos_ArrayRCP.hpp>
00047 #include <Kokkos_DefaultNode.hpp>
00048 
00049 
00050 namespace Tpetra {
00051 
00052   namespace details {
00053 
00055   template <class Node>
00056   class ViewAccepter {
00057     private:
00058       // no support for object instantiation
00059       ViewAccepter();
00060     public:
00061       template <class T>
00062       inline static ArrayRCP<T> acceptView(const ArrayRCP<T> &view) {
00063         Node::this_node_type_does_not_support_object_construction_from_user_views();
00064         return null;
00065       }
00066   };
00067 
00069   class ViewAccepterSupportedNode {
00070     private:
00071       // no support for object instantiation
00072       ViewAccepterSupportedNode();
00073     public:
00074       template <class T>
00075       inline static ArrayRCP<T> acceptView(const ArrayRCP<T> &view) {
00076         return view;
00077       }
00078   };
00079 
00080   template <>
00081   class ViewAccepter<KokkosClassic::SerialNode> : public ViewAccepterSupportedNode {};
00082 #ifdef HAVE_KOKKOSCLASSIC_TBB
00083   template <>
00084   class ViewAccepter<KokkosClassic::TBBNode> : public ViewAccepterSupportedNode {};
00085 #endif
00086 #ifdef HAVE_KOKKOSCLASSIC_THREADPOOL
00087   template <>
00088   class ViewAccepter<KokkosClassic::TPINode> : public ViewAccepterSupportedNode {};
00089 #endif
00090 #ifdef HAVE_KOKKOSCLASSIC_OPENMP
00091   template <>
00092   class ViewAccepter<KokkosClassic::OpenMPNode> : public ViewAccepterSupportedNode {};
00093 #endif
00094 
00095 #ifdef HAVE_KOKKOSCLASSIC_KOKKOSCOMPAT
00096     // Full specializations for the new Kokkos wrapper Node types.
00097 
00098   #ifdef KOKKOS_HAVE_CUDA
00099     template<>
00100     class ViewAccepter< ::Kokkos::Compat::KokkosCudaWrapperNode> : public ViewAccepterSupportedNode {};
00101   #endif // KOKKOS_HAVE_CUDA
00102 
00103   #ifdef KOKKOS_HAVE_OPENMP
00104     template<>
00105     class ViewAccepter< ::Kokkos::Compat::KokkosOpenMPWrapperNode> : public ViewAccepterSupportedNode {};
00106   #endif // KOKKOS_HAVE_OPENMP
00107 
00108   #ifdef KOKKOS_HAVE_PTHREAD
00109     template<>
00110     class ViewAccepter< ::Kokkos::Compat::KokkosThreadsWrapperNode> : public ViewAccepterSupportedNode {};
00111   #endif // KOKKOS_HAVE_PTHREAD
00112 
00113 #endif // HAVE_KOKKOSCLASSIC_KOKKOSCOMPAT
00114   } // end of namespace Tpetra::details
00115 
00116 } // end of namespace Tpetra
00117 
00118 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines