RTOp Package Browser (Single Doxygen Collection) Version of the Day
RTOpPack_TOpUnaryFuncPtr.hpp
Go to the documentation of this file.
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 // 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 Roscoe A. Bartlett (rabartl@sandia.gov) 
00039 // 
00040 // ***********************************************************************
00041 // @HEADER
00042 
00043 #ifndef RTOPPACK_UNARY_FUNC_PTR_HPP
00044 #define RTOPPACK_UNARY_FUNC_PTR_HPP
00045 
00046 #include "RTOpPack_TOpUnaryFuncPtrDecl.hpp"
00047 
00048 namespace RTOpPack {
00049 
00050 template<class Scalar>
00051 TOpUnaryFuncPtr<Scalar>::TOpUnaryFuncPtr()
00052   :RTOpT<Scalar>("TOpUnaryFuncPtr")
00053 {
00054   set_initialized();
00055 }
00056 
00057 template<class Scalar>
00058 TOpUnaryFuncPtr<Scalar>::TOpUnaryFuncPtr(
00059   unary_func_ptr_t        unary_func_ptr
00060   ,const std::string      &op_name
00061   )
00062   :RTOpT<Scalar>("TOpUnaryFuncPtr")
00063 {
00064   initialize(unary_func_ptr,op_name);
00065 }
00066 
00067 template<class Scalar>
00068 void TOpUnaryFuncPtr<Scalar>::initialize(
00069   unary_func_ptr_t        unary_func_ptr
00070   ,const std::string      &op_name
00071   )
00072 {
00073   TEUCHOS_TEST_FOR_EXCEPTION( unary_func_ptr==NULL, std::invalid_argument, "Error!" );
00074   unary_func_ptr_ = unary_func_ptr;
00075   op_name_ = op_name;
00076 }
00077 
00078 template<class Scalar>
00079 void TOpUnaryFuncPtr<Scalar>::set_initialized(
00080   unary_func_ptr_t    *unary_func_ptr
00081   ,std::string        *op_name
00082   )
00083 {
00084   if(unary_func_ptr) *unary_func_ptr = unary_func_ptr_;
00085   if(op_name) *op_name = op_name_;
00086 
00087   unary_func_ptr_ = NULL;
00088   op_name_ = "uninitialized()";
00089 }
00090 
00091 // Overridden from RTOpT
00092 
00093 template<class Scalar>
00094 const char* TOpUnaryFuncPtr<Scalar>::op_name() const
00095 {
00096   return op_name_.c_str();
00097 }
00098 
00099 template<class Scalar>
00100 void TOpUnaryFuncPtr<Scalar>::apply_op(
00101   const int   num_vecs,       const ConstSubVectorView<Scalar>         sub_vecs[]
00102   ,const int  num_targ_vecs,  const SubVectorView<Scalar>  targ_sub_vecs[]
00103   ,ReductTarget *reduct_obj
00104   ) const
00105 {
00106   TEUCHOS_TEST_FOR_EXCEPTION( num_vecs != 1 || sub_vecs == NULL, std::invalid_argument, "Error!" );
00107   TEUCHOS_TEST_FOR_EXCEPTION( num_targ_vecs != 1 || targ_sub_vecs == NULL, std::invalid_argument, "Error!" );
00108   TEUCHOS_TEST_FOR_EXCEPTION( reduct_obj != NULL, std::invalid_argument, "Error!" );
00109   TEUCHOS_TEST_FOR_EXCEPTION( sub_vecs[0].stride() != 1, std::invalid_argument, "Error, can't handle non-unit strides here!" );
00110   TEUCHOS_TEST_FOR_EXCEPTION( targ_sub_vecs[0].stride() != 1, std::invalid_argument, "Error, can't handle non-unit strides here!" );
00111   TEUCHOS_TEST_FOR_EXCEPTION( sub_vecs[0].subDim() != targ_sub_vecs[0].subDim(), std::invalid_argument, "Error!" );
00112   TEUCHOS_TEST_FOR_EXCEPTION( sub_vecs[0].globalOffset() != targ_sub_vecs[0].globalOffset(), std::invalid_argument, "Error!" );
00113 
00114   unary_func_ptr_( sub_vecs[0].values(), sub_vecs[0].subDim(), targ_sub_vecs[0].values() );
00115 
00116 }
00117 
00118 } // end namespace RTOpPack
00119 
00120 #endif // RTOPPACK_UNARY_FUNC_PTR_HPP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines