Geomi
ImplicitEulerStep.hpp
1 #ifndef DEF_VARIATIONAL_IMPLICITEULERSTEP
2 #define DEF_VARIATIONAL_IMPLICITEULERSTEP
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  typename T_TQ>
14 class ImplicitEulerStep : public Abstract::Step<T_M,T_Q,T_TQ>
15 {
16 private:
17  Teuchos::RCP<Teuchos::ParameterList> m_solverParametersPtr;
18  Teuchos::RCP<NOX::StatusTest::Combo> m_statusTests;
19  Teuchos::RCP<NOXGroup<T_Q,1>> m_grp;
20  Teuchos::RCP<NOX::Solver::Generic> m_solver;
21 
22 public:
25  {
26  // m_internals is already initalized by base constructor, overriding
28  this->m_internals = internals;
29 
30  // NOX
31  this->m_solverParametersPtr = Teuchos::rcp(new Teuchos::ParameterList);
32  Teuchos::ParameterList& solverParameters = *m_solverParametersPtr;
33 
34  solverParameters.set("Nonlinear Solver","Line Search Based");
35  Teuchos::ParameterList& lineSearchParameters = solverParameters.sublist("Line Search");
36  lineSearchParameters.set("Method","Full Step");
37 
38  Teuchos::RCP<NOX::StatusTest::NormF> statusTestA = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-8,NOX::StatusTest::NormF::Unscaled));
39  Teuchos::RCP<NOX::StatusTest::MaxIters> statusTestB = Teuchos::rcp(new NOX::StatusTest::MaxIters(500));
40  this->m_statusTests = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR,statusTestA,statusTestB));
41 
43  this->m_grp = Teuchos::rcp(new NOXGroup<T_Q,1>(*tmp));
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(static_cast<ImplicitEulerStepInternals<T_M,T_Q,T_TQ>*>(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: Abstract_Step.hpp:12
Definition: Abstract_LieProblem.hpp:6
Definition: ImplicitEulerStepInternals.hpp:11
Definition: ImplicitEulerStep.hpp:14
Definition: NOXVector.hpp:14