Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <limits> 7 : #include <pup.h> 8 : 9 : #include "DataStructures/DataVector.hpp" 10 : #include "DataStructures/Tensor/Tensor.hpp" 11 : #include "Options/String.hpp" 12 : #include "PointwiseFunctions/ScalarTensor/ScalarGaussBonnet/CouplingFunctions/CouplingFunction.hpp" 13 : #include "Utilities/Gsl.hpp" 14 : #include "Utilities/Serialization/CharmPupable.hpp" 15 : #include "Utilities/TMPL.hpp" 16 : 17 : namespace ScalarTensor::sgb::CouplingFunctions { 18 : 19 : /*! 20 : * \brief Coupling function of polynomial type with degree up to four: 21 : * \f$F[\Psi] = \sum_{i = 1}^4 a_i \Psi^i\f$. 22 : * 23 : * \details This expression can be used to model the weak-field limit of a 24 : * generic coupling. Also, by appropriately setting the values of the 25 : * coefficients \f$a_i\f$ it can be used to study different phenomenological 26 : * scenario. For example, the theory admits the Kerr metric with vanishing 27 : * scalar field as a stationary solution in the case \f$a_1 = 0\f$, and can 28 : * feature spontanous scalarization for sufficiently large values of \f$a_2\f$. 29 : * Furthermore, if \f$a_2 = 0\f$, the theory can feature nonlinear 30 : * scalarization. See \cite Doneva:2022ewd for a review on spontanous 31 : * scalarization. 32 : */ 33 1 : class QuarticPolynomial : public CouplingFunction { 34 : public: 35 0 : static constexpr Options::String help = { 36 : "Coupling function of polynomial type with degree up to four"}; 37 : 38 0 : struct Linear { 39 0 : using type = double; 40 0 : static constexpr Options::String help = { 41 : "Coefficient of the linear term in the scalar field"}; 42 : }; 43 : 44 0 : struct Quadratic { 45 0 : using type = double; 46 0 : static constexpr Options::String help = { 47 : "Coefficient of the quadratic term in the scalar field"}; 48 : }; 49 : 50 0 : struct Cubic { 51 0 : using type = double; 52 0 : static constexpr Options::String help = { 53 : "Coefficient of the cubic term in the scalar field"}; 54 : }; 55 : 56 0 : struct Quartic { 57 0 : using type = double; 58 0 : static constexpr Options::String help = { 59 : "Coefficient of the quartic term in the scalar field"}; 60 : }; 61 : 62 0 : using options = tmpl::list<Linear, Quadratic, Cubic, Quartic>; 63 : 64 0 : QuarticPolynomial() = default; 65 0 : QuarticPolynomial(double linear, double quadratic, double cubic, 66 : double quartic); 67 0 : QuarticPolynomial(const QuarticPolynomial&) = default; 68 0 : QuarticPolynomial& operator=(const QuarticPolynomial&) = default; 69 0 : QuarticPolynomial(QuarticPolynomial&&) = default; 70 0 : QuarticPolynomial& operator=(QuarticPolynomial&&) = default; 71 0 : ~QuarticPolynomial() override = default; 72 : 73 0 : explicit QuarticPolynomial(CkMigrateMessage* m) : CouplingFunction(m) {} 74 0 : WRAPPED_PUPable_decl_template(QuarticPolynomial); 75 0 : void pup(PUP::er& p) override; 76 : 77 0 : double get_linear() const { return linear_; } 78 0 : double get_quadratic() const { return quadratic_; } 79 0 : double get_cubic() const { return cubic_; } 80 0 : double get_quartic() const { return quartic_; } 81 : 82 : protected: 83 : /*! 84 : * \brief Specialization of the function that evaluates the coupling function 85 : * on a scalar field profile. 86 : * 87 : * It returns the profile 88 : * \f$F[\Psi] = a_1 \Psi + a_2 \Psi^2 + a_3 \Psi^3 + a_4 \Psi^4\f$. 89 : */ 90 1 : void coupling_function_impl( 91 : gsl::not_null<Scalar<DataVector>*> function_values, 92 : const Scalar<DataVector>& scalar_field) const override; 93 : 94 : /*! 95 : * \brief Specialization of the function that evaluates the first functional 96 : * derivative of the coupling function on a scalar field profile. 97 : * 98 : * It returns the profile 99 : * \f$\frac{\delta F[\Psi]}{\delta \Psi} = a_1 + 2 a_2 \Psi + 3 a_3 \Psi^2 100 : * + 4 a_4 \Psi^3\f$. 101 : */ 102 1 : void coupling_function_prime_impl( 103 : gsl::not_null<Scalar<DataVector>*> function_values, 104 : const Scalar<DataVector>& scalar_field) const override; 105 : 106 : /*! 107 : * \brief Specialization of the function that evaluates the second functional 108 : * derivative of the coupling function on a scalar field profile. 109 : * 110 : * It returns the profile 111 : * \f$\frac{\delta^2 F[\Psi]}{\delta \Psi^2} = 2 a_2 + 6 a_3 \Psi 112 : * + 12 a_4 \Psi^2\f$. 113 : */ 114 1 : void coupling_function_prime_prime_impl( 115 : gsl::not_null<Scalar<DataVector>*> function_values, 116 : const Scalar<DataVector>& scalar_field) const override; 117 : 118 : private: 119 : /*! 120 : * \brief Coefficient of the term linear in the scalar field, \f$a_1\f$. 121 : */ 122 1 : double linear_{std::numeric_limits<double>::signaling_NaN()}; 123 : 124 : /*! 125 : * \brief Coefficient of the term quadratic in the scalar field, \f$a_2\f$. 126 : */ 127 1 : double quadratic_{std::numeric_limits<double>::signaling_NaN()}; 128 : 129 : /*! 130 : * \brief Coefficient of the term cubic in the scalar field, \f$a_3\f$. 131 : */ 132 1 : double cubic_{std::numeric_limits<double>::signaling_NaN()}; 133 : 134 : /*! 135 : * \brief Coefficient of the term quartic in the scalar field, \f$a_4\f$. 136 : */ 137 1 : double quartic_{std::numeric_limits<double>::signaling_NaN()}; 138 : }; 139 : 140 : } // namespace ScalarTensor::sgb::CouplingFunctions