PSCF v1.3
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
381 template <int D>
382 class Basis
383 {
384
385 public:
386
390 class Wave
391 {
392
393 public:
394
398 std::complex<double> coeff;
399
408
423
428
433
448
453 : coeff(0.0),
454 indicesDft(0),
455 indicesBz(0),
456 starId(0),
457 inverseId(-1),
458 implicit(false),
459 sqNorm(0.0)
460 {}
461
462 private:
463
467 double sqNorm;
468
469 friend class Basis<D>;
470
471 };
472
481 class Star
482 {
483
484 public:
485
489 int size;
490
495
502 int endId;
503
532
545
552
564
578 bool cancel;
579
584 : size(0),
585 beginId(0),
586 endId(0),
587 invertFlag(0),
588 waveBz(0),
589 starId(0),
590 basisId(0),
591 cancel(false)
592 {}
593
594 };
595
596 // Public member functions of Basis<D>
597
601 Basis();
602
606 ~Basis();
607
608 // Initialization
609
625 void makeBasis(Mesh<D> const & mesh,
626 UnitCell<D> const & unitCell,
627 SpaceGroup<D> const & group);
628
654 void makeBasis(Mesh<D> const & mesh,
655 UnitCell<D> const & unitCell,
656 std::string groupName);
657
666
667 // Data Output
668
675 void outputWaves(std::ostream& out, bool outputAll = false) const;
676
683 void outputStars(std::ostream& out, bool outputAll = false) const;
684
685 // Accessors
686
690 int nWave() const;
691
695 int nBasisWave() const;
696
700 int nStar() const;
701
705 int nBasis() const;
706
712 Wave const & wave(int id) const;
713
721 Star const & star(int id) const;
722
728 Star const & basisFunction(int id) const;
729
741 int waveId(IntVec<D> vector) const;
742
746 bool isInitialized() const;
747
751 bool isValid() const;
752
753 private:
754
765 DArray<Wave> waves_;
766
772 GArray<Star> stars_;
773
782 DArray<int> waveIds_;
783
792 DArray<int> starIds_;
793
799 int nWave_;
800
804 int nBasisWave_;
805
809 int nStar_;
810
814 int nBasis_;
815
819 Signal<>* signalPtr_;
820
824 UnitCell<D> const * unitCellPtr_;
825
829 Mesh<D> const * meshPtr_;
830
834 bool isInitialized_;
835
839 void makeWaves();
840
844 void makeStars(const SpaceGroup<D>& group);
845
849 Mesh<D> const & mesh() const
850 { return *meshPtr_; }
851
855 UnitCell<D> const & unitCell() const
856 { return *unitCellPtr_; }
857
858 };
859
860 // Inline functions
861
862 template <int D>
863 inline int Basis<D>::nWave() const
864 { return nWave_; }
865
866 template <int D>
867 inline int Basis<D>::nBasisWave() const
868 { return nBasisWave_; }
869
870 template <int D>
871 inline int Basis<D>::nStar() const
872 { return nStar_; }
873
874 template <int D>
875 inline
876 typename Basis<D>::Wave const & Basis<D>::wave(int id) const
877 { return waves_[id]; }
878
879 template <int D>
880 inline
881 typename Basis<D>::Star const & Basis<D>::star(int id) const
882 { return stars_[id]; }
883
884 template <int D>
885 inline
886 typename Basis<D>::Star const & Basis<D>::basisFunction(int id) const
887 { return stars_[starIds_[id]]; }
888
889 template <int D>
890 int Basis<D>::waveId(IntVec<D> vector) const
891 {
892 meshPtr_->shift(vector);
893 int rank = mesh().rank(vector);
894 return waveIds_[rank];
895 }
896
897 template <int D>
898 inline bool Basis<D>::isInitialized() const
899 { return isInitialized_; }
900
901 #ifndef PRDC_BASIS_TPP
902 extern template class Basis<1>;
903 extern template class Basis<2>;
904 extern template class Basis<3>;
905 #endif
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:482
int basisId
Index of basis function associated with this star.
Definition Basis.h:563
Star()
Constructor.
Definition Basis.h:583
IntVec< D > waveBz
Integer indices indicesBz of a characteristic wave of this star.
Definition Basis.h:544
int invertFlag
Index for inversion symmetry of star.
Definition Basis.h:531
int size
Number of wavevectors in this star.
Definition Basis.h:489
int endId
Wave index of first wavevector of the next star.
Definition Basis.h:502
int beginId
Wave index of first wavevector in star.
Definition Basis.h:494
int starId
Index of this star in ordered array of all stars.
Definition Basis.h:551
bool cancel
Is this star cancelled, i.e., associated with a zero function?
Definition Basis.h:578
Wavevector used to construct a basis function.
Definition Basis.h:391
std::complex< double > coeff
Coefficient of wave within the associated star basis function.
Definition Basis.h:398
int starId
Index of the star that contains this wavevector.
Definition Basis.h:427
Wave()
Constructor.
Definition Basis.h:452
IntVec< D > indicesDft
Integer indices of wave, on a discrete Fourier transform mesh.
Definition Basis.h:407
int inverseId
Index of the wave that is the inverse of this wavevector.
Definition Basis.h:432
IntVec< D > indicesBz
Integer indices of wave, in first Brillouin zone.
Definition Basis.h:422
bool implicit
Is this wave represented implicitly in DFT of real field?
Definition Basis.h:447
Symmetry-adapted Fourier basis for pseudo-spectral SCFT.
Definition Basis.h:383
Wave const & wave(int id) const
Get a specific Wave, access by integer index.
Definition Basis.h:876
int nBasis() const
Total number of nonzero symmetry-adapted basis functions.
Definition Basis.tpp:936
int waveId(IntVec< D > vector) const
Get the integer index of a wave, as required by wave(int id).
Definition Basis.h:890
int nStar() const
Total number of stars.
Definition Basis.h:871
Basis()
Constructor.
Definition Basis.tpp:35
bool isInitialized() const
Returns true iff this basis is fully initialized.
Definition Basis.h:898
~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:1433
void outputWaves(std::ostream &out, bool outputAll=false) const
Print a list of all waves to an output stream.
Definition Basis.tpp:941
int nWave() const
Total number of wavevectors.
Definition Basis.h:863
int nBasisWave() const
Total number of wavevectors in uncancelled stars.
Definition Basis.h:867
Star const & star(int id) const
Get a Star, accessed by integer star index.
Definition Basis.h:881
bool isValid() const
Returns true if this basis is valid, false otherwise.
Definition Basis.tpp:1003
void outputStars(std::ostream &out, bool outputAll=false) const
Print a list of all stars to an output stream.
Definition Basis.tpp:970
Star const & basisFunction(int id) const
Get an uncancelled Star, accessed by basis function index.
Definition Basis.h:886
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 CField.cpp:11
PSCF package top-level namespace.
Definition param_pc.dox:1
Utility classes for scientific computation.