Grid 0.7.0
MetaData.h
Go to the documentation of this file.
1/*************************************************************************************
2
3 Grid physics library, www.github.com/paboyle/Grid
4
5 Source file: ./lib/parallelIO/Metadata.h
6
7 Copyright (C) 2015, 2026
8
9 Author: Peter Boyle <paboyle@ph.ed.ac.uk>
10 Author: Jamie Hudspith <renwick.james.hudspth@gmail.com>
11 Author: Gaurav Ray <gaurav.sinharay@swansea.ac.uk>
12
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 2 of the License, or
16 (at your option) any later version.
17
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License along
24 with this program; if not, write to the Free Software Foundation, Inc.,
25 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26
27 See the full license in the file "LICENSE" in the top level distribution directory
28*************************************************************************************/
29/* END LEGAL */
30
31#include <algorithm>
32#include <iostream>
33#include <iomanip>
34#include <fstream>
35#include <map>
36#include <unistd.h>
37#include <sys/utsname.h>
38#include <pwd.h>
39
41
43// Precision mapping
45template<class vobj> static std::string getFormatString (void)
46{
47 std::string format;
48 typedef typename getPrecision<vobj>::real_scalar_type stype;
49 if ( sizeof(stype) == sizeof(float) ) {
50 format = std::string("IEEE32BIG");
51 }
52 if ( sizeof(stype) == sizeof(double) ) {
53 format = std::string("IEEE64BIG");
54 }
55 return format;
56};
57
59 // header specification/interpretation
61 class FieldNormMetaData : Serializable {
62 public:
64 };
65 class FieldMetaData : Serializable {
66 public:
67
69 int, nd,
70 std::vector<int>, dimension,
71 std::vector<std::string>, boundary,
72 int, data_start,
73 std::string, hdr_version,
74 std::string, storage_format,
75 double, link_trace,
76 double, plaquette,
77 uint32_t, checksum,
78 uint32_t, scidac_checksuma,
79 uint32_t, scidac_checksumb,
80 unsigned int, sequence_number,
81 std::string, data_type,
82 std::string, ensemble_id,
83 std::string, ensemble_label,
84 std::string, ildg_lfn,
85 std::string, creator,
86 std::string, creator_hardware,
87 std::string, creation_date,
88 std::string, archive_date,
89 std::string, floating_point);
90 // WARNING: non-initialised values might lead to twisted parallel IO
91 // issues, std::string are fine because they initliase to size 0
92 // as per C++ standard.
94 : nd(4), dimension(4,0), boundary(4, ""), data_start(0),
95 link_trace(0.), plaquette(0.), checksum(0),
96 scidac_checksuma(0), scidac_checksumb(0), sequence_number(0)
97 {}
98 };
99
100// PB disable using namespace - this is a header and forces namesapce visibility for all
101// including files
102//using namespace Grid;
103
105// Bit and Physical Checksumming and QA of data
108{
109 int nd = grid->_ndimension;
110 header.nd = nd;
111 header.dimension.resize(nd);
112 header.boundary.resize(nd);
113 header.data_start = 0;
114 for(int d=0;d<nd;d++) {
115 header.dimension[d] = grid->_fdimensions[d];
116 }
117 for(int d=0;d<nd;d++) {
118 header.boundary[d] = std::string("PERIODIC");
119 }
120}
121
123{
124 // Who
125 struct passwd *pw = getpwuid (getuid());
126 if (pw) header.creator = std::string(pw->pw_name);
127
128 // When
129 std::time_t t = std::time(nullptr);
130 std::tm tm_ = *std::localtime(&t);
131 std::ostringstream oss;
132 oss << std::put_time(&tm_, "%c %Z");
133 header.creation_date = oss.str();
134 header.archive_date = header.creation_date;
135
136 // What
137 struct utsname name; uname(&name);
138 header.creator_hardware = std::string(name.nodename)+"-";
139 header.creator_hardware+= std::string(name.machine)+"-";
140 header.creator_hardware+= std::string(name.sysname)+"-";
141 header.creator_hardware+= std::string(name.release);
142}
143
144#define dump_meta_data(field, s) \
145 s << "BEGIN_HEADER" << std::endl; \
146 s << "HDR_VERSION = " << field.hdr_version << std::endl; \
147 s << "DATATYPE = " << field.data_type << std::endl; \
148 s << "STORAGE_FORMAT = " << field.storage_format << std::endl; \
149 for(int i=0;i<4;i++){ \
150 s << "DIMENSION_" << i+1 << " = " << field.dimension[i] << std::endl ; \
151 } \
152 s << "LINK_TRACE = " << std::setprecision(10) << field.link_trace << std::endl; \
153 s << "PLAQUETTE = " << std::setprecision(10) << field.plaquette << std::endl; \
154 for(int i=0;i<4;i++){ \
155 s << "BOUNDARY_"<<i+1<<" = " << field.boundary[i] << std::endl; \
156 } \
157 \
158 s << "CHECKSUM = "<< std::hex << std::setw(10) << field.checksum << std::dec<<std::endl; \
159 s << "SCIDAC_CHECKSUMA = "<< std::hex << std::setw(10) << field.scidac_checksuma << std::dec<<std::endl; \
160 s << "SCIDAC_CHECKSUMB = "<< std::hex << std::setw(10) << field.scidac_checksumb << std::dec<<std::endl; \
161 s << "ENSEMBLE_ID = " << field.ensemble_id << std::endl; \
162 s << "ENSEMBLE_LABEL = " << field.ensemble_label << std::endl; \
163 s << "SEQUENCE_NUMBER = " << field.sequence_number << std::endl; \
164 s << "CREATOR = " << field.creator << std::endl; \
165 s << "CREATOR_HARDWARE = "<< field.creator_hardware << std::endl; \
166 s << "CREATION_DATE = " << field.creation_date << std::endl; \
167 s << "ARCHIVE_DATE = " << field.archive_date << std::endl; \
168 s << "FLOATING_POINT = " << field.floating_point << std::endl; \
169 s << "END_HEADER" << std::endl;
170
171template<class vobj> inline void PrepareMetaData(Lattice<vobj> & field, FieldMetaData &header)
172{
173 GridBase *grid = field.Grid();
174 std::string format = getFormatString<vobj>();
175 header.floating_point = format;
176 header.checksum = 0x0; // Nersc checksum unused in ILDG, Scidac
177 GridMetaData(grid,header);
179}
180template<class Impl>
182{
183public:
189};
193{
194 GridBase *grid = field.Grid();
195 std::string format = getFormatString<vLorentzColourMatrixD>();
196 header.floating_point = format;
197 header.checksum = 0x0; // Nersc checksum unused in ILDG, Scidac
198 GridMetaData(grid,header);
200}
201
203// Utilities ; these are QCD aware
206{
207 assert( Nc < 4 && Nc > 1 ) ;
208 for(int mu=0;mu<Nd;mu++){
209 #if Nc == 2
210 cm(mu)()(1,0) = -adj(cm(mu)()(0,y)) ;
211 cm(mu)()(1,1) = adj(cm(mu)()(0,x)) ;
212 #else
213 const int x=0 , y=1 , z=2 ; // a little disingenuous labelling
214 cm(mu)()(2,x) = adj(cm(mu)()(0,y)*cm(mu)()(1,z)-cm(mu)()(0,z)*cm(mu)()(1,y)); //x= yz-zy
215 cm(mu)()(2,y) = adj(cm(mu)()(0,z)*cm(mu)()(1,x)-cm(mu)()(0,x)*cm(mu)()(1,z)); //y= zx-xz
216 cm(mu)()(2,z) = adj(cm(mu)()(0,x)*cm(mu)()(1,y)-cm(mu)()(0,y)*cm(mu)()(1,x)); //z= xy-yx
217 #endif
218 }
219}
220
221// the elements of the final row of an SU(N) matrix
222// can be obtained from the determinants of the N N-1 by N-1 matrices
223// formed by deleting each column and the Nth row of the SU(N) matrix.
224// 1) create a ColourSubMatrix object to store the N-1 dim matrix.
225// 2) peek the colour matrix in a particular direction.
226// 3) fill the ColourSubMatrix object from the peeked matrix.
227// 4) take the Determinant and fill the corresponding element
228// 5) repeat for each Lorentz index
230{
231 using ColourSubMatrix = iScalar<iScalar<iMatrix<Complex, Nc-1> > > ;
232
233 ColourSubMatrix Su; // for the Nc-1 by Nc-1 matrix
234 ColourMatrix SU; // for the Nc-1 by N matrix read from disk
235
236 for(int mu=0; mu<Nd; mu++) {
237 Su = Zero();
238 SU = peekIndex<LorentzIndex>(cm,mu);
239 for(int k=0; k<Nc; k++) {
240 for(int i=0; i<Nc-1; i++) {
241 for(int j=0; j<Nc-1; j++) {
242 int J = (j<k) ? j : j+1; // for correct indexing of columns in SU
243 Su()()(i,j) = SU()()(i,J);
244 }
245 }
246 SU()()(Nc-1,k) = std::pow(-1,k+Nc-1) * adj(Determinant(Su));
247 }
249 }
250}
251
252// this function determines if a sequence of integers {i0...ik}
253// is an even or odd parity permutation. even/odd if the number of
254// inversions needed to get back to the lexicographic 1st sequence is
255// even or odd. ex: {1,2,0} --> {1,0,2} --> {0,1,2} implies {1,2,0} is even.
256inline bool is_perm_even(std::vector<int> &v) {
257
258 int n = v.size();
259 std::vector<int> a(n,0);
260 int c = 0;
261
262 for(int j=0; j<n; j++) {
263 if(a[j]==0) {
264 c += 1;
265 a[j] = 1;
266 int i = j;
267 while(v[i]!=j) {
268 i = v[i];
269 a[i] = 1;
270 }
271 }
272 }
273
274 if ((n-c)%2==0) {
275 return true;
276 } else {
277 return false;
278 }
279}
280
282//
283// this function follows the prescription laid out by the
284// ildg spec, forming a sum of products in lexicographic order.
285//
286// SU[N-1][k] = sum ( SU[0][i0].SU[1][i1]...SU[N-2][iN-2] )*
287// {i0...iN-2!=k}
288//
289// see appendix A.2 of
290// https://www-zeuthen.desy.de/apewww/ILDG/specifications/ildg-file-format-1.2.pdf
293{
294
295 std::vector<int> indices(Nc);
296 std::iota(indices.begin(), indices.end(), 0); // {0,1,...,Nc-1}
297
298 for(int mu=0; mu<Nd; mu++) {
299 for(int k=0; k<Nc; k++) {
300 std::vector<int> cols = indices;
301 cols.erase(cols.begin()+k); // {0,...,k-1,k+1,...Nc-1}
302 cm(mu)()(Nc-1,k) = 0;
303 // construct sum of products
304 // as we cycle through permutations of cols
305 do
306 {
307 std::vector<int> perm = cols;
308 perm.emplace_back(k);
309 ComplexD prod(1,0);
310 for(int i=0;i<Nc-1;i++) {
311 prod *= cm(mu)()(i,cols[i]) ;
312 }
313 if( is_perm_even(perm) ) { cm(mu)()(Nc-1,k) += conjugate(prod); }
314 else { cm(mu)()(Nc-1,k) -= conjugate(prod); }
315 }
316 while (std::next_permutation(cols.begin(), cols.end()));
317 }
318 }
319}
320
322// this function takes a reduced format
323// Sp(2N) field with N rows and 2N columns
324// and reconstructs the full 2Nx2N matrix.
325// the full matrix has block structure:
326// | A B |
327// |-B* A*|
328// where A and B are NxN matrices.
329// see appendix A.2 of
330// https://www-zeuthen.desy.de/apewww/ILDG/specifications/ildg-file-format-1.2.pdf
333{
334 assert( Nc%2==0 );
335 int N = Nc/2;
336 for(int mu=0;mu<Nd;mu++){
337 for(int i=0;i<N;i++){
338 for(int j=0;j<N;j++){
339 cm(mu)()(i+N,j) = -adj( cm(mu)()(i,j+N) ); //B to -B*
340 cm(mu)()(i+N,j+N) = adj( cm(mu)()(i,j) ); //A to A*
341 }
342 }
343 }
344}
345
346// Some data types for intermediate storage
348template<typename vtype> using iLorentzColour2x3 = iVector<iVector<iVector<vtype, Nc>, Nc-1>, Nd >;
352
353// intermediate types for Sp(2N) fields
354template<typename vtype> using iLorentzColourNx2N = iVector<iVector<iVector<vtype, Nc>, Nc/2>, Nd >;
357
359// Simple classes for precision conversion
361template <class fobj, class sobj>
365
366 void operator()(sobj &in, fobj &out) {
367 // take word by word and transform accoding to the status
368 fobj_stype *out_buffer = (fobj_stype *)&out;
369 sobj_stype *in_buffer = (sobj_stype *)&in;
370 size_t fobj_words = sizeof(out) / sizeof(fobj_stype);
371 size_t sobj_words = sizeof(in) / sizeof(sobj_stype);
372 assert(fobj_words == sobj_words);
373
374 for (unsigned int word = 0; word < sobj_words; word++)
375 out_buffer[word] = in_buffer[word]; // type conversion on the fly
376
377 }
378};
379
380template <class fobj, class sobj>
384
385 void operator()(fobj &in, sobj &out) {
386 // take word by word and transform accoding to the status
387 fobj_stype *in_buffer = (fobj_stype *)&in;
388 sobj_stype *out_buffer = (sobj_stype *)&out;
389 size_t fobj_words = sizeof(in) / sizeof(fobj_stype);
390 size_t sobj_words = sizeof(out) / sizeof(sobj_stype);
391 assert(fobj_words == sobj_words);
392
393 for (unsigned int word = 0; word < sobj_words; word++)
394 out_buffer[word] = in_buffer[word]; // type conversion on the fly
395
396 }
397};
398
399
400template<class fobj,class sobj>
402 void operator()(fobj &in, sobj &out) {
403 for (int mu = 0; mu < Nd; mu++) {
404 for (int i = 0; i < Nc; i++) {
405 for (int j = 0; j < Nc; j++) {
406 out(mu)()(i, j) = in(mu)()(i, j);
407 }}
408 }
409 };
410};
411
412template <class fobj, class sobj>
414 void operator()(sobj &in, fobj &out) {
415 for (int mu = 0; mu < Nd; mu++) {
416 for (int i = 0; i < Nc; i++) {
417 for (int j = 0; j < Nc; j++) {
418 out(mu)()(i, j) = in(mu)()(i, j);
419 }}
420 }
421 };
422};
423
424template<class fobj,class sobj>
426 void operator()(fobj &in, sobj &out) {
427 for (int mu = 0; mu < Nds; mu++) {
428 for (int i = 0; i < Nc; i++) {
429 for (int j = 0; j < Nc; j++) {
430 out(mu)()(i, j) = in(mu)()(i, j);
431 }}
432 }
433 };
434};
435
436template <class fobj, class sobj>
438 void operator()(sobj &in, fobj &out) {
439 for (int mu = 0; mu < Nds; mu++) {
440 for (int i = 0; i < Nc; i++) {
441 for (int j = 0; j < Nc; j++) {
442 out(mu)()(i, j) = in(mu)()(i, j);
443 }}
444 }
445 };
446};
447
448template<class fobj,class sobj>
450 void operator() (fobj &in,sobj &out){
451 for(int mu=0;mu<Nd;mu++){
452 for(int i=0;i<Nc-1;i++){
453 for(int j=0;j<Nc;j++){
454 out(mu)()(i,j) = in(mu)(i)(j);
455 }}
456 }
457 reconstruct3(out);
458 }
459};
460
461template<class fobj,class sobj>
463 void operator() (sobj &in,fobj &out){
464 for(int mu=0;mu<Nd;mu++){
465 for(int i=0;i<Nc-1;i++){
466 for(int j=0;j<Nc;j++){
467 out(mu)(i)(j) = in(mu)()(i,j);
468 }}
469 }
470 }
471};
472
473template<class fobj,class sobj, bool unique_su>
475// two specialisations for two ways to reconstruct
476// NcxNc matrix from (Nc-1)xNc matrix
477
478template<class fobj,class sobj>
479struct GaugeSUmunger<fobj,sobj,false>{
480 void operator() (fobj &in,sobj &out){
481 for(int mu=0;mu<Nd;mu++){
482 for(int i=0;i<Nc-1;i++){
483 for(int j=0;j<Nc;j++){
484 out(mu)()(i,j) = in(mu)(i)(j);
485 }
486 }
487 }
488 reconstructSU(out);
489 }
490};
491
492template<class fobj,class sobj>
493struct GaugeSUmunger<fobj,sobj,true>{
494 void operator() (fobj &in,sobj &out){
495 for(int mu=0;mu<Nd;mu++){
496 for(int i=0;i<Nc-1;i++){
497 for(int j=0;j<Nc;j++){
498 out(mu)()(i,j) = in(mu)(i)(j);
499 }
500 }
501 }
503 }
504};
505
506
507template<class fobj,class sobj>
509 void operator() (sobj &in,fobj &out){
510 for(int mu=0;mu<Nd;mu++){
511 for(int i=0;i<Nc-1;i++){
512 for(int j=0;j<Nc;j++){
513 out(mu)(i)(j) = in(mu)()(i,j);
514 }
515 }
516 }
517 }
518};
519
520template<class fobj,class sobj>
522 void operator() (fobj &in,sobj &out){
523 for(int mu=0;mu<Nd;mu++){
524 for(int i=0;i<Nc/2;i++){
525 for(int j=0;j<Nc;j++){
526 out(mu)()(i,j) = in(mu)(i)(j);
527 }
528 }
529 }
530 reconstructSp(out);
531 }
532};
533
534// transform Sp(2N) fields into reduced Nx2N format.
535template<class fobj,class sobj>
537 void operator() (sobj &in,fobj &out){
538 for(int mu=0;mu<Nd;mu++){
539 for(int i=0;i<Nc/2;i++){
540 for(int j=0;j<Nc;j++){
541 out(mu)(i)(j) = in(mu)()(i,j);
542 }
543 }
544 }
545 }
546};
547
548// these are used as non-type template parameters when
549// writing with GaugeUnMunger and as regular parameters
550// when reading with IldgReader.readConfiguration
552enum struct MatrixFormat { FULL, REDUCED };
554// this struct is used to choose the appropriate
555// unmunger (for writing) at compile time.
556// there are 3 partial template specialisations,
557// > no group reduction - treat SU and Sp the same
558// > group reduction for SU fields
559// > group reduction for Sp fields
560// It also exposes the intermediate out_type for use in
561// IldgWriter.writeConfiguration
563template<class vobj, class group_name, MatrixFormat m_fmt, FloatingPointFormat fp_fmt>
565
566// no group reduction
567template<class vobj, class group_name, FloatingPointFormat fp_fmt>
568struct GaugeUnMunger<vobj, group_name, MatrixFormat::FULL, fp_fmt>
569{
570 using in_type = typename vobj::scalar_object;
571 using out_type = typename std::tuple_element_t<static_cast<int>(fp_fmt), std::tuple<LorentzColourMatrixD,LorentzColourMatrixF>>;
573
574 void operator() (in_type &in, out_type &out){
575 unmunger(in,out);
576 }
577};
578
579//template specialisation for SU
580template<class vobj, FloatingPointFormat fp_fmt>
582{
583 using in_type = typename vobj::scalar_object;
584 using tmp_type = typename std::tuple_element_t<static_cast<int>(fp_fmt), std::tuple<LorentzColourMatrixD,LorentzColourMatrixF>>;
585 using out_type = typename std::tuple_element_t<static_cast<int>(fp_fmt), std::tuple<LorentzColour2x3D,LorentzColour2x3F>>;
586
589
590 void operator() (in_type &in, out_type &out){
591 tmp_type tmp;
592 binary_unmunger(in, tmp);
593 gauge_unmunger(tmp,out);
594 }
595};
596
597//template specialisation for Sp
598template<class vobj, FloatingPointFormat fp_fmt>
600{
601 using in_type = typename vobj::scalar_object;
602 using tmp_type = typename std::tuple_element_t<static_cast<int>(fp_fmt), std::tuple<LorentzColourMatrixD,LorentzColourMatrixF>>;
603 using out_type = typename std::tuple_element_t<static_cast<int>(fp_fmt), std::tuple<LorentzColourNx2ND,LorentzColourNx2NF>>;
604
607
608 void operator() (in_type &in, out_type &out){
609 tmp_type tmp;
610 binary_unmunger(in, tmp);
611 gauge_unmunger(tmp, out);
612 }
613};
614
615
617
GaugeGroup< ncolour, GroupName::SU > SU
Definition GaugeGroup.h:453
GaugeGroup< ncolour, GroupName::Sp > Sp
Definition GaugeGroup.h:456
#define perm(a, b, n, w)
Lattice< vobj > conjugate(const Lattice< vobj > &lhs)
Lattice< vobj > adj(const Lattice< vobj > &lhs)
RealD norm2(const Lattice< vobj > &arg)
Lattice< iScalar< iScalar< iScalar< Vec > > > > Determinant(const Lattice< iScalar< iScalar< iMatrix< Vec, N > > > > &Umu)
iLorentzColour2x3< ComplexD > LorentzColour2x3D
Definition MetaData.h:351
static std::string getFormatString(void)
Definition MetaData.h:45
void PrepareMetaData(Lattice< vobj > &field, FieldMetaData &header)
Definition MetaData.h:171
void PrepareMetaData< vLorentzColourMatrixD >(Lattice< vLorentzColourMatrixD > &field, FieldMetaData &header)
Definition MetaData.h:192
iVector< iVector< iVector< vtype, Nc >, Nc-1 >, Nd > iLorentzColour2x3
Definition MetaData.h:348
void reconstructSU(LorentzColourMatrix &cm)
Definition MetaData.h:229
iLorentzColourNx2N< ComplexD > LorentzColourNx2ND
Definition MetaData.h:356
iLorentzColour2x3< ComplexF > LorentzColour2x3F
Definition MetaData.h:350
bool is_perm_even(std::vector< int > &v)
Definition MetaData.h:256
MatrixFormat
Definition MetaData.h:552
GaugeStatistics< ConjugateGimplD > ConjugateGaugeStatistics
Definition MetaData.h:191
void MachineCharacteristics(FieldMetaData &header)
Definition MetaData.h:122
GaugeStatistics< PeriodicGimplD > PeriodicGaugeStatistics
Definition MetaData.h:190
void reconstruct3(LorentzColourMatrix &cm)
Definition MetaData.h:205
void GridMetaData(GridBase *grid, FieldMetaData &header)
Definition MetaData.h:107
iLorentzColour2x3< Complex > LorentzColour2x3
Definition MetaData.h:349
iVector< iVector< iVector< vtype, Nc >, Nc/2 >, Nd > iLorentzColourNx2N
Definition MetaData.h:354
iLorentzColourNx2N< ComplexF > LorentzColourNx2NF
Definition MetaData.h:355
void reconstructSp(LorentzColourMatrix &cm)
Definition MetaData.h:332
void unique_reconstructSU(LorentzColourMatrix &cm)
Definition MetaData.h:292
FloatingPointFormat
Definition MetaData.h:551
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
iColourMatrix< Complex > ColourMatrix
Definition QCD.h:133
static constexpr int Nd
Definition QCD.h:52
static constexpr int Nc
Definition QCD.h:50
static constexpr int Nds
Definition QCD.h:54
iLorentzColourMatrix< Complex > LorentzColourMatrix
Definition QCD.h:173
#define header
std::complex< RealD > ComplexD
Definition Simd.h:79
std::complex< Real > Complex
Definition Simd.h:80
accelerator_inline void pokeIndex(vtype &ret, const decltype(TensorIndexRecursion< Level >::peekIndex(ret, 0)) &arg, int i)
accelerator_inline auto peekIndex(const vtype &arg, int i) -> RemoveCRV(TensorIndexRecursion< Level >::peekIndex(arg, 0))
FieldMetaData(void)
Definition MetaData.h:93
GRID_SERIALIZABLE_CLASS_MEMBERS(FieldMetaData, int, nd, std::vector< int >, dimension, std::vector< std::string >, boundary, int, data_start, std::string, hdr_version, std::string, storage_format, double, link_trace, double, plaquette, uint32_t, checksum, uint32_t, scidac_checksuma, uint32_t, scidac_checksumb, unsigned int, sequence_number, std::string, data_type, std::string, ensemble_id, std::string, ensemble_label, std::string, ildg_lfn, std::string, creator, std::string, creator_hardware, std::string, creation_date, std::string, archive_date, std::string, floating_point)
GRID_SERIALIZABLE_CLASS_MEMBERS(FieldNormMetaData, double, norm2)
void operator()(Lattice< vLorentzColourMatrixD > &data, FieldMetaData &header)
Definition MetaData.h:184
Coordinate _fdimensions
GridBase * Grid(void) const
static RealD avgPlaquette(const GaugeLorentz &Umu)
static RealD linkTrace(const GaugeLorentz &Umu)
Definition Simd.h:194
GridTypeMapper< scalar_type >::Realified real_scalar_type
void operator()(fobj &in, sobj &out)
Definition MetaData.h:385
getPrecision< sobj >::real_scalar_type sobj_stype
Definition MetaData.h:383
getPrecision< fobj >::real_scalar_type fobj_stype
Definition MetaData.h:382
getPrecision< sobj >::real_scalar_type sobj_stype
Definition MetaData.h:364
void operator()(sobj &in, fobj &out)
Definition MetaData.h:366
getPrecision< fobj >::real_scalar_type fobj_stype
Definition MetaData.h:363
void operator()(fobj &in, sobj &out)
Definition MetaData.h:450
void operator()(sobj &in, fobj &out)
Definition MetaData.h:463
void operator()(fobj &in, sobj &out)
Definition MetaData.h:426
void operator()(sobj &in, fobj &out)
Definition MetaData.h:438
void operator()(sobj &in, fobj &out)
Definition MetaData.h:509
void operator()(fobj &in, sobj &out)
Definition MetaData.h:402
void operator()(sobj &in, fobj &out)
Definition MetaData.h:414
void operator()(fobj &in, sobj &out)
Definition MetaData.h:522
void operator()(sobj &in, fobj &out)
Definition MetaData.h:537
typename std::tuple_element_t< static_cast< int >(fp_fmt), std::tuple< LorentzColour2x3D, LorentzColour2x3F > > out_type
Definition MetaData.h:585
typename std::tuple_element_t< static_cast< int >(fp_fmt), std::tuple< LorentzColourMatrixD, LorentzColourMatrixF > > tmp_type
Definition MetaData.h:584
BinarySimpleUnmunger< tmp_type, in_type > binary_unmunger
Definition MetaData.h:587
typename std::tuple_element_t< static_cast< int >(fp_fmt), std::tuple< LorentzColourMatrixD, LorentzColourMatrixF > > tmp_type
Definition MetaData.h:602
BinarySimpleUnmunger< tmp_type, in_type > binary_unmunger
Definition MetaData.h:605
typename std::tuple_element_t< static_cast< int >(fp_fmt), std::tuple< LorentzColourNx2ND, LorentzColourNx2NF > > out_type
Definition MetaData.h:603
typename std::tuple_element_t< static_cast< int >(fp_fmt), std::tuple< LorentzColourMatrixD, LorentzColourMatrixF > > out_type
Definition MetaData.h:571
BinarySimpleUnmunger< out_type, in_type > unmunger
Definition MetaData.h:572