PSCF v1.3.1
WFieldsTmpl.h
1#ifndef PRDC_W_FIELDS_TMPL_H
2#define PRDC_W_FIELDS_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
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 & WFieldsTmpl<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
IntVec< D > const & meshDimensions() const
Get mesh dimensions in each direction, set on r-grid allocation.
void setBasis(DArray< DArray< double > > const &fields)
Set field component values, in symmetrized Fourier format.
void symmetrize()
Symmetrize r-grid fields, compute corresponding basis components.
void writeRGrid(std::ostream &out) const
Writes fields to an input stream in real-space (r-grid) format.
void readBasis(std::istream &in)
Read fields from an input stream in symmetrized basis format.
void clear()
Clear data stored in this object without deallocating.
int meshSize() const
Get mesh size (number of grid points), set on r-grid allocation.
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 writeBasis(std::string filename) const
Write fields to a named file, in symmetrized basis format.
void allocateRGrid(IntVec< D > const &dimensions)
Allocate or re-allocate memory for fields in rgrid format.
void setWriteUnitCell(UnitCell< D > const &cell)
Set unit cell used when writing field files.
void allocateBasis(int nBasis)
Allocate or re-allocate memory for fields in basis format.
void readBasis(std::string filename)
Read fields from a named file, in symmetrized basis format.
void readRGrid(std::string filename, bool isSymmetric=false)
Reads fields from a named file in real-space (r-grid) format.
WFieldsTmpl()
Constructor.
DArray< RFT > const & rgrid() const
Get array of all fields in r-space grid format.
bool isAllocatedBasis() const
Has memory been allocated for fields in basis format?
RFT const & rgrid(int monomerId) const
Get the field for one monomer type in r-space grid format.
DArray< DArray< double > > const & basis() const
Get array of all fields in basis format.
void setReadUnitCell(UnitCell< D > &cell)
Set unit cell used when reading field files.
void setFieldIo(FIT const &fieldIo)
Create association with FIT (store pointer).
void setNMonomer(int nMonomer)
Set stored value of nMonomer.
void allocate(int nMonomer, int nBasis, IntVec< D > const &dimensions)
Allocate memory for all fields.
bool isAllocatedRGrid() const
Has memory been allocated for fields in r-grid format?
void writeBasis(std::ostream &out) const
Write fields to an input stream in symmetrized basis format.
bool hasData() const
Has field data been set in either format?
void setRGrid(DArray< RFT > const &fields, bool isSymmetric=false)
Set fields values in real-space (r-grid) format.
void readRGrid(std::istream &in, bool isSymmetric=false)
Reads fields from an input stream in real-space (r-grid) format.
void writeRGrid(std::string filename) const
Writes fields to 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.