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 <optional> 9 : #include <string> 10 : #include <utility> 11 : #include <variant> 12 : #include <vector> 13 : 14 : #include "DataStructures/DataVector.hpp" 15 : #include "Domain/Creators/TimeDependentOptions/FromVolumeFile.hpp" 16 : #include "Options/Auto.hpp" 17 : #include "Options/Context.hpp" 18 : #include "Options/Options.hpp" 19 : #include "Options/String.hpp" 20 : #include "Utilities/TMPL.hpp" 21 : 22 : namespace domain::creators::time_dependent_options { 23 : /*! 24 : * \brief Class that holds hard coded rotation map options from the input file. 25 : * 26 : * \details This class can also be used as an option tag with the \p type type 27 : * alias, `name()` function, and \p help string. 28 : */ 29 : template <bool AllowSettleFoTs> 30 1 : struct RotationMapOptions { 31 0 : using type = Options::Auto< 32 : std::variant<RotationMapOptions<AllowSettleFoTs>, FromVolumeFile>, 33 : Options::AutoLabel::None>; 34 0 : static std::string name() { return "RotationMap"; } 35 0 : static constexpr Options::String help = { 36 : "Options for a time-dependent rotation of the coordinates. Specify " 37 : "'None' to not use this map."}; 38 : 39 0 : struct InitialQuaternions { 40 0 : using type = std::vector<std::array<double, 4>>; 41 0 : static constexpr Options::String help = { 42 : "Initial values for the quaternion of the rotation map. You can " 43 : "optionally specify its first two time derivatives. If time " 44 : "derivatives aren't specified, zero will be used."}; 45 : }; 46 : 47 0 : struct InitialAngularVelocity { 48 0 : using type = std::array<double, 3>; 49 0 : static constexpr Options::String help = {"The initial angular velocity."}; 50 : }; 51 : 52 0 : struct DecayTimescale { 53 0 : using type = double; 54 0 : static constexpr Options::String help = { 55 : "The timescale for how fast the rotation approaches its asymptotic " 56 : "value with a SettleToConstant function of time."}; 57 : }; 58 : 59 0 : using non_settle_options = tmpl::list<InitialAngularVelocity>; 60 0 : using settle_options = tmpl::list<InitialQuaternions, DecayTimescale>; 61 : 62 0 : using options = tmpl::conditional_t< 63 : AllowSettleFoTs, 64 : tmpl::list<Options::Alternatives<non_settle_options, settle_options>>, 65 : non_settle_options>; 66 : 67 0 : RotationMapOptions() = default; 68 : // Constructor for non SettleToConstant functions of time 69 : // NOLINTNEXTLINE(google-explicit-constructor) 70 0 : RotationMapOptions(const std::array<double, 3>& initial_angular_velocity, 71 : const Options::Context& context = {}); 72 : // Constructor for SettleToConst functions of time 73 0 : RotationMapOptions( 74 : const std::vector<std::array<double, 4>>& initial_quaternions, 75 : double decay_timescale_in, const Options::Context& context = {}); 76 : 77 0 : std::array<DataVector, 3> quaternions{}; 78 0 : std::array<DataVector, 4> angles{}; 79 0 : std::optional<double> decay_timescale; 80 : 81 : private: 82 0 : void initialize_angles_and_quats(); 83 : }; 84 : 85 : /*! 86 : * \brief Helper function that takes the variant of the rotation map options, 87 : * and returns the fully constructed rotation function of time. 88 : * 89 : * \details The function of time will have a new \p initial_time and \p 90 : * expiration_time, unless it is read from a file and is replaying. 91 : */ 92 : template <bool AllowSettleFoTs> 93 1 : std::unique_ptr<domain::FunctionsOfTime::FunctionOfTime> get_rotation( 94 : const std::variant<RotationMapOptions<AllowSettleFoTs>, FromVolumeFile>& 95 : rotation_map_options, 96 : double initial_time, double expiration_time); 97 : } // namespace domain::creators::time_dependent_options