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);
        }
    };

} /* TempLat */

#endif