PlayaParameterListPreconditionerFactory.cpp

00001 /* @HEADER@ */
00002 //
00003  /* @HEADER@ */
00004 
00005 
00006 #include "PlayaParameterListPreconditionerFactory.hpp"
00007 #include "PlayaGenericRightPreconditioner.hpp"
00008 
00009 #ifndef HAVE_TEUCHOS_EXPLICIT_INSTANTIATION
00010 #include "PlayaVectorImpl.hpp"
00011 #include "PlayaLinearOperatorImpl.hpp"
00012 #endif
00013 
00014 using namespace Playa;
00015 using namespace Teuchos;
00016 
00017 Preconditioner<double>  ParameterListPreconditionerFactory::
00018 createPreconditioner(const LinearOperator<double>& A) const 
00019 {
00020   const std::string& pType = params_.get<string>("Type");
00021 
00022   Preconditioner<double> rtn;
00023     
00024   if (pType=="ML")
00025   {
00026     std::string precType = params_.get<string>("Problem Type");
00027     ParameterList mlParams;
00028     ML_Epetra::SetDefaults(precType, mlParams);
00029     ParameterList::ConstIterator iter;
00030     ParameterList mlSettings = params_.sublist("ML Settings");
00031     for (iter=mlSettings.begin(); iter!=mlSettings.end(); ++iter)
00032     {
00033       const std::string& name = mlSettings.name(iter);
00034       const ParameterEntry& entry = mlSettings.entry(iter);
00035       mlParams.setEntry(name, entry);
00036     }
00037     RCP<LinearOperatorBase<double> > mlp 
00038       = rcp(new MLOperator(A, mlParams));
00039     LinearOperator<double> P = mlp;
00040     rtn = new GenericRightPreconditioner<double>(P);
00041   }
00042   else if (pType=="Ifpack")
00043   {
00044     ParameterList iluSettings = params_.sublist("Ifpack Settings");
00045     RCP<PreconditionerFactoryBase<double> > pf 
00046       = rcp(new ILUKPreconditionerFactory<double>(iluSettings));
00047     rtn = pf->createPreconditioner(A);
00048   }
00049   else
00050   {
00051     TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error,
00052       "preconditioner type=[" << pType << "] not recognized");
00053   }
00054 
00055   return rtn;
00056 }

doxygen