Skip to content

Commit 15422e7

Browse files
rootroot
authored andcommitted
test: unittest of diago_cg
1 parent 126b36a commit 15422e7

File tree

5 files changed

+628
-0
lines changed

5 files changed

+628
-0
lines changed

source/src_pw/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,7 @@ add_library(
7878
OBJECT
7979
${objects}
8080
)
81+
82+
IF (BUILD_TESTING)
83+
add_subdirectory(test)
84+
endif()

source/src_pw/test/CMakeLists.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
remove_definitions(-D__MPI)
2+
#AddTest(
3+
# TARGET hsolver_david
4+
# LIBS ${math_libs} base
5+
# SOURCES diago_david_test.cpp ../diago_david.cpp ../../src_parallel/parallel_reduce.cpp
6+
#)
7+
8+
AddTest(
9+
TARGET hsolver_cg
10+
LIBS ${math_libs} base
11+
SOURCES diago_cg_test.cpp ../diago_cg.cpp ../../src_parallel/parallel_reduce.cpp
12+
)
13+
14+
install(FILES data-H DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

source/src_pw/test/data-H

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
26 (-0.0474889,-5.98146e-35) (-0.0280193,2.89495e-32) (5.78676e-16,2.6847e-17) (-8.43762e-16,-6.52942e-33) (-5.86471e-16,-4.05316e-33) (5.92884e-17,-3.16901e-17) (-2.77999e-16,-1.82753e-33) (-4.40321e-16,4.02117e-33) (-0.0709065,8.25339e-34) (2.37115e-16,3.83366e-33) (-1.04632e-16,-3.55692e-33) (-2.2187e-16,3.2618e-33) (2.14618e-16,-4.87513e-18) (-4.58924e-16,2.8576e-17) (-9.13223e-16,-8.65595e-18) (0.214964,1.31628e-17) (1.30968e-16,6.08416e-33) (1.71156e-16,-1.34484e-33) (0.0465178,2.84839e-18) (-4.23915e-16,-1.49579e-32) (1.77269e-16,-3.28385e-32) (2.74844e-17,3.21644e-18) (1.90814e-16,-2.09353e-32) (3.49559e-16,1.79037e-32) (1.88806e-16,-1.56835e-32) (0.0716488,4.38722e-18)
2+
(0.424032,-3.2732e-34) (-1.06087e-16,-1.89715e-17) (5.4383e-17,5.81737e-33) (3.34151e-16,-2.75547e-32) (-1.23395e-16,7.41127e-17) (5.62346e-16,-1.70969e-32) (5.28666e-16,-1.51023e-32) (0.065165,3.16122e-35) (3.96051e-16,1.14072e-32) (1.18459e-16,1.89175e-32) (-1.58035e-16,-2.55897e-33) (2.55826e-16,-1.51548e-17) (1.06935e-15,-8.65595e-18) (2.80911e-16,-4.62695e-17) (-0.356129,-2.18066e-17) (2.36278e-16,2.60983e-32) (2.3983e-16,2.73656e-32) (0.232009,1.42065e-17) (2.28285e-16,2.93821e-32) (3.10071e-16,5.39947e-32) (3.16242e-17,-5.73995e-18) (5.04886e-16,4.45276e-32) (-2.04316e-16,-9.57408e-33) (-2.48305e-16,-1.08767e-32) (0.0251635,1.54082e-18)
3+
(0.146957,1.31399e-33) (-1.62535e-16,1.67969e-32) (2.94738e-16,1.67123e-32) (0.141565,-2.70947e-32) (-6.45129e-16,-2.56986e-33) (-2.18602e-16,2.65993e-32) (-5.46687e-16,-3.16467e-18) (-1.51327e-16,-6.46626e-33) (-3.81222e-16,5.63908e-34) (-1.34612e-16,1.93975e-32) (0.216054,-7.6487e-33) (-0.214964,-1.31628e-17) (0.356129,2.18066e-17) (5.39227e-17,2.3971e-17) (-1.90037e-16,-4.37545e-34) (-4.04521e-16,-6.33318e-33) (7.70898e-17,-1.71135e-17) (-1.4844e-16,-1.85266e-32) (1.68293e-16,2.47808e-32) (0.0279895,1.71386e-18) (1.22735e-16,2.34995e-33) (2.61634e-17,2.41167e-33) (2.10379e-16,2.37239e-32) (-8.95418e-17,1.26103e-17)
4+
(0.312701,7.84939e-34) (-3.32519e-16,-7.36415e-33) (-7.43672e-16,7.57086e-33) (0.24062,1.97265e-32) (1.83077e-17,-8.72935e-19) (1.95724e-16,9.81099e-34) (3.37639e-16,3.75328e-18) (0.0789492,-2.3249e-33) (4.157e-16,-3.05308e-33) (-5.93188e-16,-8.91038e-33) (-5.88386e-16,-3.66575e-32) (-2.01584e-16,-2.1476e-32) (-1.66794e-17,-1.82772e-32) (-9.5994e-17,4.78307e-19) (-0.0424631,-2.60012e-18) (-3.38879e-17,-2.28861e-33) (2.79068e-16,6.25614e-19) (0.163829,1.00316e-17) (-7.54147e-17,7.01138e-34) (-0.0526523,-3.22402e-18) (9.79075e-17,7.23046e-18) (-9.92513e-17,-9.54732e-33) (-9.08101e-17,-1.60482e-32)
5+
(0.312701,-3.0334e-34) (5.9711e-17,1.73458e-32) (-1.1544e-16,-8.72935e-19) (0.24062,5.6256e-33) (-4.43856e-16,-1.21416e-33) (0.0789492,-8.86281e-33) (-8.66224e-16,3.75328e-18) (-1.67876e-16,-2.37266e-33) (-3.95898e-16,-2.85752e-33) (1.50964e-16,3.4194e-32) (-1.65291e-16,2.2817e-33) (2.65028e-16,-4.04614e-33) (-0.0424631,-2.60012e-18) (8.67741e-17,4.78307e-19) (6.57602e-17,-1.12596e-33) (0.163829,1.00316e-17) (5.37974e-17,6.25614e-19) (-3.20652e-17,-7.92726e-33) (-3.35558e-16,7.23046e-18) (-0.0526523,-3.22402e-18) (5.60834e-17,-1.83587e-33) (5.42393e-16,3.01394e-32)
6+
(1.20976,-2.32639e-33) (7.59831e-16,-9.04949e-33) (2.45483e-16,6.55067e-33) (-6.19376e-16,1.00241e-17) (-1.11585e-16,2.39001e-32) (-8.97765e-16,-1.37148e-32) (-1.01053e-16,-2.33083e-32) (-0.192847,-2.80152e-32) (-0.0465178,-2.84839e-18) (-0.232009,-1.42065e-17) (-2.12609e-16,-1.71135e-17) (1.12317e-16,3.168e-32) (1.73313e-16,2.04926e-32) (6.47682e-17,-4.37119e-17) (-2.15581e-16,-8.62907e-33) (2.68904e-16,2.62515e-32) (-0.250095,-1.53139e-17) (2.48529e-16,3.91618e-33) (6.68343e-17,2.06406e-32) (-2.49385e-16,-1.50537e-32) (2.81913e-17,-2.37999e-17)
7+
(0.660331,3.44485e-33) (-3.90348e-17,2.06439e-32) (3.62704e-16,1.95417e-33) (4.63226e-16,2.91842e-18) (0.0185087,9.69977e-33) (2.96702e-16,-1.32401e-32) (2.39382e-16,-6.56742e-33) (7.38876e-16,5.75451e-32) (3.04709e-16,-2.56747e-32) (3.46009e-17,3.23938e-33) (-3.2982e-16,6.25614e-19) (0.163829,1.00316e-17) (-1.84139e-16,-4.42106e-32) (-2.06471e-16,-4.21798e-18) (0.144744,8.86302e-18) (1.67903e-16,1.23696e-32) (-0.0395766,-2.42337e-18) (-2.4912e-16,-6.67763e-18) (1.53232e-16,7.82675e-33) (1.35766e-17,1.81976e-32)
8+
(0.660331,1.92374e-33) (-3.40987e-16,-1.54146e-34) (0.0185087,1.10368e-33) (-3.72492e-16,2.91842e-18) (2.66731e-16,-6.32381e-33) (2.19025e-17,7.74993e-33) (-3.13662e-16,-1.61523e-32) (3.80783e-16,2.00573e-32) (2.10767e-16,1.84222e-32) (0.163829,1.00316e-17) (-5.40008e-18,6.25614e-19) (-4.99145e-16,-5.34338e-32) (0.144744,8.86302e-18) (-1.05698e-16,-4.21798e-18) (3.3712e-17,-1.84847e-33) (1.781e-16,-6.67763e-18) (-0.0395766,-2.42337e-18) (-1.38483e-16,-3.00496e-33) (4.18154e-16,4.67357e-32)
9+
(1.23884,2.73293e-35) (1.13105e-16,4.79011e-34) (2.34979e-16,-1.4209e-33) (-3.46244e-16,-1.23851e-33) (6.10866e-16,2.87796e-18) (7.79049e-17,3.21644e-18) (1.21229e-18,-5.73995e-18) (-0.0279895,-1.71386e-18) (9.43205e-17,-4.49432e-33) (1.46343e-16,6.48356e-33) (0.250095,1.53139e-17) (5.33013e-17,1.48935e-34) (1.15596e-16,1.05152e-32) (6.97274e-17,9.40904e-18) (7.98969e-17,1.62904e-33) (3.65735e-17,7.68552e-33) (-5.28379e-17,-6.46957e-33) (0.134612,8.24259e-18)
10+
(1.22859,7.68618e-34) (-2.07783e-16,1.25751e-33) (-2.94045e-18,1.58571e-33) (-2.73645e-18,-1.96866e-33) (6.38371e-16,8.02718e-32) (3.10733e-16,2.08266e-32) (-5.45831e-16,-1.3719e-32) (0.0526523,3.22402e-18) (2.60782e-16,-7.23046e-18) (-2.87613e-16,-2.06475e-32) (0.0395766,2.42337e-18) (5.28034e-16,6.67763e-18) (-1.10932e-16,-3.57314e-33) (1.29459e-16,-4.94791e-18) (0.177144,1.0847e-17) (1.68073e-16,1.62939e-32) (9.23031e-18,-3.36819e-32)
11+
(1.22859,-6.07516e-34) (1.19815e-16,-2.07826e-34) (-3.64287e-16,-1.50852e-33) (2.1073e-16,3.48525e-32) (1.59871e-17,2.124e-32) (5.55579e-17,1.52527e-32) (-2.95039e-16,-7.23046e-18) (0.0526523,3.22402e-18) (-2.02793e-16,-2.55035e-32) (-1.23954e-16,6.67763e-18) (0.0395766,2.42337e-18) (4.87115e-17,1.38463e-32) (0.177144,1.0847e-17) (5.21922e-17,-4.94791e-18) (-2.48515e-17,-1.57978e-33) (3.29261e-16,-7.55987e-33)
12+
(1.32171,-1.67517e-34) (-7.00958e-17,3.71374e-33) (1.24903e-16,-1.55758e-32) (-3.66349e-16,-3.61155e-32) (-3.77888e-16,-7.029e-33) (7.82991e-17,1.05915e-32) (-5.72286e-17,-7.66391e-34) (3.0633e-16,7.60871e-33) (-2.48587e-16,-6.67721e-33) (-4.19015e-17,-3.14598e-33) (-1.05101e-16,-3.56636e-33) (2.09655e-16,1.07034e-32) (-6.30196e-17,5.35188e-33) (-8.44132e-17,1.69871e-17) (-5.88102e-17,1.1423e-33)
13+
(1.18947,6.45546e-35) (0.0716488,4.38722e-18) (0.0251635,1.54082e-18) (-1.61116e-16,-1.26103e-17) (1.90554e-18,1.91297e-32) (2.61279e-16,1.82322e-32) (1.13101e-16,2.37999e-17) (-1.84555e-17,-1.61031e-32) (1.51866e-16,1.38679e-32) (0.134612,8.24259e-18) (3.65251e-17,6.56993e-33) (-3.68098e-16,-2.14507e-32) (1.48233e-17,2.66945e-33) (-4.92914e-17,-5.26916e-18)
14+
(-0.0474889,-7.65301e-35) (-0.0280193,2.8874e-32) (4.23437e-18,2.6847e-17) (2.6647e-16,-7.49841e-33) (5.53321e-16,-4.33423e-33) (6.99735e-16,-3.16901e-17) (1.98879e-17,-8.82572e-33) (-5.74395e-16,-6.78911e-33) (-0.0709065,-1.81596e-33) (9.07881e-17,-2.20716e-33) (1.30451e-16,4.27953e-33) (2.7974e-16,-2.24255e-33) (1.62603e-16,4.87513e-18)
15+
(0.424032,-1.36665e-33) (-2.68466e-16,-1.89715e-17) (6.75927e-17,5.0123e-33) (1.41306e-16,-8.43829e-33) (8.45022e-17,7.41127e-17) (6.50911e-18,-2.27457e-32) (1.64858e-16,1.90246e-32) (0.065165,2.1455e-34) (-1.48934e-16,1.79699e-32) (-1.22886e-16,-7.00624e-33) (-4.66311e-16,3.73025e-33) (1.39142e-16,1.51548e-17)
16+
(0.146957,3.93848e-35) (6.04383e-16,9.4407e-33) (2.05714e-16,1.24564e-32) (0.141565,2.00358e-32) (6.88895e-16,6.75403e-33) (6.83021e-17,2.29084e-33) (-6.16351e-16,-3.16467e-18) (5.89351e-16,3.67307e-33) (-8.81093e-18,-1.40789e-33) (-1.1126e-16,1.14411e-32) (-0.216054,3.45391e-33)
17+
(0.312701,3.74832e-34) (-1.40854e-18,-8.86783e-33) (6.03412e-16,-1.32124e-32) (0.24062,4.87142e-32) (4.024e-17,8.72935e-19) (2.88174e-16,-1.9029e-33) (-7.61365e-17,3.75328e-18) (-0.0789492,-5.37485e-33) (3.59289e-16,-2.56208e-33) (-4.18307e-16,2.58937e-33)
18+
(0.312701,-4.23557e-34) (1.58178e-16,-6.6742e-33) (-1.16673e-16,8.72935e-19) (0.24062,2.37719e-33) (4.35233e-16,-1.06937e-33) (-0.0789492,5.88496e-33) (1.27478e-17,3.75328e-18) (-1.52311e-17,2.51922e-33) (-1.62819e-16,-4.88769e-33)
19+
(1.20976,6.23948e-33) (1.02659e-16,-9.75552e-33) (-7.79614e-18,5.26597e-33) (-2.16899e-16,1.00241e-17) (-4.91759e-16,1.30602e-32) (-1.29391e-16,-3.97436e-33) (-1.38314e-16,-3.95024e-32) (0.192847,4.96621e-33)
20+
(0.660331,-9.81783e-34) (-1.60625e-16,1.49615e-32) (-4.91805e-16,-8.82244e-33) (2.15867e-19,2.91842e-18) (-0.0185087,-9.5203e-33) (-7.61462e-17,-6.34575e-35) (-1.68142e-16,2.26047e-33)
21+
(0.660331,-2.43293e-33) (-3.27291e-16,2.37406e-33) (-0.0185087,-1.97481e-32) (-1.09533e-16,2.91842e-18) (-9.18355e-17,9.50719e-34) (4.43003e-16,-7.81445e-33)
22+
(1.23884,4.99495e-36) (2.6389e-16,-3.43386e-34) (-3.19608e-17,-2.28455e-34) (-2.31556e-16,1.56438e-34) (1.5205e-15,-2.87796e-18)
23+
(1.22859,1.03578e-34) (-1.31097e-17,1.34437e-33) (8.47444e-16,-1.64245e-33) (-3.45641e-17,-2.2015e-34)
24+
(1.22859,-6.9068e-34) (2.5374e-16,2.92867e-34) (-2.3071e-16,1.86947e-34)
25+
(1.32171,-1.85572e-34) (5.21062e-17,-4.79295e-33)
26+
(1.18947,-6.8792e-35)
Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
#include "../../module_base/inverse_matrix.h"
2+
#include "../../module_base/lapack_connector.h"
3+
#include "../diago_cg.h"
4+
#include "diago_mock.h"
5+
#include "mpi.h"
6+
7+
#include "gtest/gtest.h"
8+
#include <random>
9+
10+
/************************************************
11+
* unit test of functions in Diago_CG
12+
***********************************************/
13+
14+
/**
15+
* Class Diago_CG is an approach for eigenvalue problems
16+
* This unittest test the function Diago_CG::diag()
17+
* with different examples.
18+
* - the Hermite matrices (npw=500,1000) produced using random numbers and with sparsity of 0%, 60%, 80%
19+
* - the Hamiltonian matrix read from "data-H", produced by using out_hs in INPUT of a LCAO calculation
20+
* - a 2x2 Hermite matrix for learning and checking
21+
*
22+
* Note:
23+
* The test is passed when the eignvalues are closed to these calculated by LAPACK.
24+
* It is used together with a header file diago_mock.h.
25+
* The default Hermite matrix generated here is real symmetric, one can add an imaginary part
26+
* by changing two commented out lines in diago_mock.h.
27+
*
28+
*/
29+
30+
// call lapack in order to compare to cg
31+
void lapackEigen(int &npw, ModuleBase::ComplexMatrix &hm, double *e, bool outtime = false)
32+
{
33+
clock_t start, end;
34+
start = clock();
35+
int lwork = 2 * npw;
36+
std::complex<double> *work2 = new std::complex<double>[lwork];
37+
double *rwork = new double[3 * npw - 2];
38+
int info = 0;
39+
LapackConnector::zheev('V', 'U', npw, hm, npw, e, work2, lwork, rwork, &info);
40+
end = clock();
41+
if (outtime)
42+
std::cout << "Lapack Run time: " << (double)(end - start) / CLOCKS_PER_SEC << " S" << std::endl;
43+
delete[] rwork;
44+
delete[] work2;
45+
}
46+
47+
class DiagoCGPrepare
48+
{
49+
public:
50+
DiagoCGPrepare(int nband, int npw, bool sub, int sparsity, bool reorder, double eps, int maxiter, double threshold)
51+
: nband(nband), npw(npw), sub(sub), sparsity(sparsity), reorder(reorder), eps(eps), maxiter(maxiter),
52+
threshold(threshold)
53+
{
54+
}
55+
56+
int nband, npw, sparsity, maxiter, notconv;
57+
// eps is the convergence threshold within cg_diago
58+
double eps, avg_iter;
59+
bool sub; // do subspace diagonalization if true
60+
bool reorder;
61+
double threshold;
62+
// threshold is the comparison standard between cg and lapack
63+
64+
void CompareEigen(double *precondition)
65+
{
66+
// calculate eigenvalues by LAPACK;
67+
double *e_lapack = new double[npw];
68+
ModuleBase::ComplexMatrix ev = DIAGOTEST::hmatrix;
69+
lapackEigen(npw, ev, e_lapack, false);
70+
// initial guess of psi by perturbing lapack psi
71+
ModuleBase::ComplexMatrix psiguess(nband, npw);
72+
std::default_random_engine p(1);
73+
std::uniform_int_distribution<unsigned> u(1, 10);
74+
for (int i = 0; i < nband; i++)
75+
{
76+
for (int j = 0; j < npw; j++)
77+
{
78+
// psiguess(i,j) = ev(j,i)*(1+u(p)/10.);
79+
psiguess(i, j) = ev(j, i) * u(p) / 10.;
80+
}
81+
}
82+
// run cg
83+
clock_t start, end;
84+
start = clock();
85+
avg_iter = 0.0;
86+
notconv = 0;
87+
double *en = new double[npw];
88+
int ik = 1;
89+
int ntry = 0;
90+
Hamilt_PW hpw;
91+
Diago_CG cg(&hpw);
92+
do
93+
{
94+
if (sub && ntry > 0)
95+
{
96+
hpw.diagH_subspace(ik, nband, nband, psiguess, psiguess, en);
97+
}
98+
cg.diag(psiguess, en, npw, npw, nband, precondition, eps, maxiter, reorder, notconv, avg_iter);
99+
++ntry;
100+
} while ((ntry <= 5) && (notconv > 0));
101+
end = clock();
102+
// std::cout<<"diag Run time: "<<(double)(end - start) / CLOCKS_PER_SEC<<" S, notconv="
103+
// << notconv <<", avg_iter=" << avg_iter << std::endl;
104+
// std::cout << " ntry " << ntry << std::endl;
105+
for (int i = 0; i < nband; i++)
106+
{
107+
// std::cout << " en " << en[i] << " e_lapack " << e_lapack[i] << std::endl;
108+
EXPECT_NEAR(en[i], e_lapack[i], threshold);
109+
}
110+
111+
delete[] en;
112+
delete[] e_lapack;
113+
}
114+
};
115+
116+
class DiagoCGTest : public ::testing::TestWithParam<DiagoCGPrepare>
117+
{
118+
};
119+
120+
TEST_P(DiagoCGTest, RandomHamilt)
121+
{
122+
DiagoCGPrepare dcp = GetParam();
123+
// std::cout << "npw=" << dcp.npw << ", nband=" << dcp.nband << ", sparsity="
124+
// << dcp.sparsity << ", eps=" << dcp.eps << std::endl;
125+
126+
HPsi hpsi(dcp.nband, dcp.npw, dcp.sparsity);
127+
DIAGOTEST::hmatrix = hpsi.hamilt();
128+
DIAGOTEST::npw = dcp.npw;
129+
// ModuleBase::ComplexMatrix psi = hpsi.psi();
130+
dcp.CompareEigen(hpsi.precond());
131+
}
132+
133+
INSTANTIATE_TEST_SUITE_P(VerifyCG,
134+
DiagoCGTest,
135+
::testing::Values(
136+
// nband, npw, sub, sparsity, reorder, eps, maxiter, threshold
137+
DiagoCGPrepare(10, 500, true, 0, true, 1e-5, 50, 1e-3),
138+
DiagoCGPrepare(20, 500, true, 6, true, 1e-5, 50, 1e-3),
139+
DiagoCGPrepare(20, 1000, true, 8, true, 1e-5, 50, 1e-3),
140+
DiagoCGPrepare(40, 1000, true, 8, true, 1e-5, 50, 1e-3)));
141+
142+
// check that the mock class HPsi work well
143+
// in generating a Hermite matrix
144+
TEST(DiagoCGTest, Hamilt)
145+
{
146+
int dim = 2;
147+
int nbnd = 2;
148+
HPsi hpsi(nbnd, dim);
149+
ModuleBase::ComplexMatrix hm = hpsi.hamilt();
150+
EXPECT_EQ(hm.nr, 2);
151+
EXPECT_EQ(hm.nc, 2);
152+
EXPECT_EQ(hm(0, 0).imag(), 0.0);
153+
EXPECT_EQ(hm(1, 1).imag(), 0.0);
154+
EXPECT_EQ(conj(hm(1, 0)).real(), hm(0, 1).real());
155+
EXPECT_EQ(conj(hm(1, 0)).imag(), hm(0, 1).imag());
156+
}
157+
158+
// check that lapack work well
159+
// for an eigenvalue problem
160+
TEST(DiagoCGTest, ZHEEV)
161+
{
162+
int dim = 100;
163+
int nbnd = 2;
164+
HPsi hpsi(nbnd, dim);
165+
ModuleBase::ComplexMatrix hm = hpsi.hamilt();
166+
ModuleBase::ComplexMatrix hm_backup = hm;
167+
ModuleBase::ComplexMatrix eig(dim, dim);
168+
double e[dim];
169+
// using zheev to do a direct test
170+
lapackEigen(dim, hm, e);
171+
eig = transpose(hm, true) * hm_backup * hm;
172+
// for (int i=0;i<dim;i++) std::cout<< " e[i] "<<e[i]<<std::endl;
173+
for (int i = 0; i < dim; i++)
174+
{
175+
EXPECT_NEAR(e[i], eig(i, i).real(), 1e-10);
176+
}
177+
}
178+
179+
// cg for a 2x2 matrix
180+
TEST(DiagoCGTest, TwoByTwo)
181+
{
182+
int dim = 2;
183+
int nband = 2;
184+
ModuleBase::ComplexMatrix hm(2, 2);
185+
hm(0, 0) = std::complex<double>{4.0, 0.0};
186+
hm(0, 1) = std::complex<double>{1.0, 0.0};
187+
hm(1, 0) = std::complex<double>{1.0, 0.0};
188+
hm(1, 1) = std::complex<double>{3.0, 0.0};
189+
// nband, npw, sub, sparsity, reorder, eps, maxiter, threshold
190+
DiagoCGPrepare dcp(nband, dim, false, 0, true, 1e-4, 50, 1e-10);
191+
HPsi hpsi;
192+
hpsi.create(nband, dim);
193+
DIAGOTEST::hmatrix = hm;
194+
DIAGOTEST::npw = dim;
195+
dcp.CompareEigen(hpsi.precond());
196+
}
197+
198+
TEST(DiagoCGTest, readH)
199+
{
200+
// read Hamilt matrix from file data-H
201+
ModuleBase::ComplexMatrix hm;
202+
std::ifstream ifs;
203+
ifs.open("data-H");
204+
DIAGOTEST::readh(ifs, hm);
205+
ifs.close();
206+
int dim = hm.nr;
207+
int nband = 10; // not nband < dim, here dim = 26 in data-H
208+
// nband, npw, sub, sparsity, reorder, eps, maxiter, threshold
209+
DiagoCGPrepare dcp(nband, dim, true, 0, true, 1e-4, 50, 1e-3);
210+
HPsi hpsi;
211+
hpsi.create(nband, dim);
212+
DIAGOTEST::hmatrix = hpsi.hamilt();
213+
DIAGOTEST::npw = dim;
214+
dcp.CompareEigen(hpsi.precond());
215+
}
216+
217+
int main(int argc, char **argv)
218+
{
219+
220+
MPI_Init(&argc, &argv);
221+
222+
testing::InitGoogleTest(&argc, argv);
223+
int result = RUN_ALL_TESTS();
224+
225+
MPI_Finalize();
226+
227+
return result;
228+
}

0 commit comments

Comments
 (0)