PSCF v1.3
FieldIoReal.h
1#ifndef RPC_FIELD_IO_REAL_H
2#define RPC_FIELD_IO_REAL_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 Prdc {
30
31 using namespace Util;
32 using namespace Pscf;
33 using namespace Pscf::Prdc;
34
84 template <int D, class RFT, class KFT, class FFT>
86 {
87
88 public:
89
92
97
101 virtual ~FieldIoReal();
102
118 void associate(Mesh<D> const & mesh,
119 FFT const & fft,
120 typename UnitCell<D>::LatticeSystem const & lattice,
121 bool const & hasGroup,
122 std::string const & groupName,
123 SpaceGroup<D> const & group,
124 Basis<D> & basis);
125
137
148 void setNMonomer(int nMonomer);
149
153
179 void
180 readFieldsBasis(std::istream& in,
181 DArray< DArray<double> >& fields,
182 UnitCell<D> & unitCell) const;
183
197 void readFieldsBasis(std::string filename,
198 DArray< DArray<double> >& fields,
199 UnitCell<D> & unitCell) const;
200
217 void readFieldBasis(std::istream& in,
218 DArray<double>& field,
219 UnitCell<D> & unitCell) const;
220
234 void readFieldBasis(std::string filename,
235 DArray<double>& field,
236 UnitCell<D> & unitCell) const;
237
250 void writeFieldsBasis(std::ostream& out,
251 DArray< DArray<double> > const & fields,
252 UnitCell<D> const & unitCell) const;
253
266 void writeFieldsBasis(std::string filename,
267 DArray< DArray<double> > const & fields,
268 UnitCell<D> const & unitCell) const;
269
281 void writeFieldBasis(std::ostream& out,
282 DArray<double> const & field,
283 UnitCell<D> const & unitCell) const;
284
297 void writeFieldBasis(std::string filename,
298 DArray<double> const & field,
299 UnitCell<D> const & unitCell) const;
300
304
322 virtual
323 bool readFieldsRGrid(std::istream& in,
324 DArray<RFT>& fields,
325 UnitCell<D> & unitCell) const = 0;
326
341 bool readFieldsRGrid(std::string filename,
342 DArray<RFT>& fields,
343 UnitCell<D> & unitCell) const;
344
360 virtual
361 void readFieldsRGridData(std::istream& in,
362 DArray<RFT>& fields,
363 int nMonomer) const = 0;
364
377 virtual
378 bool readFieldRGrid(std::istream &in,
379 RFT & field,
380 UnitCell<D>& unitCell) const = 0;
381
396 bool readFieldRGrid(std::string filename,
397 RFT & field,
398 UnitCell<D>& unitCell) const;
399
416 virtual
417 void writeFieldsRGrid(std::ostream& out,
418 DArray<RFT> const & fields,
419 UnitCell<D> const & unitCell,
420 bool writeHeader = true,
421 bool isSymmetric = true,
422 bool writeMeshSize = true) const = 0;
423
437 void writeFieldsRGrid(std::string filename,
438 DArray<RFT> const & fields,
439 UnitCell<D> const & unitCell,
440 bool isSymmetric = true) const;
441
456 virtual
457 void writeFieldRGrid(std::ostream &out,
458 RFT const & field,
459 UnitCell<D> const & unitCell,
460 bool writeHeader = true,
461 bool isSymmetric = true) const = 0;
462
477 void writeFieldRGrid(std::string filename,
478 RFT const & field,
479 UnitCell<D> const & unitCell,
480 bool isSymmetric = true) const;
481
485
502 virtual
503 void readFieldsKGrid(std::istream& in,
504 DArray<KFT>& fields,
505 UnitCell<D> & unitCell) const = 0;
506
519 void readFieldsKGrid(std::string filename,
520 DArray<KFT>& fields,
521 UnitCell<D> & unitCell) const;
522
536 virtual
537 void writeFieldsKGrid(std::ostream& out,
538 DArray<KFT> const & fields,
539 UnitCell<D> const & unitCell,
540 bool isSymmetric = true) const = 0;
541
554 void writeFieldsKGrid(std::string filename,
555 DArray<KFT> const & fields,
556 UnitCell<D> const & unitCell,
557 bool isSymmetric = true) const;
558
562
569 virtual
570 void convertBasisToKGrid(DArray<double> const & components,
571 KFT& dft) const = 0;
572
583 DArray<KFT>& out) const;
584
598 virtual
599 void convertKGridToBasis(KFT const & in,
600 DArray<double> & out,
601 bool checkSymmetry = true,
602 double epsilon = 1.0e-8) const = 0;
603
618 DArray< DArray<double> > & out,
619 bool checkSymmetry = true,
620 double epsilon = 1.0e-8) const;
621
629 RFT & out) const;
630
638 DArray<RFT> & out) const ;
639
654 void convertRGridToBasis(RFT const & in,
655 DArray<double> & out,
656 bool checkSymmetry = true,
657 double epsilon = 1.0e-8) const;
658
674 DArray< DArray<double> > & out,
675 bool checkSymmetry = true,
676 double epsilon = 1.0e-8) const;
677
687 DArray<RFT> & out) const;
688
697 void convertKGridToRGrid(KFT const & in,
698 RFT & out) const;
699
710 DArray<KFT> & out) const;
711
720 void convertRGridToKGrid(RFT const & in,
721 KFT & out) const;
722
726
744 void convertBasisToRGrid(std::string const & inFileName,
745 std::string const & outFileName) const;
746
764 void convertRGridToBasis(std::string const & inFileName,
765 std::string const & outFileName) const;
766
776 void convertKGridToRGrid(std::string const & inFileName,
777 std::string const & outFileName) const;
778
788 void convertRGridToKGrid(std::string const & inFileName,
789 std::string const & outFileName) const;
790
808 void convertKGridToBasis(std::string const & inFileName,
809 std::string const & outFileName) const;
810
820 void convertBasisToKGrid(std::string const & inFileName,
821 std::string const & outFileName) const;
822
826
843 virtual
844 bool hasSymmetry(KFT const & in,
845 double epsilon = 1.0e-8,
846 bool verbose = true) const = 0;
847
864 bool hasSymmetry(RFT const & in,
865 double epsilon = 1.0e-8,
866 bool verbose = true) const;
867
875 bool hasSymmetry(std::string const & inFileName,
876 double epsilon = 1.0E-8) const;
877
881
892 DArray< DArray<double> > const & field2)
893 const;
894
901 void compareFieldsBasis(std::string const & filename1,
902 std::string const & filename2) const;
903
913 virtual
915 DArray< RFT > const & field2) const = 0;
916
923 void compareFieldsRGrid(std::string const & filename1,
924 std::string const & filename2) const;
925
929
940 virtual
942 double factor) const;
943
955 double factor) const;
956
964 void scaleFieldsBasis(std::string const & inFileName,
965 std::string const & outFileName,
966 double factor) const;
967
978 virtual
979 void scaleFieldRGrid(RFT& field, double factor) const = 0;
980
991 void scaleFieldsRGrid(DArray<RFT> & fields, double factor) const;
992
1003 void scaleFieldsRGrid(std::string const & inFileName,
1004 const std::string & outFileName,
1005 double factor) const;
1006
1010
1034 DArray< DArray<double> > & fields) const;
1035
1048 void estimateWBasis(std::string const & inFileName,
1049 std::string const & outFileName,
1050 DMatrix<double> const & chi) const;
1051
1055
1072 virtual
1073 void replicateUnitCell(std::ostream& out,
1074 DArray<RFT> const & fields,
1075 UnitCell<D> const & unitCell,
1076 IntVec<D> const & replicas) const = 0;
1077
1091 void replicateUnitCell(std::string filename,
1092 DArray<RFT> const & fields,
1093 UnitCell<D> const & unitCell,
1094 IntVec<D> const & replicas) const;
1095
1106 void replicateUnitCell(std::string const & inFileName,
1107 std::string const & outFileName,
1108 IntVec<D> const & replicas) const;
1109
1113
1132 virtual
1133 void expandRGridDimension(std::ostream &out,
1134 DArray<RFT > const & fields,
1135 UnitCell<D> const & unitCell,
1136 int d,
1137 DArray<int> const& newGridDimensions)
1138 const = 0;
1139
1154 void expandRGridDimension(std::string filename,
1155 DArray<RFT > const & fields,
1156 UnitCell<D> const & unitCell,
1157 int d,
1158 DArray<int> newGridDimensions) const;
1159
1172 void expandRGridDimension(std::string const & inFileName,
1173 std::string const & outFileName,
1174 int d,
1175 DArray<int> newGridDimensions) const;
1176
1180
1226 void readFieldHeader(std::istream& in,
1227 int& nMonomer,
1228 UnitCell<D> & unitCell,
1229 bool & isSymmetric) const;
1230
1239 void writeFieldHeader(std::ostream& out,
1240 int nMonomer,
1241 UnitCell<D> const & unitCell,
1242 bool isSymmetric = true) const;
1243
1247
1251 Mesh<D> const & mesh() const
1252 {
1253 UTIL_ASSERT(meshPtr_);
1254 return *meshPtr_;
1255 }
1256
1260 Basis<D> const & basis() const
1261 {
1262 UTIL_ASSERT(basisPtr_);
1263 return *basisPtr_;
1264 }
1265
1269 FileMaster const & fileMaster() const
1270 {
1271 UTIL_ASSERT(fileMasterPtr_);
1272 return *fileMasterPtr_;
1273 }
1274
1276
1277 protected:
1278
1282 typename UnitCell<D>::LatticeSystem const & lattice() const
1283 {
1284 UTIL_ASSERT(latticePtr_);
1285 return *latticePtr_;
1286 }
1287
1291 bool hasGroup() const
1292 {
1293 UTIL_ASSERT(hasGroupPtr_);
1294 return *hasGroupPtr_;
1295 }
1296
1300 std::string const & groupName() const
1301 {
1302 UTIL_ASSERT(groupNamePtr_);
1303 return *groupNamePtr_;
1304 }
1305
1309 SpaceGroup<D> const & group() const
1310 {
1311 UTIL_ASSERT(groupPtr_);
1312 return *groupPtr_;
1313 }
1314
1318 FFT const & fft() const
1319 {
1320 UTIL_ASSERT(fftPtr_);
1321 return *fftPtr_;
1322 }
1323
1328
1333
1343 void checkAllocateBasis(std::string const & inFileName) const;
1344
1345 private:
1346
1348 Mesh<D> const * meshPtr_;
1349
1351 FFT const * fftPtr_;
1352
1354 typename UnitCell<D>::LatticeSystem const * latticePtr_;
1355
1357 bool const * hasGroupPtr_;
1358
1360 std::string const * groupNamePtr_;
1361
1363 SpaceGroup<D> const * groupPtr_;
1364
1366 Basis<D> * basisPtr_;
1367
1369 FileMaster const * fileMasterPtr_;
1370
1372 int nMonomer_;
1373
1374 // Mutable work space used by functions that read field files
1375
1377 mutable DArray< DArray<double> > tmpFieldsBasis_;
1378
1380 mutable DArray<RFT> tmpFieldsRGrid_;
1381
1383 mutable DArray<KFT> tmpFieldsKGrid_;
1384
1386 mutable KFT workDft_;
1387
1389 mutable bool isAllocatedBasis_;
1390
1392 mutable bool isAllocatedRGrid_;
1393
1395 mutable bool isAllocatedKGrid_;
1396
1397 };
1398
1399} // namespace Prdc
1400} // namespace Pscf
1401#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
Fourier transform wrapper.
Definition cpu/FFT.h:38
void checkAllocateBasis(std::string const &inFileName) const
Check if basis workspace is allocated, allocate if necessary.
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 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.
bool readFieldsRGrid(std::string filename, DArray< RFT > &fields, UnitCell< D > &unitCell) const
Read an array of r-grid fields from a named file.
UnitCell< D >::LatticeSystem const & lattice() const
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 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.
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.
void convertBasisToKGrid(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from basis to Fourier (k-grid) format.
void convertRGridToKGrid(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from r-grid to Fourier (k-grid) format.
virtual ~FieldIoReal()
Destructor.
void convertRGridToKGrid(RFT const &in, KFT &out) const
Convert a field from r-grid to k-grid (Fourier) format.
void scaleFieldsBasis(DArray< DArray< double > > &fields, double factor) const
Multiply an array of fields in basis format by a real scalar.
void readFieldBasis(std::string filename, DArray< double > &field, UnitCell< D > &unitCell) const
Read a single field in basis format from a named file.
void compareFieldsBasis(std::string const &filename1, std::string const &filename2) const
Compare two r-grid field files, write a report to Log file.
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.
FieldIoReal()
Constructor.
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.
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.
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.
virtual void scaleFieldBasis(DArray< double > &field, double factor) const
Multiply a single field in basis form by a real scalar.
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 compareFieldsRGrid(std::string const &filename1, std::string const &filename2) const
Compare two r-grid field files, write a report to Log file.
void convertBasisToRGrid(DArray< DArray< double > > const &in, DArray< RFT > &out) const
Convert an array of fields from basis 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.
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 convertKGridToRGrid(KFT const &in, RFT &out) const
Convert a single field from k-grid to r-grid format.
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.
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 estimateWBasis(DMatrix< double > const &chi, DArray< DArray< double > > &fields) const
Convert c fields to estimated w fields, in basis format.
virtual void convertBasisToKGrid(DArray< double > const &components, KFT &dft) const =0
Convert a single field from basis to Fourier (k-grid) form.
void scaleFieldsRGrid(DArray< RFT > &fields, double factor) const
Scale an array of r-grid fields by a scalar.
void writeFieldHeader(std::ostream &out, int nMonomer, UnitCell< D > const &unitCell, bool isSymmetric=true) const
Write header for field file (fortran pscf format).
void readFieldHeader(std::istream &in, int &nMonomer, UnitCell< D > &unitCell, bool &isSymmetric) const
Reader header of field file (fortran PSCF format)
virtual void scaleFieldRGrid(RFT &field, double factor) const =0
Multiply a single field in r-grid format by a scalar.
void readFieldsKGrid(std::string filename, DArray< KFT > &fields, UnitCell< D > &unitCell) const
Read an array of k-grid fields from a named file.
void checkAllocateKGrid() const
Check if k-grid workspace is allocated, allocate if necessary.
void convertKGridToRGrid(DArray< KFT > const &in, DArray< RFT > &out) const
Convert an array of field from k-grid to r-grid format.
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 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.
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.
void convertKGridToRGrid(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from Fourier (k-grid) to r-grid format.
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 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.
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.
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 convertBasisToRGrid(DArray< double > const &in, RFT &out) const
Convert a single field from basis to r-grid format.
void setFileMaster(FileMaster const &fileMaster)
Create an association with a FileMaster.
void convertBasisToKGrid(DArray< DArray< double > > const &in, DArray< KFT > &out) const
Convert an array of fields from basis to Fourier (k-grid) form.
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::string filename, DArray< DArray< double > > &fields, UnitCell< D > &unitCell) const
Read an array of fields in basis format from a named file.
void setNMonomer(int nMonomer)
Set the number of monomer types.
void expandRGridDimension(std::string const &inFileName, std::string const &outFileName, int d, DArray< int > newGridDimensions) const
Increase D for an r-grid field file.
virtual bool readFieldsRGrid(std::istream &in, DArray< RFT > &fields, UnitCell< D > &unitCell) const =0
Read array of r-grid fields from an input stream.
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.
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.
bool readFieldRGrid(std::string filename, RFT &field, UnitCell< D > &unitCell) const
Read a single r-grid field from a named file.
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 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 checkAllocateRGrid() const
Check if r-grid workspace is allocated, allocate if necessary.
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 convertRGridToKGrid(DArray< RFT > const &in, DArray< KFT > &out) const
Convert an array of fields from r-grid to k-grid (Fourier) format.
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 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 readFieldBasis(std::istream &in, DArray< double > &field, UnitCell< D > &unitCell) const
Read a single field in basis format from an input stream.
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.
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 convertKGridToBasis(std::string const &inFileName, std::string const &outFileName) const
Convert a field file from Fourier (k-grid) to basis format.
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.
virtual bool readFieldRGrid(std::istream &in, RFT &field, UnitCell< D > &unitCell) const =0
Read a single r-grid field from an input stream.
Crystallographic space group.
Definition SpaceGroup.h:32
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition UnitCell.h:56
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 CField.cpp:11
PSCF package top-level namespace.
Definition param_pc.dox:1
Utility classes for scientific computation.