VertexCFD  0.0-dev
VertexCFD_TempusObserver_ResponseOutput_impl.hpp
1 #ifndef VERTEXCFD_TEMPUSOBSERVER_RESPONSEOUTPUT_IMPL_HPP
2 #define VERTEXCFD_TEMPUSOBSERVER_RESPONSEOUTPUT_IMPL_HPP
3 
4 #include <iomanip>
5 #include <iostream>
6 #include <utility>
7 
8 namespace VertexCFD
9 {
10 namespace TempusObserver
11 {
12 //---------------------------------------------------------------------------//
13 template<class Scalar>
14 ResponseOutput<Scalar>::ResponseOutput(
15  Teuchos::RCP<Response::ResponseManager> response_manager,
16  std::vector<int> output_freq)
17  : _ostream(Teuchos::rcp(&std::cout, false))
18  , _response_manager(response_manager)
19  , _output_freq(std::move(output_freq))
20 {
21  _ostream.setShowProcRank(false);
22  _ostream.setOutputToRootOnly(0);
23 }
24 
25 //---------------------------------------------------------------------------//
26 template<class Scalar>
28  const Tempus::Integrator<Scalar>& integrator)
29 {
30  // When the initial time index is zero, this will output all responses.
31  // Otherwise, output will depend on specified frequencies.
32  outputResponses(integrator, integrator.getIndex());
33 }
34 
35 //---------------------------------------------------------------------------//
36 template<class Scalar>
38  const Tempus::Integrator<Scalar>& /*integrator*/)
39 {
40 }
41 
42 //---------------------------------------------------------------------------//
43 template<class Scalar>
45  const Tempus::Integrator<Scalar>& /*integrator*/)
46 {
47 }
48 
49 //---------------------------------------------------------------------------//
50 template<class Scalar>
52  const Tempus::Integrator<Scalar>& /*integrator*/)
53 {
54 }
55 
56 //---------------------------------------------------------------------------//
57 template<class Scalar>
59  const Tempus::Integrator<Scalar>& /*integrator*/)
60 {
61 }
62 
63 //---------------------------------------------------------------------------//
64 template<class Scalar>
66  const Tempus::Integrator<Scalar>& /*integrator*/)
67 {
68 }
69 
70 //---------------------------------------------------------------------------//
71 template<class Scalar>
73  const Tempus::Integrator<Scalar>& integrator)
74 {
75  // Output responses at specified frequencies based on time step index.
76  outputResponses(integrator, integrator.getIndex());
77 }
78 
79 //---------------------------------------------------------------------------//
80 template<class Scalar>
82  const Tempus::Integrator<Scalar>& integrator)
83 {
84  // Output all responses unconditionally.
85  outputResponses(integrator);
86 }
87 
88 //---------------------------------------------------------------------------//
89 template<class Scalar>
91  const Tempus::Integrator<Scalar>& integrator, const int current_index)
92 {
93  const int num_resp = _response_manager->numResponses();
94 
95  // Just return if there are no responses to output.
96  if (num_resp == 0)
97  return;
98 
99  _response_manager->deactivateAll();
100 
101  // Activate desired responses.
102  int num_outputs = 0;
103  for (int i = 0; i < num_resp; ++i)
104  {
105  if (0 == current_index % _output_freq[i])
106  {
107  _response_manager->activateResponse(i);
108  ++num_outputs;
109  }
110  }
111 
112  // Just return if there are no respones to output for this time step.
113  if (num_outputs == 0)
114  return;
115 
116  // Evaluate responses.
117  const auto state = integrator.getSolutionHistory()->getCurrentState();
118  _response_manager->evaluateResponses(state->getX(), state->getXDot());
119 
120  // Output the integrated values.
121  _ostream << "Scalar Responses:\n";
122  for (int i = 0; i < num_resp; ++i)
123  {
124  if (0 == current_index % _output_freq[i])
125  {
126  const auto& name = _response_manager->name(i);
127  const auto value = _response_manager->value(i);
128 
129  constexpr int prec = std::numeric_limits<double>::digits10 + 1;
130 
131  _ostream << " " << name << " = " << std::setprecision(prec)
132  << value << '\n';
133  }
134  }
135 }
136 //---------------------------------------------------------------------------//
137 
138 } // namespace TempusObserver
139 } // namespace VertexCFD
140 
141 #endif // VERTEXCFD_TEMPUSOBSERVER_RESPONSEOUTPUT_IMPL_HPP
VertexCFD::TempusObserver::ResponseOutput::observeEndTimeStep
void observeEndTimeStep(const Tempus::Integrator< Scalar > &integrator) override
Observe the end of the time step loop.
Definition: VertexCFD_TempusObserver_ResponseOutput_impl.hpp:72
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23
VertexCFD::TempusObserver::ResponseOutput::observeStartTimeStep
void observeStartTimeStep(const Tempus::Integrator< Scalar > &integrator) override
Observe the beginning of the time step loop.
Definition: VertexCFD_TempusObserver_ResponseOutput_impl.hpp:37
VertexCFD::TempusObserver::ResponseOutput::observeStartIntegrator
void observeStartIntegrator(const Tempus::Integrator< Scalar > &integrator) override
Observe the beginning of the time integrator.
Definition: VertexCFD_TempusObserver_ResponseOutput_impl.hpp:27
VertexCFD::TempusObserver::ResponseOutput::observeAfterCheckTimeStep
void observeAfterCheckTimeStep(const Tempus::Integrator< Scalar > &integrator) override
Definition: VertexCFD_TempusObserver_ResponseOutput_impl.hpp:65
VertexCFD::TempusObserver::ResponseOutput::observeBeforeTakeStep
void observeBeforeTakeStep(const Tempus::Integrator< Scalar > &integrator) override
Observe before Stepper takes step.
Definition: VertexCFD_TempusObserver_ResponseOutput_impl.hpp:51
VertexCFD::TempusObserver::ResponseOutput::observeEndIntegrator
void observeEndIntegrator(const Tempus::Integrator< Scalar > &integrator) override
Observe the end of the time integrator.
Definition: VertexCFD_TempusObserver_ResponseOutput_impl.hpp:81
VertexCFD::TempusObserver::ResponseOutput::observeNextTimeStep
void observeNextTimeStep(const Tempus::Integrator< Scalar > &integrator) override
Definition: VertexCFD_TempusObserver_ResponseOutput_impl.hpp:44
VertexCFD::TempusObserver::ResponseOutput
Definition: VertexCFD_TempusObserver_ResponseOutput.hpp:21
VertexCFD::TempusObserver::ResponseOutput::observeAfterTakeStep
void observeAfterTakeStep(const Tempus::Integrator< Scalar > &integrator) override
Observe after Stepper takes step.
Definition: VertexCFD_TempusObserver_ResponseOutput_impl.hpp:58