StatMech
Loading...
Searching...
No Matches
Ensemble copy.hpp
Go to the documentation of this file.
1#include "Headers/mytypes.hpp"
5#include "unsupported/Eigen/KroneckerProduct"
6#include <iostream>
7
8#ifdef GPU
10 #include <cuda_runtime.h>
11
12template<class Derived1, class Derived2, class TotalSpace, typename Scalar>
13__global__ void constructHamiltonian_kernel(Eigen::MatrixBase<Derived1>* dTotMat,
14 Eigen::MatrixBase<Derived2> const* dLocMat,
15 SubSpace<TotalSpace, Scalar> const* subSpace) {
16 int const idx = blockIdx.x * blockDim.x + threadIdx.x;
17 int const idy = blockIdx.y * blockDim.y + threadIdx.y;
18 if(idx >= (*dTotMat).rows() || idy >= (*dTotMat).cols()) return;
19 if(idx < idy) return;
20
21 int const dimLoc = (*dLocMat).cols();
22
23 (*dTotMat)(idx, idy) = {0, 0};
24 magma_index_t innerX, innerY, locIdX, locIdY;
25 for(auto valuePosX = (*subSpace).basis().outerIndexPtr()[idx];
26 valuePosX != (*subSpace).basis().outerIndexPtr()[idx + 1]; ++valuePosX) {
27 innerX = (*subSpace).basis().innerIndexPtr()[valuePosX];
28 auto conjCoeffX = conj((*subSpace).basis().valuePtr()[valuePosX]);
29
30 for(auto valuePosY = (*subSpace).basis().outerIndexPtr()[idy];
31 valuePosY != (*subSpace).basis().outerIndexPtr()[idy + 1]; ++valuePosY) {
32 innerY = (*subSpace).basis().innerIndexPtr()[valuePosY];
33 auto CoeffY = (*subSpace).basis().valuePtr()[valuePosY];
34
35 // if((innerX - innerY) / dimLoc != 0) continue; // WRONG FORMULA used until 2020/10/07
36 if(innerX / dimLoc != innerY / dimLoc) continue;
37 locIdX = innerX % dimLoc;
38 locIdY = innerY % dimLoc;
39 (*dTotMat)(idx, idy) += conjCoeffX * (*dLocMat)(locIdX, locIdY) * CoeffY;
40 }
41 }
42
43 (*dTotMat)(idy, idx) = conj((*dTotMat)(idx, idy));
44 // printf("LDT=%d, id=(%d,%d), val=%+f%+f*i\t %s is yet to be tested.\n", LDT, idx, idy,
45 // real(dTotMat[idx + LDT * idy]), imag(dTotMat[idx + LDT * idy]), __func__);
46 // printf("\t id=(%d,%d)\n", idx, idy);
47 return;
48}
49#endif
50
51template<typename Scalar_t = Complex_t<Real_t>>
53 private:
56 mutable Eigen::MatrixX< Complex_t<double> > m_locMat;
57#ifndef GPU
58 mutable Eigen::MatrixX<Scalar_t> m_dLocMat;
59#else
61#endif
62 mutable unsigned long m_count;
63
64 public:
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 }
75
76 void discardSamples(int num) {
77 if(num <= 0) return;
78 debug_print(__PRETTY_FUNCTION__);
80 m_count += num;
81 };
82 void getNewSample(void) {
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 };
93
94 // template<typename EigenMatrix, class TotalSpace,
95 // typename std::enable_if_t<!on_GPU_v<EigenMatrix>>* = nullptr>
96 // void constructHamiltonian(EigenMatrix& mat,
97 // SubSpace<TotalSpace, Scalar_t> const& subSpace) const {
98 // static_assert(!on_GPU_v<EigenMatrix>,
99 // "constructHamiltonian-CPU: Input matrix is on GPU.");
100 // debug_print(__func__ << ": Input matrix is NOT on GPU. subSpace.basis():\n"
101 // << subSpace.basis());
102 // Eigen::SparseMatrix<Scalar_t> Identity(subSpace.totalSpace().dim() / m_locMat.rows(),
103 // subSpace.totalSpace().dim() / m_locMat.rows());
104 // Identity.setIdentity();
105 // mat.resize(subSpace.dim(), subSpace.dim());
106 // debug_print("subSpace.basis().size = (" << subSpace.basis().rows() << ","
107 // << subSpace.basis().cols() << ")");
108 // mat = subSpace.basis().adjoint() * Eigen::kroneckerProduct(m_locMat, Identity)
109 // * subSpace.basis();
110 // };
111
112#ifdef GPU
113 template<typename EigenMatrix, class TotalSpace, typename Scalar_,
114 typename std::enable_if_t<on_GPU_v<EigenMatrix>>* = nullptr>
115 void constructHamiltonian(EigenMatrix& mat,
116 SubSpace<TotalSpace, Scalar_> const& subSpace) const {
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 };
147#endif
148
149 // // Specific member functions for debugging
150 // Eigen::MatrixXd const& localHamiltonian() const { return m_locMat; }
151
152 // void status() const {
153 // std::cout << "Count:\t" << m_count << std::endl;
154 // m_GUE.status();
155 // }
156};
__global__ void constructHamiltonian_kernel(Eigen::MatrixBase< Derived1 > *dTotMat, Eigen::MatrixBase< Derived2 > const *dLocMat, SubSpace< TotalSpace, Scalar > const *subSpace)
Definition Ensemble copy.hpp:13
Headers for the integer composition.
Generator of matrices in the Gaussian Unitary Ensemble (GUE)
Definition RandomMatrices.hpp:20
void discard(unsigned long long num)
Discards random numbers to advance internal states of the random number generator.
Definition RandomMatrices.hpp:67
Definition HilbertSpace.hpp:32
__host__ __device__ int dim() const
Definition HilbertSpace.hpp:34
Object_t * ptr() const
Definition ObjectOnGPU.cuh:144
Definition ObjectOnGPU.cuh:149
Definition Ensemble_old.hpp:6
ObjectOnGPU< Eigen::MatrixX< Scalar_t > > m_dLocMat
Definition Ensemble copy.hpp:60
HilbertSpace const & m_locHSpace
Definition Ensemble_old.hpp:8
Eigen::MatrixX< Scalar_t > m_dLocMat
Definition Ensemble copy.hpp:58
void getNewSample(void)
Definition Ensemble copy.hpp:82
GUEgenerator m_GUE
Definition Ensemble_old.hpp:9
Eigen::MatrixX< Complex_t< double > > m_locMat
Definition Ensemble copy.hpp:56
RandomMatrixEnsemble(HilbertSpace< int > const &locHSpace)
Definition Ensemble copy.hpp:65
HilbertSpace< int > const m_locHSpace
Definition Ensemble copy.hpp:54
unsigned long m_count
Definition Ensemble copy.hpp:62
GUEgenerator< double > m_GUE
Definition Ensemble copy.hpp:55
void discardSamples(int num)
Definition Ensemble copy.hpp:76
void constructHamiltonian(EigenMatrix &mat, SubSpace< TotalSpace, Scalar_ > const &subSpace) const
Definition Ensemble copy.hpp:115
Definition HilbertSpace.hpp:568
__host__ __device__ TotalSpace const & totalSpace() const
Definition HilbertSpace.hpp:671
cuCHECK(cudaFuncGetAttributes(&attr, MatrixElementsInSector))
debug_print("# Determining GPU configuration.")
struct cudaFuncAttributes attr
Definition getAttributesOfMatrixElementsInSector.cpp:2
Integer_t const nBlock
Definition getAttributesOfMatrixElementsInSector.cpp:5
Integer_t const nThread
Definition getAttributesOfMatrixElementsInSector.cpp:4