PSCF v1.3
fieldIoUtil.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 // Utilities for checking field and array dimensions
32
54 template <int D, class FT>
55 void checkAllocateField(FT& field, IntVec<D> const& dimensions);
56
80 template <int D, class FT>
82 int nMonomer,
83 IntVec<D> const& dimensions);
84
101 template <int D, class FT>
102 void inspectFields(DArray<FT> const & fields,
103 int & nMonomer,
104 IntVec<D> & dimensions);
105
127 template <int D, class AT>
129 int nMonomer,
130 int capacity);
131
144 template <class AT>
145 void inspectArrays(DArray<AT> const & arrays,
146 int & nMonomer,
147 int & capacity);
148
149
150 // Field File Header (Common Format)
151
166 template <int D>
167 void readFieldHeader(std::istream& in, int& ver1, int& ver2,
168 UnitCell<D>& cell, std::string& groupName,
169 int& nMonomer);
170
188 template <int D>
189 void writeFieldHeader(std::ostream &out, int ver1, int ver2,
190 UnitCell<D> const & cell,
191 std::string const & groupName,
192 int nMonomer);
193
194
195 // Templates for RGrid data IO
196
208 template <int D>
209 void readMeshDimensions(std::istream& in,
210 IntVec<D> const& meshDimensions);
211
220 template <int D>
221 void writeMeshDimensions(std::ostream &out,
222 IntVec<D> const& meshDimensions);
223
240 template <int D, class AT>
241 void readRGridData(std::istream& in,
242 DArray<AT>& fields,
243 int nMonomer,
244 IntVec<D> const& dimensions);
245
261 template <int D, class AT>
262 void readRGridData(std::istream& in,
263 AT& field,
264 IntVec<D> const& dimensions);
265
282 template <int D, class AT>
283 void writeRGridData(std::ostream& out,
284 DArray<AT> const& fields,
285 int nMonomer,
286 IntVec<D> const& dimensions);
287
303 template <int D, class AT>
304 void writeRGridData(std::ostream& out,
305 AT const& field,
306 IntVec<D> const& dimensions);
307
308 // Templates for KGrid data IO
309
326 template <int D, class AT>
327 void readKGridData(std::istream& in,
328 DArray<AT>& fields,
329 int nMonomer,
330 IntVec<D> const& dftDimensions);
331
347 template <int D, class AT>
348 void readKGridData(std::istream& in,
349 AT& field,
350 IntVec<D> const& dftDimensions);
351
368 template <int D, class AT>
369 void writeKGridData(std::ostream& out,
370 DArray<AT> const& fields,
371 int nMonomer,
372 IntVec<D> const& dftDimensions);
373
389 template <int D, class AT>
390 void writeKGridData(std::ostream& in,
391 AT const& field,
392 IntVec<D> const& dftDimensions);
393
394 // Templates for Io of symmetrized basis format
395
404 int readNBasis(std::istream& in);
405
414 void writeNBasis(std::ostream& out, int nBasis);
415
440 template <int D>
441 void readBasisData(std::istream& in,
442 DArray< DArray<double> >& fields,
443 UnitCell<D> const& unitCell,
444 Mesh<D> const& mesh,
445 Basis<D> const& basis,
446 int nStarIn);
447
464 template <int D>
465 void readBasisData(std::istream& in,
466 DArray<double>& field,
467 UnitCell<D> const& unitCell,
468 Mesh<D> const& mesh,
469 Basis<D> const& basis,
470 int nStarIn);
471
488 template <int D>
489 void writeBasisData(std::ostream &out,
490 DArray<DArray<double> > const & fields,
491 Basis<D> const & basis);
492
502 template <int D>
503 void writeBasisData(std::ostream &out,
504 DArray<double> const & field,
505 Basis<D> const & basis);
506
517 template <int D, class AT>
518 void convertBasisToKGrid(DArray<double> const & components,
519 AT& dft,
520 Basis<D> const& basis,
521 IntVec<D> const& dftDimensions);
522
540 template <int D, class AT>
541 void convertKGridToBasis(AT const & in,
542 DArray<double> & out,
543 Basis<D> const& basis,
544 IntVec<D> const& dftDimensions,
545 bool checkSymmetry = true,
546 double epsilon = 1.0e-8);
547
566 template <int D, class AT>
567 bool hasSymmetry(AT const& in,
568 Basis<D> const& basis,
569 IntVec<D> const& dftDimensions,
570 double epsilon = 1.0e-8,
571 bool verbose = true);
572
573 // Field manipulation utilities
574
594 template <int D, class AT>
595 void replicateUnitCell(std::ostream& out,
596 DArray<AT > const & fields,
597 IntVec<D> const & meshDimensions,
598 UnitCell<D> const & unitCell,
599 IntVec<D> const & replicas);
600
633 template <int D, class AT>
634 void expandRGridDimension(std::ostream &out,
635 DArray< AT > const & fields,
636 IntVec<D> const & meshDimensions,
637 UnitCell<D> const & unitCell,
638 int d,
639 DArray<int> newGridDimensions);
640
641} // namespace Prdc
642} // namespace Pscf
643#include "fieldIoUtil.tpp"
644#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:383
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 writeFieldHeader(std::ostream &out, int ver1, int ver2, UnitCell< D > const &cell, std::string const &groupName, int nMonomer)
Write common part of field header (fortran PSCF format).
void readFieldHeader(std::istream &in, int &ver1, int &ver2, UnitCell< D > &cell, std::string &groupName, int &nMonomer)
Read common part of field header (fortran PSCF format).
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.
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 inspectArrays(DArray< AT > const &arrays, int &nMonomer, int &capacity)
Inspect dimensions of a DArray of 1D arrays, each of type AT.
void inspectFields(DArray< FT > const &fields, int &nMonomer, IntVec< D > &dimensions)
Inspect dimensions of a DArray of fields, each of type FT.
void checkAllocateArrays(DArray< AT > &arrays, int nMonomer, int capacity)
Check allocation of a DArray of 1D arrays, allocate if necessary.
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 writeMeshDimensions(std::ostream &out, IntVec< D > const &meshDimensions)
Write mesh dimensions to a field file header.
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.
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.
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.
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.
void readMeshDimensions(std::istream &in, IntVec< D > const &meshDimensions)
Read mesh dimensions from a field file header.
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.
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.
void checkAllocateFields(DArray< FT > &fields, int nMonomer, IntVec< D > const &dimensions)
Check allocation of an array of fields, allocate if necessary.
void checkAllocateField(FT &field, IntVec< D > const &dimensions)
Check allocation of a single field, allocate if necessary.
Periodic fields and crystallography.
Definition CField.cpp:11
PSCF package top-level namespace.
Definition param_pc.dox:1
Utility classes for scientific computation.