SpECTRE Documentation Coverage Report
Current view: top level - ControlSystem/Tags - OptionTags.hpp Coverage Total Hit
Commit: 0d1d717af84a81fb1284a20c4013708fe85cc2f0 Lines: 14.0 % 57 8
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 <string>
       8              : 
       9              : #include "ControlSystem/Averager.hpp"
      10              : #include "ControlSystem/Controller.hpp"
      11              : #include "ControlSystem/IsSize.hpp"
      12              : #include "ControlSystem/Protocols/ControlSystem.hpp"
      13              : #include "ControlSystem/TimescaleTuner.hpp"
      14              : #include "IO/Logging/Verbosity.hpp"
      15              : #include "Options/Auto.hpp"
      16              : #include "Options/String.hpp"
      17              : #include "Utilities/ProtocolHelpers.hpp"
      18              : #include "Utilities/TMPL.hpp"
      19              : 
      20              : namespace control_system {
      21              : /// \ingroup ControlSystemGroup
      22              : /// Holds all options for a single control system
      23              : ///
      24              : /// This struct collects all the options for a given control system during
      25              : /// option parsing. Then during initialization, the options can be retrieved via
      26              : /// their public member names and assigned to their corresponding DataBox tags.
      27              : ///
      28              : /// This class should only be used if a control system is active.
      29              : template <typename ControlSystem>
      30            1 : struct OptionHolder {
      31              :  private:
      32            0 :   static constexpr bool is_size =
      33              :       ::control_system::size::is_size_v<ControlSystem>;
      34              : 
      35              :  public:
      36              :   static_assert(tt::assert_conforms_to_v<
      37              :                 ControlSystem, control_system::protocols::ControlSystem>);
      38            0 :   using control_system = ControlSystem;
      39            0 :   static constexpr size_t deriv_order = control_system::deriv_order;
      40              : 
      41            0 :   struct Averager {
      42            0 :     using type = ::Averager<deriv_order - 1>;
      43            0 :     static constexpr Options::String help = {
      44              :         "Averages the derivatives of the control error and possibly the "
      45              :         "control error itself."};
      46              :   };
      47              : 
      48            0 :   struct Controller {
      49            0 :     using type = ::Controller<deriv_order>;
      50            0 :     static constexpr Options::String help = {
      51              :         "Computes the control signal which will be used to reset the functions "
      52              :         "of time."};
      53              :   };
      54              : 
      55            0 :   struct TimescaleTuner {
      56            0 :     using type = ::TimescaleTuner<not is_size>;
      57            0 :     static constexpr Options::String help = {
      58              :         "Keeps track of the damping timescales for the control system upon "
      59              :         "which other timescales are based of off."};
      60              :   };
      61              : 
      62            0 :   struct ControlError {
      63            0 :     using type = typename ControlSystem::control_error;
      64            0 :     static constexpr Options::String help = {
      65              :         "Computes the control error for the control system based on quantities "
      66              :         "in the simulation."};
      67              :   };
      68              : 
      69            0 :   using options =
      70              :       tmpl::list<Averager, Controller, TimescaleTuner, ControlError>;
      71            0 :   static constexpr Options::String help = {"Options for a control system."};
      72              : 
      73            0 :   OptionHolder(::Averager<deriv_order - 1> input_averager,
      74              :                ::Controller<deriv_order> input_controller,
      75              :                ::TimescaleTuner<not is_size> input_tuner,
      76              :                typename ControlSystem::control_error input_control_error)
      77              :       : averager(std::move(input_averager)),
      78              :         controller(std::move(input_controller)),
      79              :         tuner(std::move(input_tuner)),
      80              :         control_error(std::move(input_control_error)) {}
      81              : 
      82            0 :   OptionHolder() = default;
      83            0 :   OptionHolder(const OptionHolder& /*rhs*/) = default;
      84            0 :   OptionHolder& operator=(const OptionHolder& /*rhs*/) = default;
      85            0 :   OptionHolder(OptionHolder&& /*rhs*/) = default;
      86            0 :   OptionHolder& operator=(OptionHolder&& /*rhs*/) = default;
      87            0 :   ~OptionHolder() = default;
      88              : 
      89              :   // NOLINTNEXTLINE(google-runtime-references)
      90            0 :   void pup(PUP::er& p) {
      91              :     p | averager;
      92              :     p | controller;
      93              :     p | tuner;
      94              :     p | control_error;
      95              :   };
      96              : 
      97              :   // These members are specifically made public for easy access during
      98              :   // initialization
      99            0 :   ::Averager<deriv_order - 1> averager{};
     100            0 :   ::Controller<deriv_order> controller{};
     101            0 :   ::TimescaleTuner<not is_size> tuner{};
     102            0 :   typename ControlSystem::control_error control_error{};
     103              : };
     104              : 
     105              : /// \ingroup ControlSystemGroup
     106              : /// All option tags related to the control system
     107              : namespace OptionTags {
     108              : /// \ingroup OptionTagsGroup
     109              : /// \ingroup ControlSystemGroup
     110              : /// Options group for all control system options
     111            1 : struct ControlSystemGroup {
     112            0 :   static std::string name() { return "ControlSystems"; }
     113            0 :   static constexpr Options::String help = {
     114              :       "Options for all control systems used in a simulation."};
     115              : };
     116              : 
     117              : /// \ingroup OptionTagsGroup
     118              : /// \ingroup ControlSystemGroup
     119              : /// Option tag for each individual control system. The name of this option is
     120              : /// the name of the \p ControlSystem struct it is templated on. This way all
     121              : /// control systems will have a unique name.
     122              : ///
     123              : /// \details If `None` is specified, this control system is not active.
     124              : template <typename ControlSystem>
     125            1 : struct ControlSystemInputs {
     126            0 :   using type = Options::Auto<control_system::OptionHolder<ControlSystem>,
     127              :                              Options::AutoLabel::None>;
     128            0 :   static constexpr Options::String help{"Options for a control system."};
     129            0 :   static std::string name() { return ControlSystem::name(); }
     130            0 :   using group = ControlSystemGroup;
     131              : };
     132              : 
     133              : /// \ingroup OptionTagsGroup
     134              : /// \ingroup ControlSystemGroup
     135              : /// Option tag on whether to write data to disk.
     136            1 : struct WriteDataToDisk {
     137            0 :   using type = bool;
     138            0 :   static constexpr Options::String help = {
     139              :       "Whether control system data should be saved during an evolution."};
     140            0 :   using group = ControlSystemGroup;
     141              : };
     142              : 
     143              : /// \ingroup OptionTagsGroup
     144              : /// \ingroup ControlSystemGroup
     145              : /// Option tag that determines how many measurements will occur per control
     146              : /// system update.
     147            1 : struct MeasurementsPerUpdate {
     148            0 :   using type = int;
     149            0 :   static constexpr Options::String help = {
     150              :       "How many AH measurements are to be done between control system "
     151              :       "updates."};
     152            0 :   static int lower_bound() { return 1; }
     153            0 :   using group = ControlSystemGroup;
     154              : };
     155              : 
     156              : /// \ingroup OptionTagsGroup
     157              : /// \ingroup ControlSystemGroup
     158              : /// Option tag on whether to delay FunctionOfTime updates by one
     159              : /// measurement to improve parallelization.
     160            1 : struct DelayUpdate {
     161            0 :   using type = bool;
     162            0 :   static constexpr Options::String help = {
     163              :       "Whether FunctionOfTime updates are delayed by one measurement to "
     164              :       "improve parallelization."};
     165            0 :   using group = ControlSystemGroup;
     166              : };
     167              : 
     168              : /// \ingroup OptionTagsGroup
     169              : /// \ingroup ControlSystemGroup
     170              : /// Verbosity tag for printing diagnostics about the control system algorithm.
     171              : /// This does not control when data is written to disk.
     172            1 : struct Verbosity {
     173            0 :   using type = ::Verbosity;
     174            0 :   static constexpr Options::String help = {
     175              :       "Verbosity of control system algorithm. Determines verbosity for all "
     176              :       "control systems."};
     177            0 :   using group = ControlSystemGroup;
     178              : };
     179              : }  // namespace OptionTags
     180              : 
     181              : /// \ingroup ControlSystemGroup
     182              : /// Alias to get all the option holders from a list of control systems. This is
     183              : /// useful in the `option_tags` alias of simple tags for getting all the options
     184              : /// from control systems.
     185              : template <typename ControlSystems>
     186            1 : using inputs =
     187              :     tmpl::transform<ControlSystems,
     188              :                     tmpl::bind<OptionTags::ControlSystemInputs, tmpl::_1>>;
     189              : 
     190              : }  // namespace control_system
        

Generated by: LCOV version 2.0-1