00001 /* @HEADER@ */ 00002 // 00003 /* @HEADER@ */ 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