1#ifndef PSPG_W_FIELD_CONTAINER_TPP
2#define PSPG_W_FIELD_CONTAINER_TPP
11#include "WFieldContainer.h"
12#include <pspg/field/FieldIo.h>
32 isAllocatedRGrid_(false),
33 isAllocatedBasis_(false),
50 { fieldIoPtr_ = &fieldIo; }
73 if (isAllocatedRGrid_) {
78 meshDimensions_ = meshDimensions;
80 for (
int i = 0; i < D; ++i) {
82 meshSize_ *= meshDimensions[i];
86 rgrid_.allocate(nMonomer_);
87 for (
int i = 0; i < nMonomer_; ++i) {
88 rgrid_[i].allocate(meshDimensions);
90 isAllocatedRGrid_ =
true;
102 for (
int i = 0; i < nMonomer_; ++i) {
103 rgrid_[i].deallocate();
108 isAllocatedRGrid_ =
false;
121 if (isAllocatedBasis_) {
127 basis_.allocate(nMonomer_);
128 for (
int i = 0; i < nMonomer_; ++i) {
129 basis_[i].allocate(nBasis);
131 isAllocatedBasis_ =
true;
143 for (
int i = 0; i < nMonomer_; ++i) {
144 basis_[i].deallocate();
148 isAllocatedBasis_ =
false;
158 setNMonomer(nMonomer);
159 allocateRGrid(meshDimensions);
160 allocateBasis(nBasis);
174 for (
int i = 0; i < nMonomer_; ++i) {
179 for (
int j = 0; j < nBasis_; ++j) {
185 fieldIoPtr_->convertBasisToRGrid(basis_, rgrid_);
202 for (
int i = 0; i < nMonomer_; ++i) {
204 rgrid_[i] = fields[i];
208 fieldIoPtr_->convertRGridToBasis(rgrid_, basis_);
212 isSymmetric_ = isSymmetric;
224 int nBlocks, nThreads;
227 for (
int i = 0; i < nMonomer_; i++) {
228 assignReal<<<nBlocks, nThreads>>>(rgrid_[i].cDField(),
229 fields.
cDField() + i*meshSize_,
234 isSymmetric_ =
false;
250 fieldIoPtr_->readFieldsBasis(in, basis_, unitCell);
253 fieldIoPtr_->convertBasisToRGrid(basis_, rgrid_);
272 fieldIoPtr_->readFieldsBasis(filename, basis_, unitCell);
275 fieldIoPtr_->convertBasisToRGrid(basis_, rgrid_);
299 fieldIoPtr_->readFieldsRGrid(in, rgrid_, unitCell);
302 fieldIoPtr_->convertRGridToBasis(rgrid_, basis_);
306 isSymmetric_ = isSymmetric;
327 fieldIoPtr_->readFieldsRGrid(filename, rgrid_, unitCell);
330 fieldIoPtr_->convertRGridToBasis(rgrid_, basis_);
334 isSymmetric_ = isSymmetric;
344 fieldIoPtr_->convertRGridToBasis(rgrid_, basis_);
345 fieldIoPtr_->convertBasisToRGrid(basis_, rgrid_);
An IntVec<D, T> is a D-component vector of elements of integer type T.
Dynamic array on the GPU with alligned data.
Data * cDField()
Return pointer to underlying C array.
File input/output operations for fields in several file formats.
Field of real single precision values on an FFT mesh on a device.
void setRGrid(DArray< RDField< D > > 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 deallocateBasis()
De-allocate fields in basis format.
void setBasis(DArray< DArray< double > > const &fields)
Set field component values, in symmetrized Fourier format.
void allocate(int nMonomer, int nBasis, IntVec< D > const &dimensions)
Allocate memory for all fields.
WFieldContainer()
Constructor.
void setNMonomer(int nMonomer)
Set stored value of nMonomer.
~WFieldContainer()
Destructor.
void deallocateRGrid()
De-allocate fields in rgrid format.
void readRGrid(std::istream &in, UnitCell< D > &unitCell, bool isSymmetric=false)
Reads fields from an input stream in real-space (r-grid) format.
void setFieldIo(FieldIo< D > const &fieldIo)
Create association with FieldIo (store pointer).
void allocateRGrid(IntVec< D > const &dimensions)
Allocate or re-allocate memory for fields in rgrid format.
void readBasis(std::istream &in, UnitCell< D > &unitCell)
Read field component values from input stream, in symmetrized Fourier format.
void allocateBasis(int nBasis)
Allocate or re-allocate memory for fields 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.
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
void setThreadsLogical(int nThreadsLogical)
Set the total number of threads required for execution.
C++ namespace for polymer self-consistent field theory (PSCF).
Utility classes for scientific computation.