TEUCHOS_UNIT_TEST(tStratimikosFactory, test_RelatedFunctions) { using Teuchos::RCP; using Teuchos::ParameterList; // build global (or serial communicator) #ifdef HAVE_MPI Epetra_MpiComm comm(MPI_COMM_WORLD); #else Epetra_SerialComm comm; #endif // build epetra operator RCP<Epetra_Operator> eA = buildStridedSystem(comm,5); RCP<Thyra::LinearOpBase<double> > tA = Thyra::nonconstEpetraLinearOp(eA); { // build stratimikos factory, adding Teko's version Stratimikos::DefaultLinearSolverBuilder stratFactory; Teko::addTekoToStratimikosBuilder(stratFactory); TEST_THROW(Teko::addTekoToStratimikosBuilder(stratFactory),std::logic_error); Teko::addTekoToStratimikosBuilder(stratFactory,"Teko-2"); TEST_NOTHROW(stratFactory.getValidParameters()->sublist("Preconditioner Types").sublist("Teko")); TEST_NOTHROW(stratFactory.getValidParameters()->sublist("Preconditioner Types").sublist("Teko-2")); } { Teuchos::RCP<Teko::RequestHandler> rh = Teuchos::rcp(new Teko::RequestHandler); // build stratimikos factory, adding Teko's version Stratimikos::DefaultLinearSolverBuilder stratFactory; Teko::addTekoToStratimikosBuilder(stratFactory,rh); TEST_THROW(Teko::addTekoToStratimikosBuilder(stratFactory,rh),std::logic_error); Teko::addTekoToStratimikosBuilder(stratFactory,rh,"Teko-2"); TEST_NOTHROW(stratFactory.getValidParameters()->sublist("Preconditioner Types").sublist("Teko")); TEST_NOTHROW(stratFactory.getValidParameters()->sublist("Preconditioner Types").sublist("Teko-2")); RCP<ParameterList> params = Teuchos::rcp(new ParameterList(*stratFactory.getValidParameters())); ParameterList & tekoList = params->sublist("Preconditioner Types").sublist("Teko"); tekoList.set("Write Block Operator", false); tekoList.set("Test Block Operator", false); tekoList.set("Strided Blocking","1 1"); tekoList.set("Inverse Type","BGS"); ParameterList & ifl = tekoList.sublist("Inverse Factory Library"); ifl.sublist("BGS").set("Type","Block Gauss-Seidel"); ifl.sublist("BGS").set("Inverse Type","Amesos"); stratFactory.setParameterList(params); RCP<Teko::StratimikosFactory> precFactory = Teuchos::rcp_dynamic_cast<Teko::StratimikosFactory>(stratFactory.createPreconditioningStrategy("Teko-2")); TEST_EQUALITY(precFactory->getRequestHandler(),rh); } }
TEUCHOS_UNIT_TEST(tStratimikosFactory, test_Defaults) { using Teuchos::RCP; using Teuchos::ParameterList; // build global (or serial communicator) #ifdef HAVE_MPI Epetra_MpiComm comm(MPI_COMM_WORLD); #else Epetra_SerialComm comm; #endif // build epetra operator RCP<Epetra_Operator> eA = buildSystem(comm,5); RCP<Thyra::LinearOpBase<double> > tA = Thyra::nonconstEpetraLinearOp(eA); // build stratimikos factory, adding Teko's version Stratimikos::DefaultLinearSolverBuilder stratFactory; stratFactory.setPreconditioningStrategyFactory( Teuchos::abstractFactoryStd<Thyra::PreconditionerFactoryBase<double>,Teko::StratimikosFactory>(), "Teko"); RCP<const ParameterList> validParams = stratFactory.getValidParameters(); stratFactory.setParameterList(Teuchos::rcp(new Teuchos::ParameterList(*validParams))); // print out Teko's parameter list and fail if it doesn't exist! TEST_NOTHROW(validParams->sublist("Preconditioner Types").sublist("Teko").print(out, ParameterList::PrintOptions().showDoc(true).indent(2).showTypes(true))); // build teko preconditioner factory RCP<Thyra::PreconditionerFactoryBase<double> > precFactory = stratFactory.createPreconditioningStrategy("Teko"); // make sure factory is built TEST_ASSERT(precFactory!=Teuchos::null); // build preconditioner RCP<Thyra::PreconditionerBase<double> > prec = Thyra::prec<double>(*precFactory,tA); TEST_ASSERT(prec!=Teuchos::null); // build an operator to test against RCP<const Teko::InverseLibrary> invLib = Teko::InverseLibrary::buildFromStratimikos(); RCP<const Teko::InverseFactory> invFact = invLib->getInverseFactory("Amesos"); Teko::LinearOp testOp = Teko::buildInverse(*invFact,tA); Teko::LinearOp precOp = prec->getUnspecifiedPrecOp(); TEST_ASSERT(precOp!=Teuchos::null); Thyra::LinearOpTester<double> tester; tester.show_all_tests(true); tester.set_all_error_tol(0); TEST_ASSERT(tester.compare(*precOp,*testOp,Teuchos::ptrFromRef(out))); }
TEUCHOS_UNIT_TEST(tStratimikosFactory, test_MultipleCalls) { using Teuchos::RCP; using Teuchos::ParameterList; // build global (or serial communicator) #ifdef HAVE_MPI Epetra_MpiComm comm(MPI_COMM_WORLD); #else Epetra_SerialComm comm; #endif // build epetra operator RCP<Epetra_Operator> eA = buildStridedSystem(comm,5); RCP<Thyra::LinearOpBase<double> > tA = Thyra::nonconstEpetraLinearOp(eA); Stratimikos::DefaultLinearSolverBuilder stratFactory; RCP<ParameterList> params = Teuchos::rcp(new ParameterList(*stratFactory.getValidParameters())); ParameterList & tekoList = params->sublist("Preconditioner Types").sublist("Teko"); tekoList.set("Write Block Operator", false); tekoList.set("Test Block Operator", false); tekoList.set("Strided Blocking","1 1"); tekoList.set("Inverse Type","BGS"); ParameterList & ifl = tekoList.sublist("Inverse Factory Library"); ifl.sublist("BGS").set("Type","Block Gauss-Seidel"); ifl.sublist("BGS").set("Inverse Type","Amesos"); Teko::addTekoToStratimikosBuilder(stratFactory,"Teko"); stratFactory.setParameterList(params); RCP<Thyra::PreconditionerFactoryBase<double> > precFactory = stratFactory.createPreconditioningStrategy("Teko"); // build teko preconditioner factory RCP<Thyra::PreconditionerBase<double> > prec_a = Thyra::prec<double>(*precFactory,tA); Teko::LinearOp precOp_a = prec_a->getUnspecifiedPrecOp(); TEST_ASSERT(precOp_a!=Teuchos::null); // try to do it again RCP<Thyra::PreconditionerBase<double> > prec_b = Thyra::prec<double>(*precFactory,tA); Teko::LinearOp precOp_b = prec_b->getUnspecifiedPrecOp(); TEST_ASSERT(precOp_b!=Teuchos::null); }
TEUCHOS_UNIT_TEST(tStratimikosFactory, test_multi_use) { using Teuchos::RCP; using Teuchos::ParameterList; // build global (or serial communicator) #ifdef HAVE_MPI Epetra_MpiComm comm(MPI_COMM_WORLD); #else Epetra_SerialComm comm; #endif // build epetra operator RCP<Epetra_Operator> eA = buildSystem(comm,5); RCP<Thyra::LinearOpBase<double> > tA = Thyra::nonconstEpetraLinearOp(eA); // build stratimikos factory, adding Teko's version Stratimikos::DefaultLinearSolverBuilder stratFactory; stratFactory.setPreconditioningStrategyFactory( Teuchos::abstractFactoryStd<Thyra::PreconditionerFactoryBase<double>,Teko::StratimikosFactory>(), "Teko"); RCP<const ParameterList> validParams = stratFactory.getValidParameters(); stratFactory.setParameterList(Teuchos::rcp(new Teuchos::ParameterList(*validParams))); // print out Teko's parameter list and fail if it doesn't exist! TEST_NOTHROW(validParams->sublist("Preconditioner Types").sublist("Teko").print(out, ParameterList::PrintOptions().showDoc(true).indent(2).showTypes(true))); // build teko preconditioner factory RCP<Thyra::PreconditionerFactoryBase<double> > precFactory = stratFactory.createPreconditioningStrategy("Teko"); // make sure factory is built TEST_ASSERT(precFactory!=Teuchos::null); // try using a different preconditioner each time RCP<Thyra::PreconditionerBase<double> > prec; for(int i=0;i<2;i++) { prec = precFactory->createPrec(); RCP<const Thyra::LinearOpSourceBase<double> > losb = rcp(new Thyra::DefaultLinearOpSource<double>(tA)); precFactory->initializePrec(losb,prec.get()); RCP<Teko::StratimikosFactory> stratFact = rcp_dynamic_cast<Teko::StratimikosFactory>(precFactory); const std::vector<int> & decomp = stratFact->getDecomposition(); TEST_EQUALITY(decomp.size(),1); TEST_EQUALITY(decomp[0],1); } // try using a single preconditioner multiple times prec = precFactory->createPrec(); for(int i=0;i<2;i++) { RCP<const Thyra::LinearOpSourceBase<double> > losb = rcp(new Thyra::DefaultLinearOpSource<double>(tA)); precFactory->initializePrec(losb,prec.get()); RCP<Teko::StratimikosFactory> stratFact = rcp_dynamic_cast<Teko::StratimikosFactory>(precFactory); const std::vector<int> & decomp = stratFact->getDecomposition(); TEST_EQUALITY(decomp.size(),1); TEST_EQUALITY(decomp[0],1); } }
TEUCHOS_UNIT_TEST(tStratimikosFactory, test_BlockGaussSeidel) { using Teuchos::RCP; using Teuchos::ParameterList; // build global (or serial communicator) #ifdef HAVE_MPI Epetra_MpiComm comm(MPI_COMM_WORLD); #else Epetra_SerialComm comm; #endif // build epetra operator RCP<Epetra_Operator> eA = buildStridedSystem(comm,5); RCP<Thyra::LinearOpBase<double> > tA = Thyra::nonconstEpetraLinearOp(eA); // build stratimikos factory, adding Teko's version Stratimikos::DefaultLinearSolverBuilder stratFactory; stratFactory.setPreconditioningStrategyFactory( Teuchos::abstractFactoryStd<Thyra::PreconditionerFactoryBase<double>,Teko::StratimikosFactory>(), "Teko"); RCP<ParameterList> params = Teuchos::rcp(new ParameterList(*stratFactory.getValidParameters())); ParameterList & tekoList = params->sublist("Preconditioner Types").sublist("Teko"); tekoList.set("Write Block Operator", false); tekoList.set("Test Block Operator", false); tekoList.set("Strided Blocking","1 1"); tekoList.set("Inverse Type","BGS"); ParameterList & ifl = tekoList.sublist("Inverse Factory Library"); ifl.sublist("BGS").set("Type","Block Gauss-Seidel"); ifl.sublist("BGS").set("Inverse Type","Amesos"); // RCP<Thyra::PreconditionerFactoryBase<double> > precFactory // = stratFactory.createPreconditioningStrategy("Teko"); // build operator to test against Teko::LinearOp testOp; { Teuchos::ParameterList iflCopy(ifl); RCP<Epetra_Operator> strided_eA = Teuchos::rcp(new Teko::Epetra::StridedEpetraOperator(2,eA)); RCP<Teko::InverseLibrary> invLib = Teko::InverseLibrary::buildFromParameterList(iflCopy); RCP<const Teko::InverseFactory> invFact = invLib->getInverseFactory("BGS"); RCP<Teko::Epetra::InverseFactoryOperator> invFactOp = Teuchos::rcp(new Teko::Epetra::InverseFactoryOperator(invFact)); invFactOp->buildInverseOperator(strided_eA); testOp = Thyra::epetraLinearOp(invFactOp,Thyra::NOTRANS,Thyra::EPETRA_OP_APPLY_APPLY_INVERSE); } stratFactory.setParameterList(params); RCP<Thyra::PreconditionerFactoryBase<double> > precFactory = stratFactory.createPreconditioningStrategy("Teko"); // build teko preconditioner factory RCP<Thyra::PreconditionerBase<double> > prec = Thyra::prec<double>(*precFactory,tA); Teko::LinearOp precOp = prec->getUnspecifiedPrecOp(); TEST_ASSERT(precOp!=Teuchos::null); Thyra::LinearOpTester<double> tester; tester.show_all_tests(true); tester.set_all_error_tol(0); TEST_ASSERT(tester.compare(*precOp,*testOp,Teuchos::ptrFromRef(out))); }