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"
76 using Teuchos::rcp_dynamic_cast;
77 using Teuchos::inOutArg;
100 template<
class Scalar>
101 RCP<const VectorSpaceBase<Scalar> >
108 template<
class Scalar>
109 RCP<Tpetra::Operator<Scalar> >
112 typedef Tpetra::global_size_t global_size_t;
113 typedef Tpetra::Map<>::global_ordinal_type GO;
117 const size_t numMyElements = map->getNodeNumElements();
118 const global_size_t numGlobalElements = map->getGlobalNumElements();
131 for (
size_t i=0; i < numMyElements; ++i) {
132 if (myGlobalElements[i] == 0 || static_cast<global_size_t>(myGlobalElements[i]) == numGlobalElements-1) {
143 Teuchos::rcp(
new Tpetra::CrsMatrix<Scalar>(map, numNz, Tpetra::StaticProfile) );
146 numNz = Teuchos::null;
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)()
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)()
167 A->insertGlobalValues( myGlobalElements[i],
168 tuple<GO>(myGlobalElements[i]-1, myGlobalElements[i], myGlobalElements[i]+1)(),
169 tuple<Scalar> (negOne, two, posOne)()
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" );
225 Thyra::createVectorSpace<Scalar>(tpetraMap);
227 out <<
"vs = " << *vs;
229 rcp_dynamic_cast<
const SpmdVectorSpaceBase<Scalar> >(vs,
true);
231 TEST_EQUALITY(vs->dim(), as<Ordinal>(tpetraMap->getGlobalNumElements()));
247 Thyra::createVectorSpace<Scalar>(tpetraMap);
250 rcp(
new Tpetra::Vector<Scalar>(tpetraMap));
256 ConverterT::getTpetraVector(thyraVector);
263 TEST_ASSERT(thyraVector->space()->isCompatible(*vs));
265 ConverterT::getTpetraVector(thyraVector);
284 Thyra::createVectorSpace<Scalar>(tpetraMap);
287 rcp(
new Tpetra::Vector<Scalar>(tpetraMap));
294 ConverterT::getConstTpetraVector(thyraVector);
302 TEST_ASSERT(thyraVector->space()->isCompatible(*vs));
304 ConverterT::getConstTpetraVector(thyraVector);
318 typedef Tpetra::Map<>::local_ordinal_type LO;
319 typedef Tpetra::Map<>::global_ordinal_type GO;
322 const int numCols = 3;
326 Thyra::createVectorSpace<Scalar>(tpetraMap);
329 Tpetra::createLocalMapWithNode<LO, GO>(
330 numCols, tpetraMap->getComm(), tpetraMap->getNode());
332 Thyra::createVectorSpace<Scalar>(tpetraLocRepMap);
335 rcp(
new Tpetra::MultiVector<Scalar>(tpetraMap, numCols));
343 ConverterT::getTpetraMultiVector(thyraMultiVector);
352 TEST_ASSERT(thyraMultiVector->range()->isCompatible(*rangeVs));
353 TEST_ASSERT(thyraMultiVector->domain()->isCompatible(*domainVs));
355 ConverterT::getTpetraMultiVector(thyraMultiVector);
369 typedef Tpetra::Map<>::local_ordinal_type LO;
370 typedef Tpetra::Map<>::global_ordinal_type GO;
373 const int numCols = 3;
377 Thyra::createVectorSpace<Scalar>(tpetraMap);
380 Tpetra::createLocalMapWithNode<LO,GO>(
381 numCols, tpetraMap->getComm(), tpetraMap->getNode());
383 Thyra::createVectorSpace<Scalar>(tpetraLocRepMap);
386 rcp(
new Tpetra::MultiVector<Scalar>(tpetraMap, numCols));
394 ConverterT::getConstTpetraMultiVector(thyraMultiVector);
403 TEST_ASSERT(thyraMultiVector->range()->isCompatible(*rangeVs));
404 TEST_ASSERT(thyraMultiVector->domain()->isCompatible(*domainVs));
406 ConverterT::getConstTpetraMultiVector(thyraMultiVector);
437 = createTpetraVectorSpace<Scalar>(
g_localDim);
438 Thyra::VectorSpaceTester<Scalar> vectorSpaceTester;
440 vectorSpaceTester.dump_all(
dumpAll);
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));
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));
488 const int numCols = 3;
490 = createTpetraVectorSpace<Scalar>(
g_localDim);
495 ConverterT::getTpetraMultiVector(mv);
497 TEST_EQUALITY(as<Ordinal>(tmv->getMap()->getGlobalNumElements()), vs->dim());
503 ConverterT::getTpetraMultiVector(v);
505 TEST_EQUALITY(as<Ordinal>(tmv->getMap()->getGlobalNumElements()), vs->dim());
510 TEST_THROW(ConverterT::getTpetraMultiVector(pv), std::logic_error);
525 const int numCols = 3;
527 = createTpetraVectorSpace<Scalar>(
g_localDim);
532 ConverterT::getConstTpetraMultiVector(mv);
534 TEST_EQUALITY(as<Ordinal>(tmv->getMap()->getGlobalNumElements()), vs->dim());
540 ConverterT::getConstTpetraMultiVector(v);
542 TEST_EQUALITY(as<Ordinal>(tmv->getMap()->getGlobalNumElements()), vs->dim());
547 TEST_THROW(ConverterT::getConstTpetraMultiVector(pv), std::logic_error);
565 createTriDiagonalTpetraOperator<Scalar>(
g_localDim);
566 out <<
"tpetraOp = " << Teuchos::describe(*tpetraOp,
Teuchos::VERB_HIGH) << std::endl;
570 Thyra::createVectorSpace<Scalar>(tpetraOp->getRangeMap());
572 Thyra::createVectorSpace<Scalar>(tpetraOp->getDomainMap());
574 Thyra::tpetraLinearOp(rangeSpace, domainSpace, tpetraOp);
577 out <<
"\nCheck that operator returns the right thing ...\n";
579 Thyra::V_S(x.
ptr(), ST::one());
581 Thyra::apply<Scalar>(*thyraLinearOp, Thyra::NOTRANS, *x, y.
ptr());
582 const Scalar sum_y = sum(*y);
586 out <<
"\nCheck the general LinearOp interface ...\n";
587 Thyra::LinearOpTester<Scalar> linearOpTester;
589 linearOpTester.dump_all(
dumpAll);
591 TEST_ASSERT(linearOpTester.check(*thyraLinearOp, Teuchos::inOutArg(out)));
608 createTriDiagonalTpetraOperator<Scalar>(
g_localDim);
609 out <<
"tpetraOp = " << Teuchos::describe(*tpetraOp,
Teuchos::VERB_HIGH) << std::endl;
612 Thyra::createVectorSpace<Scalar>(tpetraOp->getRangeMap());
615 Thyra::createVectorSpace<Scalar>(tpetraOp->getDomainMap());
623 ConverterT::getTpetraOperator(thyraOp);
632 TEST_ASSERT(thyraOp->range()->isCompatible(*rangeSpace));
633 TEST_ASSERT(thyraOp->domain()->isCompatible(*domainSpace));
635 ConverterT::getTpetraOperator(thyraOp);
653 createTriDiagonalTpetraOperator<Scalar>(
g_localDim);
654 out <<
"tpetraOp = " << Teuchos::describe(*tpetraOp,
Teuchos::VERB_HIGH) << std::endl;
657 Thyra::createVectorSpace<Scalar>(tpetraOp->getRangeMap());
660 Thyra::createVectorSpace<Scalar>(tpetraOp->getDomainMap());
668 ConverterT::getConstTpetraOperator(thyraOp);
677 TEST_ASSERT(thyraOp->range()->isCompatible(*rangeSpace));
678 TEST_ASSERT(thyraOp->domain()->isCompatible(*domainSpace));
680 ConverterT::getConstTpetraOperator(thyraOp);
697 "lookupAndAssertTimer(): timer \"" << label <<
"\" was not present in Teuchos::TimeMonitor."
698 " Unit test not valid.");
703 #define CHECK_TPETRA_FUNC_CALL_INCREMENT( timerStr, tpetraCode, thyraCode ) \
705 out << "\nTesting that Thyra calls down to " << timerStr << "\n"; \
707 const RCP<const Time> timer = lookupAndAssertTimer(timerStr); \
708 const int countBefore = timer->numCalls(); \
710 const int countAfter = timer->numCalls(); \
711 TEST_EQUALITY( countAfter, countBefore+1 ); \
720 typedef typename ST::magnitudeType Magnitude;
721 typedef VectorSpaceBase<Scalar> VectorSpace;
722 typedef MultiVectorBase<Scalar> MultiVec;
724 typedef Tpetra::MultiVector<Scalar> TpetraMultiVec;
727 const int numCols = 3;
732 A = createMembers(vs, numCols),
733 B = createMembers(vs, numCols);
735 tA = TOVE::getTpetraMultiVector(
A),
736 tB = TOVE::getTpetraMultiVector(
B);
737 Array<Scalar>
C(numCols*numCols,ST::zero());
743 "Tpetra::MultiVector::putScalar()",
744 tA->putScalar(ST::zero()),
745 Thyra::assign(
A.ptr(), ST::zero())
749 "Tpetra::MultiVector::dot()",
750 tA->dot(*tB, avScal() ),
751 Thyra::norms( *
A, avMag() )
755 "Tpetra::MultiVector::dot()",
756 tA->dot(*tB, avScal() ),
757 A->range()->scalarProds(*
A, *
B, avScal() )
823 #ifdef TPETRA_TEUCHOS_TIME_MONITOR
824 # define TPETRA_TIMER_TESTS(SCALAR) \
825 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, UseTpetraImplementations, SCALAR )
827 # define TPETRA_TIMER_TESTS(SCALAR)
836 #ifdef HAVE_THYRA_TPETRA_EPETRA
844 using Teuchos::outArg;
845 using Teuchos::rcp_dynamic_cast;
849 const RCP<Tpetra::Operator<Scalar> > tpetraOp =
850 createTriDiagonalTpetraOperator<Scalar>(
g_localDim);
852 const RCP<LinearOpBase<Scalar> > thyraOp =
855 const RCP<Thyra::TpetraLinearOp<Scalar> > thyraTpetraOp =
858 RCP<const Epetra_Operator> epetraOp;
859 Thyra::EOpTransp epetraOpTransp;
863 thyraTpetraOp->getEpetraOpView( outArg(epetraOp), outArg(epetraOpTransp),
864 outArg(epetraOpApplyAs), outArg(epetraOpAdjointSupport) );
866 if (
typeid(Scalar) ==
typeid(
double)) {
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);
875 epetraRowMatrix->ExtractMyRowCopy(1, numRowEntries, numRowEntries,
901 createTriDiagonalTpetraOperator<Scalar>(
g_localDim);
902 out <<
"tpetraOp = " << Teuchos::describe(*tpetraOp,
Teuchos::VERB_HIGH) << std::endl;
906 Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<Scalar> >(tpetraOp,
true);
909 Thyra::createVectorSpace<Scalar>(tpetraOp->getRangeMap());
911 Thyra::createVectorSpace<Scalar>(tpetraOp->getDomainMap());
913 Thyra::tpetraLinearOp(rangeSpace, domainSpace, tpetraOp);
917 Teuchos::rcp_dynamic_cast<Thyra::RowStatLinearOpBase<Scalar> >(thyraLinearOp,
true);
922 createMember<Scalar>(thyraLinearOp->range());
924 createMember<Scalar>(thyraLinearOp->range());
926 rowStatOp->getRowStat(Thyra::RowStatLinearOpBaseUtils::ROW_STAT_INV_ROW_SUM,
928 rowStatOp->getRowStat(Thyra::RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM,
931 out <<
"inv_row_sums = " << *inv_row_sums;
932 out <<
"row_sums = " << *row_sums;
935 Thyra::sum<Scalar>(*row_sums),
936 Teuchos::as<Scalar>(4.0 * thyraLinearOp->domain()->dim() - 2.0),
941 Thyra::sum<Scalar>(*inv_row_sums),
942 Teuchos::as<Scalar>( 1.0 / 4.0 * (thyraLinearOp->domain()->dim() - 2) + 2.0 / 3.0 ),
951 createTriDiagonalTpetraOperator<Scalar>(
g_localDim);
952 out <<
"tpetraOp = " << Teuchos::describe(*tpetraOp,
Teuchos::VERB_HIGH) << std::endl;
956 Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<Scalar> >(tpetraOp,
true);
959 Thyra::createVectorSpace<Scalar>(tpetraOp->getRangeMap());
961 Thyra::createVectorSpace<Scalar>(tpetraOp->getDomainMap());
963 Thyra::tpetraLinearOp(rangeSpace, domainSpace, tpetraOp);
967 Teuchos::rcp_dynamic_cast<Thyra::RowStatLinearOpBase<Scalar> >(thyraLinearOp,
true);
972 createMember<Scalar>(thyraLinearOp->range());
974 createMember<Scalar>(thyraLinearOp->range());
976 rowStatOp->getRowStat(Thyra::RowStatLinearOpBaseUtils::ROW_STAT_INV_ROW_SUM,
978 rowStatOp->getRowStat(Thyra::RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM,
981 out <<
"inv_row_sums = " << *inv_row_sums;
982 out <<
"row_sums = " << *row_sums;
985 Teuchos::rcp_dynamic_cast<Thyra::ScaledLinearOpBase<Scalar> >(thyraLinearOp,
true);
989 scaledOp->scaleLeft(*inv_row_sums);
991 rowStatOp->getRowStat(Thyra::RowStatLinearOpBaseUtils::ROW_STAT_ROW_SUM,
994 out <<
"row_sums after left scaling by inv_row_sum = " << *row_sums;
998 Scalar(row_sums->space()->dim()),
999 Thyra::sum<Scalar>(*row_sums),
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;
1012 #endif // HAVE_THYRA_TPETRA_EPETRA
1019 #define THYRA_TPETRA_THYRA_WRAPPERS_INSTANT(SCALAR) \
1021 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1022 convertTpetraToThyraComm, SCALAR ) \
1024 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1025 createVectorSpace, SCALAR ) \
1027 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1028 createVector, SCALAR ) \
1030 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1031 createConstVector, SCALAR ) \
1033 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1034 createMultiVector, SCALAR ) \
1036 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1037 createConstMultiVector, SCALAR ) \
1039 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1040 TeptraVectorSpace, SCALAR ) \
1042 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1043 vectorSpaceTester, SCALAR ) \
1045 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1046 vectorStdOpsTester, SCALAR ) \
1048 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1049 multiVectorStdOpsTester, SCALAR ) \
1051 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1052 getTpetraMultiVector, SCALAR ) \
1054 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1055 getConstTpetraMultiVector, SCALAR ) \
1057 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1058 TpetraLinearOp, SCALAR ) \
1060 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1061 createLinearOp, SCALAR ) \
1063 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1064 createConstLinearOp, SCALAR ) \
1066 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1067 TpetraLinearOp_EpetraRowMatrix, SCALAR ) \
1069 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1070 TpetraLinearOp_RowStatLinearOpBase, SCALAR ) \
1072 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( TpetraThyraWrappers, \
1073 TpetraLinearOp_ScaledLinearOpBase, SCALAR ) \