Geomi
Step.hpp
1 #ifndef DEF_VARIATIONAL_STEP
2 #define DEF_VARIATIONAL_STEP
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 Step : 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
29  this->m_internals = internals;
30 
31  // NOX
32  this->m_solverParametersPtr = Teuchos::rcp(new Teuchos::ParameterList);
33  Teuchos::ParameterList& solverParameters = *m_solverParametersPtr;
34  solverParameters.set("Nonlinear Solver","Tensor Based");
35 
36  Teuchos::ParameterList& directionParameters
37  = solverParameters.sublist("Direction");
38  directionParameters.set("Method","Tensor");
39 
40  Teuchos::ParameterList& globalStrategyParameters
41  = solverParameters.sublist("Line Search");
42  globalStrategyParameters.set("Method","Curvilinear");
43 
44  Teuchos::ParameterList& lineSearchParameters
45  = globalStrategyParameters.sublist(globalStrategyParameters.get("Method","Curvilinear"));
46  lineSearchParameters.set("Lambda Selection","Halving");
47  lineSearchParameters.set("Max Iters",20);
48 
49  Teuchos::RCP<NOX::StatusTest::NormF> statusTestA
50  = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-8,NOX::StatusTest::NormF::Unscaled));
51  Teuchos::RCP<NOX::StatusTest::MaxIters> statusTestB
52  = Teuchos::rcp(new NOX::StatusTest::MaxIters(50));
53  this->m_statusTests = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR,statusTestA,statusTestB));
54 
55 
57  = static_cast<Abstract::StepInternals<T_M,T_Q,T_TQ>*>(this->m_internals);
58  this->m_grp = Teuchos::rcp(new NOXGroup<T_Q,1>(*tmp));
59  this->m_solver = NOX::Solver::buildSolver(this->m_grp,this->m_statusTests,this->m_solverParametersPtr);
60  }
61 
63  { }
64 
65  const bool
66  makeStep (void)
67  {
68  // TODO: a travailler !!
69  T_Q* q1 = new T_Q();
70  bool success = true;
71  bool verbose = false;
72 
73  try {
74  NOX::StatusTest::StatusType status = m_solver->solve();
75  const NOXGroup<T_Q,1>& solnGrp = dynamic_cast<const NOXGroup<T_Q,1>&>(m_solver->getSolutionGroup());
76  const NOXVector<T_Q::DOF>& solnVec = dynamic_cast<const NOXVector<T_Q::DOF>&>(solnGrp.getX());
77 
78  if (status != NOX::StatusTest::Converged)
79  success = false;
80  } TEUCHOS_STANDARD_CATCH_STATEMENTS(verbose, std::cerr, success);
81 
82  success &= this->m_internals->computeSolution();
83 
84  return success;
85  }
86 };
87 } // namespace Variational
88 
89 #endif
Definition: Abstract_Problem.hpp:10
Definition: NOXGroup.hpp:14
Definition: Abstract_Step.hpp:12
Definition: Abstract_LieProblem.hpp:6
Definition: Step.hpp:14
Definition: NOXVector.hpp:14