10#ifndef THYRA_MULTI_VECTOR_STD_OPS_TESTER_HPP
11#define THYRA_MULTI_VECTOR_STD_OPS_TESTER_HPP
13#include "Thyra_MultiVectorStdOpsTester_decl.hpp"
14#include "Thyra_MultiVectorStdOps.hpp"
15#include "Thyra_VectorStdOps.hpp"
16#include "Thyra_TestingTools.hpp"
22template <
class Scalar>
26 ,
const int num_mv_cols_in
28 :warning_tol_(warning_tol_in)
29 ,error_tol_(error_tol_in)
30 ,num_mv_cols_(num_mv_cols_in)
33template <
class Scalar>
46 *out <<
"\n*** Entering MultiVectorStdOpsTester<"<<ST::name()<<
">::checkStdOps(...) ...\n"
47 <<
"using a \'" << vecSpc.
description() <<
"\' object ...\n";
50 if(out) *out <<
"\nvecSpc.dim() = " << vecSpc.
dim() << std::endl;
52 const Ordinal n = vecSpc.
dim();
55 two = as<Scalar>(2.0),
56 three = as<Scalar>(3.0),
57 four = as<Scalar>(4.0);
61 if(out) *out <<
"\nCreating MultiVectorBase objects V1, V2, and V3 ...\n";
67 if(out) *out <<
"\nassign(V1.ptr(),-2.0);\n";
76 if(out) *out <<
"\n"<<tc<<
") sums(*V1);\n";
79 sums(*V1, scalars1());
80 for (Ordinal i = 0; i < scalars2.
size(); ++i)
81 scalars2[i] = -two*as<Scalar>(vecSpc.
dim());
83 "sums(*V1)", scalars1(),
85 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
91 if(out) *out <<
"\n"<<tc<<
") norms_1(*V1);\n";
95 for (Ordinal i = 0; i < mags2.
size(); ++i)
96 mags2[i] = ST::magnitude(two)*as<ScalarMag>(vecSpc.
dim());
98 "norms_1(*V1)", mags1(),
100 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
106 if(out) *out <<
"\n"<<tc<<
") norms_2(*V1);\n";
110 for (Ordinal i = 0; i < mags2.
size(); ++i)
111 mags2[i] = ST::magnitude(two * ST::squareroot(as<Scalar>(n)));
113 "norms_2(*V1)", mags1(),
114 "2.0*sqrt(n)", mags2(),
115 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
121 if(out) *out <<
"\n"<<tc<<
") norms_inf(*V1);\n";
125 for (Ordinal i = 0; i < mags2.
size(); ++i)
126 mags2[i] = ST::magnitude(two);
128 "norms_inf(*V1)", mags1(),
130 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
136 if(out) *out <<
"\n"<<tc<<
") assign(V2.ptr(), alpha);\n";
141 for (Ordinal i = 0; i < mags2.
size(); ++i)
142 mags2[i] = ST::magnitude(three * ST::squareroot(as<Scalar>(n)));
144 "norms_2(*V2)", mags1(),
145 "3.0*sqrt(n)", mags2(),
146 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
152 if(out) *out <<
"\n"<<tc<<
") assign(V2.ptr(), *V1);\n";
158 "norms_2(*V1)", mags1(),
159 "norms_2(*V2)", mags2(),
160 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
165 if(out) *out <<
"\n"<<tc<<
") scale(alpha,V2.ptr());\n";
168 Scalar alpha = as<Scalar>(1.2345);
170 scale(alpha, V2.ptr());
172 for (Ordinal i = 0; i < mags1.
size(); ++i)
173 mags1[i] *= ST::magnitude(alpha);
176 "norms_2(alpha*V1)", mags1(),
177 "alpha*norms_2(V1)", mags2(),
178 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
184 if(out) *out <<
"\n"<<tc<<
") scaleUpdate(a,V1,V2.ptr());\n";
193 "norms_2(*V2)", mags1(),
194 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
200 if(out) *out <<
"\n"<<tc<<
") update(a,V1,V2.ptr());\n";
203 Scalar alpha = as<Scalar>(1.2345);
206 scale(alpha, V3.ptr());
212 "norms_2(*V2)", mags1(),
213 "norms_2(*V3)", mags2(),
214 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
220 if(out) *out <<
"\n"<<tc<<
") update(alpha,beta,*V1,V2.ptr());\n";
224 for (Ordinal i = 0; i < alpha.
size(); ++i)
225 alpha[i] = as<Scalar>(i+1);
226 Scalar beta = as<Scalar>(1.2345);
229 scale(beta, V3.ptr());
230 for (Ordinal i = 0; i < alpha.
size(); ++i)
231 scale(alpha[i], V3->col(i).ptr());
238 "norms_2(*V2)", mags1(),
239 "norms_2(*V3)", mags2(),
240 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
246 if(out) *out <<
"\n"<<tc<<
") update(*V1,alpha,beta,V2.ptr());\n";
250 for (Ordinal i = 0; i < alpha.
size(); ++i)
251 alpha[i] = as<Scalar>(i+1);
252 Scalar beta = as<Scalar>(1.2345);
255 scale(beta, V3.ptr());
256 for (Ordinal i = 0; i < alpha.
size(); ++i)
257 scale(alpha[i], V3->col(i).ptr());
260 update(*V1, alphaView, beta, V2.ptr());
264 "norms_2(*V2)", mags1(),
265 "norms_2(*V3)", mags2(),
266 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
272 if(out) *out <<
"\n"<<tc<<
") linear_combination({alpha,beta,gamma},{V1.ptr(),V2.ptr(),V3.ptr()},0.0,V4.ptr());\n";
275 Scalar alpha = two, beta = -three, gamma = three;
280 tuple<Scalar>(alpha, beta, gamma),
285 for (Ordinal i = 0; i < mags2.
size(); ++i)
286 mags2[i] = ST::magnitude(two * ST::squareroot(as<Scalar>(n)));
288 "norms_2(*V4)", mags1(),
289 "2.0*sqrt(n)", mags2(),
290 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
295 if(out) *out <<
"\n"<<tc<<
") linear_combination({alpha,beta,gamma},{V1.ptr(),V2.ptr(),V3.ptr()},0.5,V4.ptr());\n";
298 Scalar alpha = two, beta = -three, gamma = three;
304 tuple<Scalar>(alpha, beta, gamma),
310 "norms_2(*V4)", mags1(),
311 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
317 if(out) *out <<
"\n"<<tc<<
") Vt_S(V1.ptr(),alpha);\n";
320 Scalar alpha = as<Scalar>(1.2345);
322 Vt_S(V2.ptr(), alpha);
324 for (Ordinal i = 0; i < mags1.
size(); ++i)
325 mags1[i] *= ST::magnitude(alpha);
328 "norms_2(alpha*V1)", mags1(),
329 "alpha*norms_2(V1)", mags2(),
330 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
336 if(out) *out <<
"\n"<<tc<<
") Vp_S(V2.ptr(),alpha);\n";
343 "norms_2(V2)", mags1(),
344 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
350 if(out) *out <<
"\n"<<tc<<
") Vp_V(V2.ptr(),*V1);\n";
357 "norms_2(V2)", mags1(),
358 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
365 if(out) *out <<
"\n"<<tc<<
") V_VpV(V3.ptr(),*V1,*V2);\n";
369 V_VpV(V3.ptr(), *V1, *V2);
372 "norms_2(V3)", mags1(),
373 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
380 if(out) *out <<
"\n"<<tc<<
") V_VmV(V3.ptr(),*V1,*V2);\n";
384 V_VmV(V3.ptr(), *V1, *V2);
387 "norms_2(V3)", mags1(),
388 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
395 if(out) *out <<
"\n"<<tc<<
") V_StVpV(V3.ptr(),alpha,*V1,*V2);\n";
398 Scalar alpha = as<Scalar>(1.2345);
400 V_StVpV(V3.ptr(), alpha, *V1, *V2);
403 V_VmV(V3.ptr(), *V2, *V3);
406 "norms_2(V3)", mags1(),
407 "error_tol", error_tol(),
"warning_tol", warning_tol(), ptr(out)
414 <<
"\n*** Leaving MultiVectorStdOpsTester<"<<ST::name()<<
">::checkStdOps(...) ...\n";
virtual std::string description() const
RCP< const LinearOpBase< Scalar > > scale(const Scalar &scalar, const RCP< const LinearOpBase< Scalar > > &Op, const std::string &label="")
Build an implicit const scaled linear operator.
Interface for a collection of column vectors called a multi-vector.
void assign(const Ptr< MultiVectorBase< Scalar > > &V, Scalar alpha)
V = alpha.
void sums(const MultiVectorBase< Scalar > &V, const ArrayView< Scalar > &sums)
Multi-vector column sum.
void V_VpV(const Ptr< MultiVectorBase< Scalar > > &Z, const MultiVectorBase< Scalar > &X, const MultiVectorBase< Scalar > &Y)
Z(i,j) = X(i,j) + Y(i,j), i = 0...Z->range()->dim()-1, j = 0...Z->domain()->dim()-1.
void norms_inf(const MultiVectorBase< Scalar > &V, const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms)
Column-wise multi-vector infinity norm.
void Vt_S(const Ptr< MultiVectorBase< Scalar > > &Z, const Scalar &alpha)
Z(i,j) *= alpha, i = 0...Z->range()->dim()-1, j = 0...Z->domain()->dim()-1.
void update(Scalar alpha, const MultiVectorBase< Scalar > &U, const Ptr< MultiVectorBase< Scalar > > &V)
alpha*U + V -> V.
void norms_2(const MultiVectorBase< Scalar > &V, const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms)
Column-wise multi-vector 2 (Euclidean) norm.
void V_VmV(const Ptr< MultiVectorBase< Scalar > > &Z, const MultiVectorBase< Scalar > &X, const MultiVectorBase< Scalar > &Y)
Z(i,j) = X(i,j) - Y(i,j), i = 0...Z->range()->dim()-1, j = 0...Z->domain()->dim()-1.
void linear_combination(const ArrayView< const Scalar > &alpha, const ArrayView< const Ptr< const MultiVectorBase< Scalar > > > &X, const Scalar &beta, const Ptr< MultiVectorBase< Scalar > > &Y)
Y.col(j)(i) = beta*Y.col(j)(i) + sum( alpha[k]*X[k].col(j)(i), k=0...m-1 ), for i = 0....
void scaleUpdate(const VectorBase< Scalar > &a, const MultiVectorBase< Scalar > &U, const Ptr< MultiVectorBase< Scalar > > &V)
A*U + V -> V (where A is a diagonal matrix with diagonal a).
void V_StVpV(const Ptr< MultiVectorBase< Scalar > > &Z, const Scalar &alpha, const MultiVectorBase< Scalar > &X, const MultiVectorBase< Scalar > &Y)
Z(i,j) = alpha*X(i,j) + Y(i), i = 0...z->space()->dim()-1, , j = 0...Z->domain()->dim()-1.
void Vp_V(const Ptr< MultiVectorBase< Scalar > > &Z, const MultiVectorBase< Scalar > &X)
Z(i,j) += X(i,j), i = 0...Z->range()->dim()-1, j = 0...Z->domain()->dim()-1.
void Vp_S(const Ptr< MultiVectorBase< Scalar > > &Z, const Scalar &alpha)
Z(i,j) += alpha, i = 0...Z->range()->dim()-1, j = 0...Z->domain()->dim()-1.
void norms_1(const MultiVectorBase< Scalar > &V, const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms)
Column-wise multi-vector one norm.
bool checkStdOps(const VectorSpaceBase< Scalar > &vecSpc, std::ostream *out=0, const bool &dumpAll=false)
Run the tests using a vector space.
MultiVectorStdOpsTester(const ScalarMag &warning_tol=0, const ScalarMag &error_tol=0, const int num_mv_cols=4)
Teuchos::ScalarTraits< Scalar >::magnitudeType ScalarMag
Abstract interface for objects that represent a space for vectors.
virtual Ordinal dim() const =0
Return the dimension of the vector space.
RCP< VectorBase< Scalar > > createMember(const RCP< const VectorSpaceBase< Scalar > > &vs, const std::string &label="")
Create a vector member from the vector space.
RCP< MultiVectorBase< Scalar > > createMembers(const RCP< const VectorSpaceBase< Scalar > > &vs, int numMembers, const std::string &label="")
Create a set of vector members (a MultiVectorBase) from the vector space.
bool testRelErrors(const std::string &v1_name, const ArrayView< const Scalar1 > &v1, const std::string &v2_name, const ArrayView< const Scalar2 > &v2, const std::string &maxRelErr_error_name, const ScalarMag &maxRelErr_error, const std::string &maxRelErr_warning_name, const ScalarMag &maxRelErr_warning, const Ptr< std::ostream > &out, const std::string &leadingIndent=std::string(""))
Compute, check and optionally print the relative errors in two scalar arays.
bool testMaxErrors(const std::string &error_name, const ArrayView< const typename Teuchos::ScalarTraits< Scalar >::magnitudeType > &errors, const std::string &max_error_name, const typename Teuchos::ScalarTraits< Scalar >::magnitudeType &max_error, const std::string &max_warning_name, const typename Teuchos::ScalarTraits< Scalar >::magnitudeType &max_warning, const Ptr< std::ostream > &out, const std::string &leadingIndent=std::string(""))
Check that an array of errors is less than some error tolerence.
TypeTo as(const TypeFrom &t)