Thyra_apply_op_helper_def.hpp

00001 // @HEADER
00002 // ***********************************************************************
00003 // 
00004 //    Thyra: Interfaces and Support for Abstract Numerical Algorithms
00005 //                 Copyright (2004) Sandia Corporation
00006 // 
00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00008 // license for use of this work by or on behalf of the U.S. Government.
00009 // 
00010 // This library is free software; you can redistribute it and/or modify
00011 // it under the terms of the GNU Lesser General Public License as
00012 // published by the Free Software Foundation; either version 2.1 of the
00013 // License, or (at your option) any later version.
00014 //  
00015 // This library is distributed in the hope that it will be useful, but
00016 // WITHOUT ANY WARRANTY; without even the implied warranty of
00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018 // Lesser General Public License for more details.
00019 //  
00020 // You should have received a copy of the GNU Lesser General Public
00021 // License along with this library; if not, write to the Free Software
00022 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00023 // USA
00024 // Questions? Contact Michael A. Heroux (maherou@sandia.gov) 
00025 // 
00026 // ***********************************************************************
00027 // @HEADER
00028 
00029 #ifndef THYRA_APPLY_OP_HELPER_HPP
00030 #define THYRA_APPLY_OP_HELPER_HPP
00031 
00032 #include "Thyra_apply_op_helper_decl.hpp"
00033 #include "Thyra_VectorBase.hpp"
00034 #include "Thyra_VectorSpaceBase.hpp"
00035 #include "Thyra_AssertOp.hpp"
00036 #include "Teuchos_TestForException.hpp"
00037 #include "Teuchos_as.hpp"
00038 
00039 
00040 template<class Scalar>
00041 void Thyra::apply_op_validate_input(
00042   const std::string &func_name,
00043   const VectorSpaceBase<Scalar> &space,
00044   const RTOpPack::RTOpT<Scalar> &op,
00045   const ArrayView<const Ptr<const VectorBase<Scalar> > > &vecs,
00046   const ArrayView<const Ptr<VectorBase<Scalar> > > &targ_vecs,
00047   const Ptr<RTOpPack::ReductTarget> &reduct_obj,
00048   const Ordinal global_offset_in
00049   )
00050 {
00051   const int num_vecs = vecs.size();
00052   const int num_targ_vecs = targ_vecs.size();
00053   TEST_FOR_EXCEPTION(
00054     global_offset_in < 0, std::logic_error
00055     ,func_name << " : Error! global_offset_in = "
00056     <<global_offset_in<<" is not valid" );
00057   for (int k = 0; k < num_vecs; ++k)
00058     THYRA_ASSERT_VEC_SPACES(func_name,space,*vecs[k]->space());
00059   for (int k = 0; k < num_targ_vecs; ++k)
00060     THYRA_ASSERT_VEC_SPACES(func_name,space,*targ_vecs[k]->space());
00061 }
00062 
00063 
00064 template<class Scalar>
00065 void Thyra::apply_op_validate_input(
00066   const std::string &func_name,
00067   const VectorSpaceBase<Scalar> &domain,
00068   const VectorSpaceBase<Scalar> &range,
00069   const RTOpPack::RTOpT<Scalar> &primary_op,
00070   const ArrayView<const Ptr<const MultiVectorBase<Scalar> > > &multi_vecs,
00071   const ArrayView<const Ptr<MultiVectorBase<Scalar> > > &targ_multi_vecs,
00072   const ArrayView<const Ptr<RTOpPack::ReductTarget> > &reduct_objs,
00073   const Ordinal primary_global_offset_in
00074   )
00075 {
00076   using Teuchos::as;
00077   // Validate primary range arguments
00078   TEST_FOR_EXCEPTION(
00079     primary_global_offset_in < 0, std::logic_error
00080     ,func_name << " : Error! primary_global_offset_in = "
00081     <<primary_global_offset_in<<" is not valid" );
00082   // Validate secondary domain arguments
00083   // Validate spaces
00084   for (int k = 0; k < multi_vecs.size(); ++k) {
00085     THYRA_ASSERT_VEC_SPACES(func_name,domain,*multi_vecs[k]->domain());
00086     THYRA_ASSERT_VEC_SPACES(func_name,range,*multi_vecs[k]->range());
00087   }
00088   for (int k = 0; k < targ_multi_vecs.size(); ++k) {
00089     THYRA_ASSERT_VEC_SPACES(func_name,domain,*targ_multi_vecs[k]->domain());
00090     THYRA_ASSERT_VEC_SPACES(func_name,range,*targ_multi_vecs[k]->range());
00091   }
00092 }
00093 
00094 
00095 //
00096 // Explicit instant macro
00097 //
00098 
00099 #define THYRA_APPLY_OP_HELPER_INSTANT(SCALAR) \
00100    \
00101   template void apply_op_validate_input( \
00102     const std::string &func_name, \
00103     const VectorSpaceBase<SCALAR > &space, \
00104     const RTOpPack::RTOpT<SCALAR > &op, \
00105     const ArrayView<const Ptr<const VectorBase<SCALAR > > > &vecs, \
00106     const ArrayView<const Ptr<VectorBase<SCALAR > > > &targ_vecs, \
00107     const Ptr<RTOpPack::ReductTarget> &reduct_obj, \
00108     const Ordinal global_offset_in \
00109     ); \
00110    \
00111   template void apply_op_validate_input( \
00112     const std::string &func_name, \
00113     const VectorSpaceBase<SCALAR > &domain, \
00114     const VectorSpaceBase<SCALAR > &range, \
00115     const RTOpPack::RTOpT<SCALAR > &primary_op, \
00116     const ArrayView<const Ptr<const MultiVectorBase<SCALAR > > > &multi_vecs, \
00117     const ArrayView<const Ptr<MultiVectorBase<SCALAR > > > &targ_multi_vecs, \
00118     const ArrayView<const Ptr<RTOpPack::ReductTarget> > &reduct_objs, \
00119     const Ordinal primary_global_offset_in \
00120     ); \
00121 
00122 
00123 
00124 #endif // THYRA_APPLY_OP_HELPER_HPP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
Generated on Wed Apr 13 10:00:06 2011 for Thyra by  doxygen 1.6.3