PSCF v1.1
pspc/field/FieldIo.h
1#ifndef PSPC_FIELD_IO_H
2#define PSPC_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 <pspc/field/FFT.h> // member
12#include <pspc/field/RField.h> // function parameter
13#include <pspc/field/RFieldDft.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 Pspc
26{
27 using namespace Util;
28 using namespace Pscf;
29
41 template <int D>
42 class FieldIo
43 {
44
45 public:
46
50 FieldIo();
51
55 ~FieldIo();
56
68 void associate(Mesh<D> const & mesh,
69 FFT<D> const & fft,
70 typename UnitCell<D>::LatticeSystem & lattice,
71 std::string & groupName,
72 SpaceGroup<D> & group,
73 Basis<D> & basis,
74 FileMaster const & fileMaster);
75
78
89 void readFieldBasis(std::istream& in, DArray<double>& field,
90 UnitCell<D> & unitCell) const;
91
103 void readFieldBasis(std::string filename, DArray<double>& field,
104 UnitCell<D> & unitCell) const;
105
116 void writeFieldBasis(std::ostream& out,
117 DArray<double> const & field,
118 UnitCell<D> const & unitCell) const;
119
131 void writeFieldBasis(std::string filename,
132 DArray<double> const & field,
133 UnitCell<D> const & unitCell) const;
134
149 void
150 readFieldsBasis(std::istream& in, DArray< DArray<double> > & fields,
151 UnitCell<D> & unitCell) const;
152
164 void readFieldsBasis(std::string filename,
165 DArray< DArray<double> > & fields,
166 UnitCell<D> & unitCell) const;
167
177 void writeFieldsBasis(std::ostream& out,
178 DArray< DArray<double> > const & fields,
179 UnitCell<D> const & unitCell) const;
180
192 void writeFieldsBasis(std::string filename,
193 DArray< DArray<double> > const & fields,
194 UnitCell<D> const & unitCell) const;
195
199
207 void readFieldRGrid(std::istream &in,
208 RField<D> & field,
209 UnitCell<D>& unitCell) const;
210
222 void readFieldRGrid(std::string filename,
223 RField<D> & field,
224 UnitCell<D>& unitCell) const;
225
236 void readFieldsRGrid(std::istream& in, DArray< RField<D> >& fields,
237 UnitCell<D> & unitCell) const;
238
253 void readFieldsRGrid(std::string filename,
254 DArray< RField<D> >& fields,
255 UnitCell<D> & unitCell) const;
256
265 void writeFieldRGrid(std::ostream &out,
266 RField<D> const & field,
267 UnitCell<D> const & unitCell,
268 bool writeHeader = true)
269 const;
270
282 void writeFieldRGrid(std::string filename,
283 RField<D> const & field,
284 UnitCell<D> const & unitCell) const;
285
293 void writeFieldsRGrid(std::ostream& out,
294 DArray< RField<D> > const & fields,
295 UnitCell<D> const & unitCell) const;
296
308 void writeFieldsRGrid(std::string filename,
309 DArray< RField<D> > const & fields,
310 UnitCell<D> const & unitCell) const;
311
315
327 void readFieldsKGrid(std::istream& in,
328 DArray< RFieldDft<D> >& fields,
329 UnitCell<D> & unitCell) const;
330
346 void readFieldsKGrid(std::string filename,
347 DArray< RFieldDft<D> >& fields,
348 UnitCell<D> & unitCell) const;
349
361 void writeFieldsKGrid(std::ostream& out,
362 DArray< RFieldDft<D> > const & fields,
363 UnitCell<D> const & unitCell) const;
364
376 void writeFieldsKGrid(std::string filename,
377 DArray< RFieldDft<D> > const & fields,
378 UnitCell<D> const & unitCell) const;
379
383
419 void readFieldHeader(std::istream& in, int& nMonomer,
420 UnitCell<D> & unitCell) const;
421
429 void writeFieldHeader(std::ostream& out, int nMonomer,
430 UnitCell<D> const & unitCell) const;
431
435
442 void convertBasisToKGrid(DArray<double> const & components,
443 RFieldDft<D>& dft) const;
444
454 void convertBasisToKGrid(DArray< DArray<double> > const & in,
455 DArray< RFieldDft<D> >& out) const;
456
470 void convertKGridToBasis(RFieldDft<D> const & in,
471 DArray<double> & out,
472 bool checkSymmetry = true,
473 double epsilon = 1.0e-8) const;
474
491 void convertKGridToBasis(DArray< RFieldDft<D> > const & in,
492 DArray< DArray<double> > & out,
493 bool checkSymmetry = true,
494 double epsilon = 1.0e-8) const;
495
502 void convertBasisToRGrid(DArray<double> const & in,
503 RField<D> & out) const;
504
511 void convertBasisToRGrid(DArray< DArray<double> > const & in,
512 DArray< RField<D> > & out) const ;
513
526 void convertRGridToBasis(RField<D> const & in,
527 DArray<double> & out,
528 bool checkSymmetry = true,
529 double epsilon = 1.0e-8) const;
530
543 void convertRGridToBasis(DArray< RField<D> > const & in,
544 DArray< DArray<double> > & out,
545 bool checkSymmetry = true,
546 double epsilon = 1.0e-8) const;
547
559 DArray< RField<D> > & out) const;
560
572 RField<D> & out) const;
573
580 void convertRGridToKGrid(DArray< RField<D> > const & in,
581 DArray< RFieldDft<D> > & out) const;
582
589 void convertRGridToKGrid(RField<D> const & in,
590 RFieldDft<D> & out) const;
591
595
607 bool hasSymmetry(RField<D> const & in, double epsilon = 1.0e-8,
608 bool verbose = true) const;
609
621 bool hasSymmetry(RFieldDft<D> const & in, double epsilon = 1.0e-8,
622 bool verbose = true) const;
623
625
626 private:
627
628 // DFT work array for two-step conversion basis <-> kgrid <-> r-grid.
629 mutable RFieldDft<D> workDft_;
630
631 // Pointers to associated objects.
632
634 Mesh<D> const * meshPtr_;
635
637 FFT<D> const * fftPtr_;
638
640 typename UnitCell<D>::LatticeSystem * latticePtr_;
641
643 std::string * groupNamePtr_;
644
646 SpaceGroup<D> * groupPtr_;
647
649 Basis<D> * basisPtr_;
650
652 FileMaster const * fileMasterPtr_;
653
654 // Private accessor functions:
655
657 Mesh<D> const & mesh() const
658 {
659 UTIL_ASSERT(meshPtr_);
660 return *meshPtr_;
661 }
662
664 FFT<D> const & fft() const
665 {
666 UTIL_ASSERT(fftPtr_);
667 return *fftPtr_;
668 }
669
671 typename UnitCell<D>::LatticeSystem & lattice() const
672 {
673 UTIL_ASSERT(latticePtr_);
674 return *latticePtr_;
675 }
676
678 std::string & groupName() const
679 {
680 UTIL_ASSERT(groupNamePtr_);
681 return *groupNamePtr_;
682 }
683
685 SpaceGroup<D> & group() const
686 {
687 UTIL_ASSERT(groupPtr_);
688 return *groupPtr_;
689 }
690
692 Basis<D> & basis() const
693 {
694 UTIL_ASSERT(basisPtr_);
695 return *basisPtr_;
696 }
697
699 FileMaster const & fileMaster() const
700 {
701 UTIL_ASSERT(fileMasterPtr_);
702 return *fileMasterPtr_;
703 }
704
708 void checkWorkDft() const;
709
710 };
711
712 #ifndef PSPC_FIELD_IO_TPP
713 extern template class FieldIo<1>;
714 extern template class FieldIo<2>;
715 extern template class FieldIo<3>;
716 #endif
717
718} // namespace Pspc
719} // namespace Pscf
720#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 and format conversions for fields.
void readFieldRGrid(std::istream &in, RField< D > &field, UnitCell< D > &unitCell) const
Read single RField (field on an r-space grid) from istream.
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 convertBasisToKGrid(DArray< double > const &components, RFieldDft< D > &dft) const
Convert a field from symmetrized basis to Fourier transform (k-grid).
void readFieldsKGrid(std::istream &in, DArray< RFieldDft< D > > &fields, UnitCell< D > &unitCell) const
Read array of RFieldDft objects (k-space fields) from file.
void readFieldHeader(std::istream &in, int &nMonomer, UnitCell< D > &unitCell) const
Reader header of field file (fortran pscf format)
void writeFieldHeader(std::ostream &out, int nMonomer, UnitCell< D > const &unitCell) const
Write header for field file (fortran pscf format)
void convertBasisToRGrid(DArray< double > const &in, RField< D > &out) const
Convert a field from symmetrized basis to spatial grid (r-grid).
void convertKGridToBasis(RFieldDft< D > const &in, DArray< double > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const
Convert a field from Fourier transform (kgrid) to symmetrized basis.
void writeFieldsKGrid(std::ostream &out, DArray< RFieldDft< D > > const &fields, UnitCell< D > const &unitCell) const
Write array of RFieldDft objects (k-space fields) to file.
void writeFieldBasis(std::ostream &out, DArray< double > const &field, UnitCell< D > const &unitCell) const
Write single concentration or chemical potential field to output stream out.
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 readFieldsRGrid(std::istream &in, DArray< RField< D > > &fields, UnitCell< D > &unitCell) const
Read array of RField objects (fields on r-space grid) from istream.
void convertRGridToBasis(RField< D > const &in, DArray< double > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const
Convert a field from spatial grid (r-grid) to symmetrized basis.
void writeFieldRGrid(std::ostream &out, RField< D > const &field, UnitCell< D > const &unitCell, bool writeHeader=true) const
Write a single RField (field on an r-space grid) to ostream.
void writeFieldsRGrid(std::ostream &out, DArray< RField< D > > const &fields, UnitCell< D > const &unitCell) const
Write array of RField objects (fields on r-space grid) to ostream.
void readFieldBasis(std::istream &in, DArray< double > &field, UnitCell< D > &unitCell) const
Read single concentration or chemical potential field from file.
void convertKGridToRGrid(DArray< RFieldDft< D > > &in, DArray< RField< D > > &out) const
Convert fields from k-grid (DFT) to real space (r-grid) format.
bool hasSymmetry(RField< D > const &in, double epsilon=1.0e-8, bool verbose=true) const
Check if an r-grid field has the declared space group symmetry.
void convertRGridToKGrid(DArray< RField< D > > const &in, DArray< RFieldDft< D > > &out) const
Convert fields from spatial grid (r-grid) to k-grid format.
void readFieldsBasis(std::istream &in, DArray< DArray< double > > &fields, UnitCell< D > &unitCell) const
Read concentration or chemical potential field components from file.
Fourier transform of a real field on an FFT mesh.
Definition: RFieldDft.h:31
Field of real double precision values on an FFT mesh.
Definition: RField.h:29
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