00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef THYRA_SPMD_LINEAR_OP_BASE_HPP
00030 #define THYRA_SPMD_LINEAR_OP_BASE_HPP
00031
00032 #include "Thyra_SpmdLinearOpBaseDecl.hpp"
00033 #include "Thyra_SingleScalarEuclideanLinearOpBase.hpp"
00034 #include "Thyra_DefaultSpmdVectorSpace.hpp"
00035 #include "Thyra_DetachedVectorView.hpp"
00036 #include "Thyra_DetachedMultiVectorView.hpp"
00037
00038 namespace Thyra {
00039
00040
00041
00042 template<class Scalar>
00043 Teuchos::RCP< const ScalarProdVectorSpaceBase<Scalar> >
00044 SpmdLinearOpBase<Scalar>::rangeScalarProdVecSpc() const
00045 {
00046 return sp_range_;
00047 }
00048
00049 template<class Scalar>
00050 Teuchos::RCP< const ScalarProdVectorSpaceBase<Scalar> >
00051 SpmdLinearOpBase<Scalar>::domainScalarProdVecSpc() const
00052 {
00053 return sp_domain_;
00054 }
00055
00056 template<class Scalar>
00057 void SpmdLinearOpBase<Scalar>::euclideanApply(
00058 const EOpTransp M_trans
00059 ,const MultiVectorBase<Scalar> &X
00060 ,MultiVectorBase<Scalar> *Y
00061 ,const Scalar alpha
00062 ,const Scalar beta
00063 ) const
00064 {
00065 #ifdef TEUCHOS_DEBUG
00066 THYRA_ASSERT_LINEAR_OP_MULTIVEC_APPLY_SPACES(
00067 "SpmdLinearOpBase<Scalar>::euclideanApply()",*this,M_trans,X,Y
00068 );
00069 #endif
00070 const Teuchos::RCP<const SpmdVectorSpaceBase<Scalar> >
00071 &Op_range = ( M_trans == NOTRANS ? range_ : domain_ ),
00072 &Op_domain = ( M_trans == NOTRANS ? domain_ : range_ );
00073 const Index
00074 localOffsetRange = Op_range->localOffset(),
00075 localDimRange = Op_range->localSubDim(),
00076 localOffsetDomain = Op_domain->localOffset(),
00077 localDimDomain = Op_domain->localSubDim();
00078 const ConstDetachedMultiVectorView<Scalar>
00079 local_X_ev(X,Range1D(localOffsetDomain,localOffsetDomain+localDimDomain-1));
00080 const DetachedMultiVectorView<Scalar>
00081 local_Y_ev(*Y,Range1D(localOffsetRange,localOffsetRange+localDimRange-1));
00082 this->euclideanApply(M_trans,local_X_ev.smv(),&local_Y_ev.smv(),alpha,beta);
00083 }
00084
00085
00086
00087
00088
00089 template<class Scalar>
00090 SpmdLinearOpBase<Scalar>::SpmdLinearOpBase()
00091 :forceUnitStride_(true)
00092 {}
00093
00094 template<class Scalar>
00095 void SpmdLinearOpBase<Scalar>::setSpaces(
00096 const Teuchos::RCP<const SpmdVectorSpaceBase<Scalar> > &range
00097 ,const Teuchos::RCP<const SpmdVectorSpaceBase<Scalar> > &domain
00098 )
00099 {
00100
00101 #ifdef TEUCHOS_DEBUG
00102 TEST_FOR_EXCEPT(range.get()==NULL);
00103 TEST_FOR_EXCEPT(domain.get()==NULL);
00104 #endif
00105 Teuchos::RCP<const ScalarProdVectorSpaceBase<Scalar> >
00106 sp_range = Teuchos::rcp_dynamic_cast<const ScalarProdVectorSpaceBase<Scalar> >(range,true),
00107 sp_domain = Teuchos::rcp_dynamic_cast<const ScalarProdVectorSpaceBase<Scalar> >(domain,true);
00108
00109 range_ = range;
00110 domain_ = domain;
00111 sp_range_ = sp_range;
00112 sp_domain_ = sp_domain;
00113 }
00114
00115 template<class Scalar>
00116 void SpmdLinearOpBase<Scalar>::setLocalDimensions(
00117 const Teuchos::RCP<const Teuchos::Comm<Index> > &comm
00118 ,const Index localDimRange
00119 ,const Index localDimDomain
00120 )
00121 {
00122 #ifdef TEUCHOS_DEBUG
00123 TEST_FOR_EXCEPT( localDimRange <= 0 );
00124 TEST_FOR_EXCEPT( localDimDomain <= 0 );
00125 #endif
00126 Teuchos::RCP<const DefaultSpmdVectorSpace<Scalar> >
00127 range = defaultSpmdVectorSpace<Scalar>(comm,localDimRange,-1),
00128 domain = defaultSpmdVectorSpace<Scalar>(comm,localDimDomain,-1);
00129 range_ = range;
00130 domain_ = domain;
00131 sp_range_ = range;
00132 sp_domain_ = domain;
00133 }
00134
00135
00136
00137 template<class Scalar>
00138 void SpmdLinearOpBase<Scalar>::euclideanApply(
00139 const EOpTransp M_trans
00140 ,const RTOpPack::ConstSubMultiVectorView<Scalar> &local_X
00141 ,const RTOpPack::SubMultiVectorView<Scalar> *local_Y
00142 ,const Scalar alpha
00143 ,const Scalar beta
00144 ) const
00145 {
00146 for(Index j = 0; j < local_X.numSubCols(); ++j ) {
00147 const RTOpPack::ConstSubVectorView<Scalar>
00148 local_X_j = local_X.col(j);
00149 const RTOpPack::SubVectorView<Scalar>
00150 local_Y_j = local_Y->col(j);
00151 this->euclideanApply(M_trans,local_X_j,&local_Y_j,alpha,beta);
00152 }
00153 }
00154
00155 }
00156
00157 #endif // THYRA_SPMD_LINEAR_OP_BASE_HPP