File modelinitializer.h
File List > code_source > cosmolattice > include > CosmoInterface > initializers > modelinitializer.h
Go to the documentation of this file
#ifndef COSMOINTERFACE_INITIALIZERS_MODELINITIALIZER_H
#define COSMOINTERFACE_INITIALIZERS_MODELINITIALIZER_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: 2020
#include "CosmoInterface/initializers/fluctuationsgenerator.h"
#include "CosmoInterface/initializers/externalpowerspectruminitializer.h"
#include "CosmoInterface/initializers/scalefactorinitializer.h"
#include "CosmoInterface/initializers/scalarsingletinitializer.h"
#include "CosmoInterface/initializers/gwsinitializer.h"
#include "CosmoInterface/initializers/u1initializer.h"
#include "CosmoInterface/initializers/su2initializer.h"
#include "CosmoInterface/definitions/averages.h"
#include "CosmoInterface/definitions/hubbleconstraint.h"
#include "CosmoInterface/definitions/nonminimalcoupling.h"
#include "CosmoInterface/definitions/defectsmodule/diffusion.h"
namespace TempLat
{
// @label:modelinitializer_class
template <typename T> class ModelInitializer
{
public:
// Put public methods here. These should change very little over time.
template <class Model> ModelInitializer(Model &model, T pLSide, std::string pSeed) :
fg(model, pLSide, pSeed),
extps(model, pLSide, pSeed)
{}
template <class Model> void initialize(Model &model, RunParameters<T> &rPar, FilesManager<Model::NDim> &filesManager, ExtraFields<Model> extraFields)
{
// Initialize scale factor:
if (rPar.expansion) ScaleFactorInitializer::initializeScaleFactor(model, rPar);
// Initialize scalar singlets:
if constexpr (Model::Ns > 0) ScalarSingletInitializer::initializeScalars(model, fg, extps, rPar);
// Initialize GWs:
if (model.fldGWs != nullptr) GWsInitializer::initializeGWs(model);
// Initialize the SU2 gauge fields and SU2 doublets:
// --> Note: It is important to initialize SU2 first, as the doublet contributes to the U1 currents.
if constexpr (Model::NSU2Doublet > 0) SU2Initializer::initializeSU2(model, fg, rPar.kCutoff);
// Initialize the U1 gauge fields and complex scalars:
if constexpr (Model::NCs > 0 || Model::NU1 > 0)
U1Initializer::initializeU1(model, fg, extps, rPar, extraFields);
if constexpr (Model::DefectsModel) {
if (rPar.doDiffusion) Diffusion::diffuse(model, rPar, filesManager, extraFields);
}
Averages::setAllAverages(model);
if constexpr (Model::IsNonMinimallyCoupled) model.RI = NonMinimalCoupling::R(model);
if (rPar.expansion && !rPar.fixedBackground) {
// For consistency, correct the scale factor time-derivative with the fluctuations.
// Relevant only for higher order evolvers. Not done for a fixed background,
// where aDot is prescribed by the user through H0.
auto hubbleLaw = HubbleConstraint::get(model);
model.aDotI = sqrt(hubbleLaw[2]);
if constexpr (Model::IsNonMinimallyCoupled) model.piAI = model.aDotI * pow(model.aI, 1 - model.alpha);
}
}
// @endlabel
private:
/* Put all member variables and private methods here. These may change arbitrarily. */
FluctuationsGenerator<T> fg;
ExternalPowerSpectrumInitializer<T> extps;
};
} // namespace TempLat
#endif