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