39#define CHECK {std::cerr << __FILE__ << " @l " << __LINE__ << ": CHECK" << grid->ThisRank() << std::endl;}
40#define CHECK_VAR(a) { std::cerr << __FILE__ << "@l" << __LINE__ << " on "<< grid->ThisRank() << ": " << __func__ << " " << #a << "=" << (a) << std::endl; }
64 err = MPI_File_open(comm,
const_cast<char*
>(filename.c_str()), MPI_MODE_RDONLY, MPI_INFO_NULL, &
fp);
65 assert(
err == MPI_SUCCESS);
70 inline void errInfo(
int const err, std::string
const& func) {
71 static char estring[MPI_MAX_ERROR_STRING];
72 int eclass = -1, len = 0;
73 MPI_Error_class(
err, &eclass);
74 MPI_Error_string(
err, estring, &len);
75 std::cerr << func <<
" - Error " << eclass <<
": " << estring << std::endl;
79 assert((
grid->_ndimension ==
Nd) && (
Nd == 4));
94 field.dimension[0] =
header.Nx;
95 field.dimension[1] =
header.Ny;
96 field.dimension[2] =
header.Nz;
97 field.dimension[3] =
header.Nt;
99 for(
int d = 0; d <
Nd; d++)
100 assert(
grid->FullDimensions()[d] == field.dimension[d]);
102 field.plaquette =
header.plaq;
106 return field.data_start;
109 void readBlock(
void*
const dest, uint64_t
const pos, uint64_t
const nbytes, MPI_Datatype
const datatype) {
110 err = MPI_File_read_at_all(
fp, pos, dest, nbytes, datatype, &
status);
115 MPI_Get_count(&
status, datatype, &read);
117 assert(nbytes == (uint64_t)read);
118 assert(
err == MPI_SUCCESS);
122 constexpr int elem_size =
Nd * 2 * 2 *
Nc *
Nc *
sizeof(double);
124 err = MPI_Type_contiguous(elem_size, MPI_BYTE, &
oddSiteType); assert(
err == MPI_SUCCESS);
131 Coordinate sizes({L[2] / 2, L[1], L[0], L[3]});
132 Coordinate subsizes({l[2] / 2, l[1], l[0], l[3]});
133 Coordinate starts({i[2] * l[2] / 2, i[1] * l[1], i[0] * l[0], i[3] * l[3]});
135 err = MPI_Type_create_subarray(
grid->_ndimension, &sizes[0], &subsizes[0], &starts[0], MPI_ORDER_FORTRAN,
oddSiteType, &
fileViewType); assert(
err == MPI_SUCCESS);
150 int const domainSites =
grid->lSites();
151 domain_buff.resize(
Nd * domainSites);
154 constexpr uint64_t cm_size = 2 *
Nc *
Nc *
sizeof(double);
155 constexpr uint64_t os_size =
Nd * 2 * cm_size;
156 constexpr uint64_t max_elems = std::numeric_limits<int>::max();
157 uint64_t
const n_os = domainSites / 2;
159 for(uint64_t os_idx = 0; os_idx < n_os;) {
160 uint64_t
const read_os = os_idx + max_elems <= n_os ? max_elems : n_os - os_idx;
161 uint64_t
const cm = os_idx *
Nd * 2;
167 err = MPI_File_set_view(
fp, 0, MPI_BYTE, MPI_BYTE,
"native", MPI_INFO_NULL);
169 assert(
err == MPI_SUCCESS);
172 std::cout <<
GridLogMessage <<
"read sum: " << n_os * os_size <<
" bytes" << std::endl;
179 template<
class vsimd>
181 Grid::FieldMetaData&
header,
185 assert(
Ns == 4 and
Nd == 4 and
Nc == 3);
187 auto grid = Umu.Grid();
191 std::vector<fobj> iodata(
192 Nd * grid->lSites());
195 ParRdr rdr(MPI_COMM_WORLD, file, grid);
199 std::vector<iDoubleStoredColourMatrix<typename vsimd::scalar_type>> Umu_ds_scalar(grid->lSites());
203 DoubledGaugeField Umu_ds(grid);
213 RealD plaq_diff = fabs(clone.plaquette -
header.plaquette);
217 <<
" plaquette " << clone.plaquette
218 <<
" header " <<
header.plaquette
219 <<
" difference " << plaq_diff
224 RealD tol = precTol * std::sqrt(grid->_Nprocessors);
227 std::cout <<
" Plaquette mismatch (diff = " << plaq_diff <<
", tol = " << tol <<
")" << std::endl;
228 assert(plaq_diff < tol);
230 std::cout <<
GridLogMessage <<
"OpenQcd Configuration " << file <<
" and plaquette agree" << std::endl;
234 template<
class vsimd>
237 Grid::conformable(Umu.Grid(), Umu_ds.Grid());
247 std::vector<ColourMatrixD>
const& node_buff,
249 assert(node_buff.size() ==
Nd * grid->
lSites());
260 for(t = 0; t < l[3]; ++t)
261 for(x = 0; x < l[0]; ++x)
262 for(y = 0; y < l[1]; ++y)
263 for(z = 0; z < l[2]; ++z) {
264 if((t + z + y + x) % 2 == 0)
continue;
267 Lexicographic::IndexFromCoor(coord, local_idx, grid->
LocalDimensions());
268 for(
int mu = 0; mu < 2 *
Nd; ++mu)
269 for(
int c1 = 0; c1 <
Nc; ++c1) {
270 for(
int c2 = 0; c2 <
Nc; ++c2) {
271 u_fb[local_idx](mu)()(c1,c2) = node_buff[mu+buff_idx]()()(c1,c2);
277 assert(node_buff.size() == buff_idx);
AcceleratorVector< int, MaxDims > Coordinate
auto Cshift(const Expression &expr, int dim, int shift) -> decltype(closure(expr))
void PokeIndex(Lattice< vobj > &lhs, const Lattice< decltype(peekIndex< Index >(vobj(), 0))> &rhs, int i)
auto PeekIndex(const Lattice< vobj > &lhs, int i) -> Lattice< decltype(peekIndex< Index >(vobj(), i))>
std::enable_if< isSIMDvectorized< vobj >::value &&!isSIMDvectorized< sobj >::value, void >::type vectorizeFromLexOrdArray(std::vector< sobj > &in, Lattice< vobj > &out)
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
#define NAMESPACE_BEGIN(A)
iVector< iScalar< iMatrix< vtype, Nc > >, Nds > iDoubleStoredColourMatrix
iVector< iScalar< iMatrix< vtype, Nc > >, Nd > iLorentzColourMatrix
iColourMatrix< ComplexD > ColourMatrixD
static INTERNAL_PRECISION U
const Coordinate & LocalDimensions(void)
static void copyToLatticeObject(std::vector< DoubleStoredColourMatrix > &u_fb, std::vector< ColourMatrixD > const &node_buff, GridBase *grid)
static void redistribute(Lattice< iLorentzColourMatrix< vsimd > > &Umu, Lattice< iDoubleStoredColourMatrix< vsimd > > const &Umu_ds)
static void readConfiguration(Lattice< iLorentzColourMatrix< vsimd > > &Umu, Grid::FieldMetaData &header, std::string file)
MPI_Datatype fileViewType
int readHeader(FieldMetaData &field)
bool readGauge(std::vector< ColourMatrixD > &domain_buff, FieldMetaData &meta)
void errInfo(int const err, std::string const &func)
void readBlock(void *const dest, uint64_t const pos, uint64_t const nbytes, MPI_Datatype const datatype)
ParRdr(MPI_Comm comm, std::string const &filename, GridBase *gridPtr)