PSCF v1.4.0
cpc/field/FieldIo.tpp
1#ifndef CPC_FIELD_IO_TPP
2#define CPC_FIELD_IO_TPP
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// Contains declarations needed to parse other templates
12#include <pscf/cpu/complex.h>
13
14#include "FieldIo.h"
15#include <prdc/field/fieldCheck.h>
16#include <prdc/crystal/UnitCell.h>
17#include <prdc/cpu/CFieldComparison.h>
18#include <prdc/field/cFieldIo.h>
19#include <prdc/field/rFieldIo.h>
20#include <pscf/mesh/Mesh.h>
21#include <pscf/math/IntVec.h>
22
23#include <cp/field/FieldIo.tpp>
24
25namespace Pscf {
26namespace Cpc {
27
28 using namespace Util;
29 using namespace Prdc;
30 using namespace Prdc::Cpu;
31
32 /*
33 * Read an array of fields in r-grid format.
34 */
35 template <int D>
36 void FieldIo<D>::readFields(std::istream& in,
37 DArray< CField<D> >& fields,
38 UnitCell<D>& unitCell) const
39 {
40 // Read header
41 int nMonomer;
42 readFieldHeader(in, nMonomer, unitCell);
43 readMeshDimensions(in, mesh().dimensions());
44 checkAllocateFields(fields, nMonomer, mesh().dimensions());
45
46 // Read data
47 // Rpg:: Allocate host arrays
48 Prdc::readCFieldsData(in, fields, mesh().dimensions());
49 // Rpg:: Copy host -> device
50
51 }
52
53 /*
54 * Read the data section of an array of complex fields.
55 */
56 template <int D>
57 void FieldIo<D>::readFieldsData(std::istream& in,
58 DArray< CField<D> >& fields,
59 int nMonomer) const
60 {
61 checkAllocateFields(fields, nMonomer, mesh().dimensions());
62 // Rpg:: Allocate host arrays
63 Prdc::readCFieldsData(in, fields, mesh().dimensions());
64 // Rpg:: Copy host -> device
65 }
66
67 /*
68 * Read a single complex field.
69 */
70 template <int D>
71 void FieldIo<D>::readField(std::istream &in,
72 CField<D> & field,
73 UnitCell<D>& unitCell) const
74 {
75 // Read header
76 int nMonomer;
77 readFieldHeader(in, nMonomer, unitCell);
78 UTIL_CHECK(nMonomer == 1);
79 readMeshDimensions(in, mesh().dimensions());
80
81 // Read data
82 // Rpg:: Allocate host arrays
83 checkAllocateField(field, mesh().dimensions());
84 Prdc::readCFieldData(in, field, mesh().dimensions());
85 // Rpg:: Copy host -> device
86
87 }
88
89 /*
90 * Read an array of real-valued fields in r-grid format.
91 */
92 template <int D>
93 void FieldIo<D>::readFieldsRGrid(std::istream& in,
94 DArray< CField<D> >& fields,
95 UnitCell<D>& unitCell) const
96 {
97 // Read header
98 int nMonomer;
99 readFieldHeader(in, nMonomer, unitCell);
100 readMeshDimensions(in, mesh().dimensions());
101 checkAllocateFields(fields, nMonomer, mesh().dimensions());
102
103 // Read data
104 // Rpg:: Allocate host arrays
105 Prdc::readRGridData(in, fields, nMonomer, mesh().dimensions());
106 // Rpg:: Copy host -> device
107
108 }
109
110 /*
111 * Write an array of fields in r-grid format.
112 */
113 template <int D>
115 std::ostream &out,
116 DArray<CField<D> > const & fields,
117 UnitCell<D> const & unitCell,
118 bool writeHeader,
119 bool writeMeshSize) const
120 {
121 // Inspect fields array, infer nMonomer and meshDimensions
122 int nMonomer;
123 IntVec<D> meshDimensions;
124 inspectFields(fields, nMonomer, meshDimensions);
125
126 // Write header
127 if (writeHeader){
128 writeFieldHeader(out, nMonomer, unitCell);
129 }
130 if (writeMeshSize){
131 writeMeshDimensions(out, meshDimensions);
132 }
133
134 // Write data section
135 // Rpg:: Allocate host arrays
136 // Rpg:: Copy device -> host
137 using AT = CField<D>;
138 using CT = typename CField<D>::ValueType;
139 using RT = typename CField<D>::RealType;
140 Prdc::writeCFieldsData<D,AT,CT,RT>(out, fields, meshDimensions);
141 }
142
143 /*
144 * Write a single field in r-grid format.
145 */
146 template <int D>
147 void FieldIo<D>::writeField(std::ostream &out,
148 CField<D> const & field,
149 UnitCell<D> const & unitCell,
150 bool writeHeader) const
151 {
152 IntVec<D> meshDimensions = field.meshDimensions();
153
154 // Write header
155 if (writeHeader) {
156 writeFieldHeader(out, 1, unitCell);
157 writeMeshDimensions(out, meshDimensions);
158 }
159
160 // Write data
161 // Rpg:: Allocate host array
162 // Rpg:: Copy device -> host
163 using AT = CField<D>;
164 using CT = typename CField<D>::ValueType;
165 using RT = typename CField<D>::RealType;
166 Prdc::writeCFieldData<D,AT,CT,RT>(out, field, meshDimensions);
167 }
168
169 #if 0
170 /*
171 * Compare two fields in r-grid format, output report to Log file.
172 */
173 template <int D>
174 void FieldIo<D>::compareFields(DArray< CField<D> > const & field1,
175 DArray< CField<D> > const & field2)
176 const
177 {
178 CFieldComparison<D> comparison;
179 comparison.compare(field1, field2);
180
181 Log::file() << "\n Real-space field comparison results"
182 << std::endl;
183 Log::file() << " Maximum Absolute Difference: "
184 << comparison.maxDiff() << std::endl;
185 Log::file() << " Root-Mean-Square Difference: "
186 << comparison.rmsDiff() << "\n" << std::endl;
187 }
188 #endif
189
190}
191}
192#endif
File input/output operations for fields.
void writeFields(std::ostream &out, DArray< CField< D > > const &fields, UnitCell< D > const &unitCell, bool writeHeader=true, bool writeMeshSize=true) const override
Write array of CField objects (fields on r-space grid) to a stream.
void readFields(std::istream &in, DArray< CField< D > > &fields, UnitCell< D > &unitCell) const override
Read multiple complex-valued fields from an input stream.
void readField(std::istream &in, CField< D > &field, UnitCell< D > &unitCell) const override
Read a single CField (field on an r-space grid) from a stream.
void readFieldsData(std::istream &in, DArray< CField< D > > &fields, int nMonomer) const override
Read data for multiple complex fields, with no header section.
void readFieldsRGrid(std::istream &in, DArray< CField< D > > &fields, UnitCell< D > &unitCell) const
Read multiple real value field in r-grid format.
void writeField(std::ostream &out, CField< D > const &field, UnitCell< D > const &unitCell, bool writeHeader=true) const override
Write a single CField (field on an r-space grid) to a stream.
Mesh< D > const & mesh() const
Get spatial discretization mesh by const reference.
An IntVec<D, T> is a D-component vector of elements of integer type T.
Definition IntVec.h:27
Comparator for CField (k-grid) arrays.
double compare(CField< D > const &a, CField< D > const &b)
Compare individual fields.
double rmsDiff() const
Return the precomputed root-mean-squared difference.
double maxDiff() const
Return the precomputed maximum element-by-element difference.
Field of complex double precision values on an FFT mesh.
Definition cpu/CField.h:29
const IntVec< D > & meshDimensions() const
Return mesh dimensions by constant reference.
Definition cpu/CField.h:119
double RealType
Type of real and imaginary parts of a complex value.
Definition cpu/CField.h:40
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition UnitCell.h:56
Dynamically allocatable contiguous array template.
Definition DArray.h:32
static std::ostream & file()
Get log ostream by reference.
Definition Log.cpp:59
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
Definition global.h:68
void writeFieldHeader(std::ostream &out, int ver1, int ver2, UnitCell< D > const &cell, std::string const &groupName, int nMonomer)
Write common part of field header (fortran PSCF format).
void readFieldHeader(std::istream &in, int &ver1, int &ver2, UnitCell< D > &cell, std::string &groupName, int &nMonomer)
Read common part of field header (fortran PSCF format).
void writeCFieldsData(std::ostream &out, DArray< AT > const &fields, IntVec< D > const &dimensions)
Write data for an array of complex fields, with no header section.
Definition cFieldIo.tpp:64
void readCFieldData(std::istream &in, AT &field, IntVec< D > const &dimensions)
Read data for a single complex field, with no header section.
Definition cFieldIo.tpp:45
void inspectFields(DArray< FT > const &fields, int &nMonomer, IntVec< D > &dimensions)
Inspect dimensions of a DArray of fields, each of type FT.
void writeMeshDimensions(std::ostream &out, IntVec< D > const &meshDimensions)
Write mesh dimensions to a field file header.
void writeCFieldData(std::ostream &out, AT const &field, IntVec< D > const &dimensions)
Write data for a single complex field, with no header section.
Definition cFieldIo.tpp:86
void readRGridData(std::istream &in, DArray< AT > &fields, int nMonomer, IntVec< D > const &dimensions)
Read data for array of r-grid fields, with no header section.
Definition rFieldIo.tpp:38
void readCFieldsData(std::istream &in, DArray< AT > &fields, IntVec< D > const &dimensions)
Read data for an array of complex fields, with no header section.
Definition cFieldIo.tpp:22
void readMeshDimensions(std::istream &in, IntVec< D > const &meshDimensions)
Read mesh dimensions from a field file header.
void checkAllocateFields(DArray< FT > &fields, int nMonomer, IntVec< D > const &dimensions)
Check allocation of an array of fields, allocate if necessary.
void checkAllocateField(FT &field, IntVec< D > const &dimensions)
Check allocation of a single field, allocate if necessary.
Complex periodic fields, CL-FTS (CPU).
Definition cpc.mod:6
Periodic fields and crystallography.
Definition complex.cpp:11
PSCF package top-level namespace.