PSCF v1.4.0
Basis.h
1#ifndef PRDC_BASIS_H
2#define PRDC_BASIS_H
3/*
4* PSCF - Polymer Self-Consistent Field
5*
6* Copyright 2015 - 2025, The Regents of the University of Minnesota
7* Distributed under the terms of the GNU General Public License.
8*/
9
10#include <pscf/math/IntVec.h> // inline waveId
11#include <pscf/mesh/Mesh.h> // inline waveId
12#include <util/containers/DArray.h> // member
13#include <util/containers/GArray.h> // member
14#include <util/signal/Signal.h> // member
15
16// Forward declarations
17namespace Util {
18 template <typename T> class Signal;
19 template <> class Signal<void>;
20}
21namespace Pscf {
22 namespace Prdc {
23 template <int D> class UnitCell;
24 template <int D> class SpaceGroup;
25 }
26}
27
28namespace Pscf {
29namespace Prdc {
30
31 using namespace Util;
32
382 template <int D>
383 class Basis
384 {
385
386 public:
387
391 class Wave
392 {
393
394 public:
395
399 std::complex<double> coeff;
400
409
424
429
434
449
454 : coeff(0.0),
455 indicesStd(0),
456 indicesMin(0),
457 starId(0),
458 inverseId(-1),
459 implicit(false),
460 sqNorm(0.0)
461 {}
462
463 private:
464
468 double sqNorm;
469
470 friend class Basis<D>;
471
472 };
473
482 class Star
483 {
484
485 public:
486
490 int size;
491
496
503 int endId;
504
533
546
553
565
579 bool cancel;
580
585 : size(0),
586 beginId(0),
587 endId(0),
588 invertFlag(0),
589 waveMin(0),
590 starId(0),
591 basisId(0),
592 cancel(false)
593 {}
594
595 };
596
597 // Public member functions of Basis<D>
598
602 Basis();
603
607 ~Basis();
608
609 // Initialization
610
626 void makeBasis(Mesh<D> const & mesh,
627 UnitCell<D> const & unitCell,
628 SpaceGroup<D> const & group);
629
655 void makeBasis(Mesh<D> const & mesh,
656 UnitCell<D> const & unitCell,
657 std::string groupName);
658
667
668 // Data Output
669
676 void outputWaves(std::ostream& out, bool outputAll = false) const;
677
684 void outputStars(std::ostream& out, bool outputAll = false) const;
685
686 // Accessors
687
691 int nWave() const;
692
696 int nBasisWave() const;
697
701 int nStar() const;
702
706 int nBasis() const;
707
713 Wave const & wave(int id) const;
714
722 Star const & star(int id) const;
723
729 Star const & basisFunction(int id) const;
730
742 int waveId(IntVec<D> vector) const;
743
747 bool isInitialized() const;
748
752 bool isValid() const;
753
754 private:
755
766 DArray<Wave> waves_;
767
773 GArray<Star> stars_;
774
783 DArray<int> waveIds_;
784
793 DArray<int> starIds_;
794
800 int nWave_;
801
805 int nBasisWave_;
806
810 int nStar_;
811
815 int nBasis_;
816
820 Signal<>* signalPtr_;
821
825 UnitCell<D> const * unitCellPtr_;
826
830 Mesh<D> const * meshPtr_;
831
835 bool isInitialized_;
836
840 void makeWaves();
841
845 void makeStars(const SpaceGroup<D>& group);
846
850 Mesh<D> const & mesh() const
851 { return *meshPtr_; }
852
856 UnitCell<D> const & unitCell() const
857 { return *unitCellPtr_; }
858
859 };
860
861 // Inline functions
862
863 template <int D>
864 inline int Basis<D>::nWave() const
865 { return nWave_; }
866
867 template <int D>
868 inline int Basis<D>::nBasisWave() const
869 { return nBasisWave_; }
870
871 template <int D>
872 inline int Basis<D>::nStar() const
873 { return nStar_; }
874
875 template <int D>
876 inline
877 typename Basis<D>::Wave const & Basis<D>::wave(int id) const
878 { return waves_[id]; }
879
880 template <int D>
881 inline
882 typename Basis<D>::Star const & Basis<D>::star(int id) const
883 { return stars_[id]; }
884
885 template <int D>
886 inline
887 typename Basis<D>::Star const & Basis<D>::basisFunction(int id) const
888 { return stars_[starIds_[id]]; }
889
890 template <int D>
891 int Basis<D>::waveId(IntVec<D> vector) const
892 {
893 meshPtr_->shift(vector);
894 int rank = mesh().rank(vector);
895 return waveIds_[rank];
896 }
897
898 template <int D>
899 inline bool Basis<D>::isInitialized() const
900 { return isInitialized_; }
901
902 // Explicit instantiation declarations
903 extern template class Basis<1>;
904 extern template class Basis<2>;
905 extern template class Basis<3>;
906
907} // namespace Prdc
908} // namespace Pscf
909#endif
An IntVec<D, T> is a D-component vector of elements of integer type T.
Definition IntVec.h:27
Description of a regular grid of points in a periodic domain.
Definition Mesh.h:61
A list of wavevectors that are related by space-group symmetries.
Definition Basis.h:483
int basisId
Index of basis function associated with this star.
Definition Basis.h:564
Star()
Constructor.
Definition Basis.h:584
IntVec< D > waveMin
Integer indices indicesMin of a characteristic wave of this star.
Definition Basis.h:545
int invertFlag
Index for inversion symmetry of star.
Definition Basis.h:532
int size
Number of wavevectors in this star.
Definition Basis.h:490
int endId
Wave index of first wavevector of the next star.
Definition Basis.h:503
int beginId
Wave index of first wavevector in star.
Definition Basis.h:495
int starId
Index of this star in ordered array of all stars.
Definition Basis.h:552
bool cancel
Is this star cancelled, i.e., associated with a zero function?
Definition Basis.h:579
Wavevector used to construct a basis function.
Definition Basis.h:392
std::complex< double > coeff
Coefficient of wave within the associated star basis function.
Definition Basis.h:399
int starId
Index of the star that contains this wavevector.
Definition Basis.h:428
Wave()
Constructor.
Definition Basis.h:453
IntVec< D > indicesMin
Integer indices of wave, in first Brillouin zone.
Definition Basis.h:423
int inverseId
Index of the wave that is the inverse of this wavevector.
Definition Basis.h:433
IntVec< D > indicesStd
Integer indices of wave, on a discrete Fourier transform mesh.
Definition Basis.h:408
bool implicit
Is this wave represented implicitly in DFT of real field?
Definition Basis.h:448
Symmetry-adapted Fourier basis for pseudo-spectral SCFT.
Definition Basis.h:384
Wave const & wave(int id) const
Get a specific Wave, access by integer index.
Definition Basis.h:877
int nBasis() const
Total number of nonzero symmetry-adapted basis functions.
Definition Basis.tpp:946
int waveId(IntVec< D > vector) const
Get the integer index of a wave, as required by wave(int id).
Definition Basis.h:891
int nStar() const
Total number of stars.
Definition Basis.h:872
Basis()
Constructor.
Definition Basis.tpp:35
bool isInitialized() const
Returns true iff this basis is fully initialized.
Definition Basis.h:899
~Basis()
Destructor.
Definition Basis.tpp:56
void makeBasis(Mesh< D > const &mesh, UnitCell< D > const &unitCell, SpaceGroup< D > const &group)
Construct basis for a specific mesh and space group.
Definition Basis.tpp:78
Signal< void > & signal()
Get a Signal that is triggered by basis initialization.
Definition Basis.tpp:1443
void outputWaves(std::ostream &out, bool outputAll=false) const
Print a list of all waves to an output stream.
Definition Basis.tpp:951
int nWave() const
Total number of wavevectors.
Definition Basis.h:864
int nBasisWave() const
Total number of wavevectors in uncancelled stars.
Definition Basis.h:868
Star const & star(int id) const
Get a Star, accessed by integer star index.
Definition Basis.h:882
bool isValid() const
Returns true if this basis is valid, false otherwise.
Definition Basis.tpp:1013
void outputStars(std::ostream &out, bool outputAll=false) const
Print a list of all stars to an output stream.
Definition Basis.tpp:980
Star const & basisFunction(int id) const
Get an uncancelled Star, accessed by basis function index.
Definition Basis.h:887
Crystallographic space group.
Definition SpaceGroup.h:32
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition UnitCell.h:56
Dynamically allocatable contiguous array template.
Definition DArray.h:32
An automatically growable array, analogous to a std::vector.
Definition GArray.h:34
Notifier (or subject) in the Observer design pattern.
Definition Signal.h:39
Periodic fields and crystallography.
Definition complex.cpp:11
PSCF package top-level namespace.
Utility classes for scientific computation.