Geomi
EulerStep.hpp
1 #ifndef DEF_VARIATIONAL_EULERSTEP
2 #define DEF_VARIATIONAL_EULERSTEP
3 
4 #include <NOX.H>
5 #include <NOX_Common.H>
6 #include <NOX_Utils.H>
7 #include <Teuchos_StandardCatchMacros.hpp>
8 
9 namespace Variational {
10 
11 template <typename T_M,
12  typename T_Q>
13 class EulerStep : public Abstract::Step<T_M,T_Q,EulerStepInternals<T_M,T_Q>,Abstract::Problem<T_M,T_Q>>
14 {
17 
18 private:
19  Teuchos::RCP<Teuchos::ParameterList> m_solverParametersPtr;
20  Teuchos::RCP<NOX::StatusTest::Combo> m_statusTests;
21  Teuchos::RCP<NOXGroup<T_Q,1>> m_grp;
22  Teuchos::RCP<NOX::Solver::Generic> m_solver;
23 
24 public:
25  EulerStep<T_M,T_Q> (Problem& problem)
27  {
28  // m_internals is already initalized by base constructor, so this is useless
29  //this->m_internals = new Internals(problem);
30 
31  // NOX
32  this->m_solverParametersPtr = Teuchos::rcp(new Teuchos::ParameterList);
33  Teuchos::ParameterList& solverParameters = *m_solverParametersPtr;
34 
35  solverParameters.set("Nonlinear Solver","Line Search Based");
36  Teuchos::ParameterList& lineSearchParameters = solverParameters.sublist("Line Search");
37  lineSearchParameters.set("Method","Full Step");
38 
39  Teuchos::RCP<NOX::StatusTest::NormF> statusTestA = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-8,NOX::StatusTest::NormF::Unscaled));
40  Teuchos::RCP<NOX::StatusTest::MaxIters> statusTestB = Teuchos::rcp(new NOX::StatusTest::MaxIters(500));
41  this->m_statusTests = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR,statusTestA,statusTestB));
42 
43  this->m_grp = Teuchos::rcp(new NOXGroup<T_Q,1>(*(this->m_internals)));
44  this->m_solver = NOX::Solver::buildSolver(this->m_grp,this->m_statusTests,this->m_solverParametersPtr);
45  }
46 
48  { }
49 
50  void
51  setData (T_M h_var, T_Q q0_var, T_Q q1_var)
52  { this->m_internals->setData(h_var,q0_var,q1_var); }
53 
54  void
55  initialize (void)
56  { }
57 
58  const T_Q
59  makeStep (void)
60  {
61  // TODO: faire des tests pour voir si tout se passe bien
62  bool success = true;
63  bool verbose = false;
64 
65  try {
66  m_solver->reset(this->m_internals->getInitialGuess());
67  NOX::StatusTest::StatusType status = m_solver->solve();
68  const NOXGroup<T_Q,1>& solnGrp = dynamic_cast<const NOXGroup<T_Q,1>&>(m_solver->getSolutionGroup());
69  const NOXVector<T_Q::DOF>& solnVec = dynamic_cast<const NOXVector<T_Q::DOF>&>(solnGrp.getX());
70 
71  if (status != NOX::StatusTest::Converged)
72  success = false;
73 
74  T_Q solution(solnVec);
75 
76  return solution;
77  } TEUCHOS_STANDARD_CATCH_STATEMENTS(verbose, std::cerr, success);
78  }
79 };
80 } // namespace Variational
81 
82 #endif
Definition: Abstract_Problem.hpp:10
Definition: NOXGroup.hpp:14
Definition: EulerStep.hpp:13
Definition: Abstract_Step.hpp:12
Definition: Abstract_LieProblem.hpp:6
Definition: EulerStepInternals.hpp:10
Definition: NOXVector.hpp:14