Skip to content

Commit e6b9cf9

Browse files
authored
Merge pull request #804 from pxlxingliang/develop
<test>: add the unit test of diago_david.h
2 parents 7e080bf + f03c3e0 commit e6b9cf9

File tree

5 files changed

+537
-0
lines changed

5 files changed

+537
-0
lines changed

source/src_pw/CMakeLists.txt

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

source/src_pw/test/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
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+
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: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
#include"../diago_david.h"
2+
#include"../diago_cg.h"
3+
#include"./diago_mock.h"
4+
#include"gtest/gtest.h"
5+
#include"mpi.h"
6+
7+
#include "../../module_base/inverse_matrix.h"
8+
#include "../../module_base/lapack_connector.h"
9+
10+
#define CONVTHRESHOLD 1e-3
11+
#define DETAILINFO false
12+
13+
14+
/************************************************
15+
* unit test of class Diago_David
16+
***********************************************/
17+
18+
/**
19+
* Class Diago_David is used to solve the eigenvalues
20+
* This unittest test the function Diago_David::diag()
21+
* with different examples.
22+
* - the hamilt matrix (npw=100,500,1000) produced by random with sparsity of 90%
23+
* - the hamilt matrix (npw=100,500,1000) produced by random with sparsity of 50%
24+
* - the hamilt matrix (npw=100,500,1000) produced by random with sparsity of 0%
25+
* - the hamilt matrix read from "data-H"
26+
*
27+
* The test is passed when the eignvalues are closed to these calculated by LAPACK.
28+
*
29+
*/
30+
31+
//mock the ddot_real function
32+
double Diago_CG::ddot_real(int const&, std::complex<double> const*, std::complex<double> const*, bool) {};
33+
34+
//use lapack to calcualte eigenvalue of matrix hm
35+
//NOTE: after finish this function, hm stores the eigen vectors.
36+
void lapackEigen(int &npw, ModuleBase::ComplexMatrix &hm, ModuleBase::ComplexMatrix &ev,double * e, bool outtime=false)
37+
{
38+
int lwork = 2 * npw;
39+
std::complex<double> *work2= new std::complex<double>[lwork];
40+
double* rwork = new double[3*npw-2];
41+
int info = 0;
42+
43+
ModuleBase::ComplexMatrix tmp = hm;
44+
45+
clock_t start,end;
46+
start = clock();
47+
LapackConnector::zheev('V', 'U', npw, tmp, npw, e, work2, lwork, rwork, &info);
48+
end = clock();
49+
if (outtime) std::cout<<"Lapack Run time: "<<(double)(end - start) / CLOCKS_PER_SEC<<" S"<<std::endl;
50+
51+
ev = tmp;
52+
53+
delete [] rwork;
54+
delete [] work2;
55+
}
56+
57+
class DiagoDavPrepare
58+
{
59+
public:
60+
DiagoDavPrepare(int nband, int npw, int sparsity, int order,double eps,int maxiter):
61+
nband(nband),npw(npw),sparsity(sparsity),order(order),eps(eps),maxiter(maxiter) {}
62+
63+
int nband, npw, sparsity, order, maxiter, notconv;
64+
double eps, avg_iter;
65+
66+
void CompareEigen(ModuleBase::ComplexMatrix &psi, double *precondition)
67+
{
68+
//calculate eigenvalues by LAPACK;
69+
double* e_lapack = new double[npw];
70+
ModuleBase::ComplexMatrix ev;
71+
lapackEigen(npw, DIAGOTEST::hmatrix, ev, e_lapack,DETAILINFO);
72+
73+
//do Diago_David::diag()
74+
double* en = new double[npw];
75+
76+
Hamilt_PW hpw;
77+
Diago_David dav(&hpw);
78+
clock_t start,end;
79+
start = clock();
80+
dav.diag(psi,en,npw,nband,precondition,order,eps,maxiter,notconv,avg_iter);
81+
end = clock();
82+
if (DETAILINFO) std::cout<<"diag Run time: "<<(double)(end - start) / CLOCKS_PER_SEC<<" S, notconv="
83+
<< notconv << ", avg_iter=" << avg_iter << std::endl;
84+
85+
for(int i=0;i<nband;i++)
86+
{
87+
EXPECT_NEAR(en[i],e_lapack[i],CONVTHRESHOLD);
88+
}
89+
90+
delete [] en;
91+
delete [] e_lapack;
92+
}
93+
};
94+
95+
class DiagoDavTest : public ::testing::TestWithParam<DiagoDavPrepare> {};
96+
97+
TEST_P(DiagoDavTest,RandomHamilt)
98+
{
99+
DiagoDavPrepare ddp = GetParam();
100+
if (DETAILINFO) std::cout << "npw=" << ddp.npw << ", nband=" << ddp.nband << ", sparsity="
101+
<< ddp.sparsity << ", eps=" << ddp.eps << std::endl;
102+
103+
HPsi hpsi(ddp.nband,ddp.npw,ddp.sparsity);
104+
DIAGOTEST::hmatrix = hpsi.hamilt();
105+
DIAGOTEST::npw = ddp.npw;
106+
ModuleBase::ComplexMatrix psi = hpsi.psi();
107+
108+
ddp.CompareEigen(psi,hpsi.precond());
109+
}
110+
111+
112+
INSTANTIATE_TEST_SUITE_P(VerifyDiag,DiagoDavTest,::testing::Values(
113+
//DiagoDavPrepare(int nband, int npw, int sparsity, int order,double eps,int maxiter)
114+
DiagoDavPrepare(10,100,0,4,1e-5,500),
115+
DiagoDavPrepare(10,100,5,4,1e-5,500),
116+
DiagoDavPrepare(10,100,9,4,1e-5,500),
117+
DiagoDavPrepare(20,500,0,4,1e-5,500),
118+
DiagoDavPrepare(20,500,5,4,1e-5,500),
119+
DiagoDavPrepare(20,500,9,4,1e-5,500),
120+
DiagoDavPrepare(10,1000,8,4,1e-5,500)
121+
//DiagoDavPrepare(20,2000,8,4,1e-5,500)
122+
));
123+
124+
TEST(DiagoDavRealSystemTest,dataH)
125+
{
126+
ModuleBase::ComplexMatrix hmatrix;
127+
std::ifstream ifs("data-H");
128+
DIAGOTEST::readh(ifs,hmatrix);
129+
DIAGOTEST::hmatrix = hmatrix;
130+
DIAGOTEST::npw = hmatrix.nc;
131+
132+
DiagoDavPrepare ddp(10,DIAGOTEST::npw,0,2,1e-5,500);
133+
HPsi hpsi(10,DIAGOTEST::npw);
134+
ModuleBase::ComplexMatrix psi = hpsi.psi();
135+
136+
ddp.CompareEigen(psi,hpsi.precond());
137+
}
138+
139+
int main(int argc, char **argv)
140+
{
141+
MPI_Init(&argc, &argv);
142+
testing::InitGoogleTest(&argc, argv);
143+
int result = RUN_ALL_TESTS();
144+
MPI_Finalize();
145+
return result;
146+
}

0 commit comments

Comments
 (0)