SpECTRE Documentation Coverage Report
Current view: top level - Time - TimeStepRequest.hpp Hit Total Coverage
Commit: f23e75c235cae5144b8ac7ce01280be5b8cd2c8a Lines: 1 10 10.0 %
Date: 2024-09-07 06:21:00
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 <optional>
       7             : 
       8             : /// \cond
       9             : namespace PUP {
      10             : class er;
      11             : }  // namespace PUP
      12             : /// \endcond
      13             : 
      14             : /// Information on a requested time-step size returned by `StepChooser`s.
      15             : ///
      16             : /// Requests made using this struct control most of the changing of
      17             : /// slab and local-time-stepping step sizes.  Slab-size changing is
      18             : /// more complex, as it is controlled using the `ChangeSlabSize`
      19             : /// event, which may run zero or more times per slab, and may have the
      20             : /// application of its result delayed.  The step size for LTS is
      21             : /// adjusted using a constant list of `StepChoosers` on every step.
      22             : ///
      23             : /// For slab-size adjustment (including the global time step when not
      24             : /// using LTS), a "goal" step size is maintained from step to step.
      25             : /// It is initially the initial slab size from the input file, and can
      26             : /// be adjusted by any request setting the `size_goal` field of this
      27             : /// struct.  If multiple requests set new goals at the same time, the
      28             : /// smallest value is used.  At the start of each slab, the size is
      29             : /// chosen to be the smallest of the current goal and the temporary
      30             : /// limits imposed by any requests processed at that time.  For the
      31             : /// LTS step size, the current step size is used as the goal if no
      32             : /// request sets a new one.
      33             : ///
      34             : /// Any request with either the `size` or `end` fields set introduces
      35             : /// a temporary step size limit.  If only one of the two is set, the
      36             : /// chosen step size will be limited to be not larger than `*size`, or
      37             : /// not go beyond the time `*end`.  If both are set, the tighter limit
      38             : /// may be ignored if the looser limit is chosen as the actual step,
      39             : /// but the step will not be chosen to be intermediate between two
      40             : /// temporary limits from the same request object.
      41             : ///
      42             : /// The hard limits are not used in setting the step size, but if the
      43             : /// actual step does not satisfy all hard limits from all requests the
      44             : /// evolution will be terminated with an error.
      45             : ///
      46             : /// \note All step sizes are subject to roundoff error in either
      47             : /// direction except for two cases:
      48             : /// * Slab sizes imposed by the `end` limit of a request will always
      49             : ///   end precisely at the requested time.
      50             : /// * LTS step sizes within a single slab will always be considered to
      51             : ///   have size ratios that are exactly powers of two for the purposes
      52             : ///   of the `size_goal` and `size` limits.
      53           1 : struct TimeStepRequest {
      54           0 :   std::optional<double> size_goal{};
      55             : 
      56           0 :   std::optional<double> size{};
      57           0 :   std::optional<double> end{};
      58             : 
      59           0 :   std::optional<double> size_hard_limit{};
      60           0 :   std::optional<double> end_hard_limit{};
      61             : 
      62           0 :   void pup(PUP::er& p);
      63             : };
      64             : 
      65           0 : bool operator==(const TimeStepRequest& a, const TimeStepRequest& b);
      66           0 : bool operator!=(const TimeStepRequest& a, const TimeStepRequest& b);

Generated by: LCOV version 1.14