mirror of
https://github.com/paboyle/Grid.git
synced 2025-04-09 21:50:45 +01:00
Hadrons: A2AMatrix load
This commit is contained in:
parent
3e1d268fa3
commit
f05b25dae4
@ -37,6 +37,10 @@ See the full license in the file "LICENSE" in the top level distribution directo
|
|||||||
#define HADRONS_A2AM_NAME "a2aMatrix"
|
#define HADRONS_A2AM_NAME "a2aMatrix"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef HADRONS_A2AM_IO_TYPE
|
||||||
|
#define HADRONS_A2AM_IO_TYPE ComplexF
|
||||||
|
#endif
|
||||||
|
|
||||||
#define HADRONS_A2AM_PARALLEL_IO
|
#define HADRONS_A2AM_PARALLEL_IO
|
||||||
|
|
||||||
BEGIN_HADRONS_NAMESPACE
|
BEGIN_HADRONS_NAMESPACE
|
||||||
@ -51,6 +55,9 @@ BEGIN_HADRONS_NAMESPACE
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
using A2AMatrixSet = Eigen::TensorMap<Eigen::Tensor<T, 5, Eigen::RowMajor>>;
|
using A2AMatrixSet = Eigen::TensorMap<Eigen::Tensor<T, 5, Eigen::RowMajor>>;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
using A2AMatrix = Eigen::Matrix<T, -1, -1, Eigen::RowMajor>;
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* Abstract class for A2A kernels *
|
* Abstract class for A2A kernels *
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
@ -76,10 +83,15 @@ public:
|
|||||||
// constructors
|
// constructors
|
||||||
A2AMatrixIo(void) = default;
|
A2AMatrixIo(void) = default;
|
||||||
A2AMatrixIo(std::string filename, std::string dataname,
|
A2AMatrixIo(std::string filename, std::string dataname,
|
||||||
const unsigned int nt, const unsigned int ni,
|
const unsigned int nt, const unsigned int ni = 0,
|
||||||
const unsigned int nj);
|
const unsigned int nj = 0);
|
||||||
// destructor
|
// destructor
|
||||||
~A2AMatrixIo(void) = default;
|
~A2AMatrixIo(void) = default;
|
||||||
|
// access
|
||||||
|
unsigned int getNi(void) const;
|
||||||
|
unsigned int getNj(void) const;
|
||||||
|
unsigned int getNt(void) const;
|
||||||
|
size_t getSize(void) const;
|
||||||
// file allocation
|
// file allocation
|
||||||
template <typename MetadataType>
|
template <typename MetadataType>
|
||||||
void initFile(const MetadataType &d, const unsigned int chunkSize);
|
void initFile(const MetadataType &d, const unsigned int chunkSize);
|
||||||
@ -88,9 +100,11 @@ public:
|
|||||||
const unsigned int blockSizei, const unsigned int blockSizej);
|
const unsigned int blockSizei, const unsigned int blockSizej);
|
||||||
void saveBlock(const A2AMatrixSet<T> &m, const unsigned int ext, const unsigned int str,
|
void saveBlock(const A2AMatrixSet<T> &m, const unsigned int ext, const unsigned int str,
|
||||||
const unsigned int i, const unsigned int j);
|
const unsigned int i, const unsigned int j);
|
||||||
|
template <template <class> class Vec, typename VecT>
|
||||||
|
void load(Vec<VecT> &v, double *tRead = nullptr);
|
||||||
private:
|
private:
|
||||||
std::string filename_, dataname_;
|
std::string filename_{""}, dataname_{""};
|
||||||
unsigned int nt_, ni_, nj_;
|
unsigned int nt_{0}, ni_{0}, nj_{0};
|
||||||
};
|
};
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@ -148,6 +162,31 @@ A2AMatrixIo<T>::A2AMatrixIo(std::string filename, std::string dataname,
|
|||||||
, nt_(nt), ni_(ni), nj_(nj)
|
, nt_(nt), ni_(ni), nj_(nj)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
// access //////////////////////////////////////////////////////////////////////
|
||||||
|
template <typename T>
|
||||||
|
unsigned int A2AMatrixIo<T>::getNt(void) const
|
||||||
|
{
|
||||||
|
return nt_;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
unsigned int A2AMatrixIo<T>::getNi(void) const
|
||||||
|
{
|
||||||
|
return ni_;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
unsigned int A2AMatrixIo<T>::getNj(void) const
|
||||||
|
{
|
||||||
|
return nj_;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
size_t A2AMatrixIo<T>::getSize(void) const
|
||||||
|
{
|
||||||
|
return nt_*ni_*nj_*sizeof(T);
|
||||||
|
}
|
||||||
|
|
||||||
// file allocation /////////////////////////////////////////////////////////////
|
// file allocation /////////////////////////////////////////////////////////////
|
||||||
template <typename T>
|
template <typename T>
|
||||||
template <typename MetadataType>
|
template <typename MetadataType>
|
||||||
@ -226,6 +265,81 @@ void A2AMatrixIo<T>::saveBlock(const A2AMatrixSet<T> &m,
|
|||||||
saveBlock(m.data() + offset, i, j, blockSizei, blockSizej);
|
saveBlock(m.data() + offset, i, j, blockSizei, blockSizej);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
template <template <class> class Vec, typename VecT>
|
||||||
|
void A2AMatrixIo<T>::load(Vec<VecT> &v, double *tRead)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_HDF5
|
||||||
|
Hdf5Reader reader(filename_);
|
||||||
|
std::vector<hsize_t> hdim;
|
||||||
|
H5NS::DataSet dataset;
|
||||||
|
H5NS::DataSpace dataspace;
|
||||||
|
H5NS::CompType datatype;
|
||||||
|
H5NS::DSetCreatPropList plist;
|
||||||
|
|
||||||
|
push(reader, dataname_);
|
||||||
|
auto &group = reader.getGroup();
|
||||||
|
dataset = group.openDataSet(HADRONS_A2AM_NAME);
|
||||||
|
datatype = dataset.getCompType();
|
||||||
|
dataspace = dataset.getSpace();
|
||||||
|
plist = dataset.getCreatePlist();
|
||||||
|
hdim.resize(dataspace.getSimpleExtentNdims());
|
||||||
|
dataspace.getSimpleExtentDims(hdim.data());
|
||||||
|
if ((nt_*ni_*nj_ != 0) and
|
||||||
|
((hdim[0] != nt_) or (hdim[1] != ni_) or (hdim[2] != nj_)))
|
||||||
|
{
|
||||||
|
HADRONS_ERROR(Size, "all-to-all matrix size mismatch (got "
|
||||||
|
+ std::to_string(hdim[0]) + "x" + std::to_string(hdim[1]) + "x"
|
||||||
|
+ std::to_string(hdim[2]) + ", expected "
|
||||||
|
+ std::to_string(nt_) + "x" + std::to_string(ni_) + "x"
|
||||||
|
+ std::to_string(nj_));
|
||||||
|
}
|
||||||
|
else if (ni_*nj_ == 0)
|
||||||
|
{
|
||||||
|
if (hdim[0] != nt_)
|
||||||
|
{
|
||||||
|
HADRONS_ERROR(Size, "all-to-all time size mismatch (got "
|
||||||
|
+ std::to_string(hdim[0]) + ", expected "
|
||||||
|
+ std::to_string(nt_) + ")");
|
||||||
|
}
|
||||||
|
ni_ = hdim[1];
|
||||||
|
nj_ = hdim[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
A2AMatrix<T> buf(ni_, nj_);
|
||||||
|
std::vector<hsize_t> count = {1, static_cast<hsize_t>(ni_),
|
||||||
|
static_cast<hsize_t>(nj_)},
|
||||||
|
stride = {1, 1, 1},
|
||||||
|
block = {1, 1, 1},
|
||||||
|
memCount = {static_cast<hsize_t>(ni_),
|
||||||
|
static_cast<hsize_t>(nj_)};
|
||||||
|
H5NS::DataSpace memspace(memCount.size(), memCount.data());
|
||||||
|
|
||||||
|
std::cout << "Loading timeslice";
|
||||||
|
std::cout.flush();
|
||||||
|
*tRead = 0.;
|
||||||
|
for (unsigned int t = 0; t < nt_; ++t)
|
||||||
|
{
|
||||||
|
std::vector<hsize_t> offset = {static_cast<hsize_t>(t), 0, 0};
|
||||||
|
|
||||||
|
if (t % 10 == 0)
|
||||||
|
{
|
||||||
|
std::cout << " " << t;
|
||||||
|
std::cout.flush();
|
||||||
|
}
|
||||||
|
dataspace.selectHyperslab(H5S_SELECT_SET, count.data(), offset.data(),
|
||||||
|
stride.data(), block.data());
|
||||||
|
if (tRead) *tRead -= usecond();
|
||||||
|
dataset.read(buf.data(), datatype, memspace, dataspace);
|
||||||
|
if (tRead) *tRead += usecond();
|
||||||
|
v[t] = buf.template cast<VecT>();
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
#else
|
||||||
|
HADRONS_ERROR(Implementation, "all-to-all matrix I/O needs HDF5 library");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* A2AMatrixBlockComputation template implementation *
|
* A2AMatrixBlockComputation template implementation *
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
@ -6,10 +6,6 @@
|
|||||||
#include <Hadrons/ModuleFactory.hpp>
|
#include <Hadrons/ModuleFactory.hpp>
|
||||||
#include <Hadrons/A2AMatrix.hpp>
|
#include <Hadrons/A2AMatrix.hpp>
|
||||||
|
|
||||||
#ifndef ASF_IO_TYPE
|
|
||||||
#define ASF_IO_TYPE ComplexF
|
|
||||||
#endif
|
|
||||||
|
|
||||||
BEGIN_HADRONS_NAMESPACE
|
BEGIN_HADRONS_NAMESPACE
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@ -86,7 +82,7 @@ public:
|
|||||||
typedef A2AMatrixBlockComputation<Complex,
|
typedef A2AMatrixBlockComputation<Complex,
|
||||||
FermionField,
|
FermionField,
|
||||||
A2AAslashFieldMetadata,
|
A2AAslashFieldMetadata,
|
||||||
ASF_IO_TYPE> Computation;
|
HADRONS_A2AM_IO_TYPE> Computation;
|
||||||
typedef AslashFieldKernel<Complex, FImpl> Kernel;
|
typedef AslashFieldKernel<Complex, FImpl> Kernel;
|
||||||
public:
|
public:
|
||||||
// constructor
|
// constructor
|
||||||
@ -169,7 +165,7 @@ void TA2AAslashField<FImpl, PhotonImpl>::execute(void)
|
|||||||
LOG(Message) << " " << name << std::endl;
|
LOG(Message) << " " << name << std::endl;
|
||||||
}
|
}
|
||||||
LOG(Message) << "A-slash field size: " << nt << "*" << N_i << "*" << N_j
|
LOG(Message) << "A-slash field size: " << nt << "*" << N_i << "*" << N_j
|
||||||
<< " (filesize " << sizeString(nt*N_i*N_j*sizeof(ASF_IO_TYPE))
|
<< " (filesize " << sizeString(nt*N_i*N_j*sizeof(HADRONS_A2AM_IO_TYPE))
|
||||||
<< "/EM field)" << std::endl;
|
<< "/EM field)" << std::endl;
|
||||||
|
|
||||||
// preparing "B" complexified fields
|
// preparing "B" complexified fields
|
||||||
|
@ -35,10 +35,6 @@ See the full license in the file "LICENSE" in the top level distribution directo
|
|||||||
#include <Hadrons/ModuleFactory.hpp>
|
#include <Hadrons/ModuleFactory.hpp>
|
||||||
#include <Hadrons/A2AMatrix.hpp>
|
#include <Hadrons/A2AMatrix.hpp>
|
||||||
|
|
||||||
#ifndef MF_IO_TYPE
|
|
||||||
#define MF_IO_TYPE ComplexF
|
|
||||||
#endif
|
|
||||||
|
|
||||||
BEGIN_HADRONS_NAMESPACE
|
BEGIN_HADRONS_NAMESPACE
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@ -118,7 +114,7 @@ public:
|
|||||||
typedef A2AMatrixBlockComputation<Complex,
|
typedef A2AMatrixBlockComputation<Complex,
|
||||||
FermionField,
|
FermionField,
|
||||||
A2AMesonFieldMetadata,
|
A2AMesonFieldMetadata,
|
||||||
MF_IO_TYPE> Computation;
|
HADRONS_A2AM_IO_TYPE> Computation;
|
||||||
typedef MesonFieldKernel<Complex, FImpl> Kernel;
|
typedef MesonFieldKernel<Complex, FImpl> Kernel;
|
||||||
public:
|
public:
|
||||||
// constructor
|
// constructor
|
||||||
@ -248,7 +244,7 @@ void TA2AMesonField<FImpl>::execute(void)
|
|||||||
LOG(Message) << " " << g << std::endl;
|
LOG(Message) << " " << g << std::endl;
|
||||||
}
|
}
|
||||||
LOG(Message) << "Meson field size: " << nt << "*" << N_i << "*" << N_j
|
LOG(Message) << "Meson field size: " << nt << "*" << N_i << "*" << N_j
|
||||||
<< " (filesize " << sizeString(nt*N_i*N_j*sizeof(MF_IO_TYPE))
|
<< " (filesize " << sizeString(nt*N_i*N_j*sizeof(HADRONS_A2AM_IO_TYPE))
|
||||||
<< "/momentum/bilinear)" << std::endl;
|
<< "/momentum/bilinear)" << std::endl;
|
||||||
|
|
||||||
auto &ph = envGet(std::vector<ComplexField>, momphName_);
|
auto &ph = envGet(std::vector<ComplexField>, momphName_);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user