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>
28 template <
int D,
class RFT,
class FIT>
35 readUnitCellPtr_(nullptr),
36 writeUnitCellPtr_(nullptr),
39 isAllocatedBasis_(false),
40 isAllocatedRGrid_(false),
50 template <
int D,
class RFT,
class FIT>
59 template <
int D,
class RFT,
class FIT>
66 template <
int D,
class RFT,
class FIT>
70 readUnitCellPtr_ = &cell;
76 template <
int D,
class RFT,
class FIT>
81 writeUnitCellPtr_ = &cell;
87 template <
int D,
class RFT,
class FIT>
97 isAllocatedBasis_ =
true;
103 template <
int D,
class RFT,
class FIT>
112 for (
int i = 0; i < D; ++i) {
119 isAllocatedRGrid_ =
true;
125 template <
int D,
class RFT,
class FIT>
129 if (!isAllocatedRGrid_) {
134 if (!isAllocatedBasis_) {
135 Basis<D> const & basis = fieldIo().basis();
144 for (
int j = 0; j < nBasis_; ++j) {
145 basis_[j] = field[j];
149 fieldIo().convertBasisToRGrid(basis_, rgrid_);
161 template <
int D,
class RFT,
class FIT>
166 if (!isAllocatedRGrid_) {
177 if (!isAllocatedBasis_) {
183 fieldIo().convertRGridToBasis(rgrid_, basis_);
187 isSymmetric_ = isSymmetric;
199 template <
int D,
class RFT,
class FIT>
208 fieldIo().readFieldHeader(in, nMonomerIn, *readUnitCellPtr_,
223 if (!isAllocatedRGrid_) {
226 if (!isAllocatedBasis_) {
234 mesh,
basis, nBasisIn);
237 fieldIo().convertBasisToRGrid(basis_, rgrid_);
249 template <
int D,
class RFT,
class FIT>
253 fieldIo().fileMaster().openInputFile(filename, file);
266 template <
int D,
class RFT,
class FIT>
274 if (!isAllocatedRGrid_) {
282 fieldIo().readFieldRGrid(in, rgrid_, *readUnitCellPtr_);
286 if (!isAllocatedBasis_) {
291 fieldIo().convertRGridToBasis(rgrid_, basis_);
295 isSymmetric_ = isSymmetric;
304 template <
int D,
class RFT,
class FIT>
309 fieldIo().fileMaster().openInputFile(filename, file);
318 template <
int D,
class RFT,
class FIT>
329 ave /= double(meshSize_);
339 template <
int D,
class RFT,
class FIT>
349 fieldIo().writeFieldBasis(out, basis_, *writeUnitCellPtr_);
355 template <
int D,
class RFT,
class FIT>
359 fieldIo().fileMaster().openOutputFile(filename, file);
367 template <
int D,
class RFT,
class FIT>
376 fieldIo().writeFieldRGrid(out, rgrid_,
384 template <
int D,
class RFT,
class FIT>
388 fieldIo().fileMaster().openOutputFile(filename, file);
398 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.
bool isInitialized() const
Returns true iff this basis is fully initialized.
Base template for UnitCell<D> classes, D=1, 2 or 3.
bool hasData() const
Has field data been set in either format?
void allocateBasis(int nBasis)
Allocate memory for the field in basis format.
void setWriteUnitCell(UnitCell< D > const &cell)
Set unit cell used when writing a mask field file.
void setReadUnitCell(UnitCell< D > &cell)
Set unit cell used when reading a mask field file.
double phiTot() const
Return the volume fraction of unit cell occupied by material.
void readRGrid(std::istream &in, bool isSymmetric=false)
Reads field from an input stream in real-space (r-grid) format.
void readBasis(std::istream &in)
Read field from input stream in symmetrized basis format.
Signal< void > & signal()
void setRGrid(RFT const &field, bool isSymmetric=false)
Set field values in real-space (r-grid) format.
void writeRGrid(std::ostream &out) const
Writes fields to an input stream in real-space (r-grid) format.
void setBasis(DArray< double > const &field)
Set field component values, in symmetrized Fourier format.
int nBasis() const
Number of basis functions, set by allocation.
IntVec< D > const & meshDimensions() const
Mesh dimensions in each direction, set by allocation.
void setFieldIo(FIT const &fieldIo)
Create association with FieldIo (store pointer).
DArray< double > const & basis() const
void writeBasis(std::ostream &out) const
Write fields to an input stream in symmetrized basis format.
RField< D > const & rgrid() const
void allocateRGrid(IntVec< D > const &dimensions)
Allocate memory for the field in rgrid format.
FIT const & fieldIo() const
Associated FieldIo object (const reference).
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.
double sum(Array< double > const &in)
Compute sum of array elements (real).
Periodic fields and crystallography.
Class templates for real-valued periodic fields.
PSCF package top-level namespace.