00001
00002
00003
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