1
0
mirror of https://github.com/paboyle/Grid.git synced 2024-11-09 23:45:36 +00:00

working 7-link; Grid_log; generalShift

This commit is contained in:
david clarke 2023-10-12 11:11:39 -06:00
parent b9c70d156b
commit 36600899e2
4 changed files with 85 additions and 75 deletions

View File

@ -191,6 +191,27 @@ extern Colours GridLogColours;
std::string demangle(const char* name) ;
template<typename... Args>
inline std::string sjoin(Args&&... args) noexcept {
std::ostringstream msg;
(msg << ... << args);
return msg.str();
}
/*! @brief make log messages work like python print */
template <typename... Args>
inline void Grid_log(Args&&... args) {
std::string msg = sjoin(std::forward<Args>(args)...);
std::cout << GridLogMessage << msg << std::endl;
}
/*! @brief make warning messages work like python print */
template <typename... Args>
inline void Grid_warn(Args&&... args) {
std::string msg = sjoin(std::forward<Args>(args)...);
std::cout << GridLogWarning << msg << std::endl;
}
#define _NBACKTRACE (256)
extern void * Grid_backtrace_buffer[_NBACKTRACE];

View File

@ -32,17 +32,25 @@ directory
#pragma once
#include <Grid/Grid.h>
#include <Grid/lattice/PaddedCell.h>
#include <Grid/stencil/GeneralLocalStencil.h>
#define BACKWARD_CONST 16
#define NO_SHIFT -1
NAMESPACE_BEGIN(Grid);
/*! @brief append arbitrary shift path to shifts */
template<typename... Args>
void appendShift(std::vector<Coordinate>& shifts, int dir, Args... args) {
Coordinate shift(Nd,0);
generalShift(shift, dir, args...);
// push_back creates an element at the end of shifts and
// assigns the data in the argument to it.
shifts.push_back(shift);
}
// This is to optimize the SIMD (will also need to be in the class, at least for now)
template<class vobj> void gpermute(vobj & inout,int perm) {
vobj tmp=inout;
@ -53,14 +61,6 @@ template<class vobj> void gpermute(vobj & inout,int perm) {
}
/*! @brief signals that you want to go backwards in direction dir */
inline int Back(const int dir) {
// generalShift will use BACKWARD_CONST to determine whether we step forward or
// backward. Should work as long as BACKWARD_CONST > Nd. Trick inspired by SIMULATeQCD.
return dir + BACKWARD_CONST;
}
/*! @brief figure out the stencil index from mu and nu */
inline int stencilIndex(int mu, int nu) {
// Nshifts depends on how you built the stencil
@ -69,46 +69,6 @@ inline int stencilIndex(int mu, int nu) {
}
/*! @brief shift one unit in direction dir */
template<typename... Args>
void generalShift(Coordinate& shift, int dir) {
if (dir >= BACKWARD_CONST) {
dir -= BACKWARD_CONST;
shift[dir]+=-1;
} else if (dir == NO_SHIFT) {
; // do nothing
} else {
shift[dir]+=1;
}
}
// Move into general stencil header, beneath definition of general stencil
/*! @brief follow a path of directions, shifting one unit in each direction */
template<typename... Args>
void generalShift(Coordinate& shift, int dir, Args... args) {
if (dir >= BACKWARD_CONST) {
dir -= BACKWARD_CONST;
shift[dir]+=-1;
} else if (dir == NO_SHIFT) {
; // do nothing
} else {
shift[dir]+=1;
}
generalShift(shift, args...);
}
/*! @brief append arbitrary shift path to shifts */
template<typename... Args>
void appendShift(std::vector<Coordinate>& shifts, int dir, Args... args) {
Coordinate shift(Nd,0);
generalShift(shift, dir, args...);
// push_back creates an element at the end of shifts and
// assigns the data in the argument to it.
shifts.push_back(shift);
}
/*! @brief structure holding the link treatment */
struct SmearingParameters{
SmearingParameters(){}
@ -189,17 +149,16 @@ public:
// This is where contributions from the smearing get added together
Ughost_fat=Zero();
// Create the accessors
autoView(U_v , Ughost , CpuRead);
autoView(U_fat_v , Ughost_fat , CpuWrite);
autoView(U_3link_v , Ughost_3link , CpuWrite);
autoView(U_5linkA_v, Ughost_5linkA, CpuWrite);
autoView(U_5linkB_v, Ughost_5linkB, CpuWrite);
for(int mu=0;mu<Nd;mu++) {
// TODO: This approach is slightly memory inefficient. It uses 25% more memory than
// needs to be used.
// Create the accessors
autoView(U_v , Ughost , CpuRead);
autoView(U_fat_v , Ughost_fat , CpuWrite);
autoView(U_3link_v , Ughost_3link , CpuWrite);
autoView(U_5linkA_v, Ughost_5linkA, CpuWrite);
autoView(U_5linkB_v, Ughost_5linkB, CpuWrite);
// TODO: This approach is slightly memory inefficient. It uses 25% extra memory
Ughost_3link =Zero();
Ughost_5linkA=Zero();
Ughost_5linkB=Zero();
@ -321,7 +280,7 @@ public:
}
}
}
} // end mu loop
u_smr = Ghost.Extract(Ughost_fat) + lt.c_1*u_thin;
};

View File

@ -137,5 +137,49 @@ public:
};
////////////////////////////////////////////////
// Some machinery to streamline making a stencil
////////////////////////////////////////////////
#define BACKWARD_CONST 16
#define NO_SHIFT -1
// TODO: put a check somewhere that BACKWARD_CONST > Nd!
/*! @brief signals that you want to go backwards in direction dir */
inline int Back(const int dir) {
// generalShift will use BACKWARD_CONST to determine whether we step forward or
// backward. Trick inspired by SIMULATeQCD.
return dir + BACKWARD_CONST;
}
/*! @brief shift one unit in direction dir */
template<typename... Args>
void generalShift(Coordinate& shift, int dir) {
if (dir >= BACKWARD_CONST) {
dir -= BACKWARD_CONST;
shift[dir]+=-1;
} else if (dir == NO_SHIFT) {
; // do nothing
} else {
shift[dir]+=1;
}
}
/*! @brief follow a path of directions, shifting one unit in each direction */
template<typename... Args>
void generalShift(Coordinate& shift, int dir, Args... args) {
if (dir >= BACKWARD_CONST) {
dir -= BACKWARD_CONST;
shift[dir]+=-1;
} else if (dir == NO_SHIFT) {
; // do nothing
} else {
shift[dir]+=1;
}
generalShift(shift, args...);
}
NAMESPACE_END(Grid);

View File

@ -38,20 +38,6 @@ directory
using namespace Grid;
/*! @brief make the logger work like python print */
template<typename... Args>
inline std::string sjoin(Args&&... args) noexcept {
std::ostringstream msg;
(msg << ... << args);
return msg.str();
}
template <typename... Args>
inline void Grid_log(Args&&... args) {
std::string msg = sjoin(std::forward<Args>(args)...);
std::cout << GridLogMessage << msg << std::endl;
}
/*! @brief parameter file to easily adjust Nloop */
struct ConfParameters: Serializable {
GRID_SERIALIZABLE_CLASS_MEMBERS(