SpECTRE Documentation Coverage Report
Current view: top level - ControlSystem/ControlErrors/Size - Update.hpp Coverage Total Hit
Commit: 0d1d717af84a81fb1284a20c4013708fe85cc2f0 Lines: 50.0 % 2 1
Test Date: 2026-10-22 17:29:42
Legend: Lines:     hit not hit

            Line data    Source code
       1            0 : // Distributed under the MIT License.
       2              : // See LICENSE.txt for details.
       3              : 
       4              : #pragma once
       5              : 
       6              : #include <cstddef>
       7              : #include <limits>
       8              : #include <optional>
       9              : #include <string>
      10              : 
      11              : #include "ControlSystem/Averager.hpp"
      12              : #include "ControlSystem/ControlErrors/Size.hpp"
      13              : #include "ControlSystem/TimescaleTuner.hpp"
      14              : #include "DataStructures/DataVector.hpp"
      15              : #include "Domain/Structure/ObjectLabel.hpp"
      16              : #include "IO/Logging/Verbosity.hpp"
      17              : #include "Parallel/GlobalCache.hpp"
      18              : #include "Parallel/Printf/Printf.hpp"
      19              : #include "Utilities/Gsl.hpp"
      20              : 
      21              : namespace control_system::size {
      22              : /*!
      23              :  * \brief Updates the Averager with information from the \link
      24              :  * control_system::ControlErrors::Size Size control error \endlink.
      25              :  *
      26              :  * \details After we calculate the control error, we check if a discontinuous
      27              :  * change has occurred (the internal `control_system::size::State` changed). If
      28              :  * no discontinuous change has occurred, then we do nothing. If one did occur,
      29              :  * we get a history of control errors from the \link
      30              :  * control_system::ControlErrors::Size Size control error \endlink and use that
      31              :  * to repopulate the Averager history.
      32              :  *
      33              :  * \note See `control_system::Tags::Averager` for why the Averager is templated
      34              :  * on `DerivOrder - 1`.
      35              :  */
      36              : template <size_t DerivOrder, ::domain::ObjectLabel Horizon,
      37              :           typename Metavariables>
      38            1 : void update_averager(
      39              :     const gsl::not_null<Averager<DerivOrder - 1>*> averager,
      40              :     const gsl::not_null<ControlErrors::Size<DerivOrder, Horizon>*>
      41              :         control_error,
      42              :     const Parallel::GlobalCache<Metavariables>& cache, const double time,
      43              :     const DataVector& current_timescale,
      44              :     const std::string& function_of_time_name, const int current_measurement) {
      45              :   if (control_error->discontinuous_change_has_occurred()) {
      46              :     control_error->reset();
      47              :     averager->clear();
      48              : 
      49              :     const std::deque<std::pair<double, double>> control_error_history =
      50              :         control_error->control_error_history();
      51              : 
      52              :     if (Parallel::get<Tags::Verbosity>(cache) >= ::Verbosity::Verbose) {
      53              :       std::vector<double> history_times{};
      54              :       for (const auto& history : control_error_history) {
      55              :         history_times.push_back(history.first);
      56              :       }
      57              :       Parallel::printf(
      58              :           "%s, time = %.16f: current measurement = %d, Discontinuous "
      59              :           "change has occurred. Repopulating averager with control error "
      60              :           "history from times: %s\n",
      61              :           function_of_time_name, time, current_measurement, history_times);
      62              :     }
      63              : 
      64              :     for (const auto& [stored_time, stored_control_error] :
      65              :          control_error_history) {
      66              :       // Size 1 because it's size control
      67              :       averager->update(stored_time, DataVector{1, stored_control_error},
      68              :                        current_timescale);
      69              :     }
      70              :   }
      71              : }
      72              : }  // namespace control_system::size
        

Generated by: LCOV version 2.0-1