PSCF v1.1
pspg/field/FieldIo.h
1#ifndef PSPG_FIELD_IO_H
2#define PSPG_FIELD_IO_H
3
4/*
5* PSCF - Polymer Self-Consistent Field Theory
6*
7* Copyright 2016 - 2022, The Regents of the University of Minnesota
8* Distributed under the terms of the GNU General Public License.
9*/
10
11#include <pspg/field/FFT.h> // member
12#include <pspg/field/RDField.h> // function parameter
13#include <pspg/field/RDFieldDft.h> // function parameter
14
15#include <pscf/crystal/Basis.h> // member
16#include <pscf/crystal/SpaceGroup.h> // member
17#include <pscf/crystal/UnitCell.h> // member
18#include <pscf/mesh/Mesh.h> // member
19
20#include <util/misc/FileMaster.h> // member
21#include <util/containers/DArray.h> // function parameter
22#include <util/containers/Array.h> // function parameter
23
24namespace Pscf {
25namespace Pspg
26{
27 using namespace Util;
28 using namespace Pscf;
29
35 template <int D>
36 class FieldIo
37 {
38
39 public:
40
44 FieldIo();
45
49 ~FieldIo();
50
62 void associate(Mesh<D> const & mesh,
63 FFT<D> const & fft,
64 typename UnitCell<D>::LatticeSystem& lattice,
65 std::string& groupName,
66 SpaceGroup<D>& group,
67 Basis<D>& basis,
68 FileMaster const & fileMaster);
69
71
72
87 void
88 readFieldsBasis(std::istream& in,
89 DArray< DArray<double> >& fields,
90 UnitCell<D>& unitCell) const;
91
103 void readFieldsBasis(std::string filename,
104 DArray< DArray<double> >& fields,
105 UnitCell<D>& unitCell) const;
106
116 void writeFieldsBasis(std::ostream& out,
117 DArray< DArray<double> > const & fields,
118 UnitCell<D> const & unitCell) const;
119
131 void writeFieldsBasis(std::string filename,
132 DArray< DArray<double> > const & fields,
133 UnitCell<D> const & unitCell) const;
134
145 void readFieldsRGrid(std::istream& in,
146 DArray< RDField<D> >& fields,
147 UnitCell<D>& unitCell) const;
148
163 void readFieldsRGrid(std::string filename,
164 DArray< RDField<D> >& fields,
165 UnitCell<D>& unitCell) const;
166
174 void writeFieldsRGrid(std::ostream& out,
175 DArray< RDField<D> > const& fields,
176 UnitCell<D> const & unitCell) const;
177
189 void writeFieldsRGrid(std::string filename,
190 DArray< RDField<D> > const& fields,
191 UnitCell<D> const & unitCell) const;
192
193
201 void readFieldRGrid(std::istream& in, RDField<D> &field,
202 UnitCell<D>& unitCell) const;
203
211 void readFieldRGrid(std::string filename, RDField<D> &field,
212 UnitCell<D>& unitCell) const;
213
222 void writeFieldRGrid(std::ostream& out,
223 RDField<D> const & field,
224 UnitCell<D> const & unitCell,
225 bool writeHeader = true) const;
226
234 void writeFieldRGrid(std::string filename, RDField<D> const & field,
235 UnitCell<D> const & unitCell) const;
236
248 void readFieldsKGrid(std::istream& in,
249 DArray< RDFieldDft<D> >& fields,
250 UnitCell<D>& unitCell) const;
251
267 void readFieldsKGrid(std::string filename,
268 DArray< RDFieldDft<D> >& fields,
269 UnitCell<D>& unitCell) const;
270
282 void writeFieldsKGrid(std::ostream& out,
283 DArray< RDFieldDft<D> > const& fields,
284 UnitCell<D> const & unitCell) const;
285
297 void writeFieldsKGrid(std::string filename,
298 DArray< RDFieldDft<D> > const& fields,
299 UnitCell<D> const & unitCell) const;
300
308 void readFieldHeader(std::istream& in,
309 int& nMonomer,
310 UnitCell<D>& unitCell) const;
311
319 void writeFieldHeader(std::ostream& out, int nMonomer,
320 UnitCell<D> const & unitCell) const;
321
323
325
332 void convertBasisToKGrid(DArray<double> const& components,
333 RDFieldDft<D>& dft) const;
334
344 void convertBasisToKGrid(DArray< DArray<double> > const & in,
345 DArray< RDFieldDft<D> >& out) const;
346
353 void convertKGridToBasis(RDFieldDft<D> const& dft,
354 DArray<double>& components) const;
355
365 void convertKGridToBasis(DArray< RDFieldDft<D> > const & in,
366 DArray< DArray<double> > & out) const;
367
374 void convertBasisToRGrid(DArray< DArray<double> > const & in,
375 DArray< RDField<D> >& out) const;
376
383 void convertRGridToBasis(DArray< RDField<D> > const & in,
384 DArray< DArray<double> > & out) const;
385
392 void convertKGridToRGrid(DArray< RDFieldDft<D> > const & in,
393 DArray< RDField<D> > & out) const;
394
401 void convertRGridToKGrid(DArray< RDField<D> > const & in,
402 DArray< RDFieldDft<D> > & out) const;
403
405
406 private:
407
408 // DFT work array for two-step conversion basis <-> kgrid <-> rgrid.
409 mutable RDFieldDft<D> workDft_;
410
411 // Pointers to associated objects.
412
414 Mesh<D> const * meshPtr_;
415
417 FFT<D> const * fftPtr_;
418
420 typename UnitCell<D>::LatticeSystem * latticePtr_;
421
423 std::string * groupNamePtr_;
424
426 SpaceGroup<D> * groupPtr_;
427
429 Basis<D> * basisPtr_;
430
432 FileMaster const * fileMasterPtr_;
433
434 // Private accessor functions:
435
437 Mesh<D> const & mesh() const
438 {
439 UTIL_ASSERT(meshPtr_);
440 return *meshPtr_;
441 }
442
444 FFT<D> const & fft() const
445 {
446 UTIL_ASSERT(fftPtr_);
447 return *fftPtr_;
448 }
449
451 typename UnitCell<D>::LatticeSystem & lattice() const
452 {
453 UTIL_ASSERT(latticePtr_);
454 return *latticePtr_;
455 }
456
458 std::string & groupName() const
459 {
460 UTIL_ASSERT(groupNamePtr_);
461 return *groupNamePtr_;
462 }
463
465 SpaceGroup<D> & group() const
466 {
467 UTIL_ASSERT(basisPtr_);
468 return *groupPtr_;
469 }
470
472 Basis<D> & basis() const
473 {
474 UTIL_ASSERT(basisPtr_);
475 return *basisPtr_;
476 }
477
479 FileMaster const & fileMaster() const
480 {
481 UTIL_ASSERT(fileMasterPtr_);
482 return *fileMasterPtr_;
483 }
484
488 void checkWorkDft() const;
489
490 };
491
492 #ifndef PSPG_FIELD_IO_TPP
493 extern template class FieldIo<1>;
494 extern template class FieldIo<2>;
495 extern template class FieldIo<3>;
496 #endif
497
498} // namespace Pspc
499} // namespace Pscf
500#endif
Symmetry-adapted Fourier basis for pseudo-spectral scft.
Definition: Basis.h:346
Description of a regular grid of points in a periodic domain.
Definition: Mesh.h:61
Fourier transform wrapper for real data.
File input/output operations for fields in several file formats.
void writeFieldsKGrid(std::ostream &out, DArray< RDFieldDft< D > > const &fields, UnitCell< D > const &unitCell) const
Write array of RDFieldDft objects (k-space fields) to file.
void convertKGridToRGrid(DArray< RDFieldDft< D > > const &in, DArray< RDField< D > > &out) const
Convert fields from k-grid (DFT) to real space (rgrid) format.
void writeFieldsBasis(std::ostream &out, DArray< DArray< double > > const &fields, UnitCell< D > const &unitCell) const
Write concentration or chemical potential field components to file.
void writeFieldHeader(std::ostream &out, int nMonomer, UnitCell< D > const &unitCell) const
Write header for field file (fortran pscf format)
void convertRGridToKGrid(DArray< RDField< D > > const &in, DArray< RDFieldDft< D > > &out) const
Convert fields from spatial grid (rgrid) to k-grid format.
void writeFieldRGrid(std::ostream &out, RDField< D > const &field, UnitCell< D > const &unitCell, bool writeHeader=true) const
Write a single RField objects (field on an r-space grid) to file.
void convertRGridToBasis(DArray< RDField< D > > const &in, DArray< DArray< double > > &out) const
Convert fields from spatial grid (rgrid) to symmetrized basis.
void convertBasisToRGrid(DArray< DArray< double > > const &in, DArray< RDField< D > > &out) const
Convert fields from symmetrized basis to spatial grid (rgrid).
void writeFieldsRGrid(std::ostream &out, DArray< RDField< D > > const &fields, UnitCell< D > const &unitCell) const
Write array of RField objects (fields on an r-space grid) to file.
void associate(Mesh< D > const &mesh, FFT< D > const &fft, typename UnitCell< D >::LatticeSystem &lattice, std::string &groupName, SpaceGroup< D > &group, Basis< D > &basis, FileMaster const &fileMaster)
Get and store addresses of associated objects.
void readFieldsKGrid(std::istream &in, DArray< RDFieldDft< D > > &fields, UnitCell< D > &unitCell) const
Read array of RDFieldDft objects (k-space fields) from file.
void readFieldsBasis(std::istream &in, DArray< DArray< double > > &fields, UnitCell< D > &unitCell) const
Read concentration or chemical potential field components from file.
void convertKGridToBasis(RDFieldDft< D > const &dft, DArray< double > &components) const
Convert field from Fourier transform (k-grid) to symmetrized basis.
void readFieldRGrid(std::istream &in, RDField< D > &field, UnitCell< D > &unitCell) const
Read a single RField objects (field on an r-space grid) from file.
void convertBasisToKGrid(DArray< double > const &components, RDFieldDft< D > &dft) const
Convert field from symmetrized basis to Fourier transform (k-grid).
void readFieldHeader(std::istream &in, int &nMonomer, UnitCell< D > &unitCell) const
Reader header of field file (fortran pscf format)
void readFieldsRGrid(std::istream &in, DArray< RDField< D > > &fields, UnitCell< D > &unitCell) const
Read array of RField objects (fields on an r-space grid) from file.
Discrete Fourier Transform (DFT) of a real field on an FFT mesh.
Definition: RDFieldDft.h:35
Field of real single precision values on an FFT mesh on a device.
Definition: RDField.h:34
Crystallographic space group.
Definition: SpaceGroup.h:30
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition: UnitCell.h:44
Dynamically allocatable contiguous array template.
Definition: DArray.h:32
A FileMaster manages input and output files for a simulation.
Definition: FileMaster.h:143
#define UTIL_ASSERT(condition)
Assertion macro suitable for debugging serial or parallel code.
Definition: global.h:75
C++ namespace for polymer self-consistent field theory (PSCF).
Utility classes for scientific computation.
Definition: accumulators.mod:1