ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
vnl_tools.hpp
Go to the documentation of this file.
1#ifndef W_ABACUS_DEVELOP_ABACUS_DEVELOP_SOURCE_source_pw_HAMILT_PWDFT_KERNELS_VNL_TOOLS_HPP
2#define W_ABACUS_DEVELOP_ABACUS_DEVELOP_SOURCE_source_pw_HAMILT_PWDFT_KERNELS_VNL_TOOLS_HPP
3
4namespace hamilt
5{
6template <typename FPTYPE>
7static inline FPTYPE _polynomial_interpolation(const FPTYPE* table,
8 const int& dim1,
9 const int& dim2,
10 const int& tab_2,
11 const int& tab_3,
12 const FPTYPE& table_interval,
13 const FPTYPE& x)
14{
15 const FPTYPE position = x / table_interval;
16 const int iq = static_cast<int>(position);
17
18 const FPTYPE x0 = position - static_cast<FPTYPE>(iq);
19 const FPTYPE x1 = 1.0 - x0;
20 const FPTYPE x2 = 2.0 - x0;
21 const FPTYPE x3 = 3.0 - x0;
22 const FPTYPE y = table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0] * x1 * x2 * x3 / 6.0
23 + table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0 + 1] * x0 * x2 * x3 / 2.0
24 - table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0 + 2] * x1 * x0 * x3 / 2.0
25 + table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0 + 3] * x1 * x2 * x0 / 6.0;
26
27 // ModuleBase::timer::tick("PolyInt","Poly_Interpo_2");
28 return y;
29}
30
31template <typename FPTYPE>
32static inline FPTYPE _polynomial_interpolation_nl(const FPTYPE* table,
33 const int& dim1,
34 const int& dim2,
35 const int& tab_2,
36 const int& tab_3,
37 const FPTYPE& table_interval,
38 const FPTYPE& x)
39{
40 const FPTYPE position = x / table_interval;
41 const int iq = static_cast<int>(position);
42
43 const FPTYPE x0 = position - static_cast<FPTYPE>(iq);
44 const FPTYPE x1 = 1.0 - x0;
45 const FPTYPE x2 = 2.0 - x0;
46 const FPTYPE x3 = 3.0 - x0;
47 const FPTYPE y = (table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0] * (-x2 * x3 - x1 * x3 - x1 * x2) / 6.0
48 + table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0 + 1] * (+x2 * x3 - x0 * x3 - x0 * x2) / 2.0
49 - table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0 + 2] * (+x1 * x3 - x0 * x3 - x0 * x1) / 2.0
50 + table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0 + 3] * (+x1 * x2 - x0 * x2 - x0 * x1) / 6.0)
51 / table_interval;
52
53 return y;
54}
55
56} // namespace hamilt
57#endif
double x[440]
Definition sincos.cpp:28
Definition hamilt.h:12
__device__ FPTYPE _polynomial_interpolation(const FPTYPE *table, const int &dim1, const int &dim2, const int &tab_2, const int &tab_3, const FPTYPE &table_interval, const FPTYPE &x)
Definition vnl_tools_cu.hpp:16
__device__ FPTYPE _polynomial_interpolation_nl(const FPTYPE *table, const int &dim1, const int &dim2, const int &tab_2, const int &tab_3, const FPTYPE &table_interval, const FPTYPE &x)
Definition vnl_tools_cu.hpp:40