PSCF v1.4.0
cp/field/FieldIo.h
1#ifndef PRDC_CL_FIELD_IO_H
2#define PRDC_CL_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
16namespace Util {
17 class FileMaster;
18}
19namespace Pscf {
20 template <int D> class Mesh;
21}
22
23namespace Pscf {
24namespace Cp {
25
26 using namespace Util;
27 using namespace Prdc;
28
61 template <int D, class CFT, class FFT>
62 class FieldIo
63 {
64
65 public:
66
69
74
78 virtual ~FieldIo();
79
91 void associate(Mesh<D> const & mesh,
92 FFT const & fft,
93 typename UnitCell<D>::LatticeSystem const & lattice);
94
106
117 void setNMonomer(int nMonomer);
118
122
139 virtual
140 void readFields(std::istream& in,
141 DArray<CFT>& fields,
142 UnitCell<D> & unitCell) const = 0;
143
156 void readFields(std::string filename,
157 DArray<CFT>& fields,
158 UnitCell<D> & unitCell) const;
159
175 virtual
176 void readFieldsData(std::istream& in,
177 DArray<CFT>& fields,
178 int nMonomer) const = 0;
179
191 virtual
192 void readField(std::istream &in,
193 CFT & field,
194 UnitCell<D>& unitCell) const = 0;
195
208 void readField(std::string filename,
209 CFT & field,
210 UnitCell<D>& unitCell) const;
211
226 virtual
227 void writeFields(std::ostream& out,
228 DArray<CFT> const & fields,
229 UnitCell<D> const & unitCell,
230 bool writeHeader = true,
231 bool writeMeshSize = true) const = 0;
232
245 void writeFields(std::string filename,
246 DArray<CFT> const & fields,
247 UnitCell<D> const & unitCell) const;
248
262 virtual
263 void writeField(std::ostream &out,
264 CFT const & field,
265 UnitCell<D> const & unitCell,
266 bool writeHeader = true) const = 0;
267
281 void writeField(std::string filename,
282 CFT const & field,
283 UnitCell<D> const & unitCell) const;
284
288
300 DArray<CFT> & out) const;
301
311 void convertRGridToKGrid(std::string const & inFileName,
312 std::string const & outFileName) const;
313
325 DArray<CFT> & out) const;
326
336 void convertKGridToRGrid(std::string const & inFileName,
337 std::string const & outFileName) const;
338
340 #if 0
343
353 virtual
354 void compareFields(DArray< CFT > const & field1,
355 DArray< CFT > const & field2) const = 0;
356
363 void compareFields(std::string const & filename1,
364 std::string const & filename2) const;
365
367 #endif
368
371
399 void readFieldHeader(std::istream& in,
400 int& nMonomer,
401 UnitCell<D> & unitCell) const;
402
410 void writeFieldHeader(std::ostream& out,
411 int nMonomer,
412 UnitCell<D> const & unitCell) const;
413
417
421 Mesh<D> const & mesh() const
422 {
423 UTIL_ASSERT(meshPtr_);
424 return *meshPtr_;
425 }
426
430 FileMaster const & fileMaster() const
431 {
432 UTIL_ASSERT(fileMasterPtr_);
433 return *fileMasterPtr_;
434 }
435
437
438 protected:
439
443 typename UnitCell<D>::LatticeSystem const & lattice() const
444 {
445 UTIL_ASSERT(latticePtr_);
446 return *latticePtr_;
447 }
448
452 FFT const & fft() const
453 {
454 UTIL_ASSERT(fftPtr_);
455 return *fftPtr_;
456 }
457
461 void checkAllocate() const;
462
463 private:
464
466 Mesh<D> const * meshPtr_;
467
469 FFT const * fftPtr_;
470
472 typename UnitCell<D>::LatticeSystem const * latticePtr_;
473
475 FileMaster const * fileMasterPtr_;
476
478 int nMonomer_;
479
480 // Mutable work space used by functions that read field files
481
483 mutable DArray<CFT> tmpFields_;
484
486 mutable bool isAllocated_;
487
488 };
489
490} // namespace Cp
491} // namespace Pscf
492#endif
void convertRGridToKGrid(std::string const &inFileName, std::string const &outFileName) const
Fourier transform a field file from r-grid to k-grid format.
void readFieldHeader(std::istream &in, int &nMonomer, UnitCell< D > &unitCell) const
Reader header of field file (fortran PSCF format)
void checkAllocate() const
Check if r-grid workspace is allocated, allocate if necessary.
virtual void writeFields(std::ostream &out, DArray< CFT > const &fields, UnitCell< D > const &unitCell, bool writeHeader=true, bool writeMeshSize=true) const =0
Write an array of complex fields to an output stream.
void writeFieldHeader(std::ostream &out, int nMonomer, UnitCell< D > const &unitCell) const
Write header for field file (fortran pscf format).
virtual void readFieldsData(std::istream &in, DArray< CFT > &fields, int nMonomer) const =0
Read data for array of r-grid fields, with no header section.
void convertKGridToRGrid(DArray< CFT > const &in, DArray< CFT > &out) const
Fourier transform an array of fields from k-grid to r-grid format.
void convertKGridToRGrid(std::string const &inFileName, std::string const &outFileName) const
Transform a field file from Fourier (k-grid) to r-grid format.
void readField(std::string filename, CFT &field, UnitCell< D > &unitCell) const
Read a single field from a named file.
virtual void readFields(std::istream &in, DArray< CFT > &fields, UnitCell< D > &unitCell) const =0
Read array of complex fields from an input stream.
void writeFields(std::string filename, DArray< CFT > const &fields, UnitCell< D > const &unitCell) const
Write an array of complex fields to a named file.
void setNMonomer(int nMonomer)
Set the number of monomer types.
void readFields(std::string filename, DArray< CFT > &fields, UnitCell< D > &unitCell) const
Read an array of complex fields from a named file.
void writeField(std::string filename, CFT const &field, UnitCell< D > const &unitCell) const
Write a single complex field to a named file.
void convertRGridToKGrid(DArray< CFT > const &in, DArray< CFT > &out) const
Fourier transform array of fields from r-grid to k-grid format.
virtual void readField(std::istream &in, CFT &field, UnitCell< D > &unitCell) const =0
Read a single r-grid field from an input stream.
UnitCell< D >::LatticeSystem const & lattice() const
void setFileMaster(FileMaster const &fileMaster)
Create an association with a FileMaster.
virtual ~FieldIo()
Destructor.
void associate(Mesh< D > const &mesh, FFT const &fft, typename UnitCell< D >::LatticeSystem const &lattice)
Create associations with other members of the parent Domain.
virtual void writeField(std::ostream &out, CFT const &field, UnitCell< D > const &unitCell, bool writeHeader=true) const =0
Write a single complex field to an an output stream.
Description of a regular grid of points in a periodic domain.
Definition Mesh.h:61
Fourier transform wrapper.
Definition cpu/FFT.h:39
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition UnitCell.h:56
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
Complex-valued periodic fields (class templates).
Definition cp.mod:6
Periodic fields and crystallography.
Definition complex.cpp:11
PSCF package top-level namespace.
Utility classes for scientific computation.