Skip to content

Commit 83e4445

Browse files
committed
test: add comments and unittest for integral.h
range: source/module_base
1 parent 1ceca51 commit 83e4445

File tree

3 files changed

+130
-4
lines changed

3 files changed

+130
-4
lines changed

source/module_base/math_integral.h

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,14 @@ class Integral
1313
Integral();
1414
~Integral();
1515

16-
// Peize Lin accelerate 2017-10-02
16+
/**
17+
* @brief simpson integral. Peize Lin accelerate 2017-10-02
18+
*
19+
* @param mesh [in] mhe number of grid points (should be odd)
20+
* @param func [in] function to be integrated
21+
* @param rab [in] a list of interval
22+
* @param asum [out] the final integral value
23+
*/
1724
static void Simpson_Integral
1825
(
1926
const int mesh,
@@ -22,7 +29,14 @@ class Integral
2229
double &asum
2330
);
2431

25-
// Peize Lin accelerate 2017-10-02
32+
/**
33+
* @brief simpson integral. Peize Lin accelerate 2017-10-02
34+
*
35+
* @param mesh [in] mhe number of grid points (should be odd)
36+
* @param func [in] function to be integrated
37+
* @param dr [in] interval
38+
* @param asum [out] the final integral value
39+
*/
2640
static void Simpson_Integral
2741
(
2842
const int mesh,
@@ -31,7 +45,15 @@ class Integral
3145
double &asum
3246
);
3347

34-
// Peize Lin add 2016-02-14
48+
/**
49+
* @brief simpson integral. Peize Lin add 2016-02-14.
50+
*
51+
*
52+
* @param mesh [in] mhe number of grid points
53+
* @param func [in] function to be integrated
54+
* @param rab [in] a list of interval
55+
* @param asum [out] a list of integral value. asum[i] = integral from 0 to i. The max index of asum is an even (mesh-1 or mesh).
56+
*/
3557
static void Simpson_Integral_0toall
3658
(
3759
const int mesh,
@@ -40,7 +62,14 @@ class Integral
4062
double * const asum
4163
);
4264

43-
// Peize Lin add 2016-02-14
65+
/**
66+
* @brief simpson integral. Peize Lin add 2016-02-14.
67+
*
68+
* @param mesh [in] mhe number of grid points
69+
* @param func [in] function to be integrated
70+
* @param rab [in] r(i) * dr(i)/di * di or (b-a)/2n
71+
* @param asum [out] a list of integral value. sum[i] = integral from i to mesh-1.
72+
*/
4473
static void Simpson_Integral_alltoinf
4574
(
4675
const int mesh,

source/module_base/test/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,7 @@ AddTest(
1818
TARGET tool_quit
1919
SOURCES tool_quit_test.cpp
2020
)
21+
AddTest(
22+
TARGET base_integral
23+
SOURCES math_integral_test.cpp
24+
)
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#include"../math_integral.h"
2+
#include"gtest/gtest.h"
3+
4+
#include<math.h>
5+
6+
#define PI 3.14159265358979
7+
#define doublethreshold 1e-12
8+
9+
/************************************************
10+
* unit test of class Integral
11+
***********************************************/
12+
13+
/**
14+
* Tested functions:
15+
* - function Simpson_Integral with rab as input
16+
* - function Simpson_Integral with dr as input
17+
* - function Simpson_Integral_0toall
18+
* - function Simpson_Integral_alltoinf
19+
*
20+
*/
21+
22+
class Simpson_Integral_sinx : public testing::Test
23+
{
24+
/**
25+
* test the integral of sinx between [0,PI],
26+
* devide to mesh-1 parts
27+
*/
28+
29+
protected:
30+
31+
double* func;
32+
double* rab;
33+
int mesh = 10001;
34+
double dr = PI/(mesh-1);
35+
double asum;
36+
double* asumlist;
37+
double expectvalue = 2.0;
38+
39+
void SetUp()
40+
{
41+
func = new double[mesh];
42+
rab = new double[mesh];
43+
asumlist = new double[mesh];
44+
45+
for (int i=0;i<mesh;i++)
46+
{
47+
func[i] = sin(PI*i/(mesh-1));
48+
rab[i] = dr;
49+
}
50+
}
51+
52+
void TearDown()
53+
{
54+
delete func;
55+
delete rab;
56+
delete asumlist;
57+
}
58+
};
59+
60+
TEST_F(Simpson_Integral_sinx,Simpson_Integral_rab)
61+
{
62+
ModuleBase::Integral::Simpson_Integral(mesh,func,rab,asum);
63+
EXPECT_NEAR(asum,expectvalue,doublethreshold);
64+
EXPECT_DEATH(ModuleBase::Integral::Simpson_Integral(mesh-1,func,rab,asum),"");
65+
}
66+
67+
TEST_F(Simpson_Integral_sinx,Simpson_Integral_dr)
68+
{
69+
ModuleBase::Integral::Simpson_Integral(mesh,func,dr,asum);
70+
EXPECT_NEAR(asum,expectvalue,doublethreshold);
71+
EXPECT_DEATH(ModuleBase::Integral::Simpson_Integral(mesh-1,func,dr,asum),"");
72+
}
73+
74+
TEST_F(Simpson_Integral_sinx,Simpson_Integral_0toall)
75+
{
76+
int halfmesh = round(mesh/2);
77+
ModuleBase::Integral::Simpson_Integral_0toall(mesh,func,rab,asumlist);
78+
EXPECT_NEAR(asumlist[mesh-1],expectvalue,doublethreshold);
79+
EXPECT_NEAR(asumlist[mesh-2],1.9999999506519738901,doublethreshold);
80+
EXPECT_NEAR(asumlist[halfmesh],expectvalue/2.0,doublethreshold);
81+
EXPECT_NEAR(asumlist[halfmesh-1],0.99968584073722277505,doublethreshold);
82+
}
83+
84+
85+
TEST_F(Simpson_Integral_sinx,Simpson_Integral_alltoinf)
86+
{
87+
int halfmesh = round(mesh/2);
88+
ModuleBase::Integral::Simpson_Integral_alltoinf(mesh,func,rab,asumlist);
89+
EXPECT_NEAR(asumlist[0],expectvalue,doublethreshold);
90+
EXPECT_NEAR(asumlist[1],1.9999999506519754444,doublethreshold);
91+
EXPECT_NEAR(asumlist[halfmesh],expectvalue/2.0,doublethreshold);
92+
EXPECT_NEAR(asumlist[halfmesh-1],1.0003141592627740053,doublethreshold);
93+
}

0 commit comments

Comments
 (0)