|
Thyra Package Browser (Single Doxygen Collection) Version of the Day
|
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
1.7.4