Thyra Package Browser (Single Doxygen Collection)  Version of the Day
TpetraThyraWrappers_UnitTests.cpp
Go to the documentation of this file.
1 /*
2 // @HEADER
3 // ***********************************************************************
4 //
5 // Thyra: Interfaces and Support for Abstract Numerical Algorithms
6 // Copyright (2004) Sandia Corporation
7 //
8 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
9 // license for use of this work by or on behalf of the U.S. Government.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact Roscoe A. Bartlett (bartlettra@ornl.gov)
39 //
40 // ***********************************************************************
41 // @HEADER
42 */
43 
44 
46 #include "Thyra_VectorSpaceTester.hpp"
47 #include "Thyra_VectorStdOpsTester.hpp"
48 #include "Thyra_MultiVectorStdOpsTester.hpp"
49 #include "Thyra_VectorStdOps.hpp"
50 #include "Thyra_MultiVectorStdOps.hpp"
51 #include "Thyra_LinearOpTester.hpp"
52 #include "Thyra_DefaultProductVector.hpp"
53 #include "Thyra_TestingTools.hpp"
54 #include "Thyra_ScaledLinearOpBase.hpp"
55 #include "Thyra_RowStatLinearOpBase.hpp"
56 #include "Thyra_VectorStdOps.hpp"
57 #include "Tpetra_CrsMatrix.hpp"
59 #include "Teuchos_DefaultComm.hpp"
60 #include "Teuchos_Tuple.hpp"
61 
62 
63 namespace Thyra {
64 
65 
66 //
67 // Helper code and declarations
68 //
69 
70 
71 using Teuchos::as;
72 using Teuchos::null;
73 using Teuchos::RCP;
74 using Teuchos::rcp;
75 using Teuchos::ArrayView;
76 using Teuchos::rcp_dynamic_cast;
77 using Teuchos::inOutArg;
78 using Teuchos::Comm;
79 using Teuchos::tuple;
80 
81 
82 const int g_localDim = 4; // ToDo: Make variable!
83 
84 
85 typedef Tpetra::Map<> TpetraMap_t;
86 
87 
89 createTpetraMap(const int localDim)
90 {
92  return Teuchos::rcp(new TpetraMap_t(OT::invalid(), localDim, 0,
94  // ToDo: Pass in the comm?
95 }
96 
97 // ToDo: Above: Vary the LocalOrdinal and GlobalOrdinal types?
98 
99 
100 template<class Scalar>
101 RCP<const VectorSpaceBase<Scalar> >
102 createTpetraVectorSpace(const int localDim)
103 {
104  return Thyra::createVectorSpace<Scalar>(createTpetraMap(g_localDim));
105 }
106 
107 
108 template<class Scalar>
109 RCP<Tpetra::Operator<Scalar> >
110 createTriDiagonalTpetraOperator(const int numLocalRows)
111 {
112  typedef Tpetra::global_size_t global_size_t;
113  typedef Tpetra::Map<>::global_ordinal_type GO;
114 
115  RCP<const Tpetra::Map<> > map = createTpetraMap(numLocalRows);
116 
117  const size_t numMyElements = map->getNodeNumElements();
118  const global_size_t numGlobalElements = map->getGlobalNumElements();
119 
120  ArrayView<const GO> myGlobalElements = map->getNodeElementList();
121 
122  // Create an OTeger vector numNz that is used to build the Petra Matrix.
123  // numNz[i] is the Number of OFF-DIAGONAL term for the ith global equation
124  // on this processor
125 
126  Teuchos::ArrayRCP<size_t> numNz = Teuchos::arcp<size_t>(numMyElements);
127 
128  // We are building a tridiagonal matrix where each row has (-1 2 -1)
129  // So we need 2 off-diagonal terms (except for the first and last equation)
130 
131  for (size_t i=0; i < numMyElements; ++i) {
132  if (myGlobalElements[i] == 0 || static_cast<global_size_t>(myGlobalElements[i]) == numGlobalElements-1) {
133  // boundary
134  numNz[i] = 2;
135  }
136  else {
137  numNz[i] = 3;
138  }
139  }
140 
141  // Create a Tpetra::Matrix using the Map, with a static allocation dictated by numNz
143  Teuchos::rcp( new Tpetra::CrsMatrix<Scalar>(map, numNz, Tpetra::StaticProfile) );
144 
145  // We are done with NumNZ
146  numNz = Teuchos::null;
147 
148  // Add rows one-at-a-time
149  // Off diagonal values will always be -1
150  const Scalar two = static_cast<Scalar>( 2.0);
151  const Scalar posOne = static_cast<Scalar>(+1.0);
152  const Scalar negOne = static_cast<Scalar>(-1.0);
153  for (size_t i = 0; i < numMyElements; i++) {
154  if (myGlobalElements[i] == 0) {
155  A->insertGlobalValues( myGlobalElements[i],
156  tuple<GO>(myGlobalElements[i], myGlobalElements[i]+1)(),
157  tuple<Scalar> (two, posOne)()
158  );
159  }
160  else if (static_cast<global_size_t>(myGlobalElements[i]) == numGlobalElements-1) {
161  A->insertGlobalValues( myGlobalElements[i],
162  tuple<GO>(myGlobalElements[i]-1, myGlobalElements[i])(),
163  tuple<Scalar> (negOne, two)()
164  );
165  }
166  else {
167  A->insertGlobalValues( myGlobalElements[i],
168  tuple<GO>(myGlobalElements[i]-1, myGlobalElements[i], myGlobalElements[i]+1)(),
169  tuple<Scalar> (negOne, two, posOne)()
170  );
171  }
172  }
173 
174  // Finish up
175  A->fillComplete();
176 
177  return A;
178 
179 }
180 
181 
182 bool showAllTests = false;
183 bool dumpAll = false;
184 bool runLinearOpTester = true;
185 
186 
188 {
190  "show-all-tests", "no-show-all-tests", &showAllTests, "Show all tests or not" );
192  "dump-all", "no-dump-all", &dumpAll, "Dump all objects being tested" );
194  "run-linear-op-tester", "no-run-linear-op-tester", &runLinearOpTester, "..." );
195 }
196 
197 
198 //
199 // Unit Tests
200 //
201 
202 
203 //
204 // convertTpetraToThyraComm
205 //
206 
208  Scalar )
209 {
212  TEST_ASSERT(nonnull(thyraComm));
213 }
214 
215 
216 //
217 // createVectorSpace
218 //
219 
221  Scalar )
222 {
225  Thyra::createVectorSpace<Scalar>(tpetraMap);
226  TEST_ASSERT(nonnull(vs));
227  out << "vs = " << *vs;
228  const RCP<const SpmdVectorSpaceBase<Scalar> > vs_spmd =
229  rcp_dynamic_cast<const SpmdVectorSpaceBase<Scalar> >(vs, true);
230  TEST_EQUALITY(vs_spmd->localSubDim(), g_localDim);
231  TEST_EQUALITY(vs->dim(), as<Ordinal>(tpetraMap->getGlobalNumElements()));
232 }
233 
234 
235 //
236 // createVector
237 //
238 
240  Scalar )
241 {
242 
244 
247  Thyra::createVectorSpace<Scalar>(tpetraMap);
248 
249  const RCP<Tpetra::Vector<Scalar> > tpetraVector =
250  rcp(new Tpetra::Vector<Scalar>(tpetraMap));
251 
252  {
253  const RCP<VectorBase<Scalar> > thyraVector = createVector(tpetraVector, vs);
254  TEST_EQUALITY(thyraVector->space(), vs);
255  const RCP<Tpetra::Vector<Scalar> > tpetraVector2 =
256  ConverterT::getTpetraVector(thyraVector);
257  TEST_EQUALITY(tpetraVector2, tpetraVector);
258  }
259 
260  {
261  const RCP<VectorBase<Scalar> > thyraVector = Thyra::createVector(tpetraVector);
262  TEST_INEQUALITY(thyraVector->space(), vs);
263  TEST_ASSERT(thyraVector->space()->isCompatible(*vs));
264  const RCP<Tpetra::Vector<Scalar> > tpetraVector2 =
265  ConverterT::getTpetraVector(thyraVector);
266  TEST_EQUALITY(tpetraVector2, tpetraVector);
267  }
268 
269 }
270 
271 
272 //
273 // createConstVector
274 //
275 
277  Scalar )
278 {
279 
281 
284  Thyra::createVectorSpace<Scalar>(tpetraMap);
285 
286  const RCP<const Tpetra::Vector<Scalar> > tpetraVector =
287  rcp(new Tpetra::Vector<Scalar>(tpetraMap));
288 
289  {
290  const RCP<const VectorBase<Scalar> > thyraVector =
291  createConstVector(tpetraVector, vs);
292  TEST_EQUALITY(thyraVector->space(), vs);
293  const RCP<const Tpetra::Vector<Scalar> > tpetraVector2 =
294  ConverterT::getConstTpetraVector(thyraVector);
295  TEST_EQUALITY(tpetraVector2, tpetraVector);
296  }
297 
298  {
299  const RCP<const VectorBase<Scalar> > thyraVector =
300  Thyra::createConstVector(tpetraVector);
301  TEST_INEQUALITY(thyraVector->space(), vs);
302  TEST_ASSERT(thyraVector->space()->isCompatible(*vs));
303  const RCP<const Tpetra::Vector<Scalar> > tpetraVector2 =
304  ConverterT::getConstTpetraVector(thyraVector);
305  TEST_EQUALITY(tpetraVector2, tpetraVector);
306  }
307 
308 }
309 
310 
311 //
312 // createMultiVector
313 //
314 
316  Scalar )
317 {
318  typedef Tpetra::Map<>::local_ordinal_type LO;
319  typedef Tpetra::Map<>::global_ordinal_type GO;
321 
322  const int numCols = 3;
323 
325  const RCP<const VectorSpaceBase<Scalar> > rangeVs =
326  Thyra::createVectorSpace<Scalar>(tpetraMap);
327 
328  const RCP<const TpetraMap_t> tpetraLocRepMap =
329  Tpetra::createLocalMapWithNode<LO, GO>(
330  numCols, tpetraMap->getComm(), tpetraMap->getNode());
331  const RCP<const VectorSpaceBase<Scalar> > domainVs =
332  Thyra::createVectorSpace<Scalar>(tpetraLocRepMap);
333 
334  const RCP<Tpetra::MultiVector<Scalar> > tpetraMultiVector =
335  rcp(new Tpetra::MultiVector<Scalar>(tpetraMap, numCols));
336 
337  {
338  const RCP<MultiVectorBase<Scalar> > thyraMultiVector =
339  createMultiVector(tpetraMultiVector, rangeVs, domainVs);
340  TEST_EQUALITY(thyraMultiVector->range(), rangeVs);
341  TEST_EQUALITY(thyraMultiVector->domain(), domainVs);
342  const RCP<Tpetra::MultiVector<Scalar> > tpetraMultiVector2 =
343  ConverterT::getTpetraMultiVector(thyraMultiVector);
344  TEST_EQUALITY(tpetraMultiVector2, tpetraMultiVector);
345  }
346 
347  {
348  const RCP<MultiVectorBase<Scalar> > thyraMultiVector =
349  Thyra::createMultiVector(tpetraMultiVector);
350  TEST_INEQUALITY(thyraMultiVector->range(), rangeVs);
351  TEST_INEQUALITY(thyraMultiVector->domain(), domainVs);
352  TEST_ASSERT(thyraMultiVector->range()->isCompatible(*rangeVs));
353  TEST_ASSERT(thyraMultiVector->domain()->isCompatible(*domainVs));
354  const RCP<Tpetra::MultiVector<Scalar> > tpetraMultiVector2 =
355  ConverterT::getTpetraMultiVector(thyraMultiVector);
356  TEST_EQUALITY(tpetraMultiVector2, tpetraMultiVector);
357  }
358 
359 }
360 
361 
362 //
363 // createConstMultiVector
364 //
365 
367  Scalar )
368 {
369  typedef Tpetra::Map<>::local_ordinal_type LO;
370  typedef Tpetra::Map<>::global_ordinal_type GO;
372 
373  const int numCols = 3;
374 
376  const RCP<const VectorSpaceBase<Scalar> > rangeVs =
377  Thyra::createVectorSpace<Scalar>(tpetraMap);
378 
379  const RCP<const TpetraMap_t> tpetraLocRepMap =
380  Tpetra::createLocalMapWithNode<LO,GO>(
381  numCols, tpetraMap->getComm(), tpetraMap->getNode());
382  const RCP<const VectorSpaceBase<Scalar> > domainVs =
383  Thyra::createVectorSpace<Scalar>(tpetraLocRepMap);
384 
385  const RCP<const Tpetra::MultiVector<Scalar> > tpetraMultiVector =
386  rcp(new Tpetra::MultiVector<Scalar>(tpetraMap, numCols));
387 
388  {
389  const RCP<const MultiVectorBase<Scalar> > thyraMultiVector =
390  createConstMultiVector(tpetraMultiVector, rangeVs, domainVs);
391  TEST_EQUALITY(thyraMultiVector->range(), rangeVs);
392  TEST_EQUALITY(thyraMultiVector->domain(), domainVs);
393  const RCP<const Tpetra::MultiVector<Scalar> > tpetraMultiVector2 =
394  ConverterT::getConstTpetraMultiVector(thyraMultiVector);
395  TEST_EQUALITY(tpetraMultiVector2, tpetraMultiVector);
396  }
397 
398  {
399  const RCP<const MultiVectorBase<Scalar> > thyraMultiVector =
400  Thyra::createConstMultiVector(tpetraMultiVector);
401  TEST_INEQUALITY(thyraMultiVector->range(), rangeVs);
402  TEST_INEQUALITY(thyraMultiVector->domain(), domainVs);
403  TEST_ASSERT(thyraMultiVector->range()->isCompatible(*rangeVs));
404  TEST_ASSERT(thyraMultiVector->domain()->isCompatible(*domainVs));
405  const RCP<const Tpetra::MultiVector<Scalar> > tpetraMultiVector2 =
406  ConverterT::getConstTpetraMultiVector(thyraMultiVector);
407  TEST_EQUALITY(tpetraMultiVector2, tpetraMultiVector);
408  }
409 
410 }
411 
412 
413 //
414 // TeptraVectorSpace
415 //
416 
417 
418 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( TpetraThyraWrappers, TeptraVectorSpace,
419  Scalar )
420 {
422  Thyra::createVectorSpace<Scalar>(createTpetraMap(g_localDim));
423  const RCP<VectorBase<Scalar> > v = createMember(vs);
424  TEST_ASSERT(nonnull(v));
425  TEST_EQUALITY(v->space(), vs);
426 }
427 
428 
429 //
430 // vectorSpaceTester
431 //
432 
433 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( TpetraThyraWrappers, vectorSpaceTester,
434  Scalar )
435 {
437  = createTpetraVectorSpace<Scalar>(g_localDim);
438  Thyra::VectorSpaceTester<Scalar> vectorSpaceTester;
439  vectorSpaceTester.show_all_tests(showAllTests);
440  vectorSpaceTester.dump_all(dumpAll);
441  TEST_ASSERT(vectorSpaceTester.check(*vs, &out));
442 }
443 
444 
445 //
446 // vectorStdOpsTester
447 //
448 
449 
450 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( TpetraThyraWrappers, vectorStdOpsTester,
451  Scalar )
452 {
454  Thyra::createVectorSpace<Scalar>(createTpetraMap(g_localDim));
455  Thyra::VectorStdOpsTester<Scalar> vectorStdOpsTester;
456  vectorStdOpsTester.warning_tol(5.0e-13);
457  vectorStdOpsTester.error_tol(5.0e-14);
458  TEST_ASSERT(vectorStdOpsTester.checkStdOps(*vs, &out));
459 }
460 
461 
462 //
463 // multiVectorStdOpsTester
464 //
465 
466 
467 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( TpetraThyraWrappers, multiVectorStdOpsTester,
468  Scalar )
469 {
471  Thyra::createVectorSpace<Scalar>(createTpetraMap(g_localDim));
472  Thyra::MultiVectorStdOpsTester<Scalar> mvStdOpsTester;
473  mvStdOpsTester.warning_tol(5.0e-13);
474  mvStdOpsTester.error_tol(5.0e-14);
475  TEST_ASSERT(mvStdOpsTester.checkStdOps(*vs, &out));
476 }
477 
478 
479 //
480 // getTpetraMultiVector
481 //
482 
483 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( TpetraThyraWrappers, getTpetraMultiVector,
484  Scalar )
485 {
487 
488  const int numCols = 3;
490  = createTpetraVectorSpace<Scalar>(g_localDim);
491 
492  {
493  const RCP<MultiVectorBase<Scalar> > mv = createMembers(vs, numCols);
494  const RCP<Tpetra::MultiVector<Scalar> > tmv =
495  ConverterT::getTpetraMultiVector(mv);
496  TEST_ASSERT(nonnull(tmv));
497  TEST_EQUALITY(as<Ordinal>(tmv->getMap()->getGlobalNumElements()), vs->dim());
498  }
499 
500  {
501  const RCP<VectorBase<Scalar> > v = createMember(vs);
502  const RCP<Tpetra::MultiVector<Scalar> > tmv =
503  ConverterT::getTpetraMultiVector(v);
504  TEST_ASSERT(nonnull(tmv));
505  TEST_EQUALITY(as<Ordinal>(tmv->getMap()->getGlobalNumElements()), vs->dim());
506  }
507 
508 #ifdef THYRA_DEBUG
509  const RCP<VectorBase<Scalar> > pv = Thyra::defaultProductVector<Scalar>();
510  TEST_THROW(ConverterT::getTpetraMultiVector(pv), std::logic_error);
511 #endif
512 
513 }
514 
515 
516 //
517 // getConstTpetraMultiVector
518 //
519 
520 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( TpetraThyraWrappers, getConstTpetraMultiVector,
521  Scalar )
522 {
524 
525  const int numCols = 3;
527  = createTpetraVectorSpace<Scalar>(g_localDim);
528 
529  {
530  const RCP<const MultiVectorBase<Scalar> > mv = createMembers(vs, numCols);
532  ConverterT::getConstTpetraMultiVector(mv);
533  TEST_ASSERT(nonnull(tmv));
534  TEST_EQUALITY(as<Ordinal>(tmv->getMap()->getGlobalNumElements()), vs->dim());
535  }
536 
537  {
538  const RCP<const VectorBase<Scalar> > v = createMember(vs);
540  ConverterT::getConstTpetraMultiVector(v);
541  TEST_ASSERT(nonnull(tmv));
542  TEST_EQUALITY(as<Ordinal>(tmv->getMap()->getGlobalNumElements()), vs->dim());
543  }
544 
545 #ifdef THYRA_DEBUG
546  const RCP<const VectorBase<Scalar> > pv = Thyra::defaultProductVector<Scalar>();
547  TEST_THROW(ConverterT::getConstTpetraMultiVector(pv), std::logic_error);
548 #endif
549 
550 }
551 
552 
553 //
554 // TpetraLinearOp
555 //
556 
558  Scalar )
559 {
560 
562  using Teuchos::as;
563 
564  const RCP<Tpetra::Operator<Scalar> > tpetraOp =
565  createTriDiagonalTpetraOperator<Scalar>(g_localDim);
566  out << "tpetraOp = " << Teuchos::describe(*tpetraOp, Teuchos::VERB_HIGH) << std::endl;
567  TEST_ASSERT(nonnull(tpetraOp));
568 
569  const RCP<const VectorSpaceBase<Scalar> > rangeSpace =
570  Thyra::createVectorSpace<Scalar>(tpetraOp->getRangeMap());
571  const RCP<const VectorSpaceBase<Scalar> > domainSpace =
572  Thyra::createVectorSpace<Scalar>(tpetraOp->getDomainMap());
573  const RCP<const LinearOpBase<Scalar> > thyraLinearOp =
574  Thyra::tpetraLinearOp(rangeSpace, domainSpace, tpetraOp);
575  TEST_ASSERT(nonnull(thyraLinearOp));
576 
577  out << "\nCheck that operator returns the right thing ...\n";
578  const RCP<VectorBase<Scalar> > x = createMember(thyraLinearOp->domain());
579  Thyra::V_S(x.ptr(), ST::one());
580  const RCP<VectorBase<Scalar> > y = createMember(thyraLinearOp->range());
581  Thyra::apply<Scalar>(*thyraLinearOp, Thyra::NOTRANS, *x, y.ptr());
582  const Scalar sum_y = sum(*y);
583  TEST_FLOATING_EQUALITY( sum_y, as<Scalar>(3+1+2*(y->space()->dim()-2)),
584  100.0 * ST::eps() );
585 
586  out << "\nCheck the general LinearOp interface ...\n";
587  Thyra::LinearOpTester<Scalar> linearOpTester;
588  linearOpTester.show_all_tests(showAllTests);
589  linearOpTester.dump_all(dumpAll);
590  if (runLinearOpTester) {
591  TEST_ASSERT(linearOpTester.check(*thyraLinearOp, Teuchos::inOutArg(out)));
592  }
593 
594 }
595 
596 
597 //
598 // createLinearOp
599 //
600 
602  Scalar )
603 {
604 
606 
607  const RCP<Tpetra::Operator<Scalar> > tpetraOp =
608  createTriDiagonalTpetraOperator<Scalar>(g_localDim);
609  out << "tpetraOp = " << Teuchos::describe(*tpetraOp, Teuchos::VERB_HIGH) << std::endl;
610 
611  const RCP<const VectorSpaceBase<Scalar> > rangeSpace =
612  Thyra::createVectorSpace<Scalar>(tpetraOp->getRangeMap());
613 
614  const RCP<const VectorSpaceBase<Scalar> > domainSpace =
615  Thyra::createVectorSpace<Scalar>(tpetraOp->getDomainMap());
616 
617  {
618  const RCP<LinearOpBase<Scalar> > thyraOp =
619  createLinearOp(tpetraOp, rangeSpace, domainSpace);
620  TEST_EQUALITY(thyraOp->range(), rangeSpace);
621  TEST_EQUALITY(thyraOp->domain(), domainSpace);
622  const RCP<Tpetra::Operator<Scalar> > tpetraOp2 =
623  ConverterT::getTpetraOperator(thyraOp);
624  TEST_EQUALITY(tpetraOp2, tpetraOp);
625  }
626 
627  {
628  const RCP<LinearOpBase<Scalar> > thyraOp =
629  Thyra::createLinearOp(tpetraOp);
630  TEST_INEQUALITY(thyraOp->range(), rangeSpace);
631  TEST_INEQUALITY(thyraOp->domain(), domainSpace);
632  TEST_ASSERT(thyraOp->range()->isCompatible(*rangeSpace));
633  TEST_ASSERT(thyraOp->domain()->isCompatible(*domainSpace));
634  const RCP<Tpetra::Operator<Scalar> > tpetraOp2 =
635  ConverterT::getTpetraOperator(thyraOp);
636  TEST_EQUALITY(tpetraOp2, tpetraOp);
637  }
638 
639 }
640 
641 
642 //
643 // createConstLinearOp
644 //
645 
647  Scalar )
648 {
649 
651 
652  const RCP<const Tpetra::Operator<Scalar> > tpetraOp =
653  createTriDiagonalTpetraOperator<Scalar>(g_localDim);
654  out << "tpetraOp = " << Teuchos::describe(*tpetraOp, Teuchos::VERB_HIGH) << std::endl;
655 
656  const RCP<const VectorSpaceBase<Scalar> > rangeSpace =
657  Thyra::createVectorSpace<Scalar>(tpetraOp->getRangeMap());
658 
659  const RCP<const VectorSpaceBase<Scalar> > domainSpace =
660  Thyra::createVectorSpace<Scalar>(tpetraOp->getDomainMap());
661 
662  {
663  const RCP<const LinearOpBase<Scalar> > thyraOp =
664  createConstLinearOp(tpetraOp, rangeSpace, domainSpace);
665  TEST_EQUALITY(thyraOp->range(), rangeSpace);
666  TEST_EQUALITY(thyraOp->domain(), domainSpace);
667  const RCP<const Tpetra::Operator<Scalar> > tpetraOp2 =
668  ConverterT::getConstTpetraOperator(thyraOp);
669  TEST_EQUALITY(tpetraOp2, tpetraOp);
670  }
671 
672  {
673  const RCP<const LinearOpBase<Scalar> > thyraOp =
674  Thyra::createConstLinearOp(tpetraOp);
675  TEST_INEQUALITY(thyraOp->range(), rangeSpace);
676  TEST_INEQUALITY(thyraOp->domain(), domainSpace);
677  TEST_ASSERT(thyraOp->range()->isCompatible(*rangeSpace));
678  TEST_ASSERT(thyraOp->domain()->isCompatible(*domainSpace));
679  const RCP<const Tpetra::Operator<Scalar> > tpetraOp2 =
680  ConverterT::getConstTpetraOperator(thyraOp);
681  TEST_EQUALITY(tpetraOp2, tpetraOp);
682  }
683 
684 }
685 
686 
687 //
688 // Tpetra-implemented methods
689 //
690 
691 
693 {
695  TEUCHOS_TEST_FOR_EXCEPTION(timer == null,
696  std::runtime_error,
697  "lookupAndAssertTimer(): timer \"" << label << "\" was not present in Teuchos::TimeMonitor."
698  " Unit test not valid.");
699  return timer;
700 }
701 
702 
703 #define CHECK_TPETRA_FUNC_CALL_INCREMENT( timerStr, tpetraCode, thyraCode ) \
704 { \
705  out << "\nTesting that Thyra calls down to " << timerStr << "\n"; \
706  ECHO(tpetraCode); \
707  const RCP<const Time> timer = lookupAndAssertTimer(timerStr); \
708  const int countBefore = timer->numCalls(); \
709  ECHO(thyraCode); \
710  const int countAfter = timer->numCalls(); \
711  TEST_EQUALITY( countAfter, countBefore+1 ); \
712 }
713 
714 
715 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( TpetraThyraWrappers, UseTpetraImplementations,
716  Scalar )
717 {
718  using Teuchos::Time;
720  typedef typename ST::magnitudeType Magnitude;
721  typedef VectorSpaceBase<Scalar> VectorSpace;
722  typedef MultiVectorBase<Scalar> MultiVec;
723  //typedef Tpetra::Map<int> TpetraMap;
724  typedef Tpetra::MultiVector<Scalar> TpetraMultiVec;
726 
727  const int numCols = 3;
728 
729  const RCP<const VectorSpace> vs =
730  createTpetraVectorSpace<Scalar>(g_localDim);
731  const RCP<MultiVec>
732  A = createMembers(vs, numCols),
733  B = createMembers(vs, numCols);
734  const RCP<TpetraMultiVec>
735  tA = TOVE::getTpetraMultiVector(A),
736  tB = TOVE::getTpetraMultiVector(B);
737  Array<Scalar> C(numCols*numCols,ST::zero());
738 
739  Teuchos::Array<Magnitude> avMag(numCols);
740  Teuchos::Array<Scalar> avScal(numCols);
741 
743  "Tpetra::MultiVector::putScalar()",
744  tA->putScalar(ST::zero()),
745  Thyra::assign(A.ptr(), ST::zero())
746  );
747 
749  "Tpetra::MultiVector::dot()",
750  tA->dot(*tB, avScal() ), // norms calls scalarProd, which calls Tpetra::dot
751  Thyra::norms( *A, avMag() )
752  );
753 
755  "Tpetra::MultiVector::dot()",
756  tA->dot(*tB, avScal() ),
757  A->range()->scalarProds(*A, *B, avScal() )
758  );
759 
760  /*
761  CHECK_TPETRA_FUNC_CALL_INCREMENT(
762  "Tpetra::MultiVector::scale(alpha)",
763  tB->scale( ST::zero() ),
764  Thyra::scale( ST::zero(), B.ptr() )
765  );
766  */
767 
768  /*
769  CHECK_TPETRA_FUNC_CALL_INCREMENT(
770  "Tpetra::MultiVector::operator=()",
771  (*tA) = *tB,
772  Thyra::assign( A.ptr(), *B )
773  );
774  */
775 
776  /*
777  {
778  RCP<MultiVec> Ctmvb = Thyra::createMembersView(
779  A->domain(),
780  RTOpPack::SubMultiVectorView<Scalar>(
781  0, numCols, 0, numCols,
782  Teuchos::arcpFromArrayView(C()), numCols
783  )
784  );
785  CHECK_TPETRA_FUNC_CALL_INCREMENT(
786  "Tpetra::multiplyOntoHost()",
787  Tpetra::multiplyOntoHost(Teuchos::CONJ_TRANS,Teuchos::NO_TRANS,ST::one(),*tA,*tB, C()),
788  A->apply(Thyra::CONJTRANS,*B,Ctmvb.ptr(),ST::one(),ST::zero())
789  );
790  }
791  */
792 
793  /*
794  {
795  RCP<const MultiVec> Ctmvb = Thyra::createMembersView(
796  A->domain(),
797  RTOpPack::ConstSubMultiVectorView<Scalar>(
798  0, numCols, 0, numCols,
799  Teuchos::arcpFromArrayView(C()), numCols
800  )
801  );
802  const RCP<const TpetraMultiVec>
803  tC = TOVE::getConstTpetraMultiVector(Ctmvb);
804  CHECK_TPETRA_FUNC_CALL_INCREMENT(
805  "Tpetra::MultiVector::multiply()",
806  tB->multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,ST::one(),*tA,*tC,ST::zero()),
807  A->apply(Thyra::NOTRANS,*Ctmvb,B.ptr(),ST::one(),ST::zero())
808  );
809  }
810  */
811 
812 /*
813  RCP<Time>
814  timerUpdate = lookupAndAssertTimer("Tpetra::MultiVector::update(alpha,A,beta,B,gamma)"),
815  timerUpdate2 = lookupAndAssertTimer("Tpetra::MultiVector::update(alpha,A,beta)"),
816 
817  // TODO: test update(two vector)
818  // TODO: test update(three vector)
819 */
820 }
821 
822 
823 #ifdef TPETRA_TEUCHOS_TIME_MONITOR
824 # define TPETRA_TIMER_TESTS(SCALAR) \
825  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, UseTpetraImplementations, SCALAR )
826 #else
827 # define TPETRA_TIMER_TESTS(SCALAR)
828 #endif
829 
830 
831 //
832 // TpetraLinearOp_EpetraRowMatrix
833 //
834 
835 
836 #ifdef HAVE_THYRA_TPETRA_EPETRA
837 
838 
839 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( TpetraThyraWrappers, TpetraLinearOp_EpetraRowMatrix,
840  Scalar )
841 {
842 
843  using Teuchos::as;
844  using Teuchos::outArg;
845  using Teuchos::rcp_dynamic_cast;
846  using Teuchos::Array;
848 
849  const RCP<Tpetra::Operator<Scalar> > tpetraOp =
850  createTriDiagonalTpetraOperator<Scalar>(g_localDim);
851 
852  const RCP<LinearOpBase<Scalar> > thyraOp =
853  Thyra::createLinearOp(tpetraOp);
854 
855  const RCP<Thyra::TpetraLinearOp<Scalar> > thyraTpetraOp =
856  Teuchos::rcp_dynamic_cast<Thyra::TpetraLinearOp<Scalar> >(thyraOp);
857 
858  RCP<const Epetra_Operator> epetraOp;
859  Thyra::EOpTransp epetraOpTransp;
860  Thyra::EApplyEpetraOpAs epetraOpApplyAs;
861  Thyra::EAdjointEpetraOp epetraOpAdjointSupport;
862 
863  thyraTpetraOp->getEpetraOpView( outArg(epetraOp), outArg(epetraOpTransp),
864  outArg(epetraOpApplyAs), outArg(epetraOpAdjointSupport) );
865 
866  if (typeid(Scalar) == typeid(double)) {
867  TEST_ASSERT(nonnull(epetraOp));
868  const RCP<const Epetra_RowMatrix> epetraRowMatrix =
869  rcp_dynamic_cast<const Epetra_RowMatrix>(epetraOp, true);
870  int numRowEntries = -1;
871  epetraRowMatrix->NumMyRowEntries(1, numRowEntries);
872  TEST_EQUALITY_CONST(numRowEntries, 3);
873  Array<double> row_values(numRowEntries);
874  Array<int> row_indices(numRowEntries);
875  epetraRowMatrix->ExtractMyRowCopy(1, numRowEntries, numRowEntries,
876  row_values.getRawPtr(), row_indices.getRawPtr());
877  TEST_EQUALITY_CONST(row_values[0], -1.0);
878  TEST_EQUALITY_CONST(row_values[1], 2.0);
879  TEST_EQUALITY_CONST(row_values[2], 1.0);
880  // ToDo: Test column indices!
881  }
882  else {
883  TEST_ASSERT(is_null(epetraOp));
884  }
885 
886 }
887 
888 #else
889 
890 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( TpetraThyraWrappers, TpetraLinearOp_EpetraRowMatrix,
891  Scalar )
892 {
893 }
894 
895 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( TpetraThyraWrappers, TpetraLinearOp_RowStatLinearOpBase,
896  Scalar )
897 {
898  using Teuchos::as;
899 
900  const RCP<Tpetra::Operator<Scalar> > tpetraOp =
901  createTriDiagonalTpetraOperator<Scalar>(g_localDim);
902  out << "tpetraOp = " << Teuchos::describe(*tpetraOp, Teuchos::VERB_HIGH) << std::endl;
903  TEST_ASSERT(nonnull(tpetraOp));
904 
905  const RCP<Tpetra::CrsMatrix<Scalar> > tpetraCrsMatrix =
906  Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<Scalar> >(tpetraOp,true);
907 
908  const RCP<const VectorSpaceBase<Scalar> > rangeSpace =
909  Thyra::createVectorSpace<Scalar>(tpetraOp->getRangeMap());
910  const RCP<const VectorSpaceBase<Scalar> > domainSpace =
911  Thyra::createVectorSpace<Scalar>(tpetraOp->getDomainMap());
912  const RCP<LinearOpBase<Scalar> > thyraLinearOp =
913  Thyra::tpetraLinearOp(rangeSpace, domainSpace, tpetraOp);
914  TEST_ASSERT(nonnull(thyraLinearOp));
915 
917  Teuchos::rcp_dynamic_cast<Thyra::RowStatLinearOpBase<Scalar> >(thyraLinearOp, true);
918 
919  // Get the inverse row sums
920 
921  const RCP<VectorBase<Scalar> > inv_row_sums =
922  createMember<Scalar>(thyraLinearOp->range());
923  const RCP<VectorBase<Scalar> > row_sums =
924  createMember<Scalar>(thyraLinearOp->range());
925 
926  rowStatOp->getRowStat(Thyra::RowStatLinearOpBaseUtils::ROW_STAT_INV_ROW_SUM,
927  inv_row_sums.ptr());
928  rowStatOp->getRowStat(Thyra::RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM,
929  row_sums.ptr());
930 
931  out << "inv_row_sums = " << *inv_row_sums;
932  out << "row_sums = " << *row_sums;
933 
935  Thyra::sum<Scalar>(*row_sums),
936  Teuchos::as<Scalar>(4.0 * thyraLinearOp->domain()->dim() - 2.0),
937  Teuchos::as<Scalar>(10.0 * Teuchos::ScalarTraits<Scalar>::eps())
938  );
939 
941  Thyra::sum<Scalar>(*inv_row_sums),
942  Teuchos::as<Scalar>( 1.0 / 4.0 * (thyraLinearOp->domain()->dim() - 2) + 2.0 / 3.0 ),
943  Teuchos::as<Scalar>(10.0 * Teuchos::ScalarTraits<Scalar>::eps())
944  );
945 }
946 
947 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( TpetraThyraWrappers, TpetraLinearOp_ScaledLinearOpBase,
948  Scalar )
949 {
950  const RCP<Tpetra::Operator<Scalar> > tpetraOp =
951  createTriDiagonalTpetraOperator<Scalar>(g_localDim);
952  out << "tpetraOp = " << Teuchos::describe(*tpetraOp, Teuchos::VERB_HIGH) << std::endl;
953  TEST_ASSERT(nonnull(tpetraOp));
954 
955  const RCP<Tpetra::CrsMatrix<Scalar> > tpetraCrsMatrix =
956  Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<Scalar> >(tpetraOp,true);
957 
958  const RCP<const VectorSpaceBase<Scalar> > rangeSpace =
959  Thyra::createVectorSpace<Scalar>(tpetraOp->getRangeMap());
960  const RCP<const VectorSpaceBase<Scalar> > domainSpace =
961  Thyra::createVectorSpace<Scalar>(tpetraOp->getDomainMap());
962  const RCP<LinearOpBase<Scalar> > thyraLinearOp =
963  Thyra::tpetraLinearOp(rangeSpace, domainSpace, tpetraOp);
964  TEST_ASSERT(nonnull(thyraLinearOp));
965 
967  Teuchos::rcp_dynamic_cast<Thyra::RowStatLinearOpBase<Scalar> >(thyraLinearOp, true);
968 
969  // Get the inverse row sums
970 
971  const RCP<VectorBase<Scalar> > inv_row_sums =
972  createMember<Scalar>(thyraLinearOp->range());
973  const RCP<VectorBase<Scalar> > row_sums =
974  createMember<Scalar>(thyraLinearOp->range());
975 
976  rowStatOp->getRowStat(Thyra::RowStatLinearOpBaseUtils::ROW_STAT_INV_ROW_SUM,
977  inv_row_sums.ptr());
978  rowStatOp->getRowStat(Thyra::RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM,
979  row_sums.ptr());
980 
981  out << "inv_row_sums = " << *inv_row_sums;
982  out << "row_sums = " << *row_sums;
983 
985  Teuchos::rcp_dynamic_cast<Thyra::ScaledLinearOpBase<Scalar> >(thyraLinearOp, true);
986 
987  TEUCHOS_ASSERT(scaledOp->supportsScaleLeft());
988 
989  scaledOp->scaleLeft(*inv_row_sums);
990 
991  rowStatOp->getRowStat(Thyra::RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM,
992  row_sums.ptr());
993 
994  out << "row_sums after left scaling by inv_row_sum = " << *row_sums;
995 
996  // scaled row sums should be one for each entry
998  Scalar(row_sums->space()->dim()),
999  Thyra::sum<Scalar>(*row_sums),
1000  as<Scalar>(10.0 * Teuchos::ScalarTraits<Scalar>::eps())
1001  );
1002 
1003  // Don't currently check the results of right scaling. Tpetra tests
1004  // already check this. Once column sums are supported in tpetra
1005  // adapters, this can be checked easily.
1006  TEUCHOS_ASSERT(scaledOp->supportsScaleRight());
1007  scaledOp->scaleRight(*inv_row_sums);
1008  rowStatOp->getRowStat(Thyra::RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM,row_sums.ptr());
1009  out << "row_sums after right scaling by inv_row_sum = " << *row_sums;
1010 }
1011 
1012 #endif // HAVE_THYRA_TPETRA_EPETRA
1013 
1014 
1015 //
1016 // Unit test instantiations
1017 //
1018 
1019 #define THYRA_TPETRA_THYRA_WRAPPERS_INSTANT(SCALAR) \
1020  \
1021  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1022  convertTpetraToThyraComm, SCALAR ) \
1023  \
1024  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1025  createVectorSpace, SCALAR ) \
1026  \
1027  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1028  createVector, SCALAR ) \
1029  \
1030  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1031  createConstVector, SCALAR ) \
1032  \
1033  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1034  createMultiVector, SCALAR ) \
1035  \
1036  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1037  createConstMultiVector, SCALAR ) \
1038  \
1039  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1040  TeptraVectorSpace, SCALAR ) \
1041  \
1042  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1043  vectorSpaceTester, SCALAR ) \
1044  \
1045  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1046  vectorStdOpsTester, SCALAR ) \
1047  \
1048  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1049  multiVectorStdOpsTester, SCALAR ) \
1050  \
1051  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1052  getTpetraMultiVector, SCALAR ) \
1053  \
1054  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1055  getConstTpetraMultiVector, SCALAR ) \
1056  \
1057  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1058  TpetraLinearOp, SCALAR ) \
1059  \
1060  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1061  createLinearOp, SCALAR ) \
1062  \
1063  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1064  createConstLinearOp, SCALAR ) \
1065  \
1066  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1067  TpetraLinearOp_EpetraRowMatrix, SCALAR ) \
1068  \
1069  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1070  TpetraLinearOp_RowStatLinearOpBase, SCALAR ) \
1071  \
1072  TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1073  TpetraLinearOp_ScaledLinearOpBase, SCALAR ) \
1074 
1075 
1076 // We can currently only explicitly instantiate with double support because
1077 // Tpetra only supports explicit instantaition with double. As for implicit
1078 // instantation, g++ 3.4.6 on my Linux machine was taking more than 30 minutes
1079 // to compile this file when all of the types double, float, complex<double>,
1080 // and complex<float> where enabled. Therefore, we will only test double for
1081 // now until explicit instantation with other types are supported by Tpetra.
1082 
1084 
1085 
1086 } // namespace Thyra
is_null
bool is_null(const boost::shared_ptr< T > &p)
Thyra::createVector
RCP< VectorBase< Scalar > > createVector(const RCP< Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVector, const RCP< const VectorSpaceBase< Scalar > > space=Teuchos::null)
Teuchos_DefaultComm.hpp
TEST_THROW
#define TEST_THROW(code, ExceptType)
Thyra::TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL
TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL(TpetraThyraWrappers, convertTpetraToThyraComm, Scalar)
Definition: TpetraThyraWrappers_UnitTests.cpp:207
Thyra::EApplyEpetraOpAs
EApplyEpetraOpAs
Determine how the apply an Epetra_Operator as a linear operator.
Definition: Thyra_EpetraTypes.hpp:93
Thyra::TpetraLinearOp
Concrete Thyra::LinearOpBase subclass for Tpetra::Operator.
Definition: Thyra_TpetraLinearOp_decl.hpp:73
TEST_EQUALITY_CONST
#define TEST_EQUALITY_CONST(v1, v2)
Thyra::EAdjointEpetraOp
EAdjointEpetraOp
Determine if adjoints are supported on Epetra_Opeator or not.
Definition: Thyra_EpetraTypes.hpp:64
Teuchos::OrdinalTraits
TEUCHOS_ASSERT
#define TEUCHOS_ASSERT(assertion_test)
Teuchos::rcp
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Teuchos::UnitTestRepository::getCLP
static CommandLineProcessor & getCLP()
Thyra::convertTpetraToThyraComm
RCP< const Teuchos::Comm< Ordinal > > convertTpetraToThyraComm(const RCP< const Teuchos::Comm< int > > &tpetraComm)
Given an Tpetra Teuchos::Comm<int> object, return an equivalent Teuchos::Comm<Ordinal> object.
Definition: Thyra_TpetraThyraWrappers.cpp:55
Thyra::TpetraOperatorVectorExtraction
Traits class that enables the extraction of Tpetra operator/vector objects wrapped in Thyra operator/...
Definition: Thyra_TpetraThyraWrappers_decl.hpp:176
Teuchos::Time
Teuchos::ArrayView
Thyra::TEUCHOS_STATIC_SETUP
TEUCHOS_STATIC_SETUP()
Definition: TpetraThyraWrappers_UnitTests.cpp:187
Thyra::g_localDim
const int g_localDim
Definition: TpetraThyraWrappers_UnitTests.cpp:82
Teuchos::RCP
TEST_INEQUALITY
#define TEST_INEQUALITY(v1, v2)
Teuchos_UnitTestHarness.hpp
Teuchos::Array
Thyra::createTpetraVectorSpace
RCP< const VectorSpaceBase< Scalar > > createTpetraVectorSpace(const int localDim)
Definition: TpetraThyraWrappers_UnitTests.cpp:102
Teuchos::ArrayRCP
Teuchos_Tuple.hpp
Thyra::lookupAndAssertTimer
Teuchos::RCP< Teuchos::Time > lookupAndAssertTimer(const std::string &label)
Definition: TpetraThyraWrappers_UnitTests.cpp:692
Teuchos::ScalarTraits
Thyra::createVectorSpace
RCP< const VectorSpaceBase< Scalar > > createVectorSpace(const RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &tpetraMap)
Create a Thyra::VectorSpaceBase object given a Tpetra::Map.
Teuchos::CommandLineProcessor::setOption
void setOption(const char option_true[], const char option_false[], bool *option_val, const char documentation[]=NULL)
Teuchos::VERB_HIGH
VERB_HIGH
Thyra::createTriDiagonalTpetraOperator
RCP< Tpetra::Operator< Scalar > > createTriDiagonalTpetraOperator(const int numLocalRows)
Definition: TpetraThyraWrappers_UnitTests.cpp:110
Teuchos::DefaultComm::getComm
static Teuchos::RCP< const Comm< OrdinalType > > getComm()
Thyra::runLinearOpTester
bool runLinearOpTester
Definition: TpetraThyraWrappers_UnitTests.cpp:184
Thyra::TpetraMap_t
Tpetra::Map TpetraMap_t
Definition: TpetraThyraWrappers_UnitTests.cpp:85
Thyra::showAllTests
bool showAllTests
Definition: TpetraThyraWrappers_UnitTests.cpp:182
Thyra::createTpetraMap
RCP< const TpetraMap_t > createTpetraMap(const int localDim)
Definition: TpetraThyraWrappers_UnitTests.cpp:89
THYRA_TPETRA_THYRA_WRAPPERS_INSTANT
#define THYRA_TPETRA_THYRA_WRAPPERS_INSTANT(SCALAR)
Definition: TpetraThyraWrappers_UnitTests.cpp:1019
Thyra::dumpAll
bool dumpAll
Definition: TpetraThyraWrappers_UnitTests.cpp:183
Teuchos::as
TypeTo as(const TypeFrom &t)
Thyra::createLinearOp
RCP< LinearOpBase< Scalar > > createLinearOp(const RCP< Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraOperator, const RCP< const VectorSpaceBase< Scalar > > rangeSpace=Teuchos::null, const RCP< const VectorSpaceBase< Scalar > > domainSpace=Teuchos::null)
Thyra::createMultiVector
RCP< MultiVectorBase< Scalar > > createMultiVector(const RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraMultiVector, const RCP< const VectorSpaceBase< Scalar > > rangeSpace=Teuchos::null, const RCP< const VectorSpaceBase< Scalar > > domainSpace=Teuchos::null)
Array< double >::getRawPtr
double * getRawPtr()
C
nonnull
bool nonnull(const boost::shared_ptr< T > &p)
Teuchos::DefaultComm
A
PerformanceMonitorBase< Time >::lookupCounter
static RCP< Time > lookupCounter(const std::string &name)
Thyra::createConstMultiVector
RCP< const MultiVectorBase< Scalar > > createConstMultiVector(const RCP< const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraMultiVector, const RCP< const VectorSpaceBase< Scalar > > rangeSpace=Teuchos::null, const RCP< const VectorSpaceBase< Scalar > > domainSpace=Teuchos::null)
CHECK_TPETRA_FUNC_CALL_INCREMENT
#define CHECK_TPETRA_FUNC_CALL_INCREMENT(timerStr, tpetraCode, thyraCode)
Definition: TpetraThyraWrappers_UnitTests.cpp:703
Thyra::createConstVector
RCP< const VectorBase< Scalar > > createConstVector(const RCP< const Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVector, const RCP< const VectorSpaceBase< Scalar > > space=Teuchos::null)
Teuchos::Comm
Definition: Thyra_EpetraThyraWrappers.hpp:50
Teuchos::RCP::ptr
Ptr< T > ptr() const
TEST_EQUALITY
TEST_EQUALITY(rcp_dynamic_cast< const EnhancedNumberValidator< double > >(castedDep1->getValuesAndValidators().find("val1") ->second, true) ->getMax(), double1Vali->getMax())
Thyra_TpetraThyraWrappers.hpp
TEST_ASSERT
TEST_ASSERT(castedDep1->getValuesAndValidators().size()==2)
Thyra::createConstLinearOp
RCP< const LinearOpBase< Scalar > > createConstLinearOp(const RCP< const Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraOperator, const RCP< const VectorSpaceBase< Scalar > > rangeSpace=Teuchos::null, const RCP< const VectorSpaceBase< Scalar > > domainSpace=Teuchos::null)
TEST_FLOATING_EQUALITY
#define TEST_FLOATING_EQUALITY(v1, v2, tol)
TEUCHOS_TEST_FOR_EXCEPTION
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Thyra
Definition: Thyra_DiagonalEpetraLinearOpWithSolveFactory.cpp:53
B