PlayaNonlinearSolverBuilder.cpp
00001
00002
00003
00004
00005 #include "PlayaExceptions.hpp"
00006 #include "PlayaNonlinearSolverBuilder.hpp"
00007 #include "PlayaLinearSolverBuilder.hpp"
00008 #include "PlayaNOXSolver.hpp"
00009 #include "PlayaNewtonArmijoSolverImpl.hpp"
00010 #include "PlayaLinearCombinationImpl.hpp"
00011 #include "Teuchos_ParameterXMLFileReader.hpp"
00012
00013 #ifndef HAVE_TEUCHOS_EXPLICIT_INSTANTIATION
00014 #include "PlayaVectorImpl.hpp"
00015 #include "PlayaLinearOperatorImpl.hpp"
00016 #include "PlayaLinearSolverImpl.hpp"
00017 #endif
00018
00019 using namespace Playa;
00020 using namespace PlayaExprTemplates;
00021 using namespace Teuchos;
00022
00023
00024 NonlinearSolver<double> NonlinearSolverBuilder::createSolver(const std::string& filename)
00025 {
00026 ParameterXMLFileReader reader(filename);
00027 ParameterList solverParams = reader.getParameters();
00028 return createSolver(solverParams);
00029 }
00030
00031
00032
00033 NonlinearSolver<double> NonlinearSolverBuilder::createSolver(const ParameterList& params)
00034 {
00035 if (params.isSublist("NOX Solver"))
00036 {
00037 return new NOXSolver(params);
00038 }
00039 else if (params.isSublist("Nonlinear Solver"))
00040 {
00041 ParameterList sub = params.sublist("Nonlinear Solver");
00042 Array<string> names = tuple<string>("Newton Armijo Solver", "Newton-Armijo Solver", "NewtonArmijoSolver");
00043 for (int i=0; i<names.size(); i++)
00044 {
00045 if (sub.isSublist(names[i]))
00046 {
00047 ParameterList subsub = sub.sublist(names[i]);
00048 LinearSolver<double> linSolver;
00049 if (subsub.isParameter("Linear Solver"))
00050 {
00051 string solverFile = subsub.get<string>("Linear Solver");
00052 linSolver = LinearSolverBuilder::createSolver(solverFile);
00053 }
00054 else if (subsub.isSublist("Linear Solver"))
00055 {
00056 linSolver = LinearSolverBuilder::createSolver(subsub);
00057 }
00058 else
00059 {
00060 TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error,
00061 "Nonlinear solver parameter list " << sub
00062 << " does not appear to specify a solver for the linear subproblems");
00063 }
00064 return new NewtonArmijoSolver<double>(subsub, linSolver);
00065 }
00066 }
00067 }
00068 else
00069 {
00070 TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error,
00071 "Nonlinear solver parameter list " << params
00072 << " can't be parsed to find a nonlinear solver");
00073 }
00074
00075 return NonlinearSolver<double>();
00076
00077 }
00078