File topologicalchargesmeasurer.h
File List > code_source > cosmolattice > include > CosmoInterface > measurements > topologicalchargesmeasurer.h
Go to the documentation of this file
#ifndef COSMOINTERFACE_MEASUREMENTS_TOPOLOGICALCHARGESMEASURER_H
#define COSMOINTERFACE_MEASUREMENTS_TOPOLOGICALCHARGESMEASURER_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): Adrien Florio, Year: 2024
#include "CosmoInterface/runparameters.h"
#include "CosmoInterface/measurements/abstractmeasurer.h"
#include "CosmoInterface/measurements/meansmeasurer.h"
#include "CosmoInterface/measurements/measurementsIO/filesmanager.h"
#include "TempLat/util/templatvector.h"
#include "CosmoInterface/definitions/fieldfunctionals.h"
#include "TempLat/lattice/algebra/gaugealgebra/fieldstrength.h"
namespace TempLat
{
template <typename T> class TopologicalChargesMeasurer : public AbstractMeasurer
{
public:
/* Put public methods here. These should change very little over time. */
template <class Model>
TopologicalChargesMeasurer(Model &model, FilesManager<Model::NDim> &filesManager, const RunParameters<T> &par,
bool append)
: amIRoot(model.getToolBox()->amIRoot())
{
if constexpr (Model::NU1 > 0) {
topologicalCharges = std::make_unique<MeasurementsSaver<T>>(filesManager, "topological_charges", amIRoot,
append, getTopologyHeaders(model));
}
}
template <class Model> void measure(Model &model, T t)
{
if constexpr (Model::NU1 > 0) {
topologicalCharges->addAverage(t); // add to file
// U1 gauge fields
ForLoop(i, 0, Model::NU1 - 1, auto EB = average(FieldFunctionals::EBU1(model, i));
auto EB2 = average(pow<2>(FieldFunctionals::EBU1(model, i))); topologicalCharges->addAverage(EB);
topologicalCharges->addAverage(EB2););
// SU2 gauge fields
/*ForLoop(i, 0, Model::NSU2 - 1, auto EB = average(FieldFunctionals::TrEBSU2(model, i));
auto EB2 = average(pow<2>(FieldFunctionals::TrEBSU2(model, i))); topologicalCharges->addAverage(EB);
topologicalCharges->addAverage(EB2););*/
topologicalCharges->save(lastMeas);
}
}
private:
/* Put all member variables and private methods here. These may change arbitrarily. */
// Returns string with the header of the energies file.
template <typename Model> std::vector<std::string> getTopologyHeaders(Model &model) const
{
std::vector<std::string> ret;
ret.emplace_back("t");
ForLoop(i, 0, Model::NU1 - 1, ret.emplace_back("<EB>_U1_" + std::to_string(i));
ret.emplace_back("<(EB)^2>_U1_" + std::to_string(i)););
// ForLoop(i, 0, Model::NSU2 - 1, ret.emplace_back("<Tr(EB)>_SU2_"); ret.emplace_back("<Tr(EB)^2>_SU2_"););
return ret;
}
const bool amIRoot;
std::unique_ptr<MeasurementsSaver<T>> topologicalCharges;
};
} // namespace TempLat
#endif