PSCF v1.4.0
rp/field/FieldIo.h
1#ifndef RP_FIELD_IO_H
2#define RP_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 <prdc/crystal/UnitCell.h> // nested LatticeSystem enum
12#include <pscf/math/IntVec.h> // template with default
13#include <util/containers/DArray.h> // member
14
15// Forward declarations for classes used in interfaces
16namespace Util {
17 class FileMaster;
18 template <typename T> class DMatrix;
19}
20namespace Pscf {
21 template <int D> class Mesh;
22 namespace Prdc {
23 template <int D> class Basis;
24 template <int D> class SpaceGroup;
25 }
26}
27
28namespace Pscf {
29namespace Rp {
30
31 using namespace Util;
32 using namespace Prdc;
33
82 template <int D, class RFT, class KFT, class FFT>
83 class FieldIo
84 {
85
86 public:
87
90
106 void associate(Mesh<D> const & mesh,
107 FFT const & fft,
108 typename UnitCell<D>::LatticeSystem const & lattice,
109 bool const & hasGroup,
110 std::string const & groupName,
111 SpaceGroup<D> const & group,
112 Basis<D> & basis);
113
125
136 void setNMonomer(int nMonomer);
137
141
167 void
168 readFieldsBasis(std::istream& in,
169 DArray< DArray<double> >& fields,
170 UnitCell<D> & unitCell) const;
171
185 void readFieldsBasis(std::string filename,
186 DArray< DArray<double> >& fields,
187 UnitCell<D> & unitCell) const;
188
205 void readFieldBasis(std::istream& in,
206 DArray<double>& field,
207 UnitCell<D> & unitCell) const;
208
222 void readFieldBasis(std::string filename,
223 DArray<double>& field,
224 UnitCell<D> & unitCell) const;
225
238 void writeFieldsBasis(std::ostream& out,
239 DArray< DArray<double> > const & fields,
240 UnitCell<D> const & unitCell) const;
241
254 void writeFieldsBasis(std::string filename,
255 DArray< DArray<double> > const & fields,
256 UnitCell<D> const & unitCell) const;
257
269 void writeFieldBasis(std::ostream& out,
270 DArray<double> const & field,
271 UnitCell<D> const & unitCell) const;
272
285 void writeFieldBasis(std::string filename,
286 DArray<double> const & field,
287 UnitCell<D> const & unitCell) const;
288
292
310 virtual
311 bool readFieldsRGrid(std::istream& in,
312 DArray<RFT>& fields,
313 UnitCell<D> & unitCell) const = 0;
314
329 bool readFieldsRGrid(std::string filename,
330 DArray<RFT>& fields,
331 UnitCell<D> & unitCell) const;
332
348 virtual
349 void readFieldsRGridData(std::istream& in,
350 DArray<RFT>& fields,
351 int nMonomer) const = 0;
352
365 virtual
366 bool readFieldRGrid(std::istream &in,
367 RFT & field,
368 UnitCell<D>& unitCell) const = 0;
369
384 bool readFieldRGrid(std::string filename,
385 RFT & field,
386 UnitCell<D>& unitCell) const;
387
404 virtual
405 void writeFieldsRGrid(std::ostream& out,
406 DArray<RFT> const & fields,
407 UnitCell<D> const & unitCell,
408 bool writeHeader = true,
409 bool isSymmetric = true,
410 bool writeMeshSize = true) const = 0;
411
425 void writeFieldsRGrid(std::string filename,
426 DArray<RFT> const & fields,
427 UnitCell<D> const & unitCell,
428 bool isSymmetric = true) const;
429
444 virtual
445 void writeFieldRGrid(std::ostream &out,
446 RFT const & field,
447 UnitCell<D> const & unitCell,
448 bool writeHeader = true,
449 bool isSymmetric = true) const = 0;
450
465 void writeFieldRGrid(std::string filename,
466 RFT const & field,
467 UnitCell<D> const & unitCell,
468 bool isSymmetric = true) const;
469
473
490 virtual
491 void readFieldsKGrid(std::istream& in,
492 DArray<KFT>& fields,
493 UnitCell<D> & unitCell) const = 0;
494
507 void readFieldsKGrid(std::string filename,
508 DArray<KFT>& fields,
509 UnitCell<D> & unitCell) const;
510
524 virtual
525 void writeFieldsKGrid(std::ostream& out,
526 DArray<KFT> const & fields,
527 UnitCell<D> const & unitCell,
528 bool isSymmetric = true) const = 0;
529
542 void writeFieldsKGrid(std::string filename,
543 DArray<KFT> const & fields,
544 UnitCell<D> const & unitCell,
545 bool isSymmetric = true) const;
546
550
557 virtual
558 void convertBasisToKGrid(DArray<double> const & components,
559 KFT& dft) const = 0;
560
571 DArray<KFT>& out) const;
572
586 virtual
587 void convertKGridToBasis(KFT const & in,
588 DArray<double> & out,
589 bool checkSymmetry = true,
590 double epsilon = 1.0e-8) const = 0;
591
606 DArray< DArray<double> > & out,
607 bool checkSymmetry = true,
608 double epsilon = 1.0e-8) const;
609
617 RFT & out) const;
618
626 DArray<RFT> & out) const ;
627
642 void convertRGridToBasis(RFT const & in,
643 DArray<double> & out,
644 bool checkSymmetry = true,
645 double epsilon = 1.0e-8) const;
646
662 DArray< DArray<double> > & out,
663 bool checkSymmetry = true,
664 double epsilon = 1.0e-8) const;
665
675 DArray<RFT> & out) const;
676
685 void convertKGridToRGrid(KFT const & in,
686 RFT & out) const;
687
698 DArray<KFT> & out) const;
699
708 void convertRGridToKGrid(RFT const & in,
709 KFT & out) const;
710
714
732 void convertBasisToRGrid(std::string const & inFileName,
733 std::string const & outFileName) const;
734
752 void convertRGridToBasis(std::string const & inFileName,
753 std::string const & outFileName) const;
754
764 void convertKGridToRGrid(std::string const & inFileName,
765 std::string const & outFileName) const;
766
776 void convertRGridToKGrid(std::string const & inFileName,
777 std::string const & outFileName) const;
778
796 void convertKGridToBasis(std::string const & inFileName,
797 std::string const & outFileName) const;
798
808 void convertBasisToKGrid(std::string const & inFileName,
809 std::string const & outFileName) const;
810
814
831 virtual
832 bool hasSymmetry(KFT const & in,
833 double epsilon = 1.0e-8,
834 bool verbose = true) const = 0;
835
852 bool hasSymmetry(RFT const & in,
853 double epsilon = 1.0e-8,
854 bool verbose = true) const;
855
863 bool hasSymmetry(std::string const & inFileName,
864 double epsilon = 1.0E-8) const;
865
869
880 DArray< DArray<double> > const & field2)
881 const;
882
889 void compareFieldsBasis(std::string const & filename1,
890 std::string const & filename2) const;
891
901 virtual
903 DArray< RFT > const & field2) const = 0;
904
911 void compareFieldsRGrid(std::string const & filename1,
912 std::string const & filename2) const;
913
917
928 virtual
930 double factor) const;
931
943 double factor) const;
944
952 void scaleFieldsBasis(std::string const & inFileName,
953 std::string const & outFileName,
954 double factor) const;
955
966 virtual
967 void scaleFieldRGrid(RFT& field, double factor) const = 0;
968
979 void scaleFieldsRGrid(DArray<RFT> & fields, double factor) const;
980
991 void scaleFieldsRGrid(std::string const & inFileName,
992 const std::string & outFileName,
993 double factor) const;
994
998
1022 DArray< DArray<double> > & fields) const;
1023
1036 void estimateWBasis(std::string const & inFileName,
1037 std::string const & outFileName,
1038 DMatrix<double> const & chi) const;
1039
1043
1060 virtual
1061 void replicateUnitCell(std::ostream& out,
1062 DArray<RFT> const & fields,
1063 UnitCell<D> const & unitCell,
1064 IntVec<D> const & replicas) const = 0;
1065
1079 void replicateUnitCell(std::string filename,
1080 DArray<RFT> const & fields,
1081 UnitCell<D> const & unitCell,
1082 IntVec<D> const & replicas) const;
1083
1094 void replicateUnitCell(std::string const & inFileName,
1095 std::string const & outFileName,
1096 IntVec<D> const & replicas) const;
1097
1101
1120 virtual
1121 void expandRGridDimension(std::ostream &out,
1122 DArray<RFT > const & fields,
1123 UnitCell<D> const & unitCell,
1124 int d,
1125 DArray<int> const& newGridDimensions)
1126 const = 0;
1127
1142 void expandRGridDimension(std::string filename,
1143 DArray<RFT > const & fields,
1144 UnitCell<D> const & unitCell,
1145 int d,
1146 DArray<int> newGridDimensions) const;
1147
1160 void expandRGridDimension(std::string const & inFileName,
1161 std::string const & outFileName,
1162 int d,
1163 DArray<int> newGridDimensions) const;
1164
1168
1214 void readFieldHeader(std::istream& in,
1215 int& nMonomer,
1216 UnitCell<D> & unitCell,
1217 bool & isSymmetric) const;
1218
1227 void writeFieldHeader(std::ostream& out,
1228 int nMonomer,
1229 UnitCell<D> const & unitCell,
1230 bool isSymmetric = true) const;
1231
1235
1239 Mesh<D> const & mesh() const
1240 {
1241 UTIL_ASSERT(meshPtr_);
1242 return *meshPtr_;
1243 }
1244
1248 Basis<D> const & basis() const
1249 {
1250 UTIL_ASSERT(basisPtr_);
1251 return *basisPtr_;
1252 }
1253
1257 FileMaster const & fileMaster() const
1258 {
1259 UTIL_ASSERT(fileMasterPtr_);
1260 return *fileMasterPtr_;
1261 }
1262
1264
1265 protected:
1266
1271
1275 ~FieldIo() = default;
1276
1280 typename UnitCell<D>::LatticeSystem const & lattice() const
1281 {
1282 UTIL_ASSERT(latticePtr_);
1283 return *latticePtr_;
1284 }
1285
1289 bool hasGroup() const
1290 {
1291 UTIL_ASSERT(hasGroupPtr_);
1292 return *hasGroupPtr_;
1293 }
1294
1298 std::string const & groupName() const
1299 {
1300 UTIL_ASSERT(groupNamePtr_);
1301 return *groupNamePtr_;
1302 }
1303
1307 SpaceGroup<D> const & group() const
1308 {
1309 UTIL_ASSERT(groupPtr_);
1310 return *groupPtr_;
1311 }
1312
1316 FFT const & fft() const
1317 {
1318 UTIL_ASSERT(fftPtr_);
1319 return *fftPtr_;
1320 }
1321
1326
1331
1341 void checkAllocateBasis(std::string const & inFileName) const;
1342
1343 private:
1344
1346 Mesh<D> const * meshPtr_;
1347
1349 FFT const * fftPtr_;
1350
1352 typename UnitCell<D>::LatticeSystem const * latticePtr_;
1353
1355 bool const * hasGroupPtr_;
1356
1358 std::string const * groupNamePtr_;
1359
1361 SpaceGroup<D> const * groupPtr_;
1362
1364 Basis<D> * basisPtr_;
1365
1367 FileMaster const * fileMasterPtr_;
1368
1370 int nMonomer_;
1371
1372 // Mutable work space used by functions that read field files
1373
1375 mutable DArray< DArray<double> > tmpFieldsBasis_;
1376
1378 mutable DArray<RFT> tmpFieldsRGrid_;
1379
1381 mutable DArray<KFT> tmpFieldsKGrid_;
1382
1384 mutable KFT workDft_;
1385
1387 mutable bool isAllocatedBasis_;
1388
1390 mutable bool isAllocatedRGrid_;
1391
1393 mutable bool isAllocatedKGrid_;
1394
1395 };
1396
1397} // namespace Rp
1398} // namespace Pscf
1399#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
Fourier transform wrapper.
Definition cpu/FFT.h:39
Crystallographic space group.
Definition SpaceGroup.h:32
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition UnitCell.h:56
virtual void scaleFieldRGrid(RFT &field, double factor) const =0
Multiply a single field in r-grid format by a scalar.
virtual void writeFieldsRGrid(std::ostream &out, DArray< RFT > const &fields, UnitCell< D > const &unitCell, bool writeHeader=true, bool isSymmetric=true, bool writeMeshSize=true) const =0
Write an array of r-grid fields to an output stream.
virtual void scaleFieldBasis(DArray< double > &field, double factor) const
Multiply a single field in basis form by a real scalar.
virtual void convertKGridToBasis(KFT const &in, DArray< double > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const =0
Convert a single field from Fourier (k-grid) to basis form.
bool hasSymmetry(std::string const &inFileName, double epsilon=1.0E-8) const
Check if an r-grid field file has declared space group symmetry.
void writeFieldsRGrid(std::string filename, DArray< RFT > const &fields, UnitCell< D > const &unitCell, bool isSymmetric=true) const
Write an array of r-grid fields to a named file.
virtual bool readFieldRGrid(std::istream &in, RFT &field, UnitCell< D > &unitCell) const =0
Read a single r-grid field from an input stream.
virtual void convertBasisToKGrid(DArray< double > const &components, KFT &dft) const =0
Convert a single field from basis to Fourier (k-grid) form.
virtual void compareFieldsRGrid(DArray< RFT > const &field1, DArray< RFT > const &field2) const =0
Compare two fields in r-grid form, write a report to Log file.
void readFieldBasis(std::string filename, DArray< double > &field, UnitCell< D > &unitCell) const
Read a single field in basis format from a named file.
bool readFieldRGrid(std::string filename, RFT &field, UnitCell< D > &unitCell) const
Read a single r-grid field from a named file.
void convertBasisToRGrid(DArray< DArray< double > > const &in, DArray< RFT > &out) const
Convert an array of fields from basis to r-grid format.
void compareFieldsBasis(DArray< DArray< double > > const &field1, DArray< DArray< double > > const &field2) const
Compare array of fields in basis form, write a report to Log file.
void writeFieldBasis(std::string filename, DArray< double > const &field, UnitCell< D > const &unitCell) const
Write single field in basis format to a named file.
void checkAllocateBasis(std::string const &inFileName) const
Check if basis workspace is allocated, allocate if necessary.
void setNMonomer(int nMonomer)
Set the number of monomer types.
void convertKGridToRGrid(KFT const &in, RFT &out) const
Convert a single field from k-grid to r-grid format.
void convertBasisToRGrid(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from basis format to r-grid format.
virtual bool hasSymmetry(KFT const &in, double epsilon=1.0e-8, bool verbose=true) const =0
Check if a k-grid field has the declared space group symmetry.
void convertBasisToKGrid(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from basis to Fourier (k-grid) format.
void scaleFieldsBasis(DArray< DArray< double > > &fields, double factor) const
Multiply an array of fields in basis format by a real scalar.
virtual void replicateUnitCell(std::ostream &out, DArray< RFT > const &fields, UnitCell< D > const &unitCell, IntVec< D > const &replicas) const =0
Write r-grid fields in a replicated unit cell to std::ostream.
void expandRGridDimension(std::string filename, DArray< RFT > const &fields, UnitCell< D > const &unitCell, int d, DArray< int > newGridDimensions) const
Increase D for an array of r-grid fields, write to a named file.
void compareFieldsRGrid(std::string const &filename1, std::string const &filename2) const
Compare two r-grid field files, write a report to Log file.
void readFieldBasis(std::istream &in, DArray< double > &field, UnitCell< D > &unitCell) const
Read a single field in basis format from an input stream.
void checkAllocateRGrid() const
Check if r-grid workspace is allocated, allocate if necessary.
void scaleFieldsBasis(std::string const &inFileName, std::string const &outFileName, double factor) const
Multiply all fields in a basis field file by a scalar.
void convertRGridToKGrid(DArray< RFT > const &in, DArray< KFT > &out) const
Convert an array of fields from r-grid to k-grid (Fourier) format.
void expandRGridDimension(std::string const &inFileName, std::string const &outFileName, int d, DArray< int > newGridDimensions) const
Increase D for an r-grid field file.
void convertKGridToBasis(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from Fourier (k-grid) to basis format.
void scaleFieldsRGrid(std::string const &inFileName, const std::string &outFileName, double factor) const
Multiply all fields in an r-grid field file by a scalar.
void convertKGridToBasis(DArray< KFT > const &in, DArray< DArray< double > > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const
Convert an array of fields from Fourier (k-grid) to basis form.
void convertRGridToBasis(RFT const &in, DArray< double > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const
Convert a single field from r-grid to basis form.
void checkAllocateKGrid() const
Check if k-grid workspace is allocated, allocate if necessary.
void estimateWBasis(DMatrix< double > const &chi, DArray< DArray< double > > &fields) const
Convert c fields to estimated w fields, in basis format.
void convertBasisToRGrid(DArray< double > const &in, RFT &out) const
Convert a single field from basis to r-grid format.
void writeFieldBasis(std::ostream &out, DArray< double > const &field, UnitCell< D > const &unitCell) const
Write a single field in basis format to an output stream.
void replicateUnitCell(std::string const &inFileName, std::string const &outFileName, IntVec< D > const &replicas) const
Write replicated fields read from one file to another.
void convertRGridToBasis(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from r-grid to basis format.
void writeFieldsBasis(std::ostream &out, DArray< DArray< double > > const &fields, UnitCell< D > const &unitCell) const
Write an array of fields in basis format to an output stream.
void scaleFieldsRGrid(DArray< RFT > &fields, double factor) const
Scale an array of r-grid fields by a scalar.
void writeFieldsKGrid(std::string filename, DArray< KFT > const &fields, UnitCell< D > const &unitCell, bool isSymmetric=true) const
Write an array of k-grid fields to a named file.
void writeFieldHeader(std::ostream &out, int nMonomer, UnitCell< D > const &unitCell, bool isSymmetric=true) const
Write header for field file (fortran pscf format).
void convertRGridToBasis(DArray< RFT > const &in, DArray< DArray< double > > &out, bool checkSymmetry=true, double epsilon=1.0e-8) const
Convert an array of fields from r-grid to basis format.
virtual void readFieldsKGrid(std::istream &in, DArray< KFT > &fields, UnitCell< D > &unitCell) const =0
Read an array of k-grid fields from an input stream.
void readFieldsBasis(std::istream &in, DArray< DArray< double > > &fields, UnitCell< D > &unitCell) const
Read an array of fields in basis format from an input stream.
void estimateWBasis(std::string const &inFileName, std::string const &outFileName, DMatrix< double > const &chi) const
Convert a file of c fields to estimated w fields, in basis format.
UnitCell< D >::LatticeSystem const & lattice() const
void readFieldsBasis(std::string filename, DArray< DArray< double > > &fields, UnitCell< D > &unitCell) const
Read an array of fields in basis format from a named file.
virtual void expandRGridDimension(std::ostream &out, DArray< RFT > const &fields, UnitCell< D > const &unitCell, int d, DArray< int > const &newGridDimensions) const =0
Increase D for an array of r-grid fields, write to ostream.
void associate(Mesh< D > const &mesh, FFT const &fft, typename UnitCell< D >::LatticeSystem const &lattice, bool const &hasGroup, std::string const &groupName, SpaceGroup< D > const &group, Basis< D > &basis)
Create associations with other members of the parent Domain.
virtual void readFieldsRGridData(std::istream &in, DArray< RFT > &fields, int nMonomer) const =0
Read data for array of r-grid fields, with no header section.
void writeFieldRGrid(std::string filename, RFT const &field, UnitCell< D > const &unitCell, bool isSymmetric=true) const
Write a single r-grid field to a named file.
void readFieldsKGrid(std::string filename, DArray< KFT > &fields, UnitCell< D > &unitCell) const
Read an array of k-grid fields from a named file.
void convertKGridToRGrid(DArray< KFT > const &in, DArray< RFT > &out) const
Convert an array of field from k-grid to r-grid format.
void compareFieldsBasis(std::string const &filename1, std::string const &filename2) const
Compare two r-grid field files, write a report to Log file.
void convertRGridToKGrid(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from r-grid to Fourier (k-grid) format.
virtual void writeFieldRGrid(std::ostream &out, RFT const &field, UnitCell< D > const &unitCell, bool writeHeader=true, bool isSymmetric=true) const =0
Write a single r-grid field to an an output stream.
void convertRGridToKGrid(RFT const &in, KFT &out) const
Convert a field from r-grid to k-grid (Fourier) format.
void readFieldHeader(std::istream &in, int &nMonomer, UnitCell< D > &unitCell, bool &isSymmetric) const
Reader header of field file (fortran PSCF format)
void replicateUnitCell(std::string filename, DArray< RFT > const &fields, UnitCell< D > const &unitCell, IntVec< D > const &replicas) const
Write r-grid fields in a replicated unit cell to a named file.
void setFileMaster(FileMaster const &fileMaster)
Create an association with a FileMaster.
bool hasSymmetry(RFT const &in, double epsilon=1.0e-8, bool verbose=true) const
Check if an r-grid field has the declared space group symmetry.
virtual bool readFieldsRGrid(std::istream &in, DArray< RFT > &fields, UnitCell< D > &unitCell) const =0
Read array of r-grid fields from an input stream.
virtual void writeFieldsKGrid(std::ostream &out, DArray< KFT > const &fields, UnitCell< D > const &unitCell, bool isSymmetric=true) const =0
Write an array of k-grid fields to a output stream.
bool readFieldsRGrid(std::string filename, DArray< RFT > &fields, UnitCell< D > &unitCell) const
Read an array of r-grid fields from a named file.
void writeFieldsBasis(std::string filename, DArray< DArray< double > > const &fields, UnitCell< D > const &unitCell) const
Write an array of fields in basis format to a named file.
void convertKGridToRGrid(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from Fourier (k-grid) to r-grid format.
void convertBasisToKGrid(DArray< DArray< double > > const &in, DArray< KFT > &out) const
Convert an array of fields from basis to Fourier (k-grid) form.
~FieldIo()=default
Destructor.
Dynamically allocatable contiguous array template.
Definition DArray.h:32
Dynamically allocated Matrix.
Definition DMatrix.h:25
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
Periodic fields and crystallography.
Definition complex.cpp:11
Class templates for real-valued periodic fields.
PSCF package top-level namespace.
Utility classes for scientific computation.