Zoltan 2 Version 0.5
Zoltan2_StridedData.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 #ifndef _ZOLTAN2_STRIDEDDATA_HPP_
00046 #define _ZOLTAN2_STRIDEDDATA_HPP_
00047 
00048 #include <Zoltan2_Standards.hpp>
00049 #include <Zoltan2_Environment.hpp>
00050 #include <typeinfo>
00051 
00056 namespace Zoltan2{
00057 
00075 template<typename lno_t, typename scalar_t>
00076 class StridedData {
00077 private:
00078   ArrayRCP<const scalar_t> vec_;
00079   int stride_;
00080 
00081 public:
00082 
00089   StridedData(ArrayRCP<const scalar_t> x, int stride) :  
00090     vec_(x), stride_(stride) { }
00091 
00094   StridedData(): vec_(), stride_(0) { }
00095 
00101   lno_t size() const { return vec_.size(); }
00102 
00109   scalar_t operator[](lno_t idx) const { return vec_[idx*stride_]; }
00110 
00120   template <typename T> void getInputArray(ArrayRCP<const T> &array) const;
00121 
00127   void getStridedList(ArrayRCP<const scalar_t> &vec, int &stride) const
00128   {
00129     vec = vec_;
00130     stride = stride_;
00131   }
00132 
00140   void getStridedList(size_t &len, const scalar_t *&vec, int &stride) const
00141   {
00142     len = vec_.size();
00143     vec = vec_.getRawPtr();
00144     stride = stride_;
00145   }
00146 
00149   StridedData & operator= (const StridedData &sInput)
00150   {
00151     if (this != &sInput)
00152       sInput.getStridedList(vec_, stride_);
00153 
00154     return *this;
00155   }
00156 };
00157 
00158 template<typename lno_t, typename scalar_t>
00159   template<typename T>
00160      void StridedData<lno_t, scalar_t>::getInputArray(
00161        ArrayRCP<const T> &array) const
00162 {
00163   if (vec_.size() < 1){
00164     array = ArrayRCP<const T>();
00165   }
00166   else if (stride_==1 && typeid(T()) == typeid(scalar_t())){
00167     array = vec_;
00168   }
00169   else{
00170     Environment env;           // a default environment for error reporting
00171     size_t n = vec_.size() / stride_;
00172     T *tmp = new T [n];
00173     env.localMemoryAssertion(__FILE__, __LINE__, n, tmp);
00174     for (size_t i=0,j=0; i < n; i++,j+=stride_){
00175       tmp[i] = static_cast<T>(vec_[j]);
00176     }
00177     array = arcp(tmp, 0, n);
00178   }
00179   
00180   return;
00181 }
00182 
00183 }  // namespace Zoltan2
00184 
00185 #endif