PSCF v1.3
WFieldsReal.h
1#ifndef PRDC_W_FIELDS_REAL_H
2#define PRDC_W_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 <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
29 using namespace Util;
30
91 template <int D, class RFT, class FIT>
93 {
94
95 public:
96
101
106
109
115 void setFieldIo(FIT const & fieldIo);
116
128
139 void setWriteUnitCell(UnitCell<D> const & cell);
140
149
155 void allocateRGrid(IntVec<D> const & dimensions);
156
163
173 void allocate(int nMonomer, int nBasis, IntVec<D> const & dimensions);
174
178
190 void setBasis(DArray< DArray<double> > const & fields);
191
211 void setRGrid(DArray< RFT > const & fields,
212 bool isSymmetric = false);
213
226 void readBasis(std::istream& in);
227
241 void readBasis(std::string filename);
242
262 void readRGrid(std::istream& in, bool isSymmetric = false);
263
283 void readRGrid(std::string filename, bool isSymmetric = false);
284
306
310 void clear();
311
316
320
326 void writeBasis(std::ostream& out) const;
327
333 void writeBasis(std::string filename) const;
334
340 void writeRGrid(std::ostream& out) const;
341
347 void writeRGrid(std::string filename) const;
348
352
358 DArray< DArray<double> > const & basis() const;
359
367 DArray<double> const & basis(int monomerId) const;
368
374 DArray< RFT > const & rgrid() const;
375
381 RFT const & rgrid(int monomerId) const;
382
386
390 bool isAllocatedRGrid() const;
391
395 bool isAllocatedBasis() const;
396
402 bool hasData() const;
403
413 bool isSymmetric() const;
414
416
417 protected:
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
446 /*
447 * Array of fields in symmetry-adapted basis format.
448 *
449 * Element basis_[i] is an array that contains the components
450 * of the field associated with monomer i, in a symmetry-adapted
451 * Fourier expansion.
452 */
453 DArray< DArray<double> > basis_;
454
455 /*
456 * Array of fields in real-space grid (r-grid) format.
457 *
458 * Element basis_[i] is an RFT that contains values of the
459 * field associated with monomer i on the nodes of a regular mesh.
460 */
461 DArray< RFT > rgrid_;
462
463 /*
464 * Integer vector of grid dimensions.
465 *
466 * Element i is the number of grid points along direction i
467 */
468 IntVec<D> meshDimensions_;
469
470 /*
471 * Total number grid points (product of mesh dimensions).
472 */
473 int meshSize_;
474
475 /*
476 * Number of basis functions in symmetry-adapted basis.
477 */
478 int nBasis_;
479
480 /*
481 * Number of monomer types (number of fields).
482 */
483 int nMonomer_;
484
485 /*
486 * Pointer to unit cell modified by read functions.
487 */
488 UnitCell<D> * readUnitCellPtr_;
489
490 /*
491 * Pointer to unit cell access by write functions.
492 */
493 UnitCell<D> const * writeUnitCellPtr_;
494
495 /*
496 * Pointer to an associated FIT object.
497 */
498 FIT const * fieldIoPtr_;
499
500 /*
501 * Pointer to a Signal that is triggered by field modification.
502 *
503 * The Signal is constructed and owned by this field container.
504 */
505 Signal<void>* signalPtr_;
506
507 /*
508 * Has memory been allocated for fields in r-grid format?
509 */
510 bool isAllocatedRGrid_;
511
512 /*
513 * Has memory been allocated for fields in basis format?
514 */
515 bool isAllocatedBasis_;
516
517 /*
518 * Has field data been initialized ?
519 */
520 bool hasData_;
521
522 /*
523 * Are the fields symmetric under space group operations?
524 *
525 * Set true when fields are set using the symmetry adapted basis
526 * format via function setBasis. False by otherwise.
527 */
528 bool isSymmetric_;
529
530 /*
531 * Assign one RFT to another: lhs = rhs.
532 *
533 * \param lhs left hand side of assignment
534 * \param rhs right hand side of assignment
535 */
536 virtual void assignRField(RFT& lhs, RFT const & rhs) const;
537
538 };
539
540 // Inline member functions
541
542 // Clear data stored in this object without deallocating
543 template <int D, class RField, class FieldIo>
545 { hasData_ = false; }
546
547 // Get array of all fields in basis format (const)
548 template <int D, class RFT, class FIT>
549 inline
550 DArray< DArray<double> > const &
552 {
553 UTIL_ASSERT(isAllocatedBasis_);
554 return basis_;
555 }
556
557 // Get one field in basis format (const)
558 template <int D, class RFT, class FIT>
559 inline
561 const
562 {
563 UTIL_ASSERT(isAllocatedBasis_);
564 return basis_[id];
565 }
566
567 // Get all fields in r-grid format (const)
568 template <int D, class RFT, class FIT>
569 inline
570 DArray< RFT > const &
572 {
573 UTIL_ASSERT(isAllocatedRGrid_);
574 return rgrid_;
575 }
576
577 // Get one field in r-grid format (const)
578 template <int D, class RFT, class FIT>
579 inline
580 RFT const & WFieldsReal<D,RFT,FIT>::rgrid(int id) const
581 {
582 UTIL_ASSERT(isAllocatedRGrid_);
583 return rgrid_[id];
584 }
585
586 // Has memory been allocated for fields in r-grid format?
587 template <int D, class RFT, class FIT>
588 inline
590 { return isAllocatedRGrid_; }
591
592 // Has memory been allocated for fields in basis format?
593 template <int D, class RFT, class FIT>
594 inline
596 { return isAllocatedBasis_; }
597
598 // Has field data been initialized ?
599 template <int D, class RFT, class FIT>
600 inline
602 { return hasData_; }
603
604 // Are the fields symmetric under space group operations?
605 template <int D, class RFT, class FIT>
606 inline
608 { return isSymmetric_; }
609
610 // Protected inline member functions
611
612 // Get mesh dimensions in each direction, set on r-grid allocation.
613 template <int D, class RFT, class FIT>
614 inline
615 IntVec<D> const &
617 { return meshDimensions_; }
618
619 // Get mesh size (number of grid points), set on r-grid allocation.
620 template <int D, class RFT, class FIT>
621 inline
623 { return meshSize_; }
624
625 // Get number of basis functions, set on basis allocation.
626 template <int D, class RFT, class FIT>
627 inline
629 { return nBasis_; }
630
631 // Get number of monomer types.
632 template <int D, class RFT, class FIT>
633 inline
635 { return nMonomer_; }
636
637 // Associated FieldIo object (const reference).
638 template <int D, class RFT, class FIT>
639 inline
641 {
642 UTIL_CHECK(fieldIoPtr_);
643 return *fieldIoPtr_;
644 }
645
646} // namespace Prdc
647} // namespace Pscf
648#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
DArray< DArray< double > > const & basis() const
Get array of all fields in basis format.
bool isAllocatedRGrid() const
Has memory been allocated for fields in r-grid format?
void allocateRGrid(IntVec< D > const &dimensions)
Allocate or re-allocate memory for fields in rgrid format.
void allocate(int nMonomer, int nBasis, IntVec< D > const &dimensions)
Allocate memory for all fields.
void writeBasis(std::string filename) const
Write fields to a named file, in symmetrized basis format.
WFieldsReal()
Constructor.
void readRGrid(std::istream &in, bool isSymmetric=false)
Reads fields from an input stream in real-space (r-grid) format.
void symmetrize()
Symmetrize r-grid fields, compute corresponding basis components.
void setBasis(DArray< DArray< double > > const &fields)
Set field component values, in symmetrized Fourier format.
void setNMonomer(int nMonomer)
Set stored value of nMonomer.
bool isAllocatedBasis() const
Has memory been allocated for fields in basis format?
void setWriteUnitCell(UnitCell< D > const &cell)
Set unit cell used when writing field files.
void readBasis(std::string filename)
Read fields from a named file, in symmetrized basis format.
void writeRGrid(std::string filename) const
Writes fields to a named file in real-space (r-grid) format.
void allocateBasis(int nBasis)
Allocate or re-allocate memory for fields in basis format.
void setFieldIo(FIT const &fieldIo)
Create association with FIT (store pointer).
void writeBasis(std::ostream &out) const
Write fields to an input stream in symmetrized basis format.
DArray< double > const & basis(int monomerId) const
Get the field for one monomer type in basis format.
Signal< void > & signal()
Get a signal that notifies observers of field modification.
void setRGrid(DArray< RFT > const &fields, bool isSymmetric=false)
Set fields values in real-space (r-grid) format.
void writeRGrid(std::ostream &out) const
Writes fields to an input stream in real-space (r-grid) format.
void setReadUnitCell(UnitCell< D > &cell)
Set unit cell used when reading field files.
int meshSize() const
Get mesh size (number of grid points), set on r-grid allocation.
RFT const & rgrid(int monomerId) const
Get the field for one monomer type in r-space grid format.
void clear()
Clear data stored in this object without deallocating.
DArray< RFT > const & rgrid() const
Get array of all fields in r-space grid format.
IntVec< D > const & meshDimensions() const
Get mesh dimensions in each direction, set on r-grid allocation.
void readBasis(std::istream &in)
Read fields from an input stream in symmetrized basis format.
bool hasData() const
Has field data been set in either format?
void readRGrid(std::string filename, bool isSymmetric=false)
Reads fields from a named file in real-space (r-grid) format.
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.