PSCF v1.3
MaskReal.h
1#ifndef PRDC_MASK_TMPL_H
2#define PRDC_MASK_TMPL_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 <pscf/math/IntVec.h> // member
12#include <util/containers/DArray.h> // member template
13
14// Forward declarations
15namespace Util {
16 template <typename T> class Signal;
17 template <> class Signal<void>;
18}
19namespace Pscf {
20 namespace Prdc {
21 template <int D> class UnitCell;
22 }
23}
24
25namespace Pscf {
26namespace Prdc {
27
28 using namespace Util;
29
82 template <int D, class RFT, class FIT>
83 class MaskReal
84 {
85
86 public:
87
92
97
100
106 void setFieldIo(FIT const & fieldIo);
107
119
130 void setWriteUnitCell(UnitCell<D> const & cell);
131
140
148 void allocateRGrid(IntVec<D> const & dimensions);
149
153
165 void setBasis(DArray<double> const & field);
166
186 void setRGrid(RFT const & field, bool isSymmetric = false);
187
203 void readBasis(std::istream& in);
204
218 void readBasis(std::string filename);
219
239 void readRGrid(std::istream& in, bool isSymmetric = false);
240
260 void readRGrid(std::string filename, bool isSymmetric = false);
261
265
271 void writeBasis(std::ostream& out) const;
272
278 void writeBasis(std::string filename) const;
279
285 void writeRGrid(std::ostream& out) const;
286
292 void writeRGrid(std::string filename) const;
293
297
301 DArray<double> const & basis() const;
302
306 RFT const & rgrid() const;
307
319 double phiTot() const;
320
331
335
339 bool isAllocatedBasis() const;
340
344 bool isAllocatedRGrid() const;
345
351 bool hasData() const;
352
361 bool isSymmetric() const;
362
364
365 protected:
366
370 IntVec<D> const & meshDimensions() const
371 { return meshDimensions_; }
372
376 int meshSize() const
377 { return meshSize_; }
378
382 int nBasis() const
383 { return nBasis_; }
384
388 FIT const & fieldIo() const
389 {
390 UTIL_CHECK(fieldIoPtr_);
391 return *fieldIoPtr_;
392 }
393
400 virtual double rGridAverage() const = 0;
401
402 private:
403
407 DArray<double> basis_;
408
412 RFT rgrid_;
413
419 IntVec<D> meshDimensions_;
420
424 int meshSize_;
425
429 int nBasis_;
430
431 /*
432 * Pointer to unit cell modified by read functions.
433 */
434 UnitCell<D> * readUnitCellPtr_;
435
436 /*
437 * Pointer to unit cell access by write functions.
438 */
439 UnitCell<D> const * writeUnitCellPtr_;
440
444 FIT const * fieldIoPtr_;
445
446 /*
447 * Pointer to a Signal that is triggered by field modification.
448 */
449 Signal<void>* signalPtr_;
450
454 bool isAllocatedBasis_;
455
459 bool isAllocatedRGrid_;
460
464 bool hasData_;
465
472 bool isSymmetric_;
473
474 };
475
476 // Inline member functions
477
478 // Get field in basis format (const)
479 template <int D, class RFT, class FIT>
481 {
482 UTIL_ASSERT(hasData_);
483 UTIL_ASSERT(isSymmetric_);
484 return basis_;
485 }
486
487 // Get field in r-grid format (const)
488 template <int D, class RFT, class FIT>
489 inline RFT const & MaskReal<D,RFT,FIT>::rgrid() const
490 {
491 UTIL_ASSERT(hasData_);
492 return rgrid_;
493 }
494
495 // Has memory been allocated in basis format?
496 template <int D, class RFT, class FIT>
498 { return isAllocatedBasis_; }
499
500 // Has memory been allocated in rgrid format?
501 template <int D, class RFT, class FIT>
503 { return isAllocatedRGrid_; }
504
505 // Have the field data been set?
506 template <int D, class RFT, class FIT>
508 { return hasData_; }
509
510 // Is the field symmetric under space group operations?
511 template <int D, class RFT, class FIT>
513 { return isSymmetric_; }
514
515} // namespace Prdc
516} // namespace Pscf
517#endif
An IntVec<D, T> is a D-component vector of elements of integer type T.
Definition IntVec.h:27
void writeBasis(std::string filename) const
Write fields to a named file, in symmetrized basis format.
Definition MaskReal.tpp:353
bool hasData() const
Has field data been set in either format?
Definition MaskReal.h:507
int meshSize() const
Mesh size (number of grid points), set by allocation.
Definition MaskReal.h:376
void writeBasis(std::ostream &out) const
Write fields to an input stream in symmetrized basis format.
Definition MaskReal.tpp:337
~MaskReal()
Destructor.
Definition MaskReal.tpp:50
bool isAllocatedBasis() const
Has memory been allocated in basis format?
Definition MaskReal.h:497
void setReadUnitCell(UnitCell< D > &cell)
Set unit cell used when reading a mask field file.
Definition MaskReal.tpp:66
void readBasis(std::string filename)
Read field from a named file, in symmetrized basis format.
Definition MaskReal.tpp:249
double phiTot() const
Return the volume fraction of unit cell occupied by material.
Definition MaskReal.tpp:318
virtual double rGridAverage() const =0
Calculate the average value of the rgrid_ member.
void setRGrid(RFT const &field, bool isSymmetric=false)
Set field values in real-space (r-grid) format.
Definition MaskReal.tpp:161
void readRGrid(std::string filename, bool isSymmetric=false)
Reads field from a named file, in real-space (r-grid) format.
Definition MaskReal.tpp:304
void setBasis(DArray< double > const &field)
Set field component values, in symmetrized Fourier format.
Definition MaskReal.tpp:125
MaskReal()
Constructor.
Definition MaskReal.tpp:28
bool isAllocatedRGrid() const
Has memory been allocated in rgrid format?
Definition MaskReal.h:502
IntVec< D > const & meshDimensions() const
Mesh dimensions in each direction, set by allocation.
Definition MaskReal.h:370
void readRGrid(std::istream &in, bool isSymmetric=false)
Reads field from an input stream in real-space (r-grid) format.
Definition MaskReal.tpp:266
DArray< double > const & basis() const
Get the field in basis format.
Definition MaskReal.h:480
void writeRGrid(std::string filename) const
Writes fields to a named file in real-space (r-grid) format.
Definition MaskReal.tpp:382
void writeRGrid(std::ostream &out) const
Writes fields to an input stream in real-space (r-grid) format.
Definition MaskReal.tpp:365
void allocateRGrid(IntVec< D > const &dimensions)
Allocate memory for the field in rgrid format.
Definition MaskReal.tpp:104
void setWriteUnitCell(UnitCell< D > const &cell)
Set unit cell used when writing a mask field file.
Definition MaskReal.tpp:77
void setFieldIo(FIT const &fieldIo)
Create association with FieldIo (store pointer).
Definition MaskReal.tpp:59
Signal< void > & signal()
Get a signal that notifies observers of field modification.
Definition MaskReal.tpp:396
void readBasis(std::istream &in)
Read field from input stream in symmetrized basis format.
Definition MaskReal.tpp:199
RFT const & rgrid() const
Get the field in r-grid format.
Definition MaskReal.h:489
void allocateBasis(int nBasis)
Allocate memory for the field in basis format.
Definition MaskReal.tpp:87
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition UnitCell.h:56
Dynamically allocatable contiguous array template.
Definition DArray.h:32
Notifier (or subject) in the Observer design pattern.
Definition Signal.h:39
#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
Utility classes for scientific computation.