PSCF v1.4.0
field/Mask.h
1#ifndef RP_MASK_H
2#define RP_MASK_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 Rp {
27
28 using namespace Util;
29 using namespace Prdc;
30
90 template <int D, class RFT, class FIT>
91 class Mask
92 {
93
94 public:
95
98
104 void setFieldIo(FIT const & fieldIo);
105
116 void setReadUnitCell(UnitCell<D>& cell);
117
128 void setWriteUnitCell(UnitCell<D> const & cell);
129
137 void allocateBasis(int nBasis);
138
146 void allocateRGrid(IntVec<D> const & dimensions);
147
151
163 void setBasis(DArray<double> const & field);
164
184 void setRGrid(RFT const & field, bool isSymmetric = false);
185
201 void readBasis(std::istream& in);
202
216 void readBasis(std::string filename);
217
237 void readRGrid(std::istream& in, bool isSymmetric = false);
238
258 void readRGrid(std::string filename, bool isSymmetric = false);
259
263
269 void writeBasis(std::ostream& out) const;
270
276 void writeBasis(std::string filename) const;
277
283 void writeRGrid(std::ostream& out) const;
284
290 void writeRGrid(std::string filename) const;
291
295
299 DArray<double> const & basis() const;
300
304 RFT const & rgrid() const;
305
317 double phiTot() const;
318
329
333
337 bool isAllocatedBasis() const;
338
342 bool isAllocatedRGrid() const;
343
349 bool hasData() const;
350
359 bool isSymmetric() const;
360
362
363 protected:
364
368 Mask();
369
373 ~Mask();
374
378 IntVec<D> const & meshDimensions() const
379 { return meshDimensions_; }
380
384 int meshSize() const
385 { return meshSize_; }
386
390 int nBasis() const
391 { return nBasis_; }
392
396 FIT const & fieldIo() const
397 {
398 UTIL_CHECK(fieldIoPtr_);
399 return *fieldIoPtr_;
400 }
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 & Mask<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>
507 inline bool Mask<D,RFT,FIT>::hasData() const
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 Rp
516} // namespace Pscf
517#endif
An IntVec<D, T> is a D-component vector of elements of integer type T.
Definition IntVec.h:27
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition UnitCell.h:56
bool hasData() const
Has field data been set in either format?
Definition field/Mask.h:507
void allocateBasis(int nBasis)
Allocate memory for the field in basis format.
Definition Mask.tpp:88
void setWriteUnitCell(UnitCell< D > const &cell)
Set unit cell used when writing a mask field file.
Definition Mask.tpp:78
~Mask()
Destructor.
Definition Mask.tpp:51
bool isSymmetric() const
Are field symmetric under all elements of the space group?
Definition field/Mask.h:512
void setReadUnitCell(UnitCell< D > &cell)
Set unit cell used when reading a mask field file.
Definition Mask.tpp:67
double phiTot() const
Return the volume fraction of unit cell occupied by material.
Definition Mask.tpp:319
void readRGrid(std::istream &in, bool isSymmetric=false)
Reads field from an input stream in real-space (r-grid) format.
Definition Mask.tpp:267
void readBasis(std::istream &in)
Read field from input stream in symmetrized basis format.
Definition Mask.tpp:200
Signal< void > & signal()
Get a signal that notifies observers of field modification.
Definition Mask.tpp:399
void setRGrid(RFT const &field, bool isSymmetric=false)
Set field values in real-space (r-grid) format.
Definition Mask.tpp:162
bool isAllocatedRGrid() const
Has memory been allocated in rgrid format?
Definition field/Mask.h:502
void writeRGrid(std::ostream &out) const
Writes fields to an input stream in real-space (r-grid) format.
Definition Mask.tpp:368
void setBasis(DArray< double > const &field)
Set field component values, in symmetrized Fourier format.
Definition Mask.tpp:126
bool isAllocatedBasis() const
Has memory been allocated in basis format?
Definition field/Mask.h:497
int nBasis() const
Number of basis functions, set by allocation.
Definition field/Mask.h:390
IntVec< D > const & meshDimensions() const
Mesh dimensions in each direction, set by allocation.
Definition field/Mask.h:378
void setFieldIo(FIT const &fieldIo)
Create association with FieldIo (store pointer).
Definition Mask.tpp:60
DArray< double > const & basis() const
Get the field in basis format.
Definition field/Mask.h:480
void writeBasis(std::ostream &out) const
Write fields to an input stream in symmetrized basis format.
Definition Mask.tpp:340
Mask()
Constructor.
Definition Mask.tpp:29
RFT const & rgrid() const
Get the field in r-grid format.
Definition field/Mask.h:489
void allocateRGrid(IntVec< D > const &dimensions)
Allocate memory for the field in rgrid format.
Definition Mask.tpp:105
FIT const & fieldIo() const
Associated FieldIo object (const reference).
Definition field/Mask.h:396
int meshSize() const
Mesh size (number of grid points), set by allocation.
Definition field/Mask.h:384
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 complex.cpp:11
Class templates for real-valued periodic fields.
PSCF package top-level namespace.
Utility classes for scientific computation.