PSCF v1.4.0
rpc/field/FieldIo.h
1#ifndef RPC_FIELD_IO_H
2#define RPC_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 <rp/field/FieldIo.h> // base class template
12#include <prdc/cpu/RField.h> // base class template argument
13#include <prdc/cpu/RFieldDft.h> // base class template argument
14#include <prdc/cpu/FFT.h> // base class template argument
15
16// Forward declarations
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 Rpc {
29
30 using namespace Util;
31 using namespace Prdc;
32 using namespace Prdc::Cpu;
33
56 template <int D>
57 class FieldIo
58 : public Rp::FieldIo< D, RField<D>, RFieldDft<D>, FFT<D> >
59 {
60
61 public:
62
63 FieldIo() = default;
64 virtual ~FieldIo() = default;
65
76 bool readFieldsRGrid(std::istream& in,
77 DArray< RField<D> >& fields,
78 UnitCell<D> & unitCell) const override;
79
89 void readFieldsRGridData(std::istream& in,
90 DArray< RField<D> >& fields,
91 int nMonomer) const override;
92
103 bool readFieldRGrid(std::istream &in,
104 RField<D> & field,
105 UnitCell<D>& unitCell) const override;
106
119 void writeFieldsRGrid(std::ostream& out,
120 DArray< RField<D> > const & fields,
121 UnitCell<D> const & unitCell,
122 bool writeHeader = true,
123 bool isSymmetric = true,
124 bool writeMeshSize = true) const override;
125
137 void writeFieldRGrid(std::ostream &out,
138 RField<D> const & field,
139 UnitCell<D> const & unitCell,
140 bool writeHeader = true,
141 bool isSymmetric = true)
142 const override;
143
153 void readFieldsKGrid(std::istream& in,
154 DArray< RFieldDft<D> >& fields,
155 UnitCell<D> & unitCell)
156 const override;
157
168 void writeFieldsKGrid(std::ostream& out,
169 DArray< RFieldDft<D> > const & fields,
170 UnitCell<D> const & unitCell,
171 bool isSymmetric = true)
172 const override;
173
182 void convertBasisToKGrid(DArray<double> const & components,
183 RFieldDft<D>& dft)
184 const override;
185
196 void convertKGridToBasis(RFieldDft<D> const & in,
197 DArray<double> & out,
198 bool checkSymmetry = true,
199 double epsilon = 1.0e-8)
200 const override;
201
212 bool hasSymmetry(RFieldDft<D> const & in,
213 double epsilon = 1.0e-8,
214 bool verbose = true)
215 const override;
216
226 void compareFieldsRGrid(DArray< RField<D> > const & field1,
227 DArray< RField<D> > const & field2)
228 const override;
229
239 void scaleFieldRGrid(RField<D>& field, double factor)
240 const override;
241
254 std::ostream &out,
255 DArray<RField<D> > const & fields,
256 UnitCell<D> const & unitCell,
257 int d,
258 DArray<int> const& newGridDimensions)
259 const override;
260
272 std::ostream& out,
273 DArray< RField<D> > const & fields,
274 UnitCell<D> const & unitCell,
275 IntVec<D> const & replicas)
276 const override;
277
280
281 // Inherited public member functions (to avoid hiding)
295 using Base::hasSymmetry;
298
299 };
300
301} // namespace Rpc
302} // namespace Pscf
303
304// Explicit instantiation declarations
305namespace Pscf {
306 namespace Rp {
307 using namespace Prdc;
308 extern template
309 class Rp::FieldIo<1, Cpu::RField<1>, Cpu::RFieldDft<1>, Cpu::FFT<1>>;
310 extern template
311 class Rp::FieldIo<2, Cpu::RField<2>, Cpu::RFieldDft<2>, Cpu::FFT<2>>;
312 extern template
313 class Rp::FieldIo<3, Cpu::RField<3>, Cpu::RFieldDft<3>, Cpu::FFT<3>>;
314 }
315 namespace Rpc {
316 extern template class FieldIo<1>;
317 extern template class FieldIo<2>;
318 extern template class FieldIo<3>;
319 }
320}
321#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:39
Fourier transform of a real field on an FFT mesh.
Field of real double precision values on an FFT mesh.
Definition cpu/RField.h:27
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition UnitCell.h:56
File input/output, format conversions and other utilities for fields.
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 convertKGridToBasis(RFieldDft< D > const &in, DArray< double > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const=0
virtual bool readFieldRGrid(std::istream &in, RField< D > &field, UnitCell< D > &unitCell) const=0
virtual void convertBasisToKGrid(DArray< double > const &components, RFieldDft< D > &dft) const=0
virtual void compareFieldsRGrid(DArray< RField< D > > const &field1, DArray< RField< D > > const &field2) const=0
virtual bool hasSymmetry(RFieldDft< D > const &in, double epsilon=1.0e-8, bool verbose=true) const=0
virtual void replicateUnitCell(std::ostream &out, DArray< RField< D > > const &fields, UnitCell< D > const &unitCell, IntVec< D > const &replicas) const=0
void writeFieldBasis(std::ostream &out, DArray< double > const &field, UnitCell< D > const &unitCell) const
void writeFieldsBasis(std::ostream &out, DArray< DArray< double > > const &fields, UnitCell< D > const &unitCell) const
void scaleFieldsRGrid(DArray< RField< D > > &fields, double factor) const
virtual void readFieldsKGrid(std::istream &in, DArray< RFieldDft< D > > &fields, UnitCell< D > &unitCell) 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 void readFieldsRGridData(std::istream &in, DArray< RField< D > > &fields, int nMonomer) const=0
virtual void writeFieldRGrid(std::ostream &out, RField< D > const &field, UnitCell< D > const &unitCell, bool writeHeader=true, bool isSymmetric=true) const=0
virtual bool readFieldsRGrid(std::istream &in, DArray< RField< D > > &fields, UnitCell< D > &unitCell) const=0
virtual void writeFieldsKGrid(std::ostream &out, DArray< RFieldDft< D > > const &fields, UnitCell< D > const &unitCell, bool isSymmetric=true) const=0
File input/output operations and format conversions for fields.
Rp::FieldIo< D, RField< D >, RFieldDft< D >, FFT< D > > Base
Alias for base class.
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 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.
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.
void compareFieldsRGrid(DArray< RField< D > > const &field1, DArray< RField< D > > const &field2) const override
Compare two fields in r-grid format, output a report.
void scaleFieldRGrid(RField< D > &field, double factor) const override
Rescale a single r-grid field by a scalar factor.
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.
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 convertBasisToKGrid(DArray< double > const &components, RFieldDft< D > &dft) const override
Convert a field from symmetrized basis to Fourier grid (k-grid).
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 readFieldsKGrid(std::istream &in, DArray< RFieldDft< D > > &fields, UnitCell< D > &unitCell) const override
Read array of RFieldDft objects (k-space fields) 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 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 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.
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.
Dynamically allocatable contiguous array template.
Definition DArray.h:32
A FileMaster manages input and output files for a simulation.
Definition FileMaster.h:143
Periodic fields and crystallography.
Definition complex.cpp:11
Real periodic fields, SCFT and PS-FTS (CPU).
Definition param_pc.dox:2
PSCF package top-level namespace.
Utility classes for scientific computation.