PSCF v1.4.0
rFieldIo.h
1#ifndef PRDC_FIELD_IO_UTIL_H
2#define PRDC_FIELD_IO_UTIL_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 <pscf/math/IntVec.h> // Template with a default parameter
12
13// Forward class declarations
14namespace Util {
15 template <typename T> class DArray;
16}
17namespace Pscf {
18 template <int D> class Mesh;
19 namespace Prdc {
20 template <int D> class UnitCell;
21 template <int D> class Basis;
22 }
23}
24
25namespace Pscf {
26namespace Prdc {
27
28 using namespace Util;
29 using namespace Pscf;
30
31 // Field data IO in r-grid file format
32
53 template <int D, class AT>
54 void readRGridData(std::istream& in,
55 DArray<AT>& fields,
56 int nMonomer,
57 IntVec<D> const& dimensions);
58
74 template <int D, class AT>
75 void readRGridData(std::istream& in,
76 AT& field,
77 IntVec<D> const& dimensions);
78
95 template <int D, class AT>
96 void writeRGridData(std::ostream& out,
97 DArray<AT> const& fields,
98 int nMonomer,
99 IntVec<D> const& dimensions);
100
116 template <int D, class AT>
117 void writeRGridData(std::ostream& out,
118 AT const& field,
119 IntVec<D> const& dimensions);
120
121 // Field data IO in k-grid file format
122
139 template <int D, class AT>
140 void readKGridData(std::istream& in,
141 DArray<AT>& fields,
142 int nMonomer,
143 IntVec<D> const& dftDimensions);
144
160 template <int D, class AT>
161 void readKGridData(std::istream& in,
162 AT& field,
163 IntVec<D> const& dftDimensions);
164
181 template <int D, class AT>
182 void writeKGridData(std::ostream& out,
183 DArray<AT> const& fields,
184 int nMonomer,
185 IntVec<D> const& dftDimensions);
186
202 template <int D, class AT>
203 void writeKGridData(std::ostream& in,
204 AT const& field,
205 IntVec<D> const& dftDimensions);
206
207 // Field data IO in symmetry-adapted basis format
208
217 int readNBasis(std::istream& in);
218
227 void writeNBasis(std::ostream& out, int nBasis);
228
253 template <int D>
254 void readBasisData(std::istream& in,
255 DArray< DArray<double> >& fields,
256 UnitCell<D> const& unitCell,
257 Mesh<D> const& mesh,
258 Basis<D> const& basis,
259 int nStarIn);
260
277 template <int D>
278 void readBasisData(std::istream& in,
279 DArray<double>& field,
280 UnitCell<D> const& unitCell,
281 Mesh<D> const& mesh,
282 Basis<D> const& basis,
283 int nStarIn);
284
301 template <int D>
302 void writeBasisData(std::ostream &out,
303 DArray<DArray<double> > const & fields,
304 Basis<D> const & basis);
305
315 template <int D>
316 void writeBasisData(std::ostream &out,
317 DArray<double> const & field,
318 Basis<D> const & basis);
319
320 // Conversion between basis <-> k-grid formats
321
332 template <int D, class AT>
333 void convertBasisToKGrid(DArray<double> const & components,
334 AT& dft,
335 Basis<D> const& basis,
336 IntVec<D> const& dftDimensions);
337
355 template <int D, class AT>
356 void convertKGridToBasis(AT const & in,
357 DArray<double> & out,
358 Basis<D> const& basis,
359 IntVec<D> const& dftDimensions,
360 bool checkSymmetry = true,
361 double epsilon = 1.0e-8);
362
381 template <int D, class AT>
382 bool hasSymmetry(AT const& in,
383 Basis<D> const& basis,
384 IntVec<D> const& dftDimensions,
385 double epsilon = 1.0e-8,
386 bool verbose = true);
387
388 // Field manipulation utilities
389
409 template <int D, class AT>
410 void replicateUnitCell(std::ostream& out,
411 DArray<AT > const & fields,
412 IntVec<D> const & meshDimensions,
413 UnitCell<D> const & unitCell,
414 IntVec<D> const & replicas);
415
448 template <int D, class AT>
449 void expandRGridDimension(std::ostream &out,
450 DArray< AT > const & fields,
451 IntVec<D> const & meshDimensions,
452 UnitCell<D> const & unitCell,
453 int d,
454 DArray<int> newGridDimensions);
455
456} // namespace Prdc
457} // namespace Pscf
458#include "rFieldIo.tpp"
459#endif
An IntVec<D, T> is a D-component vector of elements of integer type T.
Definition IntVec.h:27
Description of a regular grid of points in a periodic domain.
Definition Mesh.h:61
Symmetry-adapted Fourier basis for pseudo-spectral SCFT.
Definition Basis.h:384
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition UnitCell.h:56
Dynamically allocatable contiguous array template.
Definition DArray.h:32
void replicateUnitCell(IntVec< 1 > const &replicas, UnitCell< 1 > const &cellIn, UnitCell< 1 > &cellOut)
Create a replicated UnitCell<1>.
void writeKGridData(std::ostream &out, DArray< AT > const &fields, int nMonomer, IntVec< D > const &dftDimensions)
Write data for array of k-grid fields, with no header section.
void writeNBasis(std::ostream &out, int nBasis)
Write the number of basis functions to a basis field file header.
Definition rFieldIo.cpp:44
bool hasSymmetry(AT const &in, Basis< D > const &basis, IntVec< D > const &dftDimensions, double epsilon=1.0e-8, bool verbose=true)
Check if a k-grid field has the declared space group symmetry.
void readKGridData(std::istream &in, DArray< AT > &fields, int nMonomer, IntVec< D > const &dftDimensions)
Read data for array of k-grid fields, with no header section.
void convertBasisToKGrid(DArray< double > const &components, AT &dft, Basis< D > const &basis, IntVec< D > const &dftDimensions)
Convert a real field from symmetrized basis to Fourier grid.
void expandRGridDimension(std::ostream &out, DArray< AT > const &fields, IntVec< D > const &meshDimensions, UnitCell< D > const &unitCell, int d, DArray< int > newGridDimensions)
Expand the dimensionality of space from D to d.
Definition rFieldIo.tpp:971
void writeRGridData(std::ostream &out, DArray< AT > const &fields, int nMonomer, IntVec< D > const &dimensions)
Write data for array of r-grid fields, with no header section.
Definition rFieldIo.tpp:78
void convertKGridToBasis(AT const &in, DArray< double > &out, Basis< D > const &basis, IntVec< D > const &dftDimensions, bool checkSymmetry=true, double epsilon=1.0e-8)
Convert a real field from Fourier grid to symmetrized basis.
int readNBasis(std::istream &in)
Read the number of basis functions from a basis field file header.
Definition rFieldIo.cpp:16
void readRGridData(std::istream &in, DArray< AT > &fields, int nMonomer, IntVec< D > const &dimensions)
Read data for array of r-grid fields, with no header section.
Definition rFieldIo.tpp:38
void writeBasisData(std::ostream &out, DArray< DArray< double > > const &fields, Basis< D > const &basis)
Write data section of an array of fields in basis format.
Definition rFieldIo.tpp:511
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.
Definition rFieldIo.tpp:233
Periodic fields and crystallography.
Definition complex.cpp:11
PSCF package top-level namespace.
Utility classes for scientific computation.