StatMech
Loading...
Searching...
No Matches
RandomMatrixEnsemble< Scalar_t > Class Template Reference

#include <Ensemble_old.hpp>

Collaboration diagram for RandomMatrixEnsemble< Scalar_t >:
Collaboration graph

Public Member Functions

 RandomMatrixEnsemble (HilbertSpace const &locHSpace, int seed=0, double stddev=1.0)
 
void discardSamples (int num)
 
void getNewSample (void)
 
template<typename EigenMatrix , typename Scalar_t >
void constructHamiltonian (EigenMatrix &mat, SubHilbertSpace< Scalar_t > const &HSpace)
 
 RandomMatrixEnsemble (HilbertSpace< int > const &locHSpace)
 
void discardSamples (int num)
 
void getNewSample (void)
 
template<typename EigenMatrix , class TotalSpace , typename Scalar_ , typename std::enable_if_t< on_GPU_v< EigenMatrix > > * = nullptr>
void constructHamiltonian (EigenMatrix &mat, SubSpace< TotalSpace, Scalar_ > const &subSpace) const
 
 RandomMatrixEnsemble (HilbertSpace< int > const &locHSpace)
 
void discardSamples (int num)
 
void getNewSample (void)
 
template<typename EigenMatrix , class TotalSpace , typename Scalar_ , typename std::enable_if_t< on_GPU_v< EigenMatrix > > * = nullptr>
void constructHamiltonian (EigenMatrix &mat, SubSpace< TotalSpace, Scalar_ > const &subSpace) const
 

Private Types

using MatrixType = typename HamiltonianEnsemble::MatrixType
 

Private Attributes

HilbertSpace const & m_locHSpace
 
GUEgenerator m_GUE
 
unsigned long count
 
HilbertSpace< int > const m_locHSpace
 
GUEgenerator< double > m_GUE
 
Eigen::MatrixX< Complex_t< double > > m_locMat
 
Eigen::MatrixX< Scalar_t > m_dLocMat
 
ObjectOnGPU< Eigen::MatrixX< Scalar_t > > m_dLocMat
 
unsigned long m_count
 
ScalableOperator< MatrixTypem_sample
 

Member Typedef Documentation

◆ MatrixType

template<typename Scalar_t = Complex_t<Real_t>>
using RandomMatrixEnsemble< Scalar_t >::MatrixType = typename HamiltonianEnsemble::MatrixType
private

Constructor & Destructor Documentation

◆ RandomMatrixEnsemble() [1/3]

template<typename Scalar_t = Complex_t<Real_t>>
RandomMatrixEnsemble< Scalar_t >::RandomMatrixEnsemble ( HilbertSpace const &  locHSpace,
int  seed = 0,
double  stddev = 1.0 
)
inline
14 : m_locHSpace{locHSpace}, m_GUE(seed, stddev), count{0} {}
HilbertSpace const & m_locHSpace
Definition Ensemble_old.hpp:8
unsigned long count
Definition Ensemble_old.hpp:10
GUEgenerator m_GUE
Definition Ensemble_old.hpp:9

◆ RandomMatrixEnsemble() [2/3]

template<typename Scalar_t = Complex_t<Real_t>>
RandomMatrixEnsemble< Scalar_t >::RandomMatrixEnsemble ( HilbertSpace< int > const &  locHSpace)
inline
66 : m_locHSpace{locHSpace},
67 m_GUE{},
68 m_locMat(locHSpace.dim() * locHSpace.dim(), locHSpace.dim() * locHSpace.dim()),
69 m_dLocMat(locHSpace.dim() * locHSpace.dim(), locHSpace.dim() * locHSpace.dim()),
70 m_count{0} {
71 debug_constructor_printf(1);
72 debug_print("\tlocHSpace.dim()=" << locHSpace.dim()
73 << ", m_dLocMat.ptr()=" << m_dLocMat.ptr());
74 }
__host__ __device__ int dim() const
Definition HilbertSpace.hpp:34
Eigen::MatrixX< Scalar_t > m_dLocMat
Definition Ensemble copy.hpp:58
Eigen::MatrixX< Complex_t< double > > m_locMat
Definition Ensemble copy.hpp:56
unsigned long m_count
Definition Ensemble copy.hpp:62
debug_print("# Determining GPU configuration.")

◆ RandomMatrixEnsemble() [3/3]

template<typename Scalar_t = Complex_t<Real_t>>
RandomMatrixEnsemble< Scalar_t >::RandomMatrixEnsemble ( HilbertSpace< int > const &  locHSpace)
inline
11 {
12 debug_constructor_printf(1);
13 debug_print("\tlocHSpace.dim()=" << locHSpace.dim()
14 << ", m_dLocMat.ptr()=" << m_dLocMat.ptr());
15 }

Member Function Documentation

◆ constructHamiltonian() [1/3]

template<typename Scalar_t = Complex_t<Real_t>>
template<typename EigenMatrix , typename Scalar_t >
void RandomMatrixEnsemble< Scalar_t >::constructHamiltonian ( EigenMatrix &  mat,
SubHilbertSpace< Scalar_t > const &  HSpace 
)
inline
27 {
28 m_GUE(mat);
29 };

◆ constructHamiltonian() [2/3]

template<typename Scalar_t = Complex_t<Real_t>>
template<typename EigenMatrix , class TotalSpace , typename Scalar_ , typename std::enable_if_t< on_GPU_v< EigenMatrix > > * = nullptr>
void RandomMatrixEnsemble< Scalar_t >::constructHamiltonian ( EigenMatrix &  mat,
SubSpace< TotalSpace, Scalar_ > const &  subSpace 
) const
inline
116 {
117 debug_print(__func__ << ": Input matrix is on GPU. (Not tested)\n" << mat);
118 debug_print(__func__ << ":\n\tsubSpace.dim()=" << subSpace.dim()
119 << ", subSpace.totalSpace().dim()=" << subSpace.totalSpace().dim()
120 << ", \n"
121 << mat);
122
123 mat.resize(subSpace.dim(), subSpace.dim());
124
125 constexpr void (*kernel)(
126 Eigen::MatrixBase< std::remove_reference_t<decltype(*mat.ptr())> >*,
127 Eigen::MatrixBase< std::remove_reference_t<decltype(*m_dLocMat.ptr())> > const*,
130 struct cudaFuncAttributes attr;
131 cuCHECK(cudaFuncGetAttributes(&attr, kernel));
132 int const nThread = min(subSpace.dim(), (int)sqrt(attr.maxThreadsPerBlock));
133 int const nBlock = (int)(subSpace.dim() % nThread == 0 ? subSpace.dim() / nThread
134 : subSpace.dim() / nThread + 1);
135 debug_print(__func__ << ":\t subSpace.dim()=" << subSpace.dim() << ", nBlock=" << nBlock
136 << ", nThread=" << nThread);
137
139
140 constructHamiltonian_kernel<<<dim3(nBlock, nBlock, 1), dim3(nThread, nThread, 1)>>>(
141 mat.ptr(), m_dLocMat.ptr(), dSubSpace.ptr());
142 cuCHECK(cudaPeekAtLastError());
143 cuCHECK(cudaDeviceSynchronize());
144 debug_print(__func__ << ": mat.data() = " << mat.data());
145 debug_print(__func__ << ": Result\n" << mat);
146 };
__global__ void constructHamiltonian_kernel(Eigen::MatrixBase< Derived1 > *dTotMat, Eigen::MatrixBase< Derived2 > const *dLocMat, SubSpace< TotalSpace, Scalar > const *subSpace)
Definition Ensemble copy.hpp:13
Definition ObjectOnGPU.cuh:149
Definition HilbertSpace.hpp:568
__host__ __device__ TotalSpace const & totalSpace() const
Definition HilbertSpace.hpp:671
cuCHECK(cudaFuncGetAttributes(&attr, MatrixElementsInSector))
struct cudaFuncAttributes attr
Definition getAttributesOfMatrixElementsInSector.cpp:2
Integer_t const nBlock
Definition getAttributesOfMatrixElementsInSector.cpp:5
Integer_t const nThread
Definition getAttributesOfMatrixElementsInSector.cpp:4

◆ constructHamiltonian() [3/3]

template<typename Scalar_t = Complex_t<Real_t>>
template<typename EigenMatrix , class TotalSpace , typename Scalar_ , typename std::enable_if_t< on_GPU_v< EigenMatrix > > * = nullptr>
void RandomMatrixEnsemble< Scalar_t >::constructHamiltonian ( EigenMatrix &  mat,
SubSpace< TotalSpace, Scalar_ > const &  subSpace 
) const
inline
30 {
31 mat = m_sample.construct_globalOp(subSpace.totalSpace().sysSize());
32 }
ScalableOperator< MatrixType > m_sample
Definition Ensemble.hpp:8

◆ discardSamples() [1/3]

template<typename Scalar_t = Complex_t<Real_t>>
void RandomMatrixEnsemble< Scalar_t >::discardSamples ( int  num)
inline
16 {
17 if(num <= 0) return;
18 count += num;
19 m_GUE.discard(num);
20 };
void discard(unsigned long long num)
Discards random numbers to advance internal states of the random number generator.
Definition RandomMatrices.hpp:67

◆ discardSamples() [2/3]

template<typename Scalar_t = Complex_t<Real_t>>
void RandomMatrixEnsemble< Scalar_t >::discardSamples ( int  num)
inline
76 {
77 if(num <= 0) return;
78 debug_print(__PRETTY_FUNCTION__);
80 m_count += num;
81 };

◆ discardSamples() [3/3]

template<typename Scalar_t = Complex_t<Real_t>>
void RandomMatrixEnsemble< Scalar_t >::discardSamples ( int  num)
inline
17 {
18 if(num <= 0) return;
19 auto& hEnsemble = HamiltonianEnsemble::get_instance(2);
20 hEnsemble.discard(num);
21 };
static HamiltonianEnsemble & get_instance(char **CL_argv)
Definition Ensemble.cuh:115

◆ getNewSample() [1/3]

template<typename Scalar_t = Complex_t<Real_t>>
void RandomMatrixEnsemble< Scalar_t >::getNewSample ( void  )
inline
21 {
22 ++count;
23 return;
24 };

◆ getNewSample() [2/3]

template<typename Scalar_t = Complex_t<Real_t>>
void RandomMatrixEnsemble< Scalar_t >::getNewSample ( void  )
inline
82 {
83 debug_print(__PRETTY_FUNCTION__);
85 debug_print("Matrix on CPU:\n" << m_locMat);
86#ifdef GPU
88 debug_print("Matrix on GPU:\n" << m_dLocMat);
89#endif
90 ++m_count;
91 return;
92 };

◆ getNewSample() [3/3]

template<typename Scalar_t = Complex_t<Real_t>>
void RandomMatrixEnsemble< Scalar_t >::getNewSample ( void  )
inline
22 {
23 auto& hEnsemble = HamiltonianEnsemble::get_instance(2);
24 m_sample = hEnsemble.sample();
25 };

Member Data Documentation

◆ count

template<typename Scalar_t = Complex_t<Real_t>>
unsigned long RandomMatrixEnsemble< Scalar_t >::count
mutableprivate

◆ m_count

template<typename Scalar_t = Complex_t<Real_t>>
unsigned long RandomMatrixEnsemble< Scalar_t >::m_count
mutableprivate

◆ m_dLocMat [1/2]

template<typename Scalar_t = Complex_t<Real_t>>
Eigen::MatrixX<Scalar_t> RandomMatrixEnsemble< Scalar_t >::m_dLocMat
mutableprivate

◆ m_dLocMat [2/2]

template<typename Scalar_t = Complex_t<Real_t>>
ObjectOnGPU< Eigen::MatrixX<Scalar_t> > RandomMatrixEnsemble< Scalar_t >::m_dLocMat
private

◆ m_GUE [1/2]

template<typename Scalar_t = Complex_t<Real_t>>
GUEgenerator RandomMatrixEnsemble< Scalar_t >::m_GUE
private

◆ m_GUE [2/2]

template<typename Scalar_t = Complex_t<Real_t>>
GUEgenerator<double> RandomMatrixEnsemble< Scalar_t >::m_GUE
private

◆ m_locHSpace [1/2]

template<typename Scalar_t = Complex_t<Real_t>>
HilbertSpace const& RandomMatrixEnsemble< Scalar_t >::m_locHSpace
private

◆ m_locHSpace [2/2]

template<typename Scalar_t = Complex_t<Real_t>>
HilbertSpace<int> const RandomMatrixEnsemble< Scalar_t >::m_locHSpace
private

◆ m_locMat

template<typename Scalar_t = Complex_t<Real_t>>
Eigen::MatrixX< Complex_t<double> > RandomMatrixEnsemble< Scalar_t >::m_locMat
mutableprivate

◆ m_sample

template<typename Scalar_t = Complex_t<Real_t>>
ScalableOperator<MatrixType> RandomMatrixEnsemble< Scalar_t >::m_sample
mutableprivate

The documentation for this class was generated from the following files: