|
3 | 3 | #include "../lr_util.h" |
4 | 4 | #include "../lr_util_print.h" |
5 | 5 |
|
| 6 | +inline void check_double_eq(double* data1, double* data2, int size) |
| 7 | +{ |
| 8 | + for (int i = 0;i < size;++i) |
| 9 | + EXPECT_NEAR(data1[i], data2[i], 1e-10); |
| 10 | +}; |
| 11 | +inline void check_double_eq(std::complex<double>* data1, std::complex<double>* data2, int size) |
| 12 | +{ |
| 13 | + for (int i = 0;i < size;++i) |
| 14 | + { |
| 15 | + EXPECT_NEAR(data1[i].real(), data2[i].real(), 1e-10); |
| 16 | + EXPECT_NEAR(data1[i].imag(), data2[i].imag(), 1e-10); |
| 17 | + } |
| 18 | +}; |
| 19 | +inline void check_norm_eq(std::complex<double>* data1, std::complex<double>* data2, int size) |
| 20 | +{ |
| 21 | + for (int i = 0;i < size;++i) |
| 22 | + { |
| 23 | + EXPECT_NEAR(std::norm(data1[i]), std::norm(data2[i]), 1e-10); |
| 24 | + } |
| 25 | +} |
| 26 | + |
6 | 27 | TEST(LR_Util, PsiWrapper) |
7 | 28 | { |
8 | 29 | int nk = 2; |
@@ -152,6 +173,62 @@ TEST(LR_Util, RWValue) |
152 | 173 | for (int i = 0;i < vec2.size();++i) { EXPECT_EQ(vec2[i], vec[i]); }; |
153 | 174 | } |
154 | 175 |
|
| 176 | +TEST(LR_Util, DiagScaLapackDouble) |
| 177 | +{ |
| 178 | + // setup the matrix |
| 179 | + const int dim = 14; |
| 180 | + std::vector<double> mat(dim * dim); |
| 181 | + set_rand(mat.data(), dim * dim); |
| 182 | + LR_Util::matsym(mat.data(), dim); |
| 183 | + Parallel_2D pmat; |
| 184 | + LR_Util::setup_2d_division(pmat, 1, dim, dim); |
| 185 | + std::vector<double> mat_local(pmat.get_local_size(), 0.0); |
| 186 | + LR_Util::set_local_from_global(pmat, mat.data(), mat_local.data()); |
| 187 | + |
| 188 | + // serial |
| 189 | + std::vector<double> eig(dim); |
| 190 | + LR_Util::diag_lapack(dim, mat.data(), eig.data()); |
| 191 | + |
| 192 | + // parallel |
| 193 | + std::vector<double> eig_para(dim); |
| 194 | + std::vector<double> eigvec_para(pmat.get_local_size()); |
| 195 | + LR_Util::diag_scalapack(dim, mat_local.data(), eig_para.data(), eigvec_para.data(), pmat.desc); |
| 196 | + |
| 197 | + // compare |
| 198 | + check_double_eq(eig_para.data(), eig.data(), dim); |
| 199 | + std::vector<double> eigvec_serial_local(pmat.get_local_size()); |
| 200 | + LR_Util::set_local_from_global(pmat, mat.data(), eigvec_serial_local.data()); |
| 201 | + check_double_eq(eigvec_para.data(), eigvec_serial_local.data(), pmat.get_local_size()); |
| 202 | +} |
| 203 | + |
| 204 | +TEST(LR_Util, DiagScaLapackComplex) |
| 205 | +{ |
| 206 | + // setup the matrix |
| 207 | + const int dim = 15; |
| 208 | + std::vector<std::complex<double>> mat(dim * dim); |
| 209 | + set_rand(mat.data(), dim * dim); |
| 210 | + LR_Util::matsym(mat.data(), dim); |
| 211 | + Parallel_2D pmat; |
| 212 | + LR_Util::setup_2d_division(pmat, 1, dim, dim); |
| 213 | + std::vector<std::complex<double>> mat_local(pmat.get_local_size(), 0.0); |
| 214 | + LR_Util::set_local_from_global(pmat, mat.data(), mat_local.data()); |
| 215 | + |
| 216 | + // serial |
| 217 | + std::vector<double> eig(dim); |
| 218 | + LR_Util::diag_lapack(dim, mat.data(), eig.data()); |
| 219 | + |
| 220 | + // parallel |
| 221 | + std::vector<double> eig_para(dim); |
| 222 | + std::vector<std::complex<double>> eigvec_para(pmat.get_local_size()); |
| 223 | + LR_Util::diag_scalapack(dim, mat_local.data(), eig_para.data(), eigvec_para.data(), pmat.desc); |
| 224 | + |
| 225 | + // compare |
| 226 | + check_double_eq(eig_para.data(), eig.data(), dim); |
| 227 | + std::vector<std::complex<double>> eigvec_serial_local(pmat.get_local_size()); |
| 228 | + LR_Util::set_local_from_global(pmat, mat.data(), eigvec_serial_local.data()); |
| 229 | + check_norm_eq(eigvec_para.data(), eigvec_serial_local.data(), pmat.get_local_size()); |
| 230 | +} |
| 231 | + |
155 | 232 | int main(int argc, char** argv) |
156 | 233 | { |
157 | 234 | srand(time(NULL)); // for random number generator |
|
0 commit comments