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) {
117 rgrid_.allocate(meshDimensions);
118 isAllocatedRGrid_ =
true;
124 template <
int D,
class RFT,
class FIT>
128 if (!isAllocatedRGrid_) {
133 if (!isAllocatedBasis_) {
134 Basis<D> const & basis = fieldIo().basis();
136 allocateBasis(basis.
nBasis());
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_) {
177 Basis<D> const & basis = fieldIo().basis();
179 allocateBasis(basis.
nBasis());
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_) {
226 allocateBasis(basis.
nBasis());
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_);
294 isSymmetric_ = isSymmetric;
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.
int nBasis() const
Total number of nonzero symmetry-adapted basis functions.
bool isInitialized() const
Returns true iff this basis is fully initialized.
void allocateBasis(int nBasis)
Allocate memory for the field in basis format.
bool isSymmetric() const
Are field symmetric under all elements of the space group?
int nBasis() const
Number of basis functions, 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.
virtual double rGridAverage() const=0
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.
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.
void setBasis(DArray< double > const &field)
Set field component values, in symmetrized Fourier format.
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.
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.
Signal< void > & signal()
IntVec< D > const & meshDimensions() const
Mesh dimensions in each direction, set by allocation.
void setWriteUnitCell(UnitCell< D > const &cell)
Set unit cell used when writing a mask field file.
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.