1#ifndef PRDC_MASK_TMPL_TPP
2#define PRDC_MASK_TMPL_TPP
12#include <prdc/field/fieldIoUtil.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>
27 template <
int D,
class RFT,
class FIT>
34 readUnitCellPtr_(nullptr),
35 writeUnitCellPtr_(nullptr),
38 isAllocatedBasis_(false),
39 isAllocatedRGrid_(false),
49 template <
int D,
class RFT,
class FIT>
58 template <
int D,
class RFT,
class FIT>
65 template <
int D,
class RFT,
class FIT>
69 readUnitCellPtr_ = &cell;
75 template <
int D,
class RFT,
class FIT>
80 writeUnitCellPtr_ = &cell;
86 template <
int D,
class RFT,
class FIT>
96 isAllocatedBasis_ =
true;
102 template <
int D,
class RFT,
class FIT>
111 for (
int i = 0; i < D; ++i) {
118 isAllocatedRGrid_ =
true;
124 template <
int D,
class RFT,
class FIT>
128 if (!isAllocatedRGrid_) {
133 if (!isAllocatedBasis_) {
143 for (
int j = 0; j < nBasis_; ++j) {
144 basis_[j] = field[j];
148 fieldIo().convertBasisToRGrid(basis_, rgrid_);
160 template <
int D,
class RFT,
class FIT>
165 if (!isAllocatedRGrid_) {
176 if (!isAllocatedBasis_) {
182 fieldIo().convertRGridToBasis(rgrid_, basis_);
198 template <
int D,
class RFT,
class FIT>
207 fieldIo().readFieldHeader(in, nMonomerIn, *readUnitCellPtr_,
222 if (!isAllocatedRGrid_) {
225 if (!isAllocatedBasis_) {
233 mesh,
basis, nBasisIn);
236 fieldIo().convertBasisToRGrid(basis_, rgrid_);
248 template <
int D,
class RFT,
class FIT>
252 fieldIo().fileMaster().openInputFile(filename, file);
265 template <
int D,
class RFT,
class FIT>
273 if (!isAllocatedRGrid_) {
281 fieldIo().readFieldRGrid(in, rgrid_, *readUnitCellPtr_);
285 if (!isAllocatedBasis_) {
290 fieldIo().convertRGridToBasis(rgrid_, basis_);
303 template <
int D,
class RFT,
class FIT>
308 fieldIo().fileMaster().openInputFile(filename, file);
317 template <
int D,
class RFT,
class FIT>
336 template <
int D,
class RFT,
class FIT>
346 fieldIo().writeFieldBasis(out, basis_, *writeUnitCellPtr_);
352 template <
int D,
class RFT,
class FIT>
356 fieldIo().fileMaster().openOutputFile(filename, file);
364 template <
int D,
class RFT,
class FIT>
373 fieldIo().writeFieldRGrid(out, rgrid_,
381 template <
int D,
class RFT,
class FIT>
385 fieldIo().fileMaster().openOutputFile(filename, file);
395 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 hasData() const
Has field data been set in either format?
void writeBasis(std::ostream &out) const
Write fields to an input stream in symmetrized basis format.
void setReadUnitCell(UnitCell< D > &cell)
Set unit cell used when reading a mask field file.
int nBasis() const
Number of basis functions, set by allocation.
double phiTot() const
Return the volume fraction of unit cell occupied by material.
virtual double rGridAverage() const =0
Calculate the average value of the rgrid_ member.
FIT const & fieldIo() const
Associated FieldIo object (const reference).
void setRGrid(RFT const &field, bool isSymmetric=false)
Set field values in real-space (r-grid) format.
bool isSymmetric() const
Are field symmetric under all elements of the space group?
void setBasis(DArray< double > const &field)
Set field component values, in symmetrized Fourier format.
IntVec< D > const & meshDimensions() const
Mesh dimensions in each direction, set by allocation.
void readRGrid(std::istream &in, bool isSymmetric=false)
Reads field from an input stream in real-space (r-grid) format.
DArray< double > const & basis() const
Get the field in basis format.
void writeRGrid(std::ostream &out) const
Writes fields to an input stream in real-space (r-grid) format.
void allocateRGrid(IntVec< D > const &dimensions)
Allocate memory for the field in rgrid format.
void setWriteUnitCell(UnitCell< D > const &cell)
Set unit cell used when writing a mask field file.
void setFieldIo(FIT const &fieldIo)
Create association with FieldIo (store pointer).
Signal< void > & signal()
Get a signal that notifies observers of field modification.
void readBasis(std::istream &in)
Read field from input stream in symmetrized basis format.
void allocateBasis(int nBasis)
Allocate memory for the field in basis format.
Base template for UnitCell<D> classes, D=1, 2 or 3.
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.
Periodic fields and crystallography.
PSCF package top-level namespace.