5#include "unsupported/Eigen/KroneckerProduct"
10 #include <cuda_runtime.h>
12template<
class Derived1,
class Derived2,
class TotalSpace,
typename Scalar>
14 Eigen::MatrixBase<Derived2>
const* dLocMat,
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;
21 int const dimLoc = (*dLocMat).cols();
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]);
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];
36 if(innerX / dimLoc != innerY / dimLoc)
continue;
37 locIdX = innerX % dimLoc;
38 locIdY = innerY % dimLoc;
39 (*dTotMat)(idx, idy) += conjCoeffX * (*dLocMat)(locIdX, locIdY) * CoeffY;
43 (*dTotMat)(idy, idx) = conj((*dTotMat)(idx, idy));
51template<
typename Scalar_t = Complex_t<Real_t>>
56 mutable Eigen::MatrixX< Complex_t<double> >
m_locMat;
68 m_locMat(locHSpace.dim() * locHSpace.dim(), locHSpace.dim() * locHSpace.dim()),
69 m_dLocMat(locHSpace.dim() * locHSpace.dim(), locHSpace.dim() * locHSpace.dim()),
71 debug_constructor_printf(1);
73 <<
", m_dLocMat.ptr()=" <<
m_dLocMat.ptr());
113 template<
typename EigenMatrix,
class TotalSpace,
typename Scalar_,
114 typename std::enable_if_t<on_GPU_v<EigenMatrix>>* =
nullptr>
117 debug_print(__func__ <<
": Input matrix is on GPU. (Not tested)\n" << mat);
119 <<
", subSpace.totalSpace().dim()=" << subSpace.
totalSpace().dim()
123 mat.resize(subSpace.
dim(), subSpace.
dim());
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;
132 int const nThread = min(subSpace.
dim(), (
int)sqrt(
attr.maxThreadsPerBlock));
142 cuCHECK(cudaPeekAtLastError());
143 cuCHECK(cudaDeviceSynchronize());
144 debug_print(__func__ <<
": mat.data() = " << mat.data());
__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