1#ifndef PRDC_W_FIELDS_REAL_TPP
2#define PRDC_W_FIELDS_REAL_TPP
11#include "WFieldsReal.h"
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>
29 template <
int D,
class RFT,
class FIT>
37 readUnitCellPtr_(nullptr),
38 writeUnitCellPtr_(nullptr),
41 isAllocatedRGrid_(false),
42 isAllocatedBasis_(false),
52 template <
int D,
class RFT,
class FIT>
61 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) {
121 isAllocatedRGrid_ =
true;
128 template <
int D,
class RFT,
class FIT>
137 basis_.allocate(nMonomer_);
138 for (
int i = 0; i < nMonomer_; ++i) {
141 isAllocatedBasis_ =
true;
147 template <
int D,
class RFT,
class FIT>
163 template <
int D,
class RFT,
class FIT>
170 if (!isAllocatedRGrid_) {
175 if (!isAllocatedBasis_) {
176 Basis<D> const & basis = fieldIo().basis();
178 allocateBasis(basis.
nBasis());
184 for (
int i = 0; i < nMonomer_; ++i) {
189 for (
int j = 0; j < nBasis_; ++j) {
195 fieldIo().convertBasisToRGrid(basis_, rgrid_);
207 template <
int D,
class RFT,
class FIT>
213 if (!isAllocatedRGrid_) {
222 for (
int i = 0; i < nMonomer_; ++i) {
223 UTIL_CHECK(fields[i].capacity() == meshSize_);
224 assignRField(rgrid_[i], fields[i]);
229 if (!isAllocatedBasis_) {
234 fieldIo().convertRGridToBasis(rgrid_, basis_);
238 isSymmetric_ = isSymmetric;
250 template <
int D,
class RFT,
class FIT>
261 fieldIo().readFieldHeader(in, nMonomerIn, *readUnitCellPtr_,
275 if (!isAllocatedRGrid_) {
278 if (!isAllocatedBasis_) {
279 allocateBasis(basis.
nBasis());
286 *readUnitCellPtr_, mesh, basis, nBasisIn);
289 fieldIo().convertBasisToRGrid(basis_, rgrid_);
303 template <
int D,
class RFT,
class FIT>
308 fieldIo().fileMaster().openInputFile(filename, file);
324 template <
int D,
class RFT,
class FIT>
334 if (!isAllocatedRGrid_) {
340 fieldIo().readFieldsRGrid(in, rgrid_, *readUnitCellPtr_);
346 if (!isAllocatedBasis_) {
349 fieldIo().convertRGridToBasis(rgrid_, basis_);
353 isSymmetric_ = isSymmetric;
362 template <
int D,
class RFT,
class FIT>
368 fieldIo().fileMaster().openInputFile(filename, file);
376 template <
int D,
class RFT,
class FIT>
380 fieldIo().convertRGridToBasis(rgrid_, basis_);
381 fieldIo().convertBasisToRGrid(basis_, rgrid_);
393 template <
int D,
class RFT,
class FIT>
404 fieldIo().writeFieldsBasis(out, basis_, *writeUnitCellPtr_);
410 template <
int D,
class RFT,
class FIT>
414 fieldIo().fileMaster().openOutputFile(filename, file);
422 template <
int D,
class RFT,
class FIT>
432 bool writeHeader =
true;
434 fieldIo().writeFieldsRGrid(out, rgrid_, *writeUnitCellPtr_, writeHeader,
441 template <
int D,
class RFT,
class FIT>
445 fieldIo().fileMaster().openOutputFile(filename, file);
455 template <
int D,
class RFT,
class FIT>
469 template <
int D,
class RFT,
class FIT>
471 WFieldsReal<D,RFT,FIT>::assignRField(RFT & lhs, RFT
const & rhs)
const
472 {
UTIL_THROW(
"Unimplemented function WFieldsReal::assignRField");
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.
Base template for UnitCell<D> classes, D=1, 2 or 3.
DArray< DArray< double > > const & basis() const
void allocateRGrid(IntVec< D > const &dimensions)
Allocate or re-allocate memory for fields in rgrid format.
void allocate(int nMonomer, int nBasis, IntVec< D > const &dimensions)
Allocate memory for all fields.
WFieldsReal()
Constructor.
void readRGrid(std::istream &in, bool isSymmetric=false)
Reads fields from an input stream in real-space (r-grid) format.
void symmetrize()
Symmetrize r-grid fields, compute corresponding basis components.
FIT const & fieldIo() const
Get associated FIT object (const reference).
void setBasis(DArray< DArray< double > > const &fields)
Set field component values, in symmetrized Fourier format.
void setNMonomer(int nMonomer)
Set stored value of nMonomer.
int nBasis() const
Get number of basis functions, set on basis allocation.
void setWriteUnitCell(UnitCell< D > const &cell)
Set unit cell used when writing field files.
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).
bool isSymmetric() const
Are fields symmetric under all elements of the space group?
void writeBasis(std::ostream &out) const
Write fields to an input stream in symmetrized basis format.
Signal< void > & signal()
Get a signal that notifies observers of field modification.
void setRGrid(DArray< RFT > const &fields, bool isSymmetric=false)
Set fields 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 setReadUnitCell(UnitCell< D > &cell)
Set unit cell used when reading field files.
~WFieldsReal()
Destructor.
IntVec< D > const & meshDimensions() const
Get mesh dimensions in each direction, set on r-grid allocation.
void readBasis(std::istream &in)
Read fields from an input stream in symmetrized basis format.
int nMonomer() const
Get number of monomer types.
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.
#define UTIL_THROW(msg)
Macro for throwing an Exception, reporting function, file and line number.
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.