11#include <rp/field/FieldIo.h>
12#include <prdc/cpu/RField.h>
13#include <prdc/cpu/RFieldDft.h>
14#include <prdc/cpu/FFT.h>
19 template <
typename T>
class DArray;
32 using namespace Prdc::Cpu;
58 :
public Rp::FieldIo< D, RField<D>, RFieldDft<D>, FFT<D> >
91 int nMonomer)
const override;
122 bool writeHeader =
true,
123 bool isSymmetric =
true,
124 bool writeMeshSize =
true)
const override;
140 bool writeHeader =
true,
141 bool isSymmetric =
true)
171 bool isSymmetric =
true)
198 bool checkSymmetry =
true,
199 double epsilon = 1.0e-8)
213 double epsilon = 1.0e-8,
307 using namespace Prdc;
309 class Rp::FieldIo<1, Cpu::RField<1>, Cpu::RFieldDft<1>, Cpu::FFT<1>>;
311 class Rp::FieldIo<2, Cpu::RField<2>, Cpu::RFieldDft<2>, Cpu::FFT<2>>;
313 class Rp::FieldIo<3, Cpu::RField<3>, Cpu::RFieldDft<3>, Cpu::FFT<3>>;
An IntVec<D, T> is a D-component vector of elements of integer type T.
Fourier transform wrapper.
Fourier transform of a real field on an FFT mesh.
Field of real double precision values on an FFT mesh.
Base template for UnitCell<D> classes, D=1, 2 or 3.
File input/output, format conversions and other utilities for fields.
virtual void writeFieldsRGrid(std::ostream &out, DArray< RField< D > > const &fields, UnitCell< D > const &unitCell, bool writeHeader=true, bool isSymmetric=true, bool writeMeshSize=true) const=0
virtual void convertKGridToBasis(RFieldDft< D > const &in, DArray< double > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const=0
virtual bool readFieldRGrid(std::istream &in, RField< D > &field, UnitCell< D > &unitCell) const=0
virtual void convertBasisToKGrid(DArray< double > const &components, RFieldDft< D > &dft) const=0
virtual void compareFieldsRGrid(DArray< RField< D > > const &field1, DArray< RField< D > > const &field2) const=0
virtual bool hasSymmetry(RFieldDft< D > const &in, double epsilon=1.0e-8, bool verbose=true) const=0
virtual void replicateUnitCell(std::ostream &out, DArray< RField< D > > const &fields, UnitCell< D > const &unitCell, IntVec< D > const &replicas) const=0
void writeFieldBasis(std::ostream &out, DArray< double > const &field, UnitCell< D > const &unitCell) const
void writeFieldsBasis(std::ostream &out, DArray< DArray< double > > const &fields, UnitCell< D > const &unitCell) const
void scaleFieldsRGrid(DArray< RField< D > > &fields, double factor) const
virtual void readFieldsKGrid(std::istream &in, DArray< RFieldDft< D > > &fields, UnitCell< D > &unitCell) const=0
virtual void expandRGridDimension(std::ostream &out, DArray< RField< D > > const &fields, UnitCell< D > const &unitCell, int d, DArray< int > const &newGridDimensions) const=0
virtual void readFieldsRGridData(std::istream &in, DArray< RField< D > > &fields, int nMonomer) const=0
virtual void writeFieldRGrid(std::ostream &out, RField< D > const &field, UnitCell< D > const &unitCell, bool writeHeader=true, bool isSymmetric=true) const=0
virtual bool readFieldsRGrid(std::istream &in, DArray< RField< D > > &fields, UnitCell< D > &unitCell) const=0
virtual void writeFieldsKGrid(std::ostream &out, DArray< RFieldDft< D > > const &fields, UnitCell< D > const &unitCell, bool isSymmetric=true) const=0
File input/output operations and format conversions for fields.
Rp::FieldIo< D, RField< D >, RFieldDft< D >, FFT< D > > Base
Alias for base class.
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 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.
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.
void compareFieldsRGrid(DArray< RField< D > > const &field1, DArray< RField< D > > const &field2) const override
Compare two fields in r-grid format, output a report.
void scaleFieldRGrid(RField< D > &field, double factor) const override
Rescale a single r-grid field by a scalar factor.
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.
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 convertBasisToKGrid(DArray< double > const &components, RFieldDft< D > &dft) const override
Convert a field from symmetrized basis to Fourier grid (k-grid).
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 readFieldsKGrid(std::istream &in, DArray< RFieldDft< D > > &fields, UnitCell< D > &unitCell) const override
Read array of RFieldDft objects (k-space fields) 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 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 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.
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.
Dynamically allocatable contiguous array template.
A FileMaster manages input and output files for a simulation.
Periodic fields and crystallography.
Real periodic fields, SCFT and PS-FTS (CPU).
PSCF package top-level namespace.
Utility classes for scientific computation.