SpECTRE Documentation Coverage Report
Current view: top level - PointwiseFunctions/ScalarTensor/ScalarGaussBonnet/CouplingFunctions - Exponential.hpp Hit Total Coverage
Commit: c3e43f8d41800b0ecefb9d1393f1de1d5a280c8f Lines: 6 29 20.7 %
Date: 2026-07-24 22:09:25
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 <limits>
       7             : #include <pup.h>
       8             : #include <string>
       9             : 
      10             : #include "DataStructures/DataVector.hpp"
      11             : #include "DataStructures/Tensor/Tensor.hpp"
      12             : #include "Options/String.hpp"
      13             : #include "PointwiseFunctions/ScalarTensor/ScalarGaussBonnet/CouplingFunctions/CouplingFunction.hpp"
      14             : #include "Utilities/Gsl.hpp"
      15             : #include "Utilities/Serialization/CharmPupable.hpp"
      16             : #include "Utilities/TMPL.hpp"
      17             : 
      18             : namespace ScalarTensor::sgb::CouplingFunctions {
      19             : 
      20             : /*!
      21             :  * \brief Coupling function of exponential type.
      22             :  *
      23             :  * \details The functional form of this coupling is
      24             :  * \f$F[\Psi] = \lambda e^{\gamma \Psi}\f$, where both \f$\lambda\f$ and
      25             :  * \f$\gamma\f$ are dimensionless.
      26             :  *
      27             :  * In the case of exponential coupling the theory does not admit the Kerr metric
      28             :  * as a stationary solution, and spontaneous scalarization cannot take place.
      29             :  * For this type of coupling the theory is also referred to as
      30             :  * _Einstein-dilaton-Gauss-Bonnet_.
      31             :  */
      32           1 : class Exponential : public CouplingFunction {
      33             :  public:
      34           0 :   static constexpr Options::String help = {
      35             :       "Coupling function of exponential type"};
      36             : 
      37           0 :   struct Lambda {
      38           0 :     using type = double;
      39           0 :     static constexpr Options::String help = {
      40             :         "The numerical dimensionless coefficient in front of the exponential"};
      41           0 :     static std::string name() { return "lambda"; }
      42             :   };
      43             : 
      44           0 :   struct Gamma {
      45           0 :     using type = double;
      46           0 :     static constexpr Options::String help = {
      47             :         "The numerical dimensionless coefficient in the exponent"};
      48           0 :     static std::string name() { return "gamma"; }
      49             :   };
      50             : 
      51           0 :   using options = tmpl::list<Lambda, Gamma>;
      52             : 
      53           0 :   Exponential() = default;
      54           0 :   Exponential(double lambda, double gamma);
      55           0 :   Exponential(const Exponential&) = default;
      56           0 :   Exponential& operator=(const Exponential&) = default;
      57           0 :   Exponential(Exponential&&) = default;
      58           0 :   Exponential& operator=(Exponential&&) = default;
      59           0 :   ~Exponential() override = default;
      60             : 
      61           0 :   explicit Exponential(CkMigrateMessage* m) : CouplingFunction(m) {}
      62           0 :   WRAPPED_PUPable_decl_template(Exponential);
      63           0 :   void pup(PUP::er& p) override;
      64             : 
      65           0 :   double get_lambda() const { return lambda_; }
      66           0 :   double get_gamma() const { return gamma_; }
      67             : 
      68             :  protected:
      69             :   /*!
      70             :    * \brief Specialization of the function that evaluates the coupling function
      71             :    * on a scalar field profile.
      72             :    *
      73             :    * It returns the profile \f$F[\Psi] = \lambda e^{- \gamma \Psi}\f$.
      74             :    */
      75           1 :   void coupling_function_impl(
      76             :       gsl::not_null<Scalar<DataVector>*> function_values,
      77             :       const Scalar<DataVector>& scalar_field) const override;
      78             : 
      79             :   /*!
      80             :    * \brief Specialization of the function that evaluates the first functional
      81             :    * derivative of the coupling function on a scalar field profile.
      82             :    *
      83             :    * It returns the profile
      84             :    * \f$\frac{\delta F[\Psi]}{\delta \Psi}
      85             :    * = - \gamma \lambda e^{- \gamma \Psi}\f$.
      86             :    */
      87           1 :   void coupling_function_prime_impl(
      88             :       gsl::not_null<Scalar<DataVector>*> function_values,
      89             :       const Scalar<DataVector>& scalar_field) const override;
      90             : 
      91             :   /*!
      92             :    * \brief Specialization of the function that evaluates the second functional
      93             :    * derivative of the coupling function on a scalar field profile.
      94             :    *
      95             :    * It returns the profile
      96             :    * \f$\frac{\delta^2 F[\Psi]}{\delta \Psi^2}
      97             :    * = \gamma^2 \lambda e^{- \gamma \Psi}\f$.
      98             :    */
      99           1 :   void coupling_function_prime_prime_impl(
     100             :       gsl::not_null<Scalar<DataVector>*> function_values,
     101             :       const Scalar<DataVector>& scalar_field) const override;
     102             : 
     103             :  private:
     104             :   /*!
     105             :    * \brief Coupling constant \f$\lambda\f$, appearing as a global factor in
     106             :    * the coupling function.
     107             :    */
     108           1 :   double lambda_{std::numeric_limits<double>::signaling_NaN()};
     109             : 
     110             :   /*!
     111             :    * \brief Coupling constant \f$\gamma\f$, appearing in the exponent of
     112             :    * the coupling function.
     113             :    */
     114           1 :   double gamma_{std::numeric_limits<double>::signaling_NaN()};
     115             : };
     116             : 
     117             : }  // namespace ScalarTensor::sgb::CouplingFunctions

Generated by: LCOV version 1.14