12#include <prdc/field/rFieldIo.h>
13#include <prdc/crystal/Basis.h>
14#include <prdc/crystal/UnitCell.h>
15#include <pscf/mesh/Mesh.h>
16#include <util/signal/Signal.h>
17#include <util/misc/FileMaster.h>
30 template <
int D,
class RFT,
class FIT>
38 readUnitCellPtr_(nullptr),
39 writeUnitCellPtr_(nullptr),
42 isAllocatedRGrid_(false),
43 isAllocatedBasis_(false),
53 template <
int D,
class RFT,
class FIT>
62 template <
int D,
class RFT,
class FIT>
69 template <
int D,
class RFT,
class FIT>
73 readUnitCellPtr_ = &cell;
79 template <
int D,
class RFT,
class FIT>
83 writeUnitCellPtr_ = &cell;
89 template <
int D,
class RFT,
class FIT>
100 template <
int D,
class RFT,
class FIT>
111 for (
int i = 0; i < D; ++i) {
117 rgrid_.allocate(nMonomer_);
118 for (
int i = 0; i < nMonomer_; ++i) {
122 isAllocatedRGrid_ =
true;
128 template <
int D,
class RFT,
class FIT>
137 basis_.allocate(nMonomer_);
138 for (
int i = 0; i < nMonomer_; ++i) {
139 basis_[i].allocate(
nBasis);
141 isAllocatedBasis_ =
true;
147 template <
int D,
class RFT,
class FIT>
162 template <
int D,
class RFT,
class FIT>
169 if (!isAllocatedRGrid_) {
174 if (!isAllocatedBasis_) {
183 for (
int i = 0; i < nMonomer_; ++i) {
188 for (
int j = 0; j < nBasis_; ++j) {
194 fieldIo().convertBasisToRGrid(basis_, rgrid_);
206 template <
int D,
class RFT,
class FIT>
212 if (!isAllocatedRGrid_) {
221 for (
int i = 0; i < nMonomer_; ++i) {
222 UTIL_CHECK(fields[i].capacity() == meshSize_);
228 if (!isAllocatedBasis_) {
233 fieldIo().convertRGridToBasis(rgrid_, basis_);
249 template <
int D,
class RFT,
class FIT>
260 fieldIo().readFieldHeader(in, nMonomerIn, *readUnitCellPtr_,
274 if (!isAllocatedRGrid_) {
277 if (!isAllocatedBasis_) {
285 *readUnitCellPtr_, mesh,
basis, nBasisIn);
288 fieldIo().convertBasisToRGrid(basis_, rgrid_);
302 template <
int D,
class RFT,
class FIT>
307 fieldIo().fileMaster().openInputFile(filename, file);
323 template <
int D,
class RFT,
class FIT>
333 if (!isAllocatedRGrid_) {
339 fieldIo().readFieldsRGrid(in, rgrid_, *readUnitCellPtr_);
345 if (!isAllocatedBasis_) {
348 fieldIo().convertRGridToBasis(rgrid_, basis_);
361 template <
int D,
class RFT,
class FIT>
367 fieldIo().fileMaster().openInputFile(filename, file);
375 template <
int D,
class RFT,
class FIT>
379 fieldIo().convertRGridToBasis(rgrid_, basis_);
380 fieldIo().convertBasisToRGrid(basis_, rgrid_);
392 template <
int D,
class RFT,
class FIT>
403 fieldIo().writeFieldsBasis(out, basis_, *writeUnitCellPtr_);
409 template <
int D,
class RFT,
class FIT>
413 fieldIo().fileMaster().openOutputFile(filename, file);
421 template <
int D,
class RFT,
class FIT>
431 bool writeHeader =
true;
433 fieldIo().writeFieldsRGrid(out, rgrid_, *writeUnitCellPtr_,
434 writeHeader, isSymmetric_);
440 template <
int D,
class RFT,
class FIT>
444 fieldIo().fileMaster().openOutputFile(filename, file);
454 template <
int D,
class RFT,
class FIT>
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.
IntVec< D > dimensions() const
Get an IntVec<D> of the grid dimensions.
int size() const
Get total number of grid points.
Symmetry-adapted Fourier basis for pseudo-spectral SCFT.
Base template for UnitCell<D> classes, D=1, 2 or 3.
void allocateBasis(int nBasis)
Allocate or re-allocate memory for fields in basis format.
void setFieldIo(FIT const &fieldIo)
Create association with FIT (store pointer).
void setNMonomer(int nMonomer)
Set stored value of nMonomer.
int nMonomer() const
Get number of monomer types.
void writeRGrid(std::ostream &out) const
Writes fields to an input stream in real-space (r-grid) format.
IntVec< D > const & meshDimensions() const
Get mesh dimensions in each direction, set on r-grid allocation.
DArray< DArray< double > > const & basis() const
Get array of all fields in basis format.
void setRGrid(DArray< RFT > const &fields, bool isSymmetric=false)
Set fields values in real-space (r-grid) format.
void symmetrize()
Symmetrize r-grid fields, compute corresponding basis components.
void readBasis(std::istream &in)
Read fields from an input stream in symmetrized basis format.
int nBasis() const
Get number of basis functions, set on basis allocation.
void setReadUnitCell(UnitCell< D > &cell)
Set unit cell used when reading field files.
bool isSymmetric() const
Are fields symmetric under all elements of the space group?
void setWriteUnitCell(UnitCell< D > const &cell)
Set unit cell used when writing field files.
void readRGrid(std::istream &in, bool isSymmetric=false)
Reads fields from an input stream in real-space (r-grid) format.
FIT const & fieldIo() const
Get associated FIT object (const reference).
void allocate(int nMonomer, int nBasis, IntVec< D > const &dimensions)
Allocate memory for all fields.
void allocateRGrid(IntVec< D > const &dimensions)
Allocate or re-allocate memory for fields in rgrid format.
Signal< void > & signal()
Get a signal that notifies observers of field modification.
void writeBasis(std::ostream &out) const
Write fields to an input stream in symmetrized basis format.
void setBasis(DArray< DArray< double > > const &fields)
Set field component values, in symmetrized Fourier format.
int capacity() const
Return allocated size.
Dynamically allocatable contiguous array template.
Notifier (or subject) in the Observer design pattern.
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
int readNBasis(std::istream &in)
Read the number of basis functions from a basis field file header.
void readBasisData(std::istream &in, DArray< DArray< double > > &fields, UnitCell< D > const &unitCell, Mesh< D > const &mesh, Basis< D > const &basis, int nStarIn)
Read an array of fields in basis format, without a header.
void eqV(Array< double > &a, Array< double > const &b, const int beginIdA, const int beginIdB, const int n)
Vector assignment, a[i] = b[i] (real, slice).
Periodic fields and crystallography.
Class templates for real-valued periodic fields.
PSCF package top-level namespace.