1#ifndef RPC_CL_FIELD_IO_TPP
2#define RPC_CL_FIELD_IO_TPP
13#include <prdc/field/fieldCheck.h>
14#include <prdc/field/fieldHeader.h>
15#include <prdc/crystal/UnitCell.h>
17#include <pscf/mesh/Mesh.h>
18#include <pscf/math/IntVec.h>
20#include <util/containers/DArray.h>
21#include <util/containers/DMatrix.h>
22#include <util/misc/FileMaster.h>
23#include <util/misc/Log.h>
37 template <
int D,
class CFT,
class FFT>
41 fileMasterPtr_(nullptr),
49 template <
int D,
class CFT,
class FFT>
58 template <
int D,
class CFT,
class FFT>
73 template <
int D,
class CFT,
class FFT>
81 template <
int D,
class CFT,
class FFT>
94 template <
int D,
class CFT,
class FFT>
109 template <
int D,
class CFT,
class FFT>
111 std::string filename,
124 template <
int D,
class CFT,
class FFT>
126 std::string filename,
132 bool writeHeader =
true;
133 bool writeMeshSize =
true;
135 writeHeader, writeMeshSize);
142 template <
int D,
class CFT,
class FFT>
144 std::string filename,
159 template <
int D,
class CFT,
class FFT>
166 for (
int i = 0; i < n; ++i) {
167 UTIL_CHECK(in[i].meshDimensions() == out[i].meshDimensions());
168 fft().forwardTransform(in[i], out[i]);
175 template <
int D,
class CFT,
class FFT>
177 std::string
const & inFileName,
178 std::string
const & outFileName)
const
184 readFields(inFileName, inFields, tmpUnitCell);
192 template <
int D,
class CFT,
class FFT>
199 for (
int i = 0; i < n; ++i) {
200 UTIL_CHECK(in[i].meshDimensions() == out[i].meshDimensions());
201 fft().inverseTransform(in[i], out[i]);
208 template <
int D,
class CFT,
class FFT>
210 std::string
const & inFileName,
211 std::string
const & outFileName)
const
217 readFields(inFileName, inFields, tmpUnitCell);
225 template <
int D,
class CFT,
class FFT>
227 std::string
const & filename1,
228 std::string
const & filename2)
const
234 readFields(filename1, fields1, tmpUnitCell);
235 readFields(filename2, fields2, tmpUnitCell);
236 compareFields(fields1, fields2);
249 template <
int D,
class CFT,
class FFT>
266 std::string groupNameIn;
269 groupNameIn, nMonomer);
280 if (
lattice() != unitCell.lattice()) {
282 <<
"Error - Mismatched lattice types "
283 <<
"in Cp::FieldIo::readFieldHeader:\n"
284 <<
" FieldIo::lattice :" <<
lattice() <<
"\n"
285 <<
" Unit cell lattice :" << unitCell.lattice()
295 template <
int D,
class CFT,
class FFT>
303 std::string gName =
"";
314 template <
int D,
class CFT,
class FFT>
317 if (isAllocated_)
return;
322 tmpFields_.allocate(nMonomer_);
323 for (
int i = 0; i < nMonomer_; ++i) {
324 tmpFields_[i].allocate(meshDimensions);
File IO and other utilities for complex fields.
void readFieldHeader(std::istream &in, int &nMonomer, UnitCell< D > &unitCell) const
Reader header of field file (fortran PSCF format)
void checkAllocate() const
Check if r-grid workspace is allocated, allocate if necessary.
virtual void writeFields(std::ostream &out, DArray< CFT > const &fields, UnitCell< D > const &unitCell, bool writeHeader=true, bool writeMeshSize=true) const =0
Write an array of complex fields to an output stream.
void writeFieldHeader(std::ostream &out, int nMonomer, UnitCell< D > const &unitCell) const
Write header for field file (fortran pscf format).
void convertKGridToRGrid(DArray< CFT > const &in, DArray< CFT > &out) const
Fourier transform an array of fields from k-grid to r-grid format.
FileMaster const & fileMaster() const
Get associated FileMaster by const reference.
FFT const & fft() const
Get FFT object by const reference.
virtual void readFields(std::istream &in, DArray< CFT > &fields, UnitCell< D > &unitCell) const =0
Read array of complex fields from an input stream.
void setNMonomer(int nMonomer)
Set the number of monomer types.
void convertRGridToKGrid(DArray< CFT > const &in, DArray< CFT > &out) const
Fourier transform array of fields from r-grid to k-grid format.
virtual void readField(std::istream &in, CFT &field, UnitCell< D > &unitCell) const =0
Read a single r-grid field from an input stream.
Mesh< D > const & mesh() const
Get spatial discretization mesh by const reference.
UnitCell< D >::LatticeSystem const & lattice() const
Get the lattice type enum value by const reference.
void setFileMaster(FileMaster const &fileMaster)
Create an association with a FileMaster.
virtual ~FieldIo()
Destructor.
void associate(Mesh< D > const &mesh, FFT const &fft, typename UnitCell< D >::LatticeSystem const &lattice)
Create associations with other members of the parent Domain.
virtual void writeField(std::ostream &out, CFT const &field, UnitCell< D > const &unitCell, bool writeHeader=true) const =0
Write a single complex field to an an output stream.
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.
Fourier transform wrapper.
bool isInitialized() const
Has this unit cell been initialized?
int nParameter() const
Get the number of parameters in the unit cell.
Base template for UnitCell<D> classes, D=1, 2 or 3.
int capacity() const
Return allocated size.
A FileMaster manages input and output files for a simulation.
static std::ostream & file()
Get log ostream by reference.
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
#define UTIL_THROW(msg)
Macro for throwing an Exception, reporting function, file and line number.
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).
Complex-valued periodic fields (class templates).
Periodic fields and crystallography.
void allocateFields(DArray< FT > &fields, int n, IntVec< D > const &dimension)
Allocate a DArray of fields.
PSCF package top-level namespace.