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