Geomi
DiagonalStep.hpp
1 #ifndef DEF_RKMK_DIAGONALSTEP
2 #define DEF_RKMK_DIAGONALSTEP
3 
4 #include <NOX.H>
5 #include <NOX_Common.H>
6 #include <NOX_Utils.H>
7 #include <Teuchos_StandardCatchMacros.hpp>
8 
9 namespace RKMK {
10 
22 template <typename T_LIE_ALGEBRA,
23  int T_N_INTERNAL_STAGES,
24  typename T_M = double>
25 class DiagonalStep : public Abstract::Step<T_LIE_ALGEBRA,T_N_INTERNAL_STAGES,T_M>
26 {
27 private:
28  Teuchos::RCP<Teuchos::ParameterList> m_solverParametersPtr;
29  Teuchos::RCP<NOX::StatusTest::Combo> m_statusTests;
30  Teuchos::RCP<NOXGroup<NOXVector<T_LIE_ALGEBRA::DOF>,T_N_INTERNAL_STAGES>>
31  m_grp;
32  Teuchos::RCP<NOX::Solver::Generic> m_solver;
33 
34 public:
37  {
38  // m_internals is already initalized by base constructor, overriding
41  this->m_internals = internals;
42 
43  // NOX
44  this->m_solverParametersPtr = Teuchos::rcp(new Teuchos::ParameterList);
45  Teuchos::ParameterList& solverParameters = *m_solverParametersPtr;
46  solverParameters.set("Nonlinear Solver","Tensor Based");
47 
48  Teuchos::ParameterList& directionParameters = solverParameters.sublist("Direction");
49  directionParameters.set("Method","Tensor");
50 
51  Teuchos::ParameterList& globalStrategyParameters = solverParameters.sublist("Line Search");
52  globalStrategyParameters.set("Method","Curvilinear");
53 
54  Teuchos::ParameterList& lineSearchParameters = globalStrategyParameters.sublist(globalStrategyParameters.get("Method","Curvilinear"));
55  lineSearchParameters.set("Lambda Selection","Halving");
56  lineSearchParameters.set("Max Iters",20);
57 
58  Teuchos::RCP<NOX::StatusTest::NormF> statusTestA = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-8,NOX::StatusTest::NormF::Unscaled));
59  Teuchos::RCP<NOX::StatusTest::MaxIters> statusTestB = Teuchos::rcp(new NOX::StatusTest::MaxIters(50));
60  this->m_statusTests = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR,statusTestA,statusTestB));
61 
62 
64  this->m_grp = Teuchos::rcp(new NOXGroup<NOXVector<T_LIE_ALGEBRA::DOF>,T_N_INTERNAL_STAGES>(*tmp));
65  this->m_solver = NOX::Solver::buildSolver(this->m_grp,this->m_statusTests,this->m_solverParametersPtr);
66  }
67 
69  { }
70 
72  makeStep (void)
73  {
74  // TODO: faire des tests pour voir si tout se passe bien
76  bool success = true;
77  bool verbose = false;
78 
79  for (int i=0; i<T_N_INTERNAL_STAGES; i++) {
80  try {
81  (static_cast<DiagonalStepInternals<T_LIE_ALGEBRA,T_N_INTERNAL_STAGES,T_M>*>(this->m_internals))->currentStep(i);
82  NOX::StatusTest::StatusType status = m_solver->solve();
83  const NOXGroup<NOXVector<T_LIE_ALGEBRA::DOF>,1>& solnGrp = dynamic_cast<const NOXGroup<NOXVector<T_LIE_ALGEBRA::DOF>,1>&>(m_solver->getSolutionGroup());
84  const NOXVector<T_LIE_ALGEBRA::DOF>& solnVec = dynamic_cast<const NOXVector<T_LIE_ALGEBRA::DOF>&>(solnGrp.getX());
85  (static_cast<DiagonalStepInternals<T_LIE_ALGEBRA,T_N_INTERNAL_STAGES,T_M>*>(this->m_internals))->setSolutionK(solnVec);
86 
87  if (status != NOX::StatusTest::Converged)
88  success = false;
89  } TEUCHOS_STANDARD_CATCH_STATEMENTS(verbose, std::cerr, success);
90  }
91 
92  success &= this->m_internals->computeSolution();
93  *Y1 = this->m_internals->reconstruct();
94 
95  return *Y1;
96  }
97 };
98 } // namespace RKMK
99 
100 #endif
Definition: DiagonalStepInternals.hpp:14
Definition: Abstract_Problem.hpp:10
Definition: NOXGroup.hpp:14
Definition: Abstract_Integrator.hpp:4
Definition: DiagonalStep.hpp:25
Definition: Abstract_Step.hpp:18