StatMech
Loading...
Searching...
No Matches
statmech_gpu.cu File Reference

Functions

template<typename TypeComplex >
magma_int_t EigenValues (std::vector< double > &eigenvalue, magma_int_t const dim, matrix_gpu< TypeComplex > &dHamiltonian)
 
template<>
magma_int_t EigenValues< magmaFloatComplex > (std::vector< double > &eigenvalue, magma_int_t const dim, matrix_gpu< magmaFloatComplex > &dHamiltonian)
 
template<>
magma_int_t EigenValues< magmaDoubleComplex > (std::vector< double > &eigenvalue, magma_int_t const dim, matrix_gpu< magmaDoubleComplex > &dHamiltonian)
 
template<typename TypeComplex >
double SpectralRange (double &OpMin, magma_int_t const dim, matrix_gpu< TypeComplex > &dHamiltonian)
 
template<>
double SpectralRange< magmaFloatComplex > (double &OpMin, magma_int_t const dim, matrix_gpu< magmaFloatComplex > &dHamiltonian)
 
template<>
double SpectralRange< magmaDoubleComplex > (double &OpMin, magma_int_t const dim, matrix_gpu< magmaDoubleComplex > &dHamiltonian)
 
template<typename TypeComplex >
magma_int_t Diagonalize (magma_int_t const dim, matrix_gpu< TypeComplex > &dHamiltonian, std::vector< double > &eigenvalue_h)
 
template<>
magma_int_t Diagonalize< magmaFloatComplex > (magma_int_t const dim, matrix_gpu< magmaFloatComplex > &dHamiltonian, std::vector< double > &eigenvalue_h)
 
template<>
magma_int_t Diagonalize< magmaDoubleComplex > (magma_int_t const dim, matrix_gpu< magmaDoubleComplex > &dHamiltonian, std::vector< double > &eigenvalue_h)
 
template<typename TypeComplex >
magma_int_t EigenMatrixElements (std::vector< double > &eigenvalue_h, magma_int_t const dim, matrix_gpu< TypeComplex > &dHamiltonian, matrix_gpu< TypeComplex > &dOperator, GPUconfig const &GPUconf)
 
template magma_int_t EigenMatrixElements< magmaFloatComplex > (std::vector< double > &eigenvalue_h, magma_int_t const dim, matrix_gpu< magmaFloatComplex > &dHamiltonian, matrix_gpu< magmaFloatComplex > &dOperator, GPUconfig const &GPUconf)
 
template magma_int_t EigenMatrixElements< magmaDoubleComplex > (std::vector< double > &eigenvalue_h, magma_int_t const dim, matrix_gpu< magmaDoubleComplex > &dHamiltonian, matrix_gpu< magmaDoubleComplex > &dOperator, GPUconfig const &GPUconf)
 
template<typename TypeComplex >
magma_int_t EigenExpValue (std::vector< double > &EXPvalue_h, std::vector< double > &eigenvalue_h, magma_int_t const dim, matrix_gpu< TypeComplex > &dHamiltonian, matrix_gpu< TypeComplex > &dOperator, GPUconfig const &GPUconf)
 
template magma_int_t EigenExpValue< magmaFloatComplex > (std::vector< double > &EXPvalue_h, std::vector< double > &eigenvalue_h, magma_int_t const dim, matrix_gpu< magmaFloatComplex > &dHamiltonian, matrix_gpu< magmaFloatComplex > &dOperator, GPUconfig const &GPUconf)
 
template magma_int_t EigenExpValue< magmaDoubleComplex > (std::vector< double > &EXPvalue_h, std::vector< double > &eigenvalue_h, magma_int_t const dim, matrix_gpu< magmaDoubleComplex > &dHamiltonian, matrix_gpu< magmaDoubleComplex > &dOperator, GPUconfig const &GPUconf)
 

Function Documentation

◆ Diagonalize()

template<typename TypeComplex >
magma_int_t Diagonalize ( magma_int_t const  dim,
matrix_gpu< TypeComplex > &  dHamiltonian,
std::vector< double > &  eigenvalue_h 
)

◆ Diagonalize< magmaDoubleComplex >()

template<>
magma_int_t Diagonalize< magmaDoubleComplex > ( magma_int_t const  dim,
matrix_gpu< magmaDoubleComplex > &  dHamiltonian,
std::vector< double > &  eigenvalue_h 
)
86 {
87 return magma_heevd_wrapper(MagmaVec, dim, dHamiltonian, eigenvalue_h);
88}

◆ Diagonalize< magmaFloatComplex >()

template<>
magma_int_t Diagonalize< magmaFloatComplex > ( magma_int_t const  dim,
matrix_gpu< magmaFloatComplex > &  dHamiltonian,
std::vector< double > &  eigenvalue_h 
)
75 {
76 std::vector<float> S_eigenvalue(dim, 0);
77 magma_int_t itemp, info = magma_heevd_wrapper(MagmaVec, dim, dHamiltonian, S_eigenvalue);
78 magma_int_t const CONST_ONE = 1;
79 lapackf77_slag2d(&CONST_ONE, &dim, &*S_eigenvalue.begin(), &CONST_ONE, &*eigenvalue_h.begin(),
80 &CONST_ONE, &itemp);
81 return info;
82}

◆ EigenExpValue()

template<typename TypeComplex >
magma_int_t EigenExpValue ( std::vector< double > &  EXPvalue_h,
std::vector< double > &  eigenvalue_h,
magma_int_t const  dim,
matrix_gpu< TypeComplex > &  dHamiltonian,
matrix_gpu< TypeComplex > &  dOperator,
GPUconfig const &  GPUconf 
)
127 {
128 debug_print("# " << __func__ << "_gpu: dim=" << dim);
129 magma_int_t info = EigenMatrixElements(eigenvalue_h, dim, dHamiltonian, dOperator, GPUconf);
130
131 std::vector<TypeComplex> vector(dim);
132 magma_getvector(dim, sizeof(TypeComplex), dOperator.ptr(), dOperator.LD() + 1, &*vector.begin(),
133 1, GPUconf.queue());
134
135#pragma omp parallel for
136 for(size_t i = 0; i < dim; ++i) {
137 EXPvalue_h[i] = (double)real(vector[i]);
138 if(isnan(EXPvalue_h[i])) {
139#pragma omp critical
140 std::cerr << "Error(" << __func__ << "): EXPvalue_h[" << i << "] = NaN." << std::endl;
141 }
142 }
143 return info;
144}
void queue(magma_queue_t x)
Definition mytypes.hpp:297
debug_print("# Determining GPU configuration.")
GPUconfig GPUconf(dim3(nBlock, nBlock, 1), dim3(nThread, nThread, 1), 0, queue)
magma_int_t EigenMatrixElements(std::vector< double > &eigenvalue_h, magma_int_t const dim, matrix_gpu< TypeComplex > &dHamiltonian, matrix_gpu< TypeComplex > &dOperator, GPUconfig const &GPUconf)
Definition statmech_gpu.cu:95

◆ EigenExpValue< magmaDoubleComplex >()

template magma_int_t EigenExpValue< magmaDoubleComplex > ( std::vector< double > &  EXPvalue_h,
std::vector< double > &  eigenvalue_h,
magma_int_t const  dim,
matrix_gpu< magmaDoubleComplex > &  dHamiltonian,
matrix_gpu< magmaDoubleComplex > &  dOperator,
GPUconfig const &  GPUconf 
)

◆ EigenExpValue< magmaFloatComplex >()

template magma_int_t EigenExpValue< magmaFloatComplex > ( std::vector< double > &  EXPvalue_h,
std::vector< double > &  eigenvalue_h,
magma_int_t const  dim,
matrix_gpu< magmaFloatComplex > &  dHamiltonian,
matrix_gpu< magmaFloatComplex > &  dOperator,
GPUconfig const &  GPUconf 
)

◆ EigenMatrixElements()

template<typename TypeComplex >
magma_int_t EigenMatrixElements ( std::vector< double > &  eigenvalue_h,
magma_int_t const  dim,
matrix_gpu< TypeComplex > &  dHamiltonian,
matrix_gpu< TypeComplex > &  dOperator,
GPUconfig const &  GPUconf 
)
97 {
98 debug_print("# " << __func__ << "_gpu: dim=" << dim);
99 magma_int_t const LD = dHamiltonian.LD();
100 magma_int_t const LDT = magma_roundup(dim, 32);
101 magma_int_t info = Diagonalize(dim, dHamiltonian, eigenvalue_h);
102 if(info != 0) return info;
103
104 matrix_gpu<TypeComplex> ztemp(LDT, dim);
105 matrixProduct_hemm(MagmaLeft, MagmaLower, dim, dim, dOperator, dHamiltonian, ztemp, GPUconf);
106 matrixProduct_gemm(MagmaConjTrans, MagmaNoTrans, dim, dim, dim, dHamiltonian, ztemp, dOperator,
107 GPUconf);
108 return info;
109}
magma_int_t Diagonalize(magma_int_t const dim, matrix_gpu< TypeComplex > &dHamiltonian, std::vector< double > &eigenvalue_h)

◆ EigenMatrixElements< magmaDoubleComplex >()

template magma_int_t EigenMatrixElements< magmaDoubleComplex > ( std::vector< double > &  eigenvalue_h,
magma_int_t const  dim,
matrix_gpu< magmaDoubleComplex > &  dHamiltonian,
matrix_gpu< magmaDoubleComplex > &  dOperator,
GPUconfig const &  GPUconf 
)

◆ EigenMatrixElements< magmaFloatComplex >()

template magma_int_t EigenMatrixElements< magmaFloatComplex > ( std::vector< double > &  eigenvalue_h,
magma_int_t const  dim,
matrix_gpu< magmaFloatComplex > &  dHamiltonian,
matrix_gpu< magmaFloatComplex > &  dOperator,
GPUconfig const &  GPUconf 
)

◆ EigenValues()

template<typename TypeComplex >
magma_int_t EigenValues ( std::vector< double > &  eigenvalue,
magma_int_t const  dim,
matrix_gpu< TypeComplex > &  dHamiltonian 
)

◆ EigenValues< magmaDoubleComplex >()

template<>
magma_int_t EigenValues< magmaDoubleComplex > ( std::vector< double > &  eigenvalue,
magma_int_t const  dim,
matrix_gpu< magmaDoubleComplex > &  dHamiltonian 
)
45 {
46 eigenvalue.resize(dim);
47 return magma_heevd_wrapper(MagmaNoVec, dim, dHamiltonian, eigenvalue);
48}

◆ EigenValues< magmaFloatComplex >()

template<>
magma_int_t EigenValues< magmaFloatComplex > ( std::vector< double > &  eigenvalue,
magma_int_t const  dim,
matrix_gpu< magmaFloatComplex > &  dHamiltonian 
)
34 {
35 eigenvalue.resize(dim);
36 std::vector<float> s_eigenvalue(dim);
37 magma_int_t itemp, info = magma_heevd_wrapper(MagmaNoVec, dim, dHamiltonian, s_eigenvalue);
38 constexpr magma_int_t CONST_ONE = 1;
39 lapackf77_slag2d(&CONST_ONE, &dim, &*s_eigenvalue.begin(), &CONST_ONE, &*eigenvalue.begin(),
40 &CONST_ONE, &itemp);
41 return info;
42}

◆ SpectralRange()

template<typename TypeComplex >
double SpectralRange ( double &  OpMin,
magma_int_t const  dim,
matrix_gpu< TypeComplex > &  dHamiltonian 
)

◆ SpectralRange< magmaDoubleComplex >()

template<>
double SpectralRange< magmaDoubleComplex > ( double &  OpMin,
magma_int_t const  dim,
matrix_gpu< magmaDoubleComplex > &  dHamiltonian 
)
62 {
63 std::vector<double> eigenvalue_h(dim);
64 magma_heevd_wrapper(MagmaNoVec, dim, dHamiltonian, eigenvalue_h);
65 OpMin = (double)eigenvalue_h[0];
66 return (double)(eigenvalue_h[dim - 1] - eigenvalue_h[0]);
67}

◆ SpectralRange< magmaFloatComplex >()

template<>
double SpectralRange< magmaFloatComplex > ( double &  OpMin,
magma_int_t const  dim,
matrix_gpu< magmaFloatComplex > &  dHamiltonian 
)
54 {
55 std::vector<float> eigenvalue_h(dim);
56 magma_heevd_wrapper(MagmaNoVec, dim, dHamiltonian, eigenvalue_h);
57 OpMin = (double)eigenvalue_h[0];
58 return (double)(eigenvalue_h[dim - 1] - eigenvalue_h[0]);
59}