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_DESCRIBE_LINEAR_OP_HPP
00030 #define THYRA_DESCRIBE_LINEAR_OP_HPP
00031
00032 #include "Thyra_describeLinearOpDecl.hpp"
00033 #include "Thyra_LinearOpBase.hpp"
00034 #include "Thyra_MultiVectorBase.hpp"
00035 #include "Thyra_VectorStdOps.hpp"
00036 #include "Thyra_AssertOp.hpp"
00037 #include "Thyra_AssertOp.hpp"
00038
00039 template<class RangeScalar, class DomainScalar>
00040 void Thyra::describeLinearOp(
00041 const LinearOpBase<RangeScalar,DomainScalar> &A
00042 ,Teuchos::FancyOStream &out_arg
00043 ,const Teuchos::EVerbosityLevel verbLevel
00044 )
00045 {
00046 using Teuchos::RefCountPtr;
00047 using Teuchos::FancyOStream;
00048 using Teuchos::OSTab;
00049 typedef Teuchos::ScalarTraits<DomainScalar> DST;
00050 RefCountPtr<FancyOStream> out = rcp(&out_arg,false);
00051 OSTab tab(out);
00052 *out << A.description();
00053 const Teuchos::RefCountPtr<const VectorSpaceBase<RangeScalar> >
00054 range = A.range();
00055 const Teuchos::RefCountPtr<const VectorSpaceBase<DomainScalar> >
00056 domain = A.domain();
00057 if(!range.get()) {
00058 *out << "{range=NULL,domain=NULL}\n";
00059 return;
00060 }
00061 const Index dimDomain = domain->dim(), dimRange = range->dim();
00062 *out
00063 << "{rangeDim=" << dimRange
00064 << ",domainDim=" << dimDomain << "}\n";
00065 if(verbLevel >= Teuchos::VERB_EXTREME) {
00066
00067 Teuchos::RefCountPtr<VectorBase<DomainScalar> > e_j = createMember(A.domain());
00068 Teuchos::RefCountPtr<VectorBase<RangeScalar> > t = createMember(A.range());
00069 RTOpPack::ConstSubVectorView<RangeScalar> sv;
00070 std::vector<RangeScalar> Md( dimRange * dimDomain );
00071 const Index
00072 cs = 1,
00073 rs = dimRange;
00074 Index i, j;
00075 OSTab tab(out);
00076 for( j = 0; j < dimDomain; ++j ) {
00077 Thyra::assign( e_j.get(), DST::zero() );
00078 Thyra::set_ele( j, DST::one(), e_j.get() );
00079 apply(A,NONCONJ_ELE,*e_j,t.get());
00080 t->acquireDetachedView(Range1D(),&sv);
00081 for( i = 0; i < dimRange; ++i ) Md[ i*cs + j*rs ] = sv(i);
00082 t->releaseDetachedView(&sv);
00083 }
00084
00085 for( i = 0; i < dimRange; ++i ) {
00086 for( j = 0; j < dimDomain; ++j )
00087 *out << " " << i << ":" << j << ":" << Md[ i + j*dimRange ];
00088 *out << std::endl;
00089 }
00090 }
00091 }
00092
00093 #endif // THYRA_DESCRIBE_LINEAR_OP_HPP