SpECTRE Documentation Coverage Report
Current view: top level - ControlSystem/Tags - OptionTags.hpp Hit Total Coverage
Commit: 1f2210958b4f38fdc0400907ee7c6d5af5111418 Lines: 8 57 14.0 %
Date: 2025-12-05 05:03:31
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 1.14