1#ifndef RPC_FIELD_IO_REAL_H
2#define RPC_FIELD_IO_REAL_H
11#include <prdc/crystal/UnitCell.h>
12#include <pscf/math/IntVec.h>
13#include <util/containers/DArray.h>
18 template <
typename T>
class DMatrix;
21 template <
int D>
class Mesh;
23 template <
int D>
class Basis;
84 template <
int D,
class RFT,
class KFT,
class FFT>
363 int nMonomer)
const = 0;
420 bool writeHeader =
true,
421 bool isSymmetric =
true,
422 bool writeMeshSize =
true)
const = 0;
440 bool isSymmetric =
true)
const;
460 bool writeHeader =
true,
461 bool isSymmetric =
true)
const = 0;
480 bool isSymmetric =
true)
const;
540 bool isSymmetric =
true)
const = 0;
557 bool isSymmetric =
true)
const;
601 bool checkSymmetry =
true,
602 double epsilon = 1.0e-8)
const = 0;
619 bool checkSymmetry =
true,
620 double epsilon = 1.0e-8)
const;
656 bool checkSymmetry =
true,
657 double epsilon = 1.0e-8)
const;
675 bool checkSymmetry =
true,
676 double epsilon = 1.0e-8)
const;
745 std::string
const & outFileName)
const;
765 std::string
const & outFileName)
const;
777 std::string
const & outFileName)
const;
789 std::string
const & outFileName)
const;
809 std::string
const & outFileName)
const;
821 std::string
const & outFileName)
const;
845 double epsilon = 1.0e-8,
846 bool verbose =
true)
const = 0;
865 double epsilon = 1.0e-8,
866 bool verbose =
true)
const;
876 double epsilon = 1.0E-8)
const;
902 std::string
const & filename2)
const;
924 std::string
const & filename2)
const;
942 double factor)
const;
955 double factor)
const;
965 std::string
const & outFileName,
966 double factor)
const;
1004 const std::string & outFileName,
1005 double factor)
const;
1049 std::string
const & outFileName,
1107 std::string
const & outFileName,
1173 std::string
const & outFileName,
1229 bool & isSymmetric)
const;
1242 bool isSymmetric =
true)
const;
1272 return *fileMasterPtr_;
1285 return *latticePtr_;
1294 return *hasGroupPtr_;
1303 return *groupNamePtr_;
1351 FFT const * fftPtr_;
1357 bool const * hasGroupPtr_;
1360 std::string
const * groupNamePtr_;
1386 mutable KFT workDft_;
1389 mutable bool isAllocatedBasis_;
1392 mutable bool isAllocatedRGrid_;
1395 mutable bool isAllocatedKGrid_;
An IntVec<D, T> is a D-component vector of elements of integer type T.
Description of a regular grid of points in a periodic domain.
Symmetry-adapted Fourier basis for pseudo-spectral SCFT.
Fourier transform wrapper.
void checkAllocateBasis(std::string const &inFileName) const
Check if basis workspace is allocated, allocate if necessary.
void writeFieldsRGrid(std::string filename, DArray< RFT > const &fields, UnitCell< D > const &unitCell, bool isSymmetric=true) const
Write an array of r-grid fields to a named file.
virtual void replicateUnitCell(std::ostream &out, DArray< RFT > const &fields, UnitCell< D > const &unitCell, IntVec< D > const &replicas) const =0
Write r-grid fields in a replicated unit cell to std::ostream.
bool readFieldsRGrid(std::string filename, DArray< RFT > &fields, UnitCell< D > &unitCell) const
Read an array of r-grid fields from a named file.
UnitCell< D >::LatticeSystem const & lattice() const
virtual void writeFieldRGrid(std::ostream &out, RFT const &field, UnitCell< D > const &unitCell, bool writeHeader=true, bool isSymmetric=true) const =0
Write a single r-grid field to an an output stream.
void convertRGridToBasis(RFT const &in, DArray< double > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const
Convert a single field from r-grid to basis form.
virtual void writeFieldsKGrid(std::ostream &out, DArray< KFT > const &fields, UnitCell< D > const &unitCell, bool isSymmetric=true) const =0
Write an array of k-grid fields to a output stream.
void convertBasisToKGrid(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from basis to Fourier (k-grid) format.
void convertRGridToKGrid(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from r-grid to Fourier (k-grid) format.
virtual ~FieldIoReal()
Destructor.
void convertRGridToKGrid(RFT const &in, KFT &out) const
Convert a field from r-grid to k-grid (Fourier) format.
void scaleFieldsBasis(DArray< DArray< double > > &fields, double factor) const
Multiply an array of fields in basis format by a real scalar.
Mesh< D > const & mesh() const
void readFieldBasis(std::string filename, DArray< double > &field, UnitCell< D > &unitCell) const
Read a single field in basis format from a named file.
void compareFieldsBasis(std::string const &filename1, std::string const &filename2) const
Compare two r-grid field files, write a report to Log file.
void scaleFieldsRGrid(std::string const &inFileName, const std::string &outFileName, double factor) const
Multiply all fields in an r-grid field file by a scalar.
FieldIoReal()
Constructor.
bool hasSymmetry(RFT const &in, double epsilon=1.0e-8, bool verbose=true) const
Check if an r-grid field has the declared space group symmetry.
void writeFieldsBasis(std::string filename, DArray< DArray< double > > const &fields, UnitCell< D > const &unitCell) const
Write an array of fields in basis format to a named file.
virtual bool hasSymmetry(KFT const &in, double epsilon=1.0e-8, bool verbose=true) const =0
Check if a k-grid field has the declared space group symmetry.
virtual void scaleFieldBasis(DArray< double > &field, double factor) const
Multiply a single field in basis form by a real scalar.
void replicateUnitCell(std::string const &inFileName, std::string const &outFileName, IntVec< D > const &replicas) const
Write replicated fields read from one file to another.
FileMaster const & fileMaster() const
void compareFieldsRGrid(std::string const &filename1, std::string const &filename2) const
Compare two r-grid field files, write a report to Log file.
void convertBasisToRGrid(DArray< DArray< double > > const &in, DArray< RFT > &out) const
Convert an array of fields from basis to r-grid format.
void convertBasisToRGrid(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from basis format to r-grid format.
void scaleFieldsBasis(std::string const &inFileName, std::string const &outFileName, double factor) const
Multiply all fields in a basis field file by a scalar.
void convertKGridToRGrid(KFT const &in, RFT &out) const
Convert a single field from k-grid to r-grid format.
void estimateWBasis(std::string const &inFileName, std::string const &outFileName, DMatrix< double > const &chi) const
Convert a file of c fields to estimated w fields, in basis format.
void writeFieldRGrid(std::string filename, RFT const &field, UnitCell< D > const &unitCell, bool isSymmetric=true) const
Write a single r-grid field to a named file.
void estimateWBasis(DMatrix< double > const &chi, DArray< DArray< double > > &fields) const
Convert c fields to estimated w fields, in basis format.
virtual void convertBasisToKGrid(DArray< double > const &components, KFT &dft) const =0
Convert a single field from basis to Fourier (k-grid) form.
void scaleFieldsRGrid(DArray< RFT > &fields, double factor) const
Scale an array of r-grid fields by a scalar.
void writeFieldHeader(std::ostream &out, int nMonomer, UnitCell< D > const &unitCell, bool isSymmetric=true) const
Write header for field file (fortran pscf format).
void readFieldHeader(std::istream &in, int &nMonomer, UnitCell< D > &unitCell, bool &isSymmetric) const
Reader header of field file (fortran PSCF format)
virtual void scaleFieldRGrid(RFT &field, double factor) const =0
Multiply a single field in r-grid format by a scalar.
SpaceGroup< D > const & group() const
void readFieldsKGrid(std::string filename, DArray< KFT > &fields, UnitCell< D > &unitCell) const
Read an array of k-grid fields from a named file.
void checkAllocateKGrid() const
Check if k-grid workspace is allocated, allocate if necessary.
void convertKGridToRGrid(DArray< KFT > const &in, DArray< RFT > &out) const
Convert an array of field from k-grid to r-grid format.
void writeFieldsKGrid(std::string filename, DArray< KFT > const &fields, UnitCell< D > const &unitCell, bool isSymmetric=true) const
Write an array of k-grid fields to a named file.
Basis< D > const & basis() const
void associate(Mesh< D > const &mesh, FFT const &fft, typename UnitCell< D >::LatticeSystem const &lattice, bool const &hasGroup, std::string const &groupName, SpaceGroup< D > const &group, Basis< D > &basis)
Create associations with other members of the parent Domain.
std::string const & groupName() const
void convertRGridToBasis(DArray< RFT > const &in, DArray< DArray< double > > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const
Convert an array of fields from r-grid to basis format.
void convertKGridToRGrid(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from Fourier (k-grid) to r-grid format.
void writeFieldBasis(std::string filename, DArray< double > const &field, UnitCell< D > const &unitCell) const
Write single field in basis format to a named file.
void expandRGridDimension(std::string filename, DArray< RFT > const &fields, UnitCell< D > const &unitCell, int d, DArray< int > newGridDimensions) const
Increase D for an array of r-grid fields, write to a named file.
virtual void convertKGridToBasis(KFT const &in, DArray< double > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const =0
Convert a single field from Fourier (k-grid) to basis form.
void convertRGridToBasis(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from r-grid to basis format.
void writeFieldsBasis(std::ostream &out, DArray< DArray< double > > const &fields, UnitCell< D > const &unitCell) const
Write an array of fields in basis format to an output stream.
void convertBasisToRGrid(DArray< double > const &in, RFT &out) const
Convert a single field from basis to r-grid format.
void setFileMaster(FileMaster const &fileMaster)
Create an association with a FileMaster.
void convertBasisToKGrid(DArray< DArray< double > > const &in, DArray< KFT > &out) const
Convert an array of fields from basis to Fourier (k-grid) form.
virtual void readFieldsKGrid(std::istream &in, DArray< KFT > &fields, UnitCell< D > &unitCell) const =0
Read an array of k-grid fields from an input stream.
void readFieldsBasis(std::string filename, DArray< DArray< double > > &fields, UnitCell< D > &unitCell) const
Read an array of fields in basis format from a named file.
void setNMonomer(int nMonomer)
Set the number of monomer types.
void expandRGridDimension(std::string const &inFileName, std::string const &outFileName, int d, DArray< int > newGridDimensions) const
Increase D for an r-grid field file.
virtual bool readFieldsRGrid(std::istream &in, DArray< RFT > &fields, UnitCell< D > &unitCell) const =0
Read array of r-grid fields from an input stream.
void convertKGridToBasis(DArray< KFT > const &in, DArray< DArray< double > > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const
Convert an array of fields from Fourier (k-grid) to basis form.
virtual void compareFieldsRGrid(DArray< RFT > const &field1, DArray< RFT > const &field2) const =0
Compare two fields in r-grid form, write a report to Log file.
bool readFieldRGrid(std::string filename, RFT &field, UnitCell< D > &unitCell) const
Read a single r-grid field from a named file.
void compareFieldsBasis(DArray< DArray< double > > const &field1, DArray< DArray< double > > const &field2) const
Compare array of fields in basis form, write a report to Log file.
void replicateUnitCell(std::string filename, DArray< RFT > const &fields, UnitCell< D > const &unitCell, IntVec< D > const &replicas) const
Write r-grid fields in a replicated unit cell to a named file.
void checkAllocateRGrid() const
Check if r-grid workspace is allocated, allocate if necessary.
void readFieldsBasis(std::istream &in, DArray< DArray< double > > &fields, UnitCell< D > &unitCell) const
Read an array of fields in basis format from an input stream.
void convertRGridToKGrid(DArray< RFT > const &in, DArray< KFT > &out) const
Convert an array of fields from r-grid to k-grid (Fourier) format.
virtual void readFieldsRGridData(std::istream &in, DArray< RFT > &fields, int nMonomer) const =0
Read data for array of r-grid fields, with no header section.
void writeFieldBasis(std::ostream &out, DArray< double > const &field, UnitCell< D > const &unitCell) const
Write a single field in basis format to an output stream.
void readFieldBasis(std::istream &in, DArray< double > &field, UnitCell< D > &unitCell) const
Read a single field in basis format from an input stream.
virtual void writeFieldsRGrid(std::ostream &out, DArray< RFT > const &fields, UnitCell< D > const &unitCell, bool writeHeader=true, bool isSymmetric=true, bool writeMeshSize=true) const =0
Write an array of r-grid fields to an output stream.
bool hasSymmetry(std::string const &inFileName, double epsilon=1.0E-8) const
Check if an r-grid field file has declared space group symmetry.
void convertKGridToBasis(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from Fourier (k-grid) to basis format.
virtual void expandRGridDimension(std::ostream &out, DArray< RFT > const &fields, UnitCell< D > const &unitCell, int d, DArray< int > const &newGridDimensions) const =0
Increase D for an array of r-grid fields, write to ostream.
virtual bool readFieldRGrid(std::istream &in, RFT &field, UnitCell< D > &unitCell) const =0
Read a single r-grid field from an input stream.
Crystallographic space group.
Base template for UnitCell<D> classes, D=1, 2 or 3.
Dynamically allocatable contiguous array template.
Dynamically allocated Matrix.
A FileMaster manages input and output files for a simulation.
#define UTIL_ASSERT(condition)
Assertion macro suitable for debugging serial or parallel code.
Periodic fields and crystallography.
PSCF package top-level namespace.
Utility classes for scientific computation.