Skip to content

File nonminimalcoupling.h

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

Go to the documentation of this file

#ifndef COSMOINTERFACE_DEFINITIONS_NONMINIMALCOUPLING_H
#define COSMOINTERFACE_DEFINITIONS_NONMINIMALCOUPLING_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. */

#include "CosmoInterface/definitions/averages.h"
#include "CosmoInterface/definitions/energies.h"
#include "TempLat/lattice/algebra/operators/operators.h"
#include "TempLat/util/templatvector.h"

namespace TempLat
{

  class NonMinimalCoupling
  {
  public:
    NonMinimalCoupling() = delete;

    template <class Model> static auto F(Model &model)
    {
      auto sum = Total(i, 0, Model::Ns - 1,
                       IfElse(Model::NonMinimalCouplings::couples(i, Tag<0>()),
                              (6.0 * model.xis(i, 0_c) - 1.0) * model.xis(i, 0_c) * pow<2>(model.fStar / model.MPl) *
                                  model.fld2AvSI_i(i),
                              ZeroType()));
      return 1.0 / (1.0 + sum);
    }

    template <class Model> static auto R(Model &model)
    {
      Averages::setAllAverages(model);

      auto norm = pow<2>(model.fStar / Model::MPl) * NonMinimalCoupling::F(model);
      auto Eks = (Model::Ns > 0 ? Energies::kineticS(model) : 0);
      auto Ekcs = (Model::NCs > 0 ? Energies::kineticCS(model) : 0);
      auto EkSU2Dbl = (Model::NSU2Doublet > 0 ? Energies::kineticSU2Doublet(model) : 0);
      auto Egs = (Model::Ns > 0 ? Energies::gradientS(model) : 0);
      auto Egcs = (Model::NCs > 0 ? Energies::gradientCS(model) : 0);
      auto EgSU2Dbl = (Model::NSU2Doublet > 0 ? Energies::gradientSU2Doublet(model) : 0);
      auto EelU1 = (Model::NU1 > 0 ? Energies::electricU1(model) : 0);
      auto EmagU1 = (Model::NU1 > 0 ? Energies::magneticU1(model) : 0);
      auto EelSU2 = (Model::NSU2 > 0 ? Energies::electricSU2(model) : 0);
      auto EmagSU2 = (Model::NSU2 > 0 ? Energies::magneticSU2(model) : 0);

      auto rhoMinimal =
          Eks + Ekcs + EkSU2Dbl + Egs + Egcs + EgSU2Dbl + EelU1 + EmagU1 + EelSU2 + EmagSU2 + model.potAvI;
      auto pMinimal = Eks + Ekcs + EkSU2Dbl - (1.0 / 3.0) * (Egs + Egcs + EgSU2Dbl) +
                      (1.0 / 3.0) * (EelU1 + EmagU1 + EelSU2 + EmagSU2) - model.potAvI;
      auto minimalContribution = rhoMinimal - 3.0 * pMinimal;
      auto nonMinimalContribution = Total(i, 0, Model::Ns - 1,
                                          IfElse(Model::NonMinimalCouplings::couples(i, Tag<0>()),
                                                 12 * model.xis(i, 0_c) * (model.pi2AvSI_i(i) - model.grad2AvSI_i(i)) -
                                                     6.0 * model.xis(i, 0_c) * model.fldVpAvSI(i),
                                                 ZeroType()));
      return norm * (minimalContribution + nonMinimalContribution);
    }
  };

} // namespace TempLat

#endif