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 #include "NOX_Multiphysics_Solver_Manager.H"
00040 #include "NOX_Multiphysics_DataExchange_Interface.H"
00041 #include "NOX_Multiphysics_Solver_FixedPointBased.H"
00042 #include "NOX_Utils.H"
00043 #include "Teuchos_RCP.hpp"
00044
00045
00046 NOX::Multiphysics::Solver::Manager::Manager(
00047 const Teuchos::RCP<vector<Teuchos::RCP<NOX::Solver::Generic> > >& solvers,
00048 const Teuchos::RCP<NOX::Multiphysics::DataExchange::Interface>& i,
00049 const Teuchos::RCP<NOX::StatusTest::Generic>& t,
00050 const Teuchos::RCP<Teuchos::ParameterList>& p) :
00051 utils(p->sublist("Printing")),
00052 method(""),
00053 cplPtr(NULL)
00054 {
00055 reset(solvers, i, t, p);
00056 }
00057
00058 NOX::Multiphysics::Solver::Manager::Manager(
00059 const Teuchos::RCP<NOX::Abstract::Group>& grp,
00060 const Teuchos::RCP<NOX::StatusTest::Generic>& t,
00061 const Teuchos::RCP<Teuchos::ParameterList>& p) :
00062 utils(p->sublist("Printing")),
00063 method(""),
00064 cplPtr(NULL)
00065 {
00066
00067 }
00068
00069 NOX::Multiphysics::Solver::Manager::Manager() :
00070 method(""),
00071 cplPtr(NULL)
00072 {
00073 }
00074
00075 NOX::Multiphysics::Solver::Manager::~Manager()
00076 {
00077 delete cplPtr;
00078 }
00079
00080 bool NOX::Multiphysics::Solver::Manager::reset(
00081 const Teuchos::RCP<vector<Teuchos::RCP<NOX::Solver::Generic> > >& solvers,
00082 const Teuchos::RCP<NOX::Multiphysics::DataExchange::Interface>& interface,
00083 const Teuchos::RCP<NOX::StatusTest::Generic>& tests,
00084 const Teuchos::RCP<Teuchos::ParameterList>& params)
00085 {
00086 string newmethod =
00087 params->get("Coupling Strategy", "Fixed Point Based");
00088
00089 if ((method == newmethod) && (cplPtr != NULL))
00090 {
00091 return cplPtr->reset(solvers, interface, tests, params);
00092 }
00093 else
00094 {
00095 method = newmethod;
00096
00097 delete cplPtr;
00098 cplPtr = NULL;
00099
00100 if( method == "Fixed Point Based" )
00101 {
00102 cplPtr = new NOX::Multiphysics::Solver::FixedPointBased(solvers, interface, tests, params);
00103 }
00104 else
00105 {
00106 utils.out() << "ERROR: NOX::Multiphysics::Solver::Manager::reset - Invalid solver choice " << method << endl;
00107 throw "NOX Error";
00108 }
00109
00110 if (cplPtr == NULL)
00111 {
00112 utils.err() << "NOX::Multiphysics::Solver::Manager::reset - Null pointer error" << endl;
00113 return false;
00114 }
00115
00116 return true;
00117 }
00118 }
00119
00120 void
00121 NOX::Multiphysics::Solver::Manager::reset(
00122 const NOX::Abstract::Vector& initialGuess,
00123 const Teuchos::RCP<NOX::StatusTest::Generic>& tests)
00124 {
00125 cplPtr->reset(initialGuess, tests);
00126 }
00127
00128 void
00129 NOX::Multiphysics::Solver::Manager::
00130 reset(const Abstract::Vector& initialGuess)
00131 {
00132 cplPtr->reset(initialGuess);
00133 }
00134
00135
00136 void NOX::Multiphysics::Solver::Manager::deprecated(const string& oldName, const string& newName) const
00137 {
00138 utils.out() << "Warning: NOX::Multiphysics::Solver::Manager::reset - "
00139 << "Nonlinear Solver choice \"" << oldName << "\" is deprecated.\n"
00140 << " "
00141 << "Use \"" << newName << "\" instead."
00142 << endl;
00143 }
00144
00145 NOX::StatusTest::StatusType NOX::Multiphysics::Solver::Manager::getStatus()
00146 {
00147 checkNullPtr("getStatus");
00148 return cplPtr->getStatus();
00149 }
00150
00151 NOX::StatusTest::StatusType NOX::Multiphysics::Solver::Manager::step()
00152 {
00153 checkNullPtr("step");
00154 return cplPtr->step();
00155 }
00156
00157 NOX::StatusTest::StatusType NOX::Multiphysics::Solver::Manager::solve()
00158 {
00159 checkNullPtr("solve");
00160 return cplPtr->solve();
00161 }
00162
00163 const NOX::Abstract::Group& NOX::Multiphysics::Solver::Manager::getSolutionGroup() const
00164 {
00165 checkNullPtr("getSolutionGroup");
00166 return cplPtr->getSolutionGroup();
00167 }
00168
00169 const NOX::Abstract::Group& NOX::Multiphysics::Solver::Manager::getPreviousSolutionGroup() const
00170 {
00171 checkNullPtr("getPreviousSolutionGroup");
00172 return cplPtr->getPreviousSolutionGroup();
00173 }
00174
00175 int NOX::Multiphysics::Solver::Manager::getNumIterations() const
00176 {
00177 if (cplPtr == NULL)
00178 return 0;
00179
00180 return cplPtr->getNumIterations();
00181 }
00182
00183 const Teuchos::ParameterList& NOX::Multiphysics::Solver::Manager::getList() const
00184 {
00185 checkNullPtr("getList");
00186 return cplPtr->getList();
00187 }
00188
00189
00190 void NOX::Multiphysics::Solver::Manager::checkNullPtr(const string& fname) const
00191 {
00192 if (cplPtr == NULL)
00193 {
00194 utils.out() << "NOX::Multiphysics::Solver::Manager::" << fname << " - Null pointer error" << endl;
00195 throw "NOX Error";
00196 }
00197 }
00198