PlayaNonlinearSolverBuilder.cpp

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 

doxygen