StatMech
Loading...
Searching...
No Matches
RandomMatrix.cuh File Reference

Classes

class  GaussianRandomMatrixGenerator_GPU< Derived, >
 

Functions

template<class Derived1 , class Derived2 , class Derived3 , typename std::enable_if_t< std::is_convertible_v< Derived3, OperatorSpaceBase< Derived3 > > > * = nullptr>
__global__ void RandomMatrixGenerator_sample_kernel (Eigen::MatrixBase< Derived1 > *samplePtr, Eigen::DenseBase< Derived2 > const *coeffPtr, OperatorSpaceBase< Derived3 > const *opSpacePtr)
 

Function Documentation

◆ RandomMatrixGenerator_sample_kernel()

template<class Derived1 , class Derived2 , class Derived3 , typename std::enable_if_t< std::is_convertible_v< Derived3, OperatorSpaceBase< Derived3 > > > * = nullptr>
__global__ void RandomMatrixGenerator_sample_kernel ( Eigen::MatrixBase< Derived1 > *  samplePtr,
Eigen::DenseBase< Derived2 > const *  coeffPtr,
OperatorSpaceBase< Derived3 > const *  opSpacePtr 
)
151 {
152 using RealScalar = typename Derived1::RealScalar;
153
154 int const opId = blockIdx.x * blockDim.x + threadIdx.x;
155 int const basisId = blockIdx.y * blockDim.y + threadIdx.y;
156 auto const opDim = opSpacePtr->dim();
157 auto const baseDim = opSpacePtr->baseDim();
158 if(opId >= opDim) return;
159 if(basisId >= baseDim) return;
160
161 auto const coeff = (*coeffPtr)(opId);
162 auto const [k, val] = opSpacePtr->action(opId, basisId);
163 auto& matelemRef = reinterpret_cast<RealScalar(&)[2]>((*samplePtr)(k, basisId));
164
165 atomicAdd(&matelemRef[0], coeff * val.real());
166 atomicAdd(&matelemRef[1], coeff * val.imag());
167 return;
168}
Real_t RealScalar
Definition Ensemble.cuh:14
__host__ __device__ int dim() const
Definition OperatorSpace.hpp:75
__host__ __device__ void action(int &resBasisNum, Complex_t< RealType > &coeff, int opNum, int basisNum) const
Definition OperatorSpace.hpp:83
__host__ __device__ int baseDim() const
Definition OperatorSpace.hpp:80