PlayaLinearSolverBuilder.cpp

00001 /* @HEADER@ */
00002 //   
00003 /* @HEADER@ */
00004 
00005 #include "PlayaExceptions.hpp"
00006 #include "PlayaLinearSolverBuilder.hpp"
00007 #include "PlayaAmesosSolver.hpp"
00008 #include "PlayaAztecSolver.hpp"
00009 #include "PlayaBelosSolver.hpp"
00010 #include "PlayaBICGSTABSolverDecl.hpp"
00011 #include "PlayaBlockTriangularSolverDecl.hpp"
00012 #include "Teuchos_XMLParameterListReader.hpp"
00013 #include "Teuchos_ParameterXMLFileReader.hpp"
00014 
00015 #ifndef HAVE_TEUCHOS_EXPLICIT_INSTANTIATION
00016 #include "PlayaVectorImpl.hpp"
00017 #include "PlayaLinearOperatorImpl.hpp"
00018 #include "PlayaLinearSolverImpl.hpp"
00019 #include "PlayaBICGSTABSolverImpl.hpp"
00020 #include "PlayaBlockTriangularSolverImpl.hpp"
00021 #endif
00022 
00023 using namespace Playa;
00024 using namespace PlayaExprTemplates;
00025 using namespace Teuchos;
00026 
00027 
00028 LinearSolver<double> LinearSolverBuilder::createSolver(const std::string& filename)
00029 {
00030   ParameterXMLFileReader reader(filename);
00031   ParameterList solverParams = reader.getParameters();
00032   return createSolver(solverParams);
00033 }
00034 
00035 
00036 
00037 LinearSolver<double> LinearSolverBuilder::createSolver(const ParameterList& params, int verb)
00038 {
00039   TEUCHOS_TEST_FOR_EXCEPTION(!params.isSublist("Linear Solver"), std::runtime_error,
00040     "did not find Linear Solver sublist in " << params);
00041 
00042   ParameterList solverSublist = params.sublist("Linear Solver");
00043 
00044   const std::string& solverType = getParameter<string>(solverSublist, "Type");
00045 
00046   Tabs tab;
00047   PLAYA_MSG1(verb, tab << "Solver builder creating a solver of type="
00048     << solverType);
00049   Tabs tab2;
00050   PLAYA_MSG2(verb, tab2 << "params = " << solverSublist);
00051 
00052   if (solverType=="Aztec")
00053   {
00054     return new AztecSolver(solverSublist);
00055   }
00056   else if (solverType=="Playa" || solverType=="TSF")
00057   {
00058     const std::string& solverMethod = getParameter<string>(solverSublist, "Method");
00059     if (solverMethod=="BICGSTAB") 
00060     {
00061       return new BICGSTABSolver<double>(solverSublist);
00062     }
00063     else if (solverMethod=="GMRES")
00064     {
00065       TEUCHOS_TEST_FOR_EXCEPTION(true, RuntimeError, "Playa GMRES solver not implemented");
00066     }
00067   }
00068   else if (solverType=="Amesos")
00069   {
00070     return new AmesosSolver(solverSublist);
00071   }
00072   else if (solverType=="Belos")
00073   {
00074     return new BelosSolver(solverSublist);
00075   }
00076   else if (solverType=="Block Triangular")
00077   {
00078     ParameterList subSolverParams = solverSublist.sublist("Sub Solver");
00079     LinearSolver<double> subSolver = createSolver(subSolverParams);
00080     return new BlockTriangularSolver<double>(subSolver);
00081   }
00082 
00083   TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error, 
00084     "Could not create a solver from parameter list " 
00085     << params);
00086   return LinearSolver<double>();
00087     
00088 }
00089 

doxygen