PSCF v1.3
rpg/field/FieldIo.h
1#ifndef RPG_FIELD_IO_H
2#define RPG_FIELD_IO_H
3
4/*
5* PSCF - Polymer Self-Consistent Field
6*
7* Copyright 2015 - 2025, The Regents of the University of Minnesota
8* Distributed under the terms of the GNU General Public License.
9*/
10
11#include <prdc/field/FieldIoReal.h> // base class template
12#include <prdc/cuda/RField.h> // template parameter
13#include <prdc/cuda/RFieldDft.h> // template parameter
14#include <prdc/cuda/FFT.h> // template parameter
15
16// Forward declarations for classes used only via references or pointers
17namespace Util {
18 class FileMaster;
19 template <typename T> class DArray;
20}
21namespace Pscf {
22 namespace Prdc {
23 template <int D> class UnitCell;
24 }
25}
26
27namespace Pscf {
28namespace Rpg {
29
30 using namespace Util;
31 using namespace Pscf::Prdc;
32 using namespace Pscf::Prdc::Cuda;
33
58 template <int D>
59 class FieldIo
60 : public FieldIoReal< D, RField<D>, RFieldDft<D>, FFT<D> >
61 {
62
63 public:
64
75 bool readFieldsRGrid(std::istream& in,
76 DArray< RField<D> >& fields,
77 UnitCell<D> & unitCell)
78 const override;
79
89 void readFieldsRGridData(std::istream& in,
90 DArray< RField<D> >& fields,
91 int nMonomer)
92 const override;
93
104 bool readFieldRGrid(std::istream &in,
105 RField<D> & field,
106 UnitCell<D>& unitCell)
107 const override;
108
121 void writeFieldsRGrid(std::ostream& out,
122 DArray< RField<D> > const & fields,
123 UnitCell<D> const & unitCell,
124 bool writeHeader = true,
125 bool isSymmetric = true,
126 bool writeMeshSize = true)
127 const override;
128
140 void writeFieldRGrid(std::ostream &out,
141 RField<D> const & field,
142 UnitCell<D> const & unitCell,
143 bool writeHeader = true,
144 bool isSymmetric = true)
145 const override;
146
156 void readFieldsKGrid(std::istream& in,
157 DArray< RFieldDft<D> >& fields,
158 UnitCell<D> & unitCell)
159 const override;
160
171 void writeFieldsKGrid(std::ostream& out,
172 DArray< RFieldDft<D> > const & fields,
173 UnitCell<D> const & unitCell,
174 bool isSymmetric = true)
175 const override;
176
185 void convertBasisToKGrid(DArray<double> const & components,
186 RFieldDft<D>& dft)
187 const override;
188
199 void convertKGridToBasis(RFieldDft<D> const & in,
200 DArray<double> & out,
201 bool checkSymmetry = true,
202 double epsilon = 1.0e-8)
203 const override;
204
215 bool hasSymmetry(RFieldDft<D> const & in,
216 double epsilon = 1.0e-8,
217 bool verbose = true)
218 const override;
219
229 void compareFieldsRGrid(DArray< RField<D> > const & field1,
230 DArray< RField<D> > const & field2)
231 const override;
232
242 void scaleFieldRGrid(RField<D>& field, double factor)
243 const override;
244
257 std::ostream &out,
258 DArray<RField<D> > const & fields,
259 UnitCell<D> const & unitCell,
260 int d,
261 DArray<int> const& newGridDimensions)
262 const override;
263
275 std::ostream& out,
276 DArray< RField<D> > const & fields,
277 UnitCell<D> const & unitCell,
278 IntVec<D> const & replicas)
279 const override;
280
281
286
287 // Inherited public member functions
288 using Base::associate;
307 using Base::hasSymmetry;
317 using Base::mesh;
318 using Base::basis;
319 using Base::fileMaster;
320
321 protected:
322
323 // Inherited protected member functions
324 using Base::lattice;
325 using Base::hasGroup;
326 using Base::groupName;
327 using Base::group;
328 using Base::fft;
329
330 };
331
332 #ifndef RPG_FIELD_IO_TPP
333 extern template class FieldIo<1>;
334 extern template class FieldIo<2>;
335 extern template class FieldIo<3>;
336 #endif
337
338} // namespace Rpg
339
340#ifndef RPG_FIELD_IO_TPP
341namespace Prdc {
342 using namespace Pscf::Prdc::Cuda;
343 extern template class FieldIoReal<1, RField<1>, RFieldDft<1>, FFT<1>>;
344 extern template class FieldIoReal<2, RField<2>, RFieldDft<2>, FFT<2>>;
345 extern template class FieldIoReal<3, RField<3>, RFieldDft<3>, FFT<3>>;
346}
347#endif
348
349} // namespace Pscf
350#endif
An IntVec<D, T> is a D-component vector of elements of integer type T.
Definition IntVec.h:27
Fourier transform wrapper.
Definition cpu/FFT.h:38
Fourier transform of a real field on an FFT mesh.
Field of real double precision values on an FFT mesh.
Definition cpu/RField.h:29
File input/output, format conversions and other utilities for fields.
Definition FieldIoReal.h:86
virtual void replicateUnitCell(std::ostream &out, DArray< RField< D > > const &fields, UnitCell< D > const &unitCell, IntVec< D > const &replicas) const=0
UnitCell< D >::LatticeSystem const & lattice() const
virtual void writeFieldRGrid(std::ostream &out, RField< D > const &field, UnitCell< D > const &unitCell, bool writeHeader=true, bool isSymmetric=true) const=0
void convertRGridToBasis(RField< D > const &in, DArray< double > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const
virtual void writeFieldsKGrid(std::ostream &out, DArray< RFieldDft< D > > const &fields, UnitCell< D > const &unitCell, bool isSymmetric=true) const=0
void scaleFieldsBasis(DArray< DArray< double > > &fields, double factor) const
virtual bool hasSymmetry(RFieldDft< D > const &in, double epsilon=1.0e-8, bool verbose=true) const=0
void estimateWBasis(DMatrix< double > const &chi, DArray< DArray< double > > &fields) const
virtual void convertBasisToKGrid(DArray< double > const &components, RFieldDft< D > &dft) const=0
void scaleFieldsRGrid(DArray< RField< D > > &fields, double factor) const
void writeFieldHeader(std::ostream &out, int nMonomer, UnitCell< D > const &unitCell, bool isSymmetric=true) const
void readFieldHeader(std::istream &in, int &nMonomer, UnitCell< D > &unitCell, bool &isSymmetric) const
void convertKGridToRGrid(DArray< RFieldDft< D > > const &in, DArray< RField< D > > &out) const
void associate(Mesh< D > const &mesh, FFT const &fft, typename UnitCell< D >::LatticeSystem const &lattice, bool const &hasGroup, std::string const &groupName, SpaceGroup< D > const &group, Basis< D > &basis)
virtual void convertKGridToBasis(RFieldDft< D > const &in, DArray< double > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const=0
void writeFieldsBasis(std::ostream &out, DArray< DArray< double > > const &fields, UnitCell< D > const &unitCell) const
void convertBasisToRGrid(DArray< double > const &in, RField< D > &out) const
virtual void readFieldsKGrid(std::istream &in, DArray< RFieldDft< D > > &fields, UnitCell< D > &unitCell) const=0
virtual bool readFieldsRGrid(std::istream &in, DArray< RField< D > > &fields, UnitCell< D > &unitCell) const=0
virtual void compareFieldsRGrid(DArray< RField< D > > const &field1, DArray< RField< D > > const &field2) const=0
void compareFieldsBasis(DArray< DArray< double > > const &field1, DArray< DArray< double > > const &field2) const
void readFieldsBasis(std::istream &in, DArray< DArray< double > > &fields, UnitCell< D > &unitCell) const
void convertRGridToKGrid(DArray< RField< D > > const &in, DArray< RFieldDft< D > > &out) const
virtual void readFieldsRGridData(std::istream &in, DArray< RField< D > > &fields, int nMonomer) const=0
void writeFieldBasis(std::ostream &out, DArray< double > const &field, UnitCell< D > const &unitCell) const
void readFieldBasis(std::istream &in, DArray< double > &field, UnitCell< D > &unitCell) const
virtual void writeFieldsRGrid(std::ostream &out, DArray< RField< D > > const &fields, UnitCell< D > const &unitCell, bool writeHeader=true, bool isSymmetric=true, bool writeMeshSize=true) const=0
virtual void expandRGridDimension(std::ostream &out, DArray< RField< D > > const &fields, UnitCell< D > const &unitCell, int d, DArray< int > const &newGridDimensions) const=0
virtual bool readFieldRGrid(std::istream &in, RField< D > &field, UnitCell< D > &unitCell) const=0
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition UnitCell.h:56
File input/output operations and format conversions for fields.
bool readFieldRGrid(std::istream &in, RField< D > &field, UnitCell< D > &unitCell) const override
Read a single RField (field on an r-space grid) from a stream.
void convertKGridToBasis(RFieldDft< D > const &in, DArray< double > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const override
Convert a field from Fourier (k-grid) to symmetrized basis form.
void convertBasisToKGrid(DArray< double > const &components, RFieldDft< D > &dft) const override
Convert a field from symmetrized basis to Fourier grid (k-grid).
void compareFieldsRGrid(DArray< RField< D > > const &field1, DArray< RField< D > > const &field2) const override
Compare two fields in r-grid format, output a report.
bool hasSymmetry(RFieldDft< D > const &in, double epsilon=1.0e-8, bool verbose=true) const override
Check if a k-grid field has the declared space group symmetry.
FieldIoReal< D, RField< D >, RFieldDft< D >, FFT< D > > Base
Alias for base class (partial template specialization)
void writeFieldsRGrid(std::ostream &out, DArray< RField< D > > const &fields, UnitCell< D > const &unitCell, bool writeHeader=true, bool isSymmetric=true, bool writeMeshSize=true) const override
Write array of RField objects (fields on r-space grid) to a stream.
void expandRGridDimension(std::ostream &out, DArray< RField< D > > const &fields, UnitCell< D > const &unitCell, int d, DArray< int > const &newGridDimensions) const override
Expand spatial dimension of an array of r-grid fields.
void writeFieldsKGrid(std::ostream &out, DArray< RFieldDft< D > > const &fields, UnitCell< D > const &unitCell, bool isSymmetric=true) const override
Write array of RFieldDft objects (k-space fields) to file.
void readFieldsKGrid(std::istream &in, DArray< RFieldDft< D > > &fields, UnitCell< D > &unitCell) const override
Read array of RFieldDft objects (k-space fields) from a stream.
bool readFieldsRGrid(std::istream &in, DArray< RField< D > > &fields, UnitCell< D > &unitCell) const override
Read array of RField objects (r-grid fields) from a stream.
void readFieldsRGridData(std::istream &in, DArray< RField< D > > &fields, int nMonomer) const override
Read data for an array of r-grid fields, with no header section.
void replicateUnitCell(std::ostream &out, DArray< RField< D > > const &fields, UnitCell< D > const &unitCell, IntVec< D > const &replicas) const override
Write r-grid fields in a replicated unit cell to std::ostream.
void writeFieldRGrid(std::ostream &out, RField< D > const &field, UnitCell< D > const &unitCell, bool writeHeader=true, bool isSymmetric=true) const override
Write a single RField (field on an r-space grid) to a stream.
void scaleFieldRGrid(RField< D > &field, double factor) const override
Rescale a single r-grid field by a scalar factor.
Dynamically allocatable contiguous array template.
Definition DArray.h:32
A FileMaster manages input and output files for a simulation.
Definition FileMaster.h:143
Fields, FFTs, and utilities for periodic boundary conditions (CUDA)
Definition Reduce.cpp:14
Periodic fields and crystallography.
Definition CField.cpp:11
SCFT and PS-FTS with real periodic fields (GPU)
PSCF package top-level namespace.
Definition param_pc.dox:1
Utility classes for scientific computation.