Skip to content

File fixedbackgroundexpansion.h

File List > code_source > cosmolattice > include > CosmoInterface > definitions > fixedbackgroundexpansion.h

Go to the documentation of this file

#ifndef COSMOINTERFACE_DEFINITIONS_FIXEDBACKGROUNDEXPANSION_H
#define COSMOINTERFACE_DEFINITIONS_FIXEDBACKGROUNDEXPANSION_H

/* This file is part of CosmoLattice, available at www.cosmolattice.net .
   Copyright Daniel G. Figueroa, Adrien Florio, Francisco Torrenti and Wessel Valkenburg.
   Released under the MIT license, see LICENSE.md. */

// File info: Main contributor(s): Daniel G. Figueroa, Adrien Florio, Francisco Torrenti,  Year: 2021

#include "CosmoInterface/runparameters.h"

namespace TempLat
{
  template <typename T> class FixedBackgroundExpansion
  {
  public:
    // Put public methods here. These should change very little over time.
    template <class Model>
    FixedBackgroundExpansion(Model &model, RunParameters<T> &rPar)
        : pEoS(2.0 / (3.0 * (1.0 + rPar.omegaEoS) -
                      2.0 * model.alpha)), // Coefficient of the power-law expansion: depends on EoS and alpha
          H0((AlmostEqual(rPar.H0, 0.0, runParameterTolerance) && Model::DefectsModel)
                 ? pEoS / rPar.t0
                 : rPar.H0 / model.omegaStar), // Initial Hubble parameter (in program units)
          alpha(model.alpha), doResolutionPreserving(rPar.doResolutionPreserving), t0(rPar.t0), tRP0(rPar.tRP0),
          tRPMax(rPar.tRPMax), sRP(rPar.sRP)
    {
      if (AlmostEqual(H0, 0.0, runParameterTolerance) && rPar.fixedBackground)
        throw(RunParametersInconsistent(
            "For models that do not involve cosmic defects, you need to specify a non-zero H0 to run a simulation with "
            "fixed background. If you want to disable expansion, please set expansion = false in the input file."));
    }

    auto operator()(T deltaT) // Scale factor
    {
      return pow(1 + H0 / pEoS * deltaT, pEoS);
    }

    auto dot(T deltaT) // Scale factor time-derivative
    {
      return H0 * pow(1 + H0 / pEoS * deltaT, pEoS - 1);
    }

    auto const areWeResolutionPreserving() const { return doResolutionPreserving; }

    auto R(T deltaT) // Ricci scalar for NMC field evolution in fixed background expansion
    {
      return -6.0 * pow<2>(H0) * pEoS * pow(1 + H0 / pEoS * deltaT, -2.0 * alpha * pEoS) * (1 + pEoS * (alpha - 2)) /
             pow<2>(pEoS + H0 * deltaT);
    }

  private:
    /* Put all member variables and private methods here. These may change arbitrarily. */

    T pEoS;
    T H0;
    T alpha;
    bool doResolutionPreserving;

  public:
    const T t0, tRP0, tRPMax, sRP;
  };

} // namespace TempLat

#endif