PSCF v1.3
CFieldsReal.h
1#ifndef PRDC_C_FIELDS_REAL_H
2#define PRDC_C_FIELDS_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 <util/containers/DArray.h> // member template
12#include <pscf/math/IntVec.h> // template with defaults
13
14// Forward declarations
15namespace Pscf {
16 namespace Prdc {
17 template <int D> class UnitCell;
18 }
19}
20
21namespace Pscf {
22namespace Prdc {
23
24 using namespace Util;
25
70 template <int D, class RFT, class FIT>
72 {
73
74 public:
75
80
85
88
94 void setFieldIo(FIT const & fieldIo);
95
106 void setWriteUnitCell(UnitCell<D> const & cell);
107
116 void setNMonomer(int nMonomer);
117
125 void allocateRGrid(IntVec<D> const & dimensions);
126
134 void allocateBasis(int nBasis);
135
145 void allocate(int nMonomer, int nBasis, IntVec<D> const & dimensions);
146
150
155
161 DArray< DArray<double> > const & basis() const;
162
168 DArray<double> & basis(int monomerId);
169
175 DArray<double> const & basis(int monomerId) const;
176
181
185 DArray<RFT> const & rgrid() const;
186
192 RFT & rgrid(int monomerId);
193
199 RFT const & rgrid(int monomerId) const;
200
204
210 void writeBasis(std::ostream& out) const;
211
217 void writeBasis(std::string filename) const;
218
224 void writeRGrid(std::ostream& out) const;
225
231 void writeRGrid(std::string filename) const;
232
236
240 bool isAllocatedRGrid() const;
241
245 bool isAllocatedBasis() const;
246
250 bool hasData() const;
251
255 bool isSymmetric() const;
256
260
268 void setHasData(bool hasData);
269
278
280
281 protected:
282
286 FIT const & fieldIo() const;
287
288 private:
289
290 /*
291 * Array of fields in symmetry-adapted basis format
292 *
293 * Element basis_[i] is an array that contains the components
294 * of the field associated with monomer i, in a symmetry-adapted
295 * Fourier basis expansion.
296 */
297 DArray< DArray<double> > basis_;
298
299 /*
300 * Array of fields in real-space grid (r-grid) format
301 *
302 * Element basis_[i] is an RFT that contains values of the
303 * field associated with monomer i on the nodes of a regular mesh.
304 */
305 DArray<RFT> rgrid_;
306
307 /*
308 * Number of monomer types.
309 */
310 int nMonomer_;
311
312 /*
313 * Pointer to associated UnitCell<D> object.
314 */
315 UnitCell<D> const * writeUnitCellPtr_;
316
317 /*
318 * Pointer to associated FIT (FieldIo) object
319 */
320 FIT const * fieldIoPtr_;
321
322 /*
323 * Has memory been allocated for fields in r-grid format?
324 */
325 bool isAllocatedRGrid_;
326
327 /*
328 * Has memory been allocated for fields in basis format?
329 */
330 bool isAllocatedBasis_;
331
332 /*
333 * Does this container hold up-to-date field data?
334 */
335 bool hasData_;
336
337 /*
338 * Are the fields symmetric?
339 */
340 bool isSymmetric_;
341
342 };
343
344 // Public inline member functions
345
346 // Get array of all fields in basis format (non-const)
347 template <int D, class RFT, class FIT> inline
349 {
350 UTIL_ASSERT(isAllocatedBasis_);
351 return basis_;
352 }
353
354 // Get array of all fields in basis format (const)
355 template <int D, class RFT, class FIT> inline
357 {
358 UTIL_ASSERT(isAllocatedBasis_);
359 return basis_;
360 }
361
362 // Get one field in basis format (non-const)
363 template <int D, class RFT, class FIT> inline
365 {
366 UTIL_ASSERT(isAllocatedBasis_);
367 return basis_[id];
368 }
369
370 // Get one field in basis format (const)
371 template <int D, class RFT, class FIT> inline
373 const
374 {
375 UTIL_ASSERT(isAllocatedBasis_);
376 return basis_[id];
377 }
378
379 // Get all fields in r-grid format (non-const)
380 template <int D, class RFT, class FIT> inline
382 {
383 UTIL_ASSERT(isAllocatedRGrid_);
384 return rgrid_;
385 }
386
387 // Get all fields in r-grid format (const)
388 template <int D, class RFT, class FIT> inline
390 {
391 UTIL_ASSERT(isAllocatedRGrid_);
392 return rgrid_;
393 }
394
395 // Get one field in r-grid format (non-const)
396 template <int D, class RFT, class FIT> inline
398 {
399 UTIL_ASSERT(isAllocatedRGrid_);
400 return rgrid_[id];
401 }
402
403 // Get one field in r-grid format (const)
404 template <int D, class RFT, class FIT> inline
405 RFT const & CFieldsReal<D,RFT,FIT>::rgrid(int id) const
406 {
407 UTIL_ASSERT(isAllocatedRGrid_);
408 return rgrid_[id];
409 }
410
411 // Has memory been allocated for fields in r-grid format?
412 template <int D, class RFT, class FIT> inline
414 { return isAllocatedRGrid_; }
415
416 // Has memory been allocated for fields in basis format?
417 template <int D, class RFT, class FIT> inline
419 { return isAllocatedBasis_; }
420
421 // Are the fields up-to-date?
422 template <int D, class RFT, class FIT> inline
424 { return hasData_; }
425
426 // Are the fields symmetric under elements of the space group?
427 template <int D, class RFT, class FIT> inline
429 { return isSymmetric_; }
430
431 // Protected inline member function
432
433 // Associated FieldIo object (const reference).
434 template <int D, class RFT, class FIT>
435 inline
437 {
438 UTIL_CHECK(fieldIoPtr_);
439 return *fieldIoPtr_;
440 }
441
442} // namespace Prdc
443} // namespace Pscf
444#endif
An IntVec<D, T> is a D-component vector of elements of integer type T.
Definition IntVec.h:27
void allocateBasis(int nBasis)
Allocate or re-allocate memory for fields in basis format.
RFT const & rgrid(int monomerId) const
Get field for one monomer type in r-grid format (const).
DArray< RFT > & rgrid()
Get array of all fields in r-grid format (non-const).
DArray< double > const & basis(int monomerId) const
Get the field for one monomer type in basis format (const)
DArray< DArray< double > > & basis()
Get array of all fields in basis format (non-const).
void writeRGrid(std::ostream &out) const
Writes fields to an input stream in real-space (r-grid) format.
bool hasData() const
Does this container have up-to-date fields?
DArray< DArray< double > > const & basis() const
Get array of all fields in basis format (const)
void setNMonomer(int nMonomer)
Set stored value of nMonomer.
void writeBasis(std::ostream &out) const
Write fields to an input stream in symmetrized basis format.
void allocateRGrid(IntVec< D > const &dimensions)
Allocate memory for fields in rgrid format.
void writeBasis(std::string filename) const
Write fields to a named file, in symmetrized basis format.
void setHasData(bool hasData)
Set the hasData flag.
void setWriteUnitCell(UnitCell< D > const &cell)
Set unit cell used when writing field files.
void allocate(int nMonomer, int nBasis, IntVec< D > const &dimensions)
Allocate memory for both r-grid and basis field formats.
DArray< RFT > const & rgrid() const
Get array of all fields in r-grid format (const).
void setFieldIo(FIT const &fieldIo)
Create association with FIT (store pointer).
bool isAllocatedBasis() const
Has memory been allocated for fields in basis format?
void writeRGrid(std::string filename) const
Writes fields to a named file in real-space (r-grid) format.
void setIsSymmetric(bool isSymmetric)
Set the isSymmetric flag.
CFieldsReal()
Constructor.
RFT & rgrid(int monomerId)
Get field for one monomer type in r-grid format (non-const)
bool isSymmetric() const
Are the fields invariant under elements of the space group?
DArray< double > & basis(int monomerId)
Get the field for one monomer type in basis format (non-const).
bool isAllocatedRGrid() const
Has memory been allocated for fields in r-grid format?
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
#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