|
Support Software for Vector Reduction/Transformation Operators Version of the Day
|
00001 // @HEADER 00002 // *********************************************************************** 00003 // 00004 // RTOp: Interfaces and Support Software for Vector Reduction Transformation 00005 // Operations 00006 // Copyright (2006) Sandia Corporation 00007 // 00008 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive 00009 // license for use of this work by or on behalf of the U.S. Government. 00010 // 00011 // This library is free software; you can redistribute it and/or modify 00012 // it under the terms of the GNU Lesser General Public License as 00013 // published by the Free Software Foundation; either version 2.1 of the 00014 // License, or (at your option) any later version. 00015 // 00016 // This library is distributed in the hope that it will be useful, but 00017 // WITHOUT ANY WARRANTY; without even the implied warranty of 00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00019 // Lesser General Public License for more details. 00020 // 00021 // You should have received a copy of the GNU Lesser General Public 00022 // License along with this library; if not, write to the Free Software 00023 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 00024 // USA 00025 // Questions? Contact Roscoe A. Bartlett (rabartl@sandia.gov) 00026 // 00027 // *********************************************************************** 00028 // @HEADER 00029 00030 #ifndef RTOPPACK_UNARY_FUNC_PTR_HPP 00031 #define RTOPPACK_UNARY_FUNC_PTR_HPP 00032 00033 #include "RTOpPack_TOpUnaryFuncPtrDecl.hpp" 00034 00035 namespace RTOpPack { 00036 00037 template<class Scalar> 00038 TOpUnaryFuncPtr<Scalar>::TOpUnaryFuncPtr() 00039 :RTOpT<Scalar>("TOpUnaryFuncPtr") 00040 { 00041 set_initialized(); 00042 } 00043 00044 template<class Scalar> 00045 TOpUnaryFuncPtr<Scalar>::TOpUnaryFuncPtr( 00046 unary_func_ptr_t unary_func_ptr 00047 ,const std::string &op_name 00048 ) 00049 :RTOpT<Scalar>("TOpUnaryFuncPtr") 00050 { 00051 initialize(unary_func_ptr,op_name); 00052 } 00053 00054 template<class Scalar> 00055 void TOpUnaryFuncPtr<Scalar>::initialize( 00056 unary_func_ptr_t unary_func_ptr 00057 ,const std::string &op_name 00058 ) 00059 { 00060 TEST_FOR_EXCEPTION( unary_func_ptr==NULL, std::invalid_argument, "Error!" ); 00061 unary_func_ptr_ = unary_func_ptr; 00062 op_name_ = op_name; 00063 } 00064 00065 template<class Scalar> 00066 void TOpUnaryFuncPtr<Scalar>::set_initialized( 00067 unary_func_ptr_t *unary_func_ptr 00068 ,std::string *op_name 00069 ) 00070 { 00071 if(unary_func_ptr) *unary_func_ptr = unary_func_ptr_; 00072 if(op_name) *op_name = op_name_; 00073 00074 unary_func_ptr_ = NULL; 00075 op_name_ = "uninitialized()"; 00076 } 00077 00078 // Overridden from RTOpT 00079 00080 template<class Scalar> 00081 const char* TOpUnaryFuncPtr<Scalar>::op_name() const 00082 { 00083 return op_name_.c_str(); 00084 } 00085 00086 template<class Scalar> 00087 void TOpUnaryFuncPtr<Scalar>::apply_op( 00088 const int num_vecs, const ConstSubVectorView<Scalar> sub_vecs[] 00089 ,const int num_targ_vecs, const SubVectorView<Scalar> targ_sub_vecs[] 00090 ,ReductTarget *reduct_obj 00091 ) const 00092 { 00093 TEST_FOR_EXCEPTION( num_vecs != 1 || sub_vecs == NULL, std::invalid_argument, "Error!" ); 00094 TEST_FOR_EXCEPTION( num_targ_vecs != 1 || targ_sub_vecs == NULL, std::invalid_argument, "Error!" ); 00095 TEST_FOR_EXCEPTION( reduct_obj != NULL, std::invalid_argument, "Error!" ); 00096 TEST_FOR_EXCEPTION( sub_vecs[0].stride() != 1, std::invalid_argument, "Error, can't handle non-unit strides here!" ); 00097 TEST_FOR_EXCEPTION( targ_sub_vecs[0].stride() != 1, std::invalid_argument, "Error, can't handle non-unit strides here!" ); 00098 TEST_FOR_EXCEPTION( sub_vecs[0].subDim() != targ_sub_vecs[0].subDim(), std::invalid_argument, "Error!" ); 00099 TEST_FOR_EXCEPTION( sub_vecs[0].globalOffset() != targ_sub_vecs[0].globalOffset(), std::invalid_argument, "Error!" ); 00100 00101 unary_func_ptr_( sub_vecs[0].values(), sub_vecs[0].subDim(), targ_sub_vecs[0].values() ); 00102 00103 } 00104 00105 } // end namespace RTOpPack 00106 00107 #endif // RTOPPACK_UNARY_FUNC_PTR_HPP
1.7.4