Skip to content

Commit 89d4264

Browse files
authored
Test: UT of read_pp_upf (#1817)
* Test: UT of read_pp_upf100 * update ut of read_pp
1 parent 21b326e commit 89d4264

File tree

6 files changed

+12933
-0
lines changed

6 files changed

+12933
-0
lines changed

source/module_cell/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,7 @@ if(ENABLE_COVERAGE)
1919
add_coverage(cell)
2020
endif()
2121

22+
if(BUILD_TESTING)
23+
add_subdirectory(test)
24+
endif()
25+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
remove_definitions(-D__LCAO)
2+
remove_definitions(-D__DEEPKS)
3+
remove_definitions(-D__CUDA)
4+
remove_definitions(-D__ROCM)
5+
6+
AddTest(
7+
TARGET cell_read_pp
8+
LIBS ${math_libs} base device
9+
SOURCES read_pp_test.cpp ../read_pp.cpp ../read_pp_upf201.cpp ../read_pp_upf100.cpp ../read_pp_vwr.cpp ../read_pp_blps.cpp ../../src_parallel/parallel_reduce.cpp ../../src_parallel/parallel_kpoints.cpp ../../src_parallel/parallel_global.cpp ../../src_parallel/parallel_common.cpp ../../module_io/output.cpp
10+
)
11+
12+
install(DIRECTORY support DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
#include "gtest/gtest.h"
2+
#include "gmock/gmock.h"
3+
4+
/************************************************
5+
* unit test of read_pp
6+
***********************************************/
7+
8+
/**
9+
* - Tested Functions:
10+
* - ReadUPF100
11+
* - read_pseudo_upf
12+
* - read 1.0.0 version of upf pseudopotential file
13+
* - read_pseudo_header
14+
* - read_pseudo_mesh
15+
* - read_pseudo_nl
16+
* - read_pseudo_local
17+
* - read_pseudo_pswfc
18+
* - read_pseudo_rhoatom
19+
* - read_pseudo_so
20+
* - print_pseudo_upf
21+
* - ReadUPF201
22+
* - read_pseudo_upf201
23+
* - read 2.0.1 version of upf pseudopotential file
24+
* - getnameval
25+
* - read_pseudo_upf201_r
26+
* - read_pseudo_upf201_rab
27+
* - read_pseudo_upf201_dij
28+
* - read_pseudo_upf201_rhoatom
29+
* - ReadUSppErr
30+
* - read_pseudo_nl
31+
* - read_pseudo_nlcc
32+
*/
33+
34+
#define private public
35+
#include "module_cell/read_pp.h"
36+
37+
class ReadPPTest : public testing::Test
38+
{
39+
protected:
40+
std::string output;
41+
};
42+
43+
TEST_F(ReadPPTest, ReadUPF100)
44+
{
45+
Pseudopot_upf* upf = new Pseudopot_upf;
46+
std::ifstream ifs;
47+
ifs.open("./support/Te.pbe-rrkj.UPF");
48+
upf->read_pseudo_upf(ifs);
49+
EXPECT_TRUE(upf->has_so); // has soc info
50+
EXPECT_EQ(upf->nv,0); // number of version
51+
EXPECT_EQ(upf->psd,"Te"); // element label
52+
EXPECT_EQ(upf->pp_type,"NC"); // pp_type
53+
EXPECT_FALSE(upf->tvanp); // not ultrasoft
54+
EXPECT_FALSE(upf->nlcc); // no Nonlinear core correction
55+
EXPECT_EQ(upf->xc_func,"PBE"); // Exchange-Correlation functional
56+
EXPECT_EQ(upf->zp,6); // Z valence
57+
EXPECT_DOUBLE_EQ(upf->etotps,-15.54533017755); // total energy
58+
EXPECT_DOUBLE_EQ(upf->ecutwfc,0.0); // suggested cutoff for wfc
59+
EXPECT_DOUBLE_EQ(upf->ecutrho,0.0); // suggested cutoff for rho
60+
EXPECT_EQ(upf->lmax,2); // max angular momentum component
61+
EXPECT_EQ(upf->mesh,1191); // Number of points in mesh
62+
EXPECT_EQ(upf->nwfc,3); // Number of wavefunctions
63+
EXPECT_EQ(upf->nbeta,3); // Number of projectors
64+
EXPECT_EQ(upf->els[0],"5S"); // label for i-th atomic orbital
65+
EXPECT_EQ(upf->els[1],"5P"); // label for i-th atomic orbital
66+
EXPECT_EQ(upf->els[2],"5D"); // label for i-th atomic orbital
67+
EXPECT_EQ(upf->lchi[0],0); // angluar momentum of each atomic orbital
68+
EXPECT_EQ(upf->lchi[1],1); // angluar momentum of each atomic orbital
69+
EXPECT_EQ(upf->lchi[2],2); // angluar momentum of each atomic orbital
70+
EXPECT_DOUBLE_EQ(upf->oc[0],2.0); // occupation of each atomic orbital
71+
EXPECT_DOUBLE_EQ(upf->oc[1],3.0); // occupation of each atomic orbital
72+
EXPECT_DOUBLE_EQ(upf->oc[2],1.0); // occupation of each atomic orbital
73+
EXPECT_DOUBLE_EQ(upf->r[0],1.75361916453E-05); // r
74+
EXPECT_DOUBLE_EQ(upf->r[upf->mesh-1],5.05901190442E+01); // r
75+
EXPECT_DOUBLE_EQ(upf->rab[0],2.19202395566E-07); // rab
76+
EXPECT_DOUBLE_EQ(upf->rab[upf->mesh-1],6.32376488053E-01); // rab
77+
EXPECT_DOUBLE_EQ(upf->vloc[0],-5.00890143222E+00); // vloc
78+
EXPECT_DOUBLE_EQ(upf->vloc[upf->mesh-1],-2.37200471955E-01); // vloc
79+
EXPECT_EQ(upf->lll[0],0); // BETA
80+
EXPECT_EQ(upf->kkbeta[0],957);
81+
EXPECT_DOUBLE_EQ(upf->beta(0,0),-1.82560984478E-03);
82+
EXPECT_DOUBLE_EQ(upf->beta(0,upf->kkbeta[0]-1),-1.61398366674E-03);
83+
EXPECT_EQ(upf->lll[1],0); // BETA
84+
EXPECT_EQ(upf->kkbeta[1],957);
85+
EXPECT_DOUBLE_EQ(upf->beta(1,0),1.51692136792E-03);
86+
EXPECT_DOUBLE_EQ(upf->beta(1,upf->kkbeta[1]-1),1.51458412218E-03);
87+
EXPECT_EQ(upf->lll[2],2); // BETA
88+
EXPECT_EQ(upf->kkbeta[2],957);
89+
EXPECT_DOUBLE_EQ(upf->beta(2,0),-3.10582746893E-13);
90+
EXPECT_DOUBLE_EQ(upf->beta(2,upf->kkbeta[2]-1),-4.17131335030E-04);
91+
EXPECT_EQ(upf->nd,4); // DIJ
92+
EXPECT_DOUBLE_EQ(upf->dion(0,0),-1.70394647943E-01);
93+
EXPECT_DOUBLE_EQ(upf->dion(0,1),-1.76521654672E-01);
94+
EXPECT_DOUBLE_EQ(upf->dion(1,1),-1.80323263809E-01);
95+
EXPECT_DOUBLE_EQ(upf->dion(2,2),1.16612440320E-02);
96+
EXPECT_DOUBLE_EQ(upf->chi(0,0),1.40252610787E-06); // PSWFC
97+
EXPECT_DOUBLE_EQ(upf->chi(0,upf->mesh-1),6.15962544650E-25);
98+
EXPECT_DOUBLE_EQ(upf->chi(1,0),7.65306256201E-11);
99+
EXPECT_DOUBLE_EQ(upf->chi(1,upf->mesh-1),1.44320361049E-17);
100+
EXPECT_DOUBLE_EQ(upf->chi(2,0),4.37015997370E-16);
101+
EXPECT_DOUBLE_EQ(upf->chi(2,upf->mesh-1),6.20093850585E-05);
102+
EXPECT_DOUBLE_EQ(upf->rho_at[0],3.93415898407E-12); // RhoAtom
103+
EXPECT_DOUBLE_EQ(upf->rho_at[upf->mesh-1],3.84516383534E-09);
104+
EXPECT_EQ(upf->nn[0],1); // nn
105+
EXPECT_EQ(upf->nn[1],2);
106+
EXPECT_EQ(upf->nn[2],3);
107+
EXPECT_DOUBLE_EQ(upf->jchi[0],0.0); // jchi
108+
EXPECT_DOUBLE_EQ(upf->jchi[1],0.0);
109+
EXPECT_NEAR(upf->jchi[3],0.0,1e-20);
110+
EXPECT_DOUBLE_EQ(upf->jjj[0],0.0); // jjj
111+
EXPECT_DOUBLE_EQ(upf->jjj[1],0.0);
112+
EXPECT_DOUBLE_EQ(upf->jjj[2],0.0);
113+
//EXPECT_EQ
114+
ifs.close();
115+
std::ofstream ofs;
116+
ofs.open("tmp");
117+
upf->print_pseudo_upf(ofs);
118+
ofs.close();
119+
ifs.open("tmp");
120+
getline(ifs, output);
121+
EXPECT_THAT(output, testing::HasSubstr("==== read_pseudo_upf ==="));
122+
ifs.close();
123+
delete upf;
124+
}
125+
126+
TEST_F(ReadPPTest, ReadUSppErr)
127+
{
128+
Pseudopot_upf* upf = new Pseudopot_upf;
129+
std::ifstream ifs;
130+
ifs.open("./support/Zn.pw91-n-van.UPF");
131+
//upf->read_pseudo_upf(ifs);
132+
testing::internal::CaptureStdout();
133+
EXPECT_EXIT(upf->read_pseudo_upf(ifs),
134+
::testing::ExitedWithCode(0),"");
135+
output = testing::internal::GetCapturedStdout();
136+
// test output on screening
137+
// EXPECT_THAT(output,testing::HasSubstr("this function is called"));
138+
EXPECT_THAT(output,testing::HasSubstr("Ultra Soft Pseudopotential not available yet."));
139+
ifs.close();
140+
delete upf;
141+
}
142+
143+
TEST_F(ReadPPTest, ReadUPF201)
144+
{
145+
Pseudopot_upf* upf = new Pseudopot_upf;
146+
std::ifstream ifs;
147+
ifs.open("./support/Cu_ONCV_PBE-1.0.upf");
148+
upf->read_pseudo_upf201(ifs);
149+
EXPECT_EQ(upf->psd,"Cu");
150+
EXPECT_EQ(upf->pp_type,"NC");
151+
EXPECT_FALSE(upf->has_so);
152+
EXPECT_FALSE(upf->nlcc);
153+
EXPECT_EQ(upf->xc_func,"PBE");
154+
EXPECT_EQ(upf->zp,19);
155+
EXPECT_DOUBLE_EQ(upf->etotps,-1.82394100797E+02);
156+
EXPECT_EQ(upf->lmax,2);
157+
EXPECT_EQ(upf->mesh,601); // mesh -= 1 at line 388 (why? Let's see)
158+
EXPECT_EQ(upf->nwfc,0);
159+
EXPECT_EQ(upf->nbeta,6);
160+
EXPECT_DOUBLE_EQ(upf->r[0],0.0);
161+
EXPECT_DOUBLE_EQ(upf->r[601],6.01);
162+
EXPECT_DOUBLE_EQ(upf->rab[0],0.01);
163+
EXPECT_DOUBLE_EQ(upf->rab[601],0.01);
164+
EXPECT_DOUBLE_EQ(upf->vloc[0],-5.3426582174E+01);
165+
EXPECT_DOUBLE_EQ(upf->vloc[601],-6.3227960060E+00);
166+
EXPECT_EQ(upf->lll[0],0);
167+
EXPECT_EQ(upf->kkbeta[0],196);
168+
EXPECT_DOUBLE_EQ(upf->beta(0,0),0.0);
169+
EXPECT_DOUBLE_EQ(upf->beta(0,601),0.0);
170+
EXPECT_EQ(upf->lll[1],0);
171+
EXPECT_EQ(upf->kkbeta[1],196);
172+
EXPECT_DOUBLE_EQ(upf->beta(1,0),0.0);
173+
EXPECT_DOUBLE_EQ(upf->beta(1,601),0.0);
174+
EXPECT_EQ(upf->lll[2],1);
175+
EXPECT_EQ(upf->kkbeta[2],196);
176+
EXPECT_DOUBLE_EQ(upf->beta(2,0),0.0);
177+
EXPECT_DOUBLE_EQ(upf->beta(2,601),0.0);
178+
EXPECT_EQ(upf->lll[3],1);
179+
EXPECT_EQ(upf->kkbeta[3],196);
180+
EXPECT_DOUBLE_EQ(upf->beta(3,0),0.0);
181+
EXPECT_DOUBLE_EQ(upf->beta(3,601),0.0);
182+
EXPECT_EQ(upf->lll[4],2);
183+
EXPECT_EQ(upf->kkbeta[4],196);
184+
EXPECT_DOUBLE_EQ(upf->beta(4,0),0.0);
185+
EXPECT_DOUBLE_EQ(upf->beta(4,601),0.0);
186+
EXPECT_EQ(upf->lll[5],2);
187+
EXPECT_EQ(upf->kkbeta[5],196);
188+
EXPECT_DOUBLE_EQ(upf->beta(5,0),0.0);
189+
EXPECT_DOUBLE_EQ(upf->beta(5,601),0.0);
190+
EXPECT_DOUBLE_EQ(upf->dion(0,0),-6.6178420255E+00);
191+
EXPECT_DOUBLE_EQ(upf->dion(5,5),-7.0938557228E+00);
192+
EXPECT_DOUBLE_EQ(upf->rho_at[0],0.0);
193+
EXPECT_DOUBLE_EQ(upf->rho_at[601],3.1742307110E-02);
194+
ifs.close();
195+
delete upf;
196+
}
197+
#undef private

0 commit comments

Comments
 (0)