SpECTRE Documentation Coverage Report
Current view: top level - Domain/Creators/TimeDependence - CubicScale.hpp Coverage Total Hit
Commit: 0d1d717af84a81fb1284a20c4013708fe85cc2f0 Lines: 26.0 % 50 13
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 <array>
       7              : #include <cstddef>
       8              : #include <limits>
       9              : #include <memory>
      10              : #include <optional>
      11              : #include <string>
      12              : #include <unordered_map>
      13              : #include <vector>
      14              : 
      15              : #include "Domain/CoordinateMaps/CoordinateMap.hpp"
      16              : #include "Domain/CoordinateMaps/TimeDependent/CubicScale.hpp"
      17              : #include "Domain/Creators/TimeDependence/TimeDependence.hpp"
      18              : #include "Options/Auto.hpp"
      19              : #include "Options/String.hpp"
      20              : #include "Utilities/PrettyType.hpp"
      21              : #include "Utilities/TMPL.hpp"
      22              : 
      23              : /// \cond
      24              : namespace domain::FunctionsOfTime {
      25              : class FunctionOfTime;
      26              : }  // namespace domain::FunctionsOfTime
      27              : 
      28              : namespace domain {
      29              : template <typename SourceFrame, typename TargetFrame, typename... Maps>
      30              : class CoordinateMap;
      31              : }  // namespace domain
      32              : 
      33              : namespace Frame {
      34              : struct Distorted;
      35              : struct Grid;
      36              : struct Inertial;
      37              : }  // namespace Frame
      38              : /// \endcond
      39              : 
      40            1 : namespace domain::creators::time_dependence {
      41              : /// \brief A linear or cubic radial scaling time dependence.
      42              : ///
      43              : /// Adds the `domain::CoordinateMaps::TimeDependent::CubicScale` map. A linear
      44              : /// radial scaling can be used by specifying the `UseLinearScaling` bool.
      45              : template <size_t MeshDim>
      46            1 : class CubicScale final : public TimeDependence<MeshDim> {
      47              :  private:
      48            0 :   using CubicScaleMap =
      49              :       domain::CoordinateMaps::TimeDependent::CubicScale<MeshDim>;
      50              : 
      51              :  public:
      52            0 :   using maps_list =
      53              :       tmpl::list<CoordinateMap<Frame::Grid, Frame::Inertial, CubicScaleMap>>;
      54              : 
      55            0 :   static constexpr size_t mesh_dim = MeshDim;
      56              : 
      57              :   /// \brief The initial time of the functions of time.
      58            1 :   struct InitialTime {
      59            0 :     using type = double;
      60            0 :     static constexpr Options::String help = {
      61              :         "The initial time of the functions of time"};
      62              :   };
      63              :   /// \brief The outer boundary or pivot point of the
      64              :   /// `domain::CoordinateMaps::TimeDependent::CubicScale` map
      65            1 :   struct OuterBoundary {
      66            0 :     using type = double;
      67            0 :     static constexpr Options::String help = {
      68              :         "Outer boundary or pivot point of the map"};
      69              :   };
      70              :   /// \brief The initial values of the expansion factors.
      71            1 :   struct InitialExpansion {
      72            0 :     using type = std::array<double, 2>;
      73            0 :     static constexpr Options::String help = {
      74              :         "Expansion values at initial time."};
      75              :   };
      76              :   /// \brief The velocity of the expansion factors.
      77            1 :   struct Velocity {
      78            0 :     using type = std::array<double, 2>;
      79            0 :     static constexpr Options::String help = {"The rate of expansion."};
      80              :   };
      81              :   /// \brief The acceleration of the expansion factors.
      82            1 :   struct Acceleration {
      83            0 :     using type = std::array<double, 2>;
      84            0 :     static constexpr Options::String help = {"The acceleration of expansion."};
      85              :   };
      86              :   /// \brief Whether to use linear scaling or cubic scaling.
      87            1 :   struct UseLinearScaling {
      88            0 :     using type = bool;
      89            0 :     static constexpr Options::String help = {
      90              :         "Whether or not to turn on cubic scaling."};
      91              :   };
      92              : 
      93            0 :   using options = tmpl::list<InitialTime, OuterBoundary, UseLinearScaling,
      94              :                              InitialExpansion, Velocity, Acceleration>;
      95              : 
      96            0 :   static constexpr Options::String help = {
      97              :       "A spatial radial scaling either based on a cubic scaling or a simple\n"
      98              :       "linear scaling.\n"
      99              :       "\n"
     100              :       "If the two functions of time have the same name then the scaling is a\n"
     101              :       "linear radial scaling."};
     102              : 
     103            0 :   using GridToInertialMap =
     104              :       domain::CoordinateMap<Frame::Grid, Frame::Inertial, CubicScaleMap>;
     105              : 
     106            0 :   CubicScale() = default;
     107            0 :   ~CubicScale() override = default;
     108            0 :   CubicScale(const CubicScale&) = delete;
     109            0 :   CubicScale(CubicScale&&) = default;
     110            0 :   CubicScale& operator=(const CubicScale&) = delete;
     111            0 :   CubicScale& operator=(CubicScale&&) = default;
     112              : 
     113            0 :   CubicScale(double initial_time, double outer_boundary,
     114              :              bool use_linear_scaling,
     115              :              const std::array<double, 2>& initial_expansion,
     116              :              const std::array<double, 2>& velocity,
     117              :              const std::array<double, 2>& acceleration);
     118              : 
     119            1 :   auto get_clone() const -> std::unique_ptr<TimeDependence<MeshDim>> override;
     120              : 
     121            1 :   auto block_maps_grid_to_inertial(size_t number_of_blocks) const
     122              :       -> std::vector<std::unique_ptr<domain::CoordinateMapBase<
     123              :           Frame::Grid, Frame::Inertial, MeshDim>>> override;
     124              : 
     125            1 :   auto block_maps_grid_to_distorted(size_t number_of_blocks) const
     126              :       -> std::vector<std::unique_ptr<domain::CoordinateMapBase<
     127              :           Frame::Grid, Frame::Distorted, MeshDim>>> override {
     128              :     using ptr_type =
     129              :         domain::CoordinateMapBase<Frame::Grid, Frame::Distorted, MeshDim>;
     130              :     return std::vector<std::unique_ptr<ptr_type>>(number_of_blocks);
     131              :   }
     132              : 
     133            1 :   auto block_maps_distorted_to_inertial(size_t number_of_blocks) const
     134              :       -> std::vector<std::unique_ptr<domain::CoordinateMapBase<
     135              :           Frame::Distorted, Frame::Inertial, MeshDim>>> override {
     136              :     using ptr_type =
     137              :         domain::CoordinateMapBase<Frame::Distorted, Frame::Inertial, MeshDim>;
     138              :     return std::vector<std::unique_ptr<ptr_type>>(number_of_blocks);
     139              :   }
     140              : 
     141            1 :   auto functions_of_time(const std::unordered_map<std::string, double>&
     142              :                              initial_expiration_times = {}) const
     143              :       -> std::unordered_map<
     144              :           std::string,
     145              :           std::unique_ptr<domain::FunctionsOfTime::FunctionOfTime>> override;
     146              : 
     147              :  private:
     148              :   template <size_t LocalDim>
     149              :   // NOLINTNEXTLINE(readability-redundant-declaration)
     150            0 :   friend bool operator==(const CubicScale<LocalDim>& lhs,
     151              :                          const CubicScale<LocalDim>& rhs);
     152              : 
     153            0 :   GridToInertialMap grid_to_inertial_map() const;
     154              : 
     155            0 :   double initial_time_{std::numeric_limits<double>::signaling_NaN()};
     156            0 :   double outer_boundary_{std::numeric_limits<double>::signaling_NaN()};
     157            0 :   bool use_linear_scaling_{false};
     158              :   // Unlike other TimeDependences, these names aren't inline static const
     159              :   // because they can potentially be changed by the run-time option
     160              :   // use_linear_scaling in the constructor
     161            0 :   std::array<std::string, 2> functions_of_time_names_{
     162              :       {"CubicScaleA", "CubicScaleB"}};
     163            0 :   std::array<double, 2> initial_expansion_{};
     164            0 :   std::array<double, 2> velocity_{};
     165            0 :   std::array<double, 2> acceleration_{};
     166              : };
     167              : 
     168              : template <size_t Dim>
     169            0 : bool operator==(const CubicScale<Dim>& lhs, const CubicScale<Dim>& rhs);
     170              : 
     171              : template <size_t Dim>
     172            0 : bool operator!=(const CubicScale<Dim>& lhs, const CubicScale<Dim>& rhs);
     173              : }  // namespace domain::creators::time_dependence
        

Generated by: LCOV version 2.0-1