1#ifndef RPG_FIELD_IO_TPP
2#define RPG_FIELD_IO_TPP
13#include <prdc/cuda/HostDArrayComplex.h>
14#include <prdc/cuda/RFieldComparison.h>
15#include <prdc/field/fieldCheck.h>
16#include <prdc/crystal/Basis.h>
17#include <prdc/crystal/UnitCell.h>
19#include <pscf/cuda/HostDArray.h>
20#include <pscf/cuda/VecOp.h>
21#include <pscf/cuda/complex.h>
22#include <pscf/cuda/cudaTypes.h>
23#include <pscf/mesh/Mesh.h>
24#include <pscf/math/IntVec.h>
25#include <pscf/math/arithmetic.h>
28#include <rp/field/FieldIo.tpp>
29#include <prdc/field/rFieldIo.h>
135 bool writeMeshSize)
const
142 int meshSize =
mesh().size();
171 bool isSymmetric)
const
210 IntVec<D> dftDimensions = fields[0].dftDimensions();
211 int capacity = fields[0].capacity();
232 bool isSymmetric)
const
239 IntVec<D> dftDimensions = fields[0].dftDimensions();
240 int capacity = fields[0].capacity();
288 double epsilon)
const
303 checkSymmetry, epsilon);
337 comparison.
compare(field1, field2);
339 Log::file() <<
"\n Real-space field comparison results"
341 Log::file() <<
" Maximum Absolute Difference: "
342 << comparison.
maxDiff() << std::endl;
343 Log::file() <<
" Root-Mean-Square Difference: "
344 << comparison.
rmsDiff() <<
"\n" << std::endl;
375 int capacity = fields[0].capacity();
402 int capacity = fields[0].capacity();
410 unitCell, d, newGridDimensions);
bool isAllocated() const
Return true if the array has allocated data, false otherwise.
int capacity() const
Return array capacity.
Template for dynamic array stored in host CPU memory.
An IntVec<D, T> is a D-component vector of elements of integer type T.
HostDArray containing cudaComplex elements.
Comparator for fields in real-space (r-grid) format.
double rmsDiff() const
Get precomputed rms difference.
double compare(RField< D > const &a, RField< D > const &b)
Comparator for individual fields.
double maxDiff() const
Get precomputed maximum element-by-element difference.
Discrete Fourier Transform (DFT) of a real field, allocated on a GPU.
IntVec< D > const & dftDimensions() const
Return vector of dft (Fourier) grid dimensions by const reference.
IntVec< D > const & meshDimensions() const
Return vector of real-space mesh dimensions by constant reference.
Field of real values on a regular mesh, allocated on a GPU device.
IntVec< D > const & meshDimensions() const
Return mesh dimensions by constant reference.
Base template for UnitCell<D> classes, D=1, 2 or 3.
Mesh< D > const & mesh() const
Get spatial discretization mesh by const reference.
bool readFieldRGrid(std::istream &in, RField< D > &field, UnitCell< D > &unitCell) const override
Read a single RField (field on an r-space grid) from a stream.
void convertKGridToBasis(RFieldDft< D > const &in, DArray< double > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const override
Convert a field from Fourier (k-grid) to symmetrized basis form.
void convertBasisToKGrid(DArray< double > const &components, RFieldDft< D > &dft) const override
Convert a field from symmetrized basis to Fourier grid (k-grid).
void compareFieldsRGrid(DArray< RField< D > > const &field1, DArray< RField< D > > const &field2) const override
Compare two fields in r-grid format, output a report.
bool hasSymmetry(RFieldDft< D > const &in, double epsilon=1.0e-8, bool verbose=true) const override
Check if a k-grid field has the declared space group symmetry.
Basis< D > const & basis() const
Get the associated Basis by const reference.
void writeFieldsRGrid(std::ostream &out, DArray< RField< D > > const &fields, UnitCell< D > const &unitCell, bool writeHeader=true, bool isSymmetric=true, bool writeMeshSize=true) const override
Write array of RField objects (fields on r-space grid) to a stream.
void expandRGridDimension(std::ostream &out, DArray< RField< D > > const &fields, UnitCell< D > const &unitCell, int d, DArray< int > const &newGridDimensions) const override
Expand spatial dimension of an array of r-grid fields.
void writeFieldsKGrid(std::ostream &out, DArray< RFieldDft< D > > const &fields, UnitCell< D > const &unitCell, bool isSymmetric=true) const override
Write array of RFieldDft objects (k-space fields) to file.
void readFieldsKGrid(std::istream &in, DArray< RFieldDft< D > > &fields, UnitCell< D > &unitCell) const override
Read array of RFieldDft objects (k-space fields) from a stream.
bool readFieldsRGrid(std::istream &in, DArray< RField< D > > &fields, UnitCell< D > &unitCell) const override
Read array of RField objects (r-grid fields) from a stream.
void readFieldsRGridData(std::istream &in, DArray< RField< D > > &fields, int nMonomer) const override
Read data for an array of r-grid fields, with no header section.
void replicateUnitCell(std::ostream &out, DArray< RField< D > > const &fields, UnitCell< D > const &unitCell, IntVec< D > const &replicas) const override
Write r-grid fields in a replicated unit cell to std::ostream.
void writeFieldRGrid(std::ostream &out, RField< D > const &field, UnitCell< D > const &unitCell, bool writeHeader=true, bool isSymmetric=true) const override
Write a single RField (field on an r-space grid) to a stream.
void scaleFieldRGrid(RField< D > &field, double factor) const override
Rescale a single r-grid field by a scalar factor.
int capacity() const
Return allocated size.
Dynamically allocatable contiguous array template.
void allocate(int capacity)
Allocate the underlying C array.
bool isAllocated() const
Return true if this DArray has been allocated, false otherwise.
static std::ostream & file()
Get log ostream by reference.
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
void replicateUnitCell(IntVec< 1 > const &replicas, UnitCell< 1 > const &cellIn, UnitCell< 1 > &cellOut)
Create a replicated UnitCell<1>.
void writeFieldHeader(std::ostream &out, int ver1, int ver2, UnitCell< D > const &cell, std::string const &groupName, int nMonomer)
Write common part of field header (fortran PSCF format).
void readFieldHeader(std::istream &in, int &ver1, int &ver2, UnitCell< D > &cell, std::string &groupName, int &nMonomer)
Read common part of field header (fortran PSCF format).
void writeKGridData(std::ostream &out, DArray< AT > const &fields, int nMonomer, IntVec< D > const &dftDimensions)
Write data for array of k-grid fields, with no header section.
void copyArrays(DArray< OAT > &out, DArray< IAT > const &in)
Copy a DArray of 1D arrays.
bool hasSymmetry(AT const &in, Basis< D > const &basis, IntVec< D > const &dftDimensions, double epsilon=1.0e-8, bool verbose=true)
Check if a k-grid field has the declared space group symmetry.
void inspectFields(DArray< FT > const &fields, int &nMonomer, IntVec< D > &dimensions)
Inspect dimensions of a DArray of fields, each of type FT.
void readKGridData(std::istream &in, DArray< AT > &fields, int nMonomer, IntVec< D > const &dftDimensions)
Read data for array of k-grid fields, with no header section.
void convertBasisToKGrid(DArray< double > const &components, AT &dft, Basis< D > const &basis, IntVec< D > const &dftDimensions)
Convert a real field from symmetrized basis to Fourier grid.
void writeMeshDimensions(std::ostream &out, IntVec< D > const &meshDimensions)
Write mesh dimensions to a field file header.
void expandRGridDimension(std::ostream &out, DArray< AT > const &fields, IntVec< D > const &meshDimensions, UnitCell< D > const &unitCell, int d, DArray< int > newGridDimensions)
Expand the dimensionality of space from D to d.
void writeRGridData(std::ostream &out, DArray< AT > const &fields, int nMonomer, IntVec< D > const &dimensions)
Write data for array of r-grid fields, with no header section.
void convertKGridToBasis(AT const &in, DArray< double > &out, Basis< D > const &basis, IntVec< D > const &dftDimensions, bool checkSymmetry=true, double epsilon=1.0e-8)
Convert a real field from Fourier grid to symmetrized basis.
void readRGridData(std::istream &in, DArray< AT > &fields, int nMonomer, IntVec< D > const &dimensions)
Read data for array of r-grid fields, with no header section.
void readMeshDimensions(std::istream &in, IntVec< D > const &meshDimensions)
Read mesh dimensions from a field file header.
void checkAllocateFields(DArray< FT > &fields, int nMonomer, IntVec< D > const &dimensions)
Check allocation of an array of fields, allocate if necessary.
void checkAllocateField(FT &field, IntVec< D > const &dimensions)
Check allocation of a single field, allocate if necessary.
void mulEqS(Array< double > &a, double b)
Vector-scalar in-place multiplication, a[i] *= b (real).
Fields, FFTs, and utilities for periodic boundary conditions (CUDA).
Periodic fields and crystallography.
void allocateArrays(DArray< AT > &arrays, int n, int capacity)
Allocate an array of arrays.
SCFT and PS-FTS with real periodic fields (GPU)
PSCF package top-level namespace.