PSCF v1.4.0
FieldState.h
1#ifndef PRDC_FIELD_STATE_H
2#define PRDC_FIELD_STATE_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> // member
12#include <util/containers/DArray.h> // member template
13
14namespace Pscf {
15namespace Prdc {
16
17 using namespace Util;
18 using namespace Prdc;
19
45 template <int D, class FT, class ST>
47 {
48
49 public:
50
53
58
67
72
78 void setSystem(ST& system);
79
83
89 const DArray<FT>& fields() const;
90
97
103 const FT& field(int monomerId) const;
104
110 FT& field(int monomerId);
111
115 const UnitCell<D>& unitCell() const;
116
121
123
124 protected:
125
129 bool hasSystem();
130
134 ST& system();
135
136 private:
137
141 DArray<FT> fields_;
142
146 UnitCell<D> unitCell_;
147
151 ST* systemPtr_;
152
153 };
154
155 // Public inline member functions
156
157 // Get an array of all fields (const reference)
158 template <int D, class FT, class ST> inline
160 { return fields_; }
161
162 // Get an array of all fields (non-const reference)
163 template <int D, class FT, class ST> inline
165 { return fields_; }
166
167 // Get field for monomer type id (const reference)
168 template <int D, class FT, class ST> inline
169 const FT& FieldState<D,FT,ST>::field(int id) const
170 { return fields_[id]; }
171
172 // Get field for monomer type id (non-const reference)
173 template <int D, class FT, class ST> inline
175 { return fields_[id]; }
176
177 // Get the internal Unitcell (const reference)
178 template <int D, class FT, class ST> inline
180 { return unitCell_; }
181
182 // Get the internal Unitcell (non-const reference)
183 template <int D, class FT, class ST> inline
185 { return unitCell_; }
186
187 // Protected inline member functions
188
189 // Has the system been set?
190 template <int D, class FT, class ST> inline
192 { return (systemPtr_ != 0); }
193
194 // Get the associated ST object.
195 template <int D, class FT, class ST> inline
197 {
198 assert(systemPtr_);
199 return *systemPtr_;
200 }
201
202 // Noninline public member functions
203
204 /*
205 * Constructor.
206 */
207 template <int D, class FT, class ST>
209 : fields_(),
210 unitCell_(),
211 systemPtr_(nullptr)
212 {}
213
214 /*
215 * Constructor.
216 */
217 template <int D, class FT, class ST>
219 : fields_(),
220 unitCell_(),
221 systemPtr_(nullptr)
222 { setSystem(system); }
223
224 /*
225 * Destructor.
226 */
227 template <int D, class FT, class ST>
230
231 /*
232 * Set association with system, after default construction.
233 */
234 template <int D, class FT, class ST>
236 {
237 if (hasSystem()) {
238 UTIL_CHECK(systemPtr_ == &system);
239 } else {
240 systemPtr_ = &system;
241 }
242 }
243
244} // namespace Prdc
245} // namespace Pscf
246#endif
FT & field(int monomerId)
Get field for a specific monomer type (non-const reference).
Definition FieldState.h:174
const UnitCell< D > & unitCell() const
Get UnitCell (i.e., lattice type and parameters) by const reference.
Definition FieldState.h:179
UnitCell< D > & unitCell()
Get the UnitCell by non-const reference.
Definition FieldState.h:184
const DArray< FT > & fields() const
Get array of all fields by const reference.
Definition FieldState.h:159
DArray< FT > & fields()
Get array of all chemical potential fields (non-const reference).
Definition FieldState.h:164
~FieldState()
Destructor.
Definition FieldState.h:228
FieldState()
Default constructor.
Definition FieldState.h:208
void setSystem(ST &system)
Set association with System, after default construction.
Definition FieldState.h:235
bool hasSystem()
Has a system been set?
Definition FieldState.h:191
const FT & field(int monomerId) const
Get a field for a single monomer type by const reference.
Definition FieldState.h:169
FieldState(ST &system)
Constructor, creates association with a System.
Definition FieldState.h:218
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition UnitCell.h:56
Dynamically allocatable contiguous array template.
Definition DArray.h:32
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
Definition global.h:68
Periodic fields and crystallography.
Definition complex.cpp:11
PSCF package top-level namespace.