66 {
67 int const idx = blockIdx.x * blockDim.x + threadIdx.x;
68 int const idy = blockIdx.y * blockDim.y + threadIdx.y;
69 if(idx >= dTotMat->rows() || idy >= dTotMat->cols()) return;
70 if(idx < idy) return;
71
72 int const dimLoc = dLocMat->cols();
74
75 (*dTotMat)(idx, idy) = {0, 0};
76 int innerX, innerY, locIdX, locIdY;
80 auto conjCoeffX = conj(subSpace->
basis().
valuePtr()[valuePosX]);
81
86
87 if(innerX / dimLoc != innerY / dimLoc) continue;
88 locIdX = innerX % dimLoc;
89 locIdY = innerY % dimLoc;
90 (*dTotMat)(idx, idy) += conjCoeffX * (*dLocMat)(locIdX, locIdY) * CoeffY;
91 }
92 }
93
94 if(idx == idy) { (*dTotMat)(idx, idy) = real((*dTotMat)(idx, idy)); }
95 else { (*dTotMat)(idy, idx) = conj((*dTotMat)(idx, idy)); }
96
97
98
99 return;
100}
__host__ __device__ int * innerIndexPtr() const
Definition MatrixUtils.cuh:421
__host__ __device__ int * outerIndexPtr() const
Definition MatrixUtils.cuh:420
__host__ __device__ Scalar_t * valuePtr() const
Definition MatrixUtils.cuh:422
__host__ __device__ Matrix_t & basis()
Definition HilbertSpace.hpp:668