Geomi
CovariantStep.hpp
1 #ifndef DEF_VARIATIONAL_COVARIANTSTEP
2 #define DEF_VARIATIONAL_COVARIANTSTEP
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_ALGEBRA>
14 class CovariantStep : public Abstract::Step<T_M,
15  T_Q,
16  CovariantStepInternals<T_M,T_Q,T_ALGEBRA>,
17  Abstract::LieProblem<T_M,T_Q,T_ALGEBRA>,
18  T_ALGEBRA>
19 {
22 
23 private:
24  Teuchos::RCP<Teuchos::ParameterList> m_solverParametersPtr;
25  Teuchos::RCP<NOX::StatusTest::Combo> m_statusTests;
26  Teuchos::RCP<NOXGroup<T_ALGEBRA,1>> m_grp;
27  Teuchos::RCP<NOX::Solver::Generic> m_solver;
28 
29 public:
32  {
33  // NOX
34  this->m_solverParametersPtr = Teuchos::rcp(new Teuchos::ParameterList);
35  Teuchos::ParameterList& solverParameters = *m_solverParametersPtr;
36 
37  solverParameters.set("Nonlinear Solver","Line Search Based");
38  Teuchos::ParameterList& lineSearchParameters = solverParameters.sublist("Line Search");
39  lineSearchParameters.set("Method","Full Step");
40 
41  Teuchos::RCP<NOX::StatusTest::NormF> statusTestA = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-8,NOX::StatusTest::NormF::Unscaled));
42  Teuchos::RCP<NOX::StatusTest::MaxIters> statusTestB = Teuchos::rcp(new NOX::StatusTest::MaxIters(200));
43  this->m_statusTests = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR,statusTestA,statusTestB));
44 
45  this->m_grp = Teuchos::rcp(new NOXGroup<T_ALGEBRA,1>(*(this->m_internals)));
46  this->m_solver = NOX::Solver::buildSolver(this->m_grp,this->m_statusTests,this->m_solverParametersPtr);
47  }
48 
50  { }
51 
52  void
53  setData (T_M h_var, T_Q q0_var, T_Q q1_var)
54  { this->m_internals->setData(h_var,q0_var,q1_var); }
55 
56  void
57  initialize (void)
58  { }
59 
60  const T_Q
61  makeStep (void)
62  {
63  bool success = true;
64  bool verbose = false;
65 
66  try {
67  m_solver->reset(this->m_internals->getInitialGuess());
68  NOX::StatusTest::StatusType status = m_solver->solve();
69  const NOXGroup<T_ALGEBRA,1>& solnGrp = dynamic_cast<const NOXGroup<T_ALGEBRA,1>&>(m_solver->getSolutionGroup());
70  const NOXVector<T_ALGEBRA::DOF>& solnVec = dynamic_cast<const NOXVector<T_ALGEBRA::DOF>&>(solnGrp.getX());
71 
72  if (status != NOX::StatusTest::Converged)
73  success = false;
74 
75  T_Q solution = this->m_internals->q1()*(this->m_internals->h()*T_ALGEBRA(solnVec)).cay();
76 
77  return solution;
78  } TEUCHOS_STANDARD_CATCH_STATEMENTS(verbose, std::cerr, success);
79  }
80 };
81 } // namespace Variational
82 
83 #endif
Definition: NOXGroup.hpp:14
Definition: Abstract_Step.hpp:12
Definition: Abstract_LieProblem.hpp:6
Definition: CovariantStep.hpp:14
Definition: Abstract_LieProblem.hpp:10
Definition: CovariantStepInternals.hpp:11
Definition: NOXVector.hpp:14