QMCPACK
ApplyPhaseC2C.hpp
Go to the documentation of this file.
1 //////////////////////////////////////////////////////////////////////////////////////
2 // This file is distributed under the University of Illinois/NCSA Open Source License.
3 // See LICENSE file in top directory for details.
4 //
5 // Copyright (c) 2023 QMCPACK developers.
6 //
7 // File developed by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
8 //
9 // File created by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
10 //////////////////////////////////////////////////////////////////////////////////////
11 
12 
14 
15 namespace qmcplusplus
16 {
17 namespace C2C
18 {
19 template<typename ST, typename TT>
20 inline void assign_v(ST x,
21  ST y,
22  ST z,
23  TT* restrict results_scratch_ptr,
24  const ST* restrict offload_scratch_ptr,
25  const ST* restrict myKcart_ptr,
26  size_t myKcart_padded_size,
27  size_t first_spo,
28  int index)
29 {
30  const ST* restrict kx = myKcart_ptr;
31  const ST* restrict ky = myKcart_ptr + myKcart_padded_size;
32  const ST* restrict kz = myKcart_ptr + myKcart_padded_size * 2;
33 
34  const ST* restrict val = offload_scratch_ptr;
35  TT* restrict psi = results_scratch_ptr;
36 
37  //phase
38  ST s, c, p = -(x * kx[index] + y * ky[index] + z * kz[index]);
39  omptarget::sincos(p, &s, &c);
40 
41  const ST val_r = val[index * 2];
42  const ST val_i = val[index * 2 + 1];
43  psi[first_spo + index] = TT(val_r * c - val_i * s, val_i * c + val_r * s);
44 }
45 
46 /** assign_vgl
47  */
48 template<typename ST, typename TT>
49 inline void assign_vgl(ST x,
50  ST y,
51  ST z,
52  TT* restrict results_scratch_ptr,
53  size_t orb_padded_size,
54  const ST* mKK_ptr,
55  const ST* restrict offload_scratch_ptr,
56  size_t spline_padded_size,
57  const ST G[9],
58  const ST* myKcart_ptr,
59  size_t myKcart_padded_size,
60  size_t first_spo,
61  int index)
62 {
63  constexpr ST two(2);
64  const ST &g00 = G[0], &g01 = G[1], &g02 = G[2], &g10 = G[3], &g11 = G[4], &g12 = G[5], &g20 = G[6], &g21 = G[7],
65  &g22 = G[8];
66 
67  const ST* restrict k0 = myKcart_ptr;
68  const ST* restrict k1 = myKcart_ptr + myKcart_padded_size;
69  const ST* restrict k2 = myKcart_ptr + myKcart_padded_size * 2;
70 
71  const ST* restrict val = offload_scratch_ptr + spline_padded_size * SoAFields3D::VAL;
72  const ST* restrict g0 = offload_scratch_ptr + spline_padded_size * SoAFields3D::GRAD0;
73  const ST* restrict g1 = offload_scratch_ptr + spline_padded_size * SoAFields3D::GRAD1;
74  const ST* restrict g2 = offload_scratch_ptr + spline_padded_size * SoAFields3D::GRAD2;
75  const ST* restrict lcart = offload_scratch_ptr + spline_padded_size * SoAFields3D::LAPL;
76 
77  const size_t jr = index << 1;
78  const size_t ji = jr + 1;
79 
80  const ST kX = k0[index];
81  const ST kY = k1[index];
82  const ST kZ = k2[index];
83  const ST val_r = val[jr];
84  const ST val_i = val[ji];
85 
86  //phase
87  ST s, c, p = -(x * kX + y * kY + z * kZ);
88  omptarget::sincos(p, &s, &c);
89 
90  //dot(PrimLattice.G,myG[j])
91  const ST dX_r = g00 * g0[jr] + g01 * g1[jr] + g02 * g2[jr];
92  const ST dY_r = g10 * g0[jr] + g11 * g1[jr] + g12 * g2[jr];
93  const ST dZ_r = g20 * g0[jr] + g21 * g1[jr] + g22 * g2[jr];
94 
95  const ST dX_i = g00 * g0[ji] + g01 * g1[ji] + g02 * g2[ji];
96  const ST dY_i = g10 * g0[ji] + g11 * g1[ji] + g12 * g2[ji];
97  const ST dZ_i = g20 * g0[ji] + g21 * g1[ji] + g22 * g2[ji];
98 
99  // \f$\nabla \psi_r + {\bf k}\psi_i\f$
100  const ST gX_r = dX_r + val_i * kX;
101  const ST gY_r = dY_r + val_i * kY;
102  const ST gZ_r = dZ_r + val_i * kZ;
103  const ST gX_i = dX_i - val_r * kX;
104  const ST gY_i = dY_i - val_r * kY;
105  const ST gZ_i = dZ_i - val_r * kZ;
106 
107  const ST lap_r = lcart[jr] + mKK_ptr[index] * val_r + two * (kX * dX_i + kY * dY_i + kZ * dZ_i);
108  const ST lap_i = lcart[ji] + mKK_ptr[index] * val_i - two * (kX * dX_r + kY * dY_r + kZ * dZ_r);
109 
110  TT* restrict psi = results_scratch_ptr;
111  TT* restrict dpsi_x = results_scratch_ptr + orb_padded_size;
112  TT* restrict dpsi_y = results_scratch_ptr + orb_padded_size * 2;
113  TT* restrict dpsi_z = results_scratch_ptr + orb_padded_size * 3;
114  TT* restrict d2psi = results_scratch_ptr + orb_padded_size * 4;
115 
116  const size_t psiIndex = first_spo + index;
117  psi[psiIndex] = TT(c * val_r - s * val_i, c * val_i + s * val_r);
118  d2psi[psiIndex] = TT(c * lap_r - s * lap_i, c * lap_i + s * lap_r);
119  dpsi_x[psiIndex] = TT(c * gX_r - s * gX_i, c * gX_i + s * gX_r);
120  dpsi_y[psiIndex] = TT(c * gY_r - s * gY_i, c * gY_i + s * gY_r);
121  dpsi_z[psiIndex] = TT(c * gZ_r - s * gZ_i, c * gZ_i + s * gZ_r);
122 }
123 } // namespace C2C
124 } // namespace qmcplusplus
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
void assign_v(ST x, ST y, ST z, TT *restrict results_scratch_ptr, const ST *restrict offload_scratch_ptr, const ST *restrict myKcart_ptr, size_t myKcart_padded_size, size_t first_spo, int index)
void assign_vgl(ST x, ST y, ST z, TT *restrict results_scratch_ptr, size_t orb_padded_size, const ST *mKK_ptr, const ST *restrict offload_scratch_ptr, size_t spline_padded_size, const ST G[9], const ST *myKcart_ptr, size_t myKcart_padded_size, size_t first_spo, int index)
assign_vgl
void sincos(T a, T *restrict s, T *restrict c)
sincos function wrapper
Definition: math.hpp:62
handle math function mapping inside OpenMP offload regions.