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 <pup.h>
11 :
12 : #include "DataStructures/DataVector.hpp"
13 : #include "Domain/FunctionsOfTime/FunctionOfTime.hpp"
14 : #include "Domain/FunctionsOfTime/SettleToConstant.hpp"
15 : #include "Utilities/Serialization/CharmPupable.hpp"
16 :
17 : namespace domain::FunctionsOfTime {
18 : /// \ingroup ControlSystemGroup
19 : /// \brief Given an initial function of time that is a unit quaternion,
20 : /// transitions to a constant-in-time unit quaternion.
21 : ///
22 : /// Given an initial unit quaternion \f$\mathbf{f}(t)\f$ and its first two
23 : /// derivatives at the matching time \f$t_0\f$, return a function of time
24 : /// \f$\mathbf{g}(t)\f$ satisfies \f$\mathbf{g}(t=t_0)=\mathbf{f}f(t=t_0)\f$ and
25 : /// approaches a constant value for \f$t > t_0\f$ on a timescale of \f$\tau\f$.
26 : /// This is done by internally holding a `SettleToConstant` function of time
27 : /// initialized from \f$\mathbf{f}(t)\f$ and its first two derivatives at the
28 : /// matching time, but then ensuring that \f$\mathbf{g}(t)\f$ remains
29 : /// a unit quaternion.
30 1 : class SettleToConstantQuaternion : public FunctionOfTime {
31 : public:
32 0 : SettleToConstantQuaternion() = default;
33 0 : SettleToConstantQuaternion(
34 : const std::array<DataVector, 3>& initial_func_and_derivs,
35 : double match_time, double decay_time);
36 :
37 0 : ~SettleToConstantQuaternion() override = default;
38 0 : SettleToConstantQuaternion(SettleToConstantQuaternion&&) = default;
39 0 : SettleToConstantQuaternion& operator=(SettleToConstantQuaternion&&) = default;
40 0 : SettleToConstantQuaternion(const SettleToConstantQuaternion&) = default;
41 0 : SettleToConstantQuaternion& operator=(const SettleToConstantQuaternion&) =
42 : default;
43 :
44 : // NOLINTNEXTLINE(google-runtime-references)
45 0 : WRAPPED_PUPable_decl_template(SettleToConstantQuaternion);
46 :
47 0 : explicit SettleToConstantQuaternion(CkMigrateMessage* /*unused*/) {}
48 :
49 0 : auto get_clone() const -> std::unique_ptr<FunctionOfTime> override;
50 :
51 : /// Returns the function at an arbitrary time `t`.
52 1 : std::array<DataVector, 1> func(double t) const override;
53 : /// Returns the function and its first derivative at an arbitrary time `t`.
54 1 : std::array<DataVector, 2> func_and_deriv(double t) const override;
55 : /// Returns the function and the first two derivatives at an arbitrary time
56 : /// `t`.
57 1 : std::array<DataVector, 3> func_and_2_derivs(double t) const override;
58 :
59 : /// Returns the domain of validity of the function.
60 1 : std::array<double, 2> time_bounds() const override;
61 :
62 1 : double expiration_after(double time) const override;
63 :
64 1 : void truncate_at_time(double time) override;
65 :
66 : // NOLINTNEXTLINE(google-runtime-references)
67 0 : void pup(PUP::er& p) override;
68 :
69 : private:
70 0 : friend bool operator==(const SettleToConstantQuaternion& lhs,
71 : const SettleToConstantQuaternion& rhs);
72 :
73 : template <size_t MaxDerivReturned = 2>
74 0 : std::array<DataVector, MaxDerivReturned + 1> func_and_derivs(double t) const;
75 :
76 0 : SettleToConstant unnormalized_function_of_time_;
77 0 : double match_time_{std::numeric_limits<double>::signaling_NaN()};
78 0 : double decay_time_{std::numeric_limits<double>::signaling_NaN()};
79 : };
80 :
81 0 : bool operator!=(const SettleToConstantQuaternion& lhs,
82 : const SettleToConstantQuaternion& rhs);
83 : } // namespace domain::FunctionsOfTime
|