1 #ifndef VERTEXCFD_TEMPUSOBSERVER_ERRORNORMOUTPUT_IMPL_HPP
2 #define VERTEXCFD_TEMPUSOBSERVER_ERRORNORMOUTPUT_IMPL_HPP
10 namespace TempusObserver
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)
23 if (error_norm_list.isType<
int>(
"Output Frequency"))
25 _output_freq = error_norm_list.get<
int>(
"Output Frequency");
29 if (error_norm_list.isType<
bool>(
"Compute Time Integral"))
32 = error_norm_list.get<
bool>(
"Compute Time Integral");
36 if (_compute_time_error)
38 _L1_time_error_norms = _error_norm->L1_errorNorms();
39 _L2_time_error_norms = _error_norm->L2_errorNorms();
43 _ostream.setShowProcRank(
false);
44 _ostream.setOutputToRootOnly(0);
48 template<
class Scalar>
50 const Tempus::Integrator<Scalar>& integrator)
53 const auto state = integrator.getSolutionHistory()->getCurrentState();
54 _error_norm->ComputeNorms(state);
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());
64 template<
class Scalar>
66 const Tempus::Integrator<Scalar>& )
71 template<
class Scalar>
73 const Tempus::Integrator<Scalar>& )
78 template<
class Scalar>
80 const Tempus::Integrator<Scalar>& )
85 template<
class Scalar>
87 const Tempus::Integrator<Scalar>& )
92 template<
class Scalar>
94 const Tempus::Integrator<Scalar>& )
99 template<
class Scalar>
101 const Tempus::Integrator<Scalar>& integrator)
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();
110 if (_compute_time_error)
112 for (std::size_t i = 0; i < _L1_time_error_norms.size(); ++i)
114 _L1_time_error_norms[i].error_norm
115 += _error_norm->L1_errorNorms()[i].error_norm * dt;
118 for (std::size_t i = 0; i < _L2_time_error_norms.size(); ++i)
120 _L2_time_error_norms[i].error_norm
121 += _error_norm->L2_errorNorms()[i].error_norm * dt;
126 if (0 == current_index % _output_freq)
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());
133 if (_compute_time_error)
135 const double current_time = integrator.getTime();
137 print_error_norms(
"Temporal/Spatial Integrated L1 Error Norms:",
138 _L1_time_error_norms,
141 print_error_norms(
"Temporal/Spatial Integrated L2 Error Norms:",
142 _L2_time_error_norms,
149 template<
class Scalar>
151 const Tempus::Integrator<Scalar>& integrator)
153 if (_compute_time_error)
156 const double final_time = integrator.getTime();
159 print_error_norms(
"Final Temporal/Spatial Integrated L1 Error Norms:",
160 _L1_time_error_norms,
164 print_error_norms(
"Final Temporal/Spatial Integrated L2 Error Norms:",
165 _L2_time_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());
179 template<
class Scalar>
181 const std::string& heading,
184 const double scaling)
188 << std::setprecision(prec) << std::scientific;
189 for (
auto& dof : error_norm)
191 _ostream <<
" " << dof.name <<
" = " << dof.error_norm / scaling
202 #endif // end VERTEXCFD_TEMPUSOBSERVER_ERRORNORMOUTPUT_IMPL_HPP