ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
vnl_tools_cu.hpp
Go to the documentation of this file.
1#ifndef W_ABACUS_DEVELOP_ABACUS_DEVELOP_SOURCE_source_pw_HAMILT_PWDFT_KERNELS_CUDA_VNL_TOOLS_CU_HPP
2#define W_ABACUS_DEVELOP_ABACUS_DEVELOP_SOURCE_source_pw_HAMILT_PWDFT_KERNELS_CUDA_VNL_TOOLS_CU_HPP
3
4#include <thrust/complex.h>
5#ifdef __CUDA
6#include <cuda_runtime.h>
7#endif
8#ifdef __ROCM
9#include <hip/hip_runtime.h>
10#endif
11
12namespace hamilt
13{
14
15template <typename FPTYPE>
16__device__ FPTYPE _polynomial_interpolation(const FPTYPE* table,
17 const int& dim1,
18 const int& dim2,
19 const int& tab_2,
20 const int& tab_3,
21 const FPTYPE& table_interval,
22 const FPTYPE& x)
23{
24 const FPTYPE position = x / table_interval;
25 const int iq = static_cast<int>(position);
26
27 const FPTYPE x0 = position - static_cast<FPTYPE>(iq);
28 const FPTYPE x1 = 1.0 - x0;
29 const FPTYPE x2 = 2.0 - x0;
30 const FPTYPE x3 = 3.0 - x0;
31 const FPTYPE y = table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0] * x1 * x2 * x3 / 6.0
32 + table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0 + 1] * x0 * x2 * x3 / 2.0
33 - table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0 + 2] * x1 * x0 * x3 / 2.0
34 + table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0 + 3] * x1 * x2 * x0 / 6.0;
35
36 return y;
37}
38
39template <typename FPTYPE>
40__device__ FPTYPE _polynomial_interpolation_nl(const FPTYPE* table,
41 const int& dim1,
42 const int& dim2,
43 const int& tab_2,
44 const int& tab_3,
45 const FPTYPE& table_interval,
46 const FPTYPE& x)
47{
48 const FPTYPE position = x / table_interval;
49 const int iq = static_cast<int>(position);
50
51 const FPTYPE x0 = position - static_cast<FPTYPE>(iq);
52 const FPTYPE x1 = 1.0 - x0;
53 const FPTYPE x2 = 2.0 - x0;
54 const FPTYPE x3 = 3.0 - x0;
55 const FPTYPE y = (table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0] * (-x2 * x3 - x1 * x3 - x1 * x2) / 6.0
56 + table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0 + 1] * (+x2 * x3 - x0 * x3 - x0 * x2) / 2.0
57 - table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0 + 2] * (+x1 * x3 - x0 * x3 - x0 * x1) / 2.0
58 + table[(dim1 * tab_2 + dim2) * tab_3 + iq + 0 + 3] * (+x1 * x2 - x0 * x2 - x0 * x1) / 6.0)
59 / table_interval;
60
61 return y;
62}
63
64} // namespace hamilt
65#endif
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