VertexCFD  0.0-dev
VertexCFD_TempusObserver_ErrorNormOutput_impl.hpp
1 #ifndef VERTEXCFD_TEMPUSOBSERVER_ERRORNORMOUTPUT_IMPL_HPP
2 #define VERTEXCFD_TEMPUSOBSERVER_ERRORNORMOUTPUT_IMPL_HPP
3 
4 #include <iomanip>
5 #include <iostream>
6 #include <limits>
7 
8 namespace VertexCFD
9 {
10 namespace TempusObserver
11 {
12 //---------------------------------------------------------------------------//
13 template<class Scalar>
14 ErrorNormOutput<Scalar>::ErrorNormOutput(
15  const Teuchos::ParameterList& error_norm_list,
16  Teuchos::RCP<ComputeErrorNorms::ErrorNorms<Scalar>> error_norm)
17  : _output_freq(std::numeric_limits<int>::max())
18  , _compute_time_error(true)
19  , _ostream(Teuchos::rcp(&std::cout, false))
20  , _error_norm(error_norm)
21 {
22  // Get output frequency
23  if (error_norm_list.isType<int>("Output Frequency"))
24  {
25  _output_freq = error_norm_list.get<int>("Output Frequency");
26  }
27 
28  // Time integrated error norm
29  if (error_norm_list.isType<bool>("Compute Time Integral"))
30  {
31  _compute_time_error
32  = error_norm_list.get<bool>("Compute Time Integral");
33  }
34 
35  // Initialize L1/L2 error norms objects
36  if (_compute_time_error)
37  {
38  _L1_time_error_norms = _error_norm->L1_errorNorms();
39  _L2_time_error_norms = _error_norm->L2_errorNorms();
40  }
41 
42  // Initialize output variable
43  _ostream.setShowProcRank(false);
44  _ostream.setOutputToRootOnly(0);
45 }
46 
47 //---------------------------------------------------------------------------//
48 template<class Scalar>
50  const Tempus::Integrator<Scalar>& integrator)
51 {
52  // Compute Initial Error Norms
53  const auto state = integrator.getSolutionHistory()->getCurrentState();
54  _error_norm->ComputeNorms(state);
55 
56  // Print initial L1/L2 error norms
57  print_error_norms("Initial Spatial Integrated L1 Error Norms:",
58  _error_norm->L1_errorNorms());
59  print_error_norms("Initial Spatial Integrated L2 Error Norms:",
60  _error_norm->L2_errorNorms());
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 }
76 
77 //---------------------------------------------------------------------------//
78 template<class Scalar>
80  const Tempus::Integrator<Scalar>& /*integrator*/)
81 {
82 }
83 
84 //---------------------------------------------------------------------------//
85 template<class Scalar>
87  const Tempus::Integrator<Scalar>& /*integrator*/)
88 {
89 }
90 
91 //---------------------------------------------------------------------------//
92 template<class Scalar>
94  const Tempus::Integrator<Scalar>& /*integrator*/)
95 {
96 }
97 
98 //---------------------------------------------------------------------------//
99 template<class Scalar>
101  const Tempus::Integrator<Scalar>& integrator)
102 {
103  // Compute Error Norms
104  const auto state = integrator.getSolutionHistory()->getCurrentState();
105  _error_norm->ComputeNorms(state);
106  const auto dt = state->getTimeStep();
107  const auto current_index = state->getIndex();
108 
109  // Compute integrated L1/L2 error norms
110  if (_compute_time_error)
111  {
112  for (std::size_t i = 0; i < _L1_time_error_norms.size(); ++i)
113  {
114  _L1_time_error_norms[i].error_norm
115  += _error_norm->L1_errorNorms()[i].error_norm * dt;
116  }
117 
118  for (std::size_t i = 0; i < _L2_time_error_norms.size(); ++i)
119  {
120  _L2_time_error_norms[i].error_norm
121  += _error_norm->L2_errorNorms()[i].error_norm * dt;
122  }
123  }
124 
125  // Print L1/L2 error norms
126  if (0 == current_index % _output_freq)
127  {
128  print_error_norms("Spatial Integrated L1 Error Norms:",
129  _error_norm->L1_errorNorms());
130  print_error_norms("Spatial Integrated L2 Error Norms:",
131  _error_norm->L2_errorNorms());
132 
133  if (_compute_time_error)
134  {
135  const double current_time = integrator.getTime();
136 
137  print_error_norms("Temporal/Spatial Integrated L1 Error Norms:",
138  _L1_time_error_norms,
139  current_time);
140 
141  print_error_norms("Temporal/Spatial Integrated L2 Error Norms:",
142  _L2_time_error_norms,
143  current_time);
144  }
145  }
146 }
147 
148 //---------------------------------------------------------------------------//
149 template<class Scalar>
151  const Tempus::Integrator<Scalar>& integrator)
152 {
153  if (_compute_time_error)
154  {
155  // Get final time
156  const double final_time = integrator.getTime();
157 
158  // L1 error norms
159  print_error_norms("Final Temporal/Spatial Integrated L1 Error Norms:",
160  _L1_time_error_norms,
161  final_time);
162 
163  // L2 error norms
164  print_error_norms("Final Temporal/Spatial Integrated L2 Error Norms:",
165  _L2_time_error_norms,
166  final_time);
167  }
168  else
169  {
170  // Print L1/L2 error norms
171  print_error_norms("Final Spatial Integrated L1 Error Norms:",
172  _error_norm->L1_errorNorms());
173  print_error_norms("Final Spatial Integrated L2 Error Norms:",
174  _error_norm->L2_errorNorms());
175  }
176 }
177 
178 //---------------------------------------------------------------------------//
179 template<class Scalar>
181  const std::string& heading,
182  const std::vector<
184  const double scaling)
185 {
186  _ostream << '\n'
187  << heading << '\n'
188  << std::setprecision(prec) << std::scientific;
189  for (auto& dof : error_norm)
190  {
191  _ostream << " " << dof.name << " = " << dof.error_norm / scaling
192  << '\n';
193  }
194  _ostream << '\n';
195 }
196 
197 //---------------------------------------------------------------------------//
198 
199 } // end namespace TempusObserver
200 } // end namespace VertexCFD
201 
202 #endif // end VERTEXCFD_TEMPUSOBSERVER_ERRORNORMOUTPUT_IMPL_HPP
VertexCFD::TempusObserver::ErrorNormOutput::observeBeforeTakeStep
void observeBeforeTakeStep(const Tempus::Integrator< Scalar > &integrator) override
Observe before Stepper takes step.
Definition: VertexCFD_TempusObserver_ErrorNormOutput_impl.hpp:79
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23
VertexCFD::TempusObserver::ErrorNormOutput::observeStartIntegrator
void observeStartIntegrator(const Tempus::Integrator< Scalar > &integrator) override
Observe the beginning of the time integrator.
Definition: VertexCFD_TempusObserver_ErrorNormOutput_impl.hpp:49
VertexCFD::TempusObserver::ErrorNormOutput::observeAfterTakeStep
void observeAfterTakeStep(const Tempus::Integrator< Scalar > &integrator) override
Observe after Stepper takes step.
Definition: VertexCFD_TempusObserver_ErrorNormOutput_impl.hpp:86
VertexCFD::TempusObserver::ErrorNormOutput::observeNextTimeStep
void observeNextTimeStep(const Tempus::Integrator< Scalar > &integrator) override
Definition: VertexCFD_TempusObserver_ErrorNormOutput_impl.hpp:72
VertexCFD::TempusObserver::ErrorNormOutput::observeEndTimeStep
void observeEndTimeStep(const Tempus::Integrator< Scalar > &integrator) override
Observe the end of the time step loop.
Definition: VertexCFD_TempusObserver_ErrorNormOutput_impl.hpp:100
VertexCFD::ComputeErrorNorms::ErrorNorms::DofErrorNorm
Definition: VertexCFD_Compute_ErrorNorms.hpp:48
VertexCFD::TempusObserver::ErrorNormOutput
Definition: VertexCFD_TempusObserver_ErrorNormOutput.hpp:23
VertexCFD::TempusObserver::ErrorNormOutput::observeStartTimeStep
void observeStartTimeStep(const Tempus::Integrator< Scalar > &integrator) override
Observe the beginning of the time step loop.
Definition: VertexCFD_TempusObserver_ErrorNormOutput_impl.hpp:65
VertexCFD::TempusObserver::ErrorNormOutput::observeEndIntegrator
void observeEndIntegrator(const Tempus::Integrator< Scalar > &integrator) override
Observe the end of the time integrator.
Definition: VertexCFD_TempusObserver_ErrorNormOutput_impl.hpp:150
VertexCFD::TempusObserver::ErrorNormOutput::observeAfterCheckTimeStep
void observeAfterCheckTimeStep(const Tempus::Integrator< Scalar > &integrator) override
Definition: VertexCFD_TempusObserver_ErrorNormOutput_impl.hpp:93