PSCF v1.4.0
rp/field/WFields.h
1#ifndef RP_W_FIELDS_H
2#define RP_W_FIELDS_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
13#include <util/global.h>
14
15// Forward declarations
16namespace Util {
17 template <typename T> class Signal;
18 template <> class Signal<void>;
19}
20namespace Pscf {
21 namespace Prdc {
22 template <int D> class UnitCell;
23 }
24}
25
26namespace Pscf {
27namespace Rp {
28
29 using namespace Util;
30 using namespace Prdc;
31
91 template <int D, class RFT, class FIT>
92 class WFields
93 {
94
95 public:
96
99
105 void setFieldIo(FIT const & fieldIo);
106
118
129 void setWriteUnitCell(UnitCell<D> const & cell);
130
139
145 void allocateRGrid(IntVec<D> const & dimensions);
146
153
163 void allocate(int nMonomer, int nBasis, IntVec<D> const & dimensions);
164
168
180 void setBasis(DArray< DArray<double> > const & fields);
181
201 void setRGrid(DArray< RFT > const & fields,
202 bool isSymmetric = false);
203
216 void readBasis(std::istream& in);
217
231 void readBasis(std::string filename);
232
252 void readRGrid(std::istream& in, bool isSymmetric = false);
253
273 void readRGrid(std::string filename, bool isSymmetric = false);
274
296
300 void clear();
301
306
310
316 void writeBasis(std::ostream& out) const;
317
323 void writeBasis(std::string filename) const;
324
330 void writeRGrid(std::ostream& out) const;
331
337 void writeRGrid(std::string filename) const;
338
342
348 DArray< DArray<double> > const & basis() const;
349
357 DArray<double> const & basis(int monomerId) const;
358
364 DArray< RFT > const & rgrid() const;
365
371 RFT const & rgrid(int monomerId) const;
372
376
380 bool isAllocatedRGrid() const;
381
385 bool isAllocatedBasis() const;
386
392 bool hasData() const;
393
403 bool isSymmetric() const;
404
406
407 protected:
408
413
418
422 IntVec<D> const & meshDimensions() const;
423
427 int meshSize() const;
428
432 int nBasis() const;
433
437 int nMonomer() const;
438
442 FIT const & fieldIo() const;
443
444 private:
445
453 DArray< DArray<double> > basis_;
454
461 DArray< RFT > rgrid_;
462
468 IntVec<D> meshDimensions_;
469
473 int meshSize_;
474
478 int nBasis_;
479
483 int nMonomer_;
484
488 UnitCell<D> * readUnitCellPtr_;
489
493 UnitCell<D> const * writeUnitCellPtr_;
494
498 FIT const * fieldIoPtr_;
499
505 Signal<void>* signalPtr_;
506
510 bool isAllocatedRGrid_;
511
515 bool isAllocatedBasis_;
516
520 bool hasData_;
521
528 bool isSymmetric_;
529
530 };
531
532 // Public inline member functions
533
534 // Clear data stored in this object without deallocating
535 template <int D, class RField, class FieldIo> inline
537 { hasData_ = false; }
538
539 // Get array of all fields in basis format (const)
540 template <int D, class RFT, class FIT> inline
541 DArray< DArray<double> > const &
543 {
544 UTIL_ASSERT(isAllocatedBasis_);
545 return basis_;
546 }
547
548 // Get one field in basis format (const)
549 template <int D, class RFT, class FIT> inline
551 const
552 {
553 UTIL_ASSERT(isAllocatedBasis_);
554 return basis_[id];
555 }
556
557 // Get all fields in r-grid format (const)
558 template <int D, class RFT, class FIT> inline
559 DArray< RFT > const &
561 {
562 UTIL_ASSERT(isAllocatedRGrid_);
563 return rgrid_;
564 }
565
566 // Get one field in r-grid format (const)
567 template <int D, class RFT, class FIT> inline
568 RFT const & WFields<D,RFT,FIT>::rgrid(int id) const
569 {
570 UTIL_ASSERT(isAllocatedRGrid_);
571 return rgrid_[id];
572 }
573
574 // Has memory been allocated for fields in r-grid format?
575 template <int D, class RFT, class FIT> inline
577 { return isAllocatedRGrid_; }
578
579 // Has memory been allocated for fields in basis format?
580 template <int D, class RFT, class FIT> inline
582 { return isAllocatedBasis_; }
583
584 // Has field data been initialized ?
585 template <int D, class RFT, class FIT> inline
587 { return hasData_; }
588
589 // Are the fields symmetric under space group operations?
590 template <int D, class RFT, class FIT> inline
592 { return isSymmetric_; }
593
594 // Protected inline member functions
595
596 // Get mesh dimensions in each direction, set on r-grid allocation.
597 template <int D, class RFT, class FIT>
598 inline
599 IntVec<D> const &
601 { return meshDimensions_; }
602
603 // Get mesh size (number of grid points), set on r-grid allocation.
604 template <int D, class RFT, class FIT> inline
606 { return meshSize_; }
607
608 // Get number of basis functions, set on basis allocation.
609 template <int D, class RFT, class FIT> inline
611 { return nBasis_; }
612
613 // Get number of monomer types.
614 template <int D, class RFT, class FIT> inline
616 { return nMonomer_; }
617
618 // Associated FieldIo object (const reference).
619 template <int D, class RFT, class FIT> inline
620 FIT const & WFields<D,RFT,FIT>::fieldIo() const
621 {
622 UTIL_CHECK(fieldIoPtr_);
623 return *fieldIoPtr_;
624 }
625
626} // namespace Rp
627} // namespace Pscf
628#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
void allocateBasis(int nBasis)
Allocate or re-allocate memory for fields in basis format.
DArray< double > const & basis(int monomerId) const
Get the field for one monomer type in basis format.
void readRGrid(std::string filename, bool isSymmetric=false)
Reads fields from a named file in real-space (r-grid) format.
void setFieldIo(FIT const &fieldIo)
Create association with FIT (store pointer).
void writeRGrid(std::string filename) const
Writes fields to a named file in real-space (r-grid) format.
void setNMonomer(int nMonomer)
Set stored value of nMonomer.
void writeRGrid(std::ostream &out) const
Writes fields to an input stream in real-space (r-grid) format.
IntVec< D > const & meshDimensions() const
Get mesh dimensions in each direction, set on r-grid allocation.
void clear()
Clear data stored in this object without deallocating.
DArray< DArray< double > > const & basis() const
Get array of all fields in basis format.
void setRGrid(DArray< RFT > const &fields, bool isSymmetric=false)
Set fields values in real-space (r-grid) format.
void symmetrize()
Symmetrize r-grid fields, compute corresponding basis components.
void readBasis(std::istream &in)
Read fields from an input stream in symmetrized basis format.
DArray< RFT > const & rgrid() const
Get array of all fields in r-space grid format.
void setReadUnitCell(UnitCell< D > &cell)
Set unit cell used when reading field files.
void readBasis(std::string filename)
Read fields from a named file, in symmetrized basis format.
void setWriteUnitCell(UnitCell< D > const &cell)
Set unit cell used when writing field files.
void readRGrid(std::istream &in, bool isSymmetric=false)
Reads fields from an input stream in real-space (r-grid) format.
RFT const & rgrid(int monomerId) const
Get the field for one monomer type in r-space grid format.
void allocate(int nMonomer, int nBasis, IntVec< D > const &dimensions)
Allocate memory for all fields.
bool hasData() const
Has field data been set in either format?
void writeBasis(std::string filename) const
Write fields to a named file, in symmetrized basis format.
bool isAllocatedRGrid() const
Has memory been allocated for fields in r-grid format?
bool isAllocatedBasis() const
Has memory been allocated for fields in basis format?
void allocateRGrid(IntVec< D > const &dimensions)
Allocate or re-allocate memory for fields in rgrid format.
Signal< void > & signal()
Get a signal that notifies observers of field modification.
int meshSize() const
Get mesh size (number of grid points), set on r-grid allocation.
void writeBasis(std::ostream &out) const
Write fields to an input stream in symmetrized basis format.
void setBasis(DArray< DArray< double > > const &fields)
Set field component values, in symmetrized Fourier format.
Dynamically allocatable contiguous array template.
Definition DArray.h:32
Notifier (or subject) in the Observer design pattern.
Definition Signal.h:39
File containing preprocessor macros for error handling.
#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.