PSCF v1.1
Basis.h
1#ifndef PSCF_BASIS_H
2#define PSCF_BASIS_H
3/*
4* PSCF - Polymer Self-Consistent Field Theory
5*
6* Copyright 2016 - 2022, 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
15namespace Pscf {
16
17 template <int D> class UnitCell;
18 template <int D> class SpaceGroup;
19
20 using namespace Util;
21
344 template <int D>
345 class Basis
346 {
347
348 public:
349
353 class Wave
354 {
355
356 public:
357
361 std::complex<double> coeff;
362
371
386
391
406
407 /*
408 * Default constructor.
409 */
410 Wave()
411 : coeff(0.0),
412 indicesDft(0),
413 indicesBz(0),
414 starId(0),
415 implicit(false),
416 sqNorm(0.0)
417 {}
418
419 private:
420
424 double sqNorm;
425
426 friend class Basis<D>;
427
428 };
429
438 class Star
439 {
440
441 public:
442
446 int size;
447
452
456 int endId;
457
486
499
506
518
532 bool cancel;
533
534 /*
535 * Default constructor.
536 */
537 Star()
538 : size(0),
539 beginId(0),
540 endId(0),
541 invertFlag(0),
542 waveBz(0),
543 starId(0),
544 basisId(0),
545 cancel(false)
546 {}
547
548 };
549
550 // Public member functions of Basis<D>
551
555 Basis();
556
560 ~Basis();
561
574 void makeBasis(Mesh<D> const & mesh,
575 UnitCell<D> const & unitCell,
576 SpaceGroup<D> const & group);
577
603 void makeBasis(Mesh<D> const & mesh,
604 UnitCell<D> const & unitCell,
605 std::string groupName);
606
613 void outputWaves(std::ostream& out, bool outputAll = false) const;
614
621 void outputStars(std::ostream& out, bool outputAll = false) const;
622
626 bool isValid() const;
627
631 bool isInitialized() const;
632
633 // Accessors
634
638 int nWave() const;
639
643 int nBasisWave() const;
644
648 int nStar() const;
649
653 int nBasis() const;
654
660 Wave const & wave(int id) const;
661
669 Star const & star(int id) const;
670
676 Star const & basisFunction(int id) const;
677
689 int waveId(IntVec<D> vector) const;
690
691 private:
692
703 DArray<Wave> waves_;
704
710 GArray<Star> stars_;
711
720 DArray<int> waveIds_;
721
730 DArray<int> starIds_;
731
737 int nWave_;
738
742 int nBasisWave_;
743
747 int nStar_;
748
752 int nBasis_;
753
757 UnitCell<D> const * unitCellPtr_;
758
762 Mesh<D> const * meshPtr_;
763
767 bool isInitialized_;
768
772 void makeWaves();
773
777 void makeStars(const SpaceGroup<D>& group);
778
782 Mesh<D> const & mesh() const
783 { return *meshPtr_; }
784
788 UnitCell<D> const & unitCell() const
789 { return *unitCellPtr_; }
790
791 };
792
793 // Inline functions
794
795 template <int D>
796 inline int Basis<D>::nWave() const
797 { return nWave_; }
798
799 template <int D>
800 inline int Basis<D>::nBasisWave() const
801 { return nBasisWave_; }
802
803 template <int D>
804 inline int Basis<D>::nStar() const
805 { return nStar_; }
806
807 template <int D>
808 inline
809 typename Basis<D>::Wave const & Basis<D>::wave(int id) const
810 { return waves_[id]; }
811
812 template <int D>
813 inline
814 typename Basis<D>::Star const & Basis<D>::star(int id) const
815 { return stars_[id]; }
816
817 template <int D>
818 inline
819 typename Basis<D>::Star const & Basis<D>::basisFunction(int id) const
820 { return stars_[starIds_[id]]; }
821
822 template <int D>
823 int Basis<D>::waveId(IntVec<D> vector) const
824 {
825 meshPtr_->shift(vector);
826 int rank = mesh().rank(vector);
827 return waveIds_[rank];
828 }
829
830 template <int D>
831 inline bool Basis<D>::isInitialized() const
832 { return isInitialized_; }
833
834 #ifndef PSCF_BASIS_TPP
835 extern template class Basis<1>;
836 extern template class Basis<2>;
837 extern template class Basis<3>;
838 #endif
839
840} // namespace Pscf
841#endif
A list of wavevectors that are related by space-group symmetries.
Definition: Basis.h:439
int size
Number of wavevectors in this star.
Definition: Basis.h:446
int invertFlag
Index for inversion symmetry of star.
Definition: Basis.h:485
IntVec< D > waveBz
Integer indices indexBz of a characteristic wave of this star.
Definition: Basis.h:498
int endId
Wave index of last wavevector in star.
Definition: Basis.h:456
int basisId
Index of basis function associated with this star.
Definition: Basis.h:517
int beginId
Wave index of first wavevector in star.
Definition: Basis.h:451
int starId
Index of this star in ordered array of all stars.
Definition: Basis.h:505
bool cancel
Is this star cancelled, i.e., associated with a zero function?
Definition: Basis.h:532
Wavevector used to construct a basis function.
Definition: Basis.h:354
IntVec< D > indicesBz
Integer indices of wave, in first Brillouin zone.
Definition: Basis.h:385
bool implicit
Is this wave represented implicitly in DFT of real field?
Definition: Basis.h:405
std::complex< double > coeff
Coefficient of wave within the associated star basis function.
Definition: Basis.h:361
int starId
Index of the star that contains this wavevector.
Definition: Basis.h:390
IntVec< D > indicesDft
Integer indices of wave, on a discrete Fourier transform mesh.
Definition: Basis.h:370
Symmetry-adapted Fourier basis for pseudo-spectral scft.
Definition: Basis.h:346
~Basis()
Destructor.
Definition: Basis.tpp:48
bool isInitialized() const
Returns true iff this basis is fully initialized.
Definition: Basis.h:831
int nBasis() const
Total number of nonzero symmetry-adapted basis functions.
Definition: Basis.tpp:851
Star const & star(int id) const
Get a Star, accessed by integer star index.
Definition: Basis.h:814
bool isValid() const
Returns true if valid, false otherwise.
Definition: Basis.tpp:918
int nBasisWave() const
Total number of wavevectors in uncancelled stars.
Definition: Basis.h:800
int nWave() const
Total number of wavevectors.
Definition: Basis.h:796
void outputStars(std::ostream &out, bool outputAll=false) const
Print a list of all stars to an output stream.
Definition: Basis.tpp:885
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:68
int waveId(IntVec< D > vector) const
Get the integer index of a wave, as required by wave(int id).
Definition: Basis.h:823
int nStar() const
Total number of stars.
Definition: Basis.h:804
Basis()
Default constructor.
Definition: Basis.tpp:30
Wave const & wave(int id) const
Get a specific Wave, access by integer index.
Definition: Basis.h:809
Star const & basisFunction(int id) const
Get an uncancelled Star, accessed by basis function index.
Definition: Basis.h:819
void outputWaves(std::ostream &out, bool outputAll=false) const
Print a list of all waves to an output stream.
Definition: Basis.tpp:856
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
Crystallographic space group.
Definition: SpaceGroup.h:30
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition: UnitCell.h:44
Dynamically allocatable contiguous array template.
Definition: DArray.h:32
An automatically growable array, analogous to a std::vector.
Definition: GArray.h:34
C++ namespace for polymer self-consistent field theory (PSCF).
Utility classes for scientific computation.
Definition: accumulators.mod:1