Geomi
GalerkinStep.hpp
1 #ifndef DEF_VARIATIONAL_GALERKINSTEP
2 #define DEF_VARIATIONAL_GALERKINSTEP
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  int T_N_STEPS>
15 class GalerkinStep : public Abstract::Step<T_M,T_Q,T_TQ>
16 {
17 private:
18  Teuchos::RCP<Teuchos::ParameterList> m_solverParametersPtr;
19  Teuchos::RCP<NOX::StatusTest::Combo> m_statusTests;
20  Teuchos::RCP<NOXGroup<T_Q,T_N_STEPS>> m_grp;
21  Teuchos::RCP<NOX::Solver::Generic> m_solver;
22 
23 public:
26  {
27  // m_internals is already initalized by base constructor, overriding
28  // since we use quad_deg = T_N_STEPS, only creates PsNsQ2sGau integrators
30  this->m_internals = internals;
31 
32  // NOX
33  this->m_solverParametersPtr = Teuchos::rcp(new Teuchos::ParameterList);
34  Teuchos::ParameterList& solverParameters = *m_solverParametersPtr;
35 
36  solverParameters.set("Nonlinear Solver","Line Search Based");
37  Teuchos::ParameterList& lineSearchParameters = solverParameters.sublist("Line Search");
38  lineSearchParameters.set("Method","Full Step");
39 
40  Teuchos::RCP<NOX::StatusTest::NormF> statusTestA = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-8,NOX::StatusTest::NormF::Unscaled));
41  Teuchos::RCP<NOX::StatusTest::MaxIters> statusTestB = Teuchos::rcp(new NOX::StatusTest::MaxIters(10));
42  this->m_statusTests = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR,statusTestA,statusTestB));
43 
44  this->m_grp = Teuchos::rcp(new NOXGroup<T_Q,T_N_STEPS>(*internals));
45  this->m_solver = NOX::Solver::buildSolver(this->m_grp,this->m_statusTests,this->m_solverParametersPtr);
46  }
47 
49  { }
50 
51  void
52  setData (T_M h_var, T_Q q0_var, T_Q q1_var)
53  { static_cast<GalerkinStepInternals<T_M,T_Q,T_TQ,T_N_STEPS>*>(this->m_internals)->setData(h_var,q0_var,q1_var); }
54 
55  void
56  initialize ()
57  {
58  if (T_N_STEPS==1)
59  return;
60 
61  bool success = true;
62  bool verbose = false;
63 
66  Teuchos::RCP<NOXGroup<T_Q,T_N_STEPS-1>> grp = Teuchos::rcp(new NOXGroup<T_Q,T_N_STEPS-1>(*init));
67  Teuchos::RCP<NOX::Solver::Generic> solver = NOX::Solver::buildSolver(grp,this->m_statusTests,this->m_solverParametersPtr);
68 
69  try {
70  solver->reset(init->getInitialGuess());
71  NOX::StatusTest::StatusType status = solver->solve();
72  const NOXGroup<T_Q,T_N_STEPS-1>& solnGrp = dynamic_cast<const NOXGroup<T_Q,T_N_STEPS-1>&>(m_solver->getSolutionGroup());
73  const NOXVector<T_Q::DOF*(T_N_STEPS-1)>& solnVec = dynamic_cast<const NOXVector<T_Q::DOF*(T_N_STEPS-1)>&>(solnGrp.getX());
74  init->updateInitialPosition(solnVec);
75 
76  if (status != NOX::StatusTest::Converged)
77  success = false;
78 
79  } TEUCHOS_STANDARD_CATCH_STATEMENTS(verbose, std::cerr, success);
80 
81  }
82 
83  const T_Q
84  makeStep (void)
85  {
86  bool success = true;
87  bool verbose = false;
88 
89  try {
90  m_solver->reset(static_cast<GalerkinStepInternals<T_M,T_Q,T_TQ,T_N_STEPS>*>(this->m_internals)->getInitialGuess());
91  NOX::StatusTest::StatusType status = m_solver->solve();
92  const NOXGroup<T_Q,T_N_STEPS>& solnGrp = dynamic_cast<const NOXGroup<T_Q,T_N_STEPS>&>(m_solver->getSolutionGroup());
93  const NOXVector<T_Q::DOF*T_N_STEPS>& solnVec = dynamic_cast<const NOXVector<T_Q::DOF*T_N_STEPS>&>(solnGrp.getX());
94  static_cast<GalerkinStepInternals<T_M,T_Q,T_TQ,T_N_STEPS>*>(this->m_internals)->updatePosition(solnVec);
95 
96  if (status != NOX::StatusTest::Converged)
97  success = false;
98 
99  T_Q solution(solnVec.segment((T_N_STEPS-1)*T_Q::DOF,T_Q::DOF));
100 
101  return solution;
102  } TEUCHOS_STANDARD_CATCH_STATEMENTS(verbose, std::cerr, success);
103  }
104 };
105 } // namespace Variational
106 
107 #endif
Definition: GalerkinStepInternals.hpp:484
Definition: Abstract_Problem.hpp:10
Definition: NOXGroup.hpp:14
Definition: Abstract_Step.hpp:12
Definition: Abstract_LieProblem.hpp:6
Definition: GalerkinStepInternals.hpp:118
Definition: GalerkinStep.hpp:15
Definition: NOXVector.hpp:14