QMCPACK
Gvectors< ST, LT > Struct Template Reference
+ Collaboration diagram for Gvectors< ST, LT >:

Public Types

using PosType = TinyVector< ST, 3 >
 
using ValueType = std::complex< ST >
 

Public Member Functions

 Gvectors (const std::vector< TinyVector< int, 3 >> &gvecs_in, const LT &Lattice_in, const TinyVector< int, 3 > &HalfG, size_t first, size_t last)
 
template<typename YLM_ENGINE , typename VVT >
void calc_Ylm_G (const size_t ig, YLM_ENGINE &Ylm, VVT &YlmG) const
 
template<typename VVT >
void calc_jlm_G (const int lmax, ST &r, const size_t ig, VVT &j_lm_G) const
 
template<typename PT , typename VT >
void calc_phase_shift (const PT &RSoA, const size_t ig, VT &phase_shift_real, VT &phase_shift_imag) const
 
template<typename PT >
ValueType evaluate_psi_r (const Vector< std::complex< double >> &cG, const PT &pos)
 
template<typename PT >
void evaluate_psi_r (const Vector< std::complex< double >> &cG, const PT &pos, ValueType &phi, ValueType &d2phi)
 
double evaluate_KE (const Vector< std::complex< double >> &cG)
 

Public Attributes

const LT & Lattice
 
std::vector< PosTypegvecs_cart
 
std::vector< ST > gmag
 
const size_t NumGvecs
 

Detailed Description

template<typename ST, typename LT>
struct qmcplusplus::Gvectors< ST, LT >

Definition at line 30 of file HybridRepSetReader.cpp.

Member Typedef Documentation

◆ PosType

using PosType = TinyVector<ST, 3>

Definition at line 32 of file HybridRepSetReader.cpp.

◆ ValueType

using ValueType = std::complex<ST>

Definition at line 33 of file HybridRepSetReader.cpp.

Constructor & Destructor Documentation

◆ Gvectors()

Gvectors ( const std::vector< TinyVector< int, 3 >> &  gvecs_in,
const LT &  Lattice_in,
const TinyVector< int, 3 > &  HalfG,
size_t  first,
size_t  last 
)
inline

Definition at line 40 of file HybridRepSetReader.cpp.

References qmcplusplus::dot(), Gvectors< ST, LT >::gmag, Gvectors< ST, LT >::gvecs_cart, CrystalLattice< T, D >::k_cart(), Gvectors< ST, LT >::NumGvecs, and qmcplusplus::sqrt().

45  : Lattice(Lattice_in), NumGvecs(last - first)
46  {
47  gvecs_cart.resize(NumGvecs);
48  gmag.resize(NumGvecs);
49 #pragma omp parallel for
50  for (size_t ig = 0; ig < NumGvecs; ig++)
51  {
52  TinyVector<ST, 3> gvec_shift;
53  gvec_shift = gvecs_in[ig + first] + HalfG * 0.5;
54  gvecs_cart[ig] = Lattice.k_cart(gvec_shift);
55  gmag[ig] = std::sqrt(dot(gvecs_cart[ig], gvecs_cart[ig]));
56  }
57  }
std::vector< PosType > gvecs_cart
MakeReturn< UnaryNode< FnSqrt, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t sqrt(const Vector< T1, C1 > &l)
Tensor< typename BinaryReturn< T1, T2, OpMultiply >::Type_t, D > dot(const AntiSymTensor< T1, D > &lhs, const AntiSymTensor< T2, D > &rhs)

Member Function Documentation

◆ calc_jlm_G()

void calc_jlm_G ( const int  lmax,
ST &  r,
const size_t  ig,
VVT &  j_lm_G 
) const
inline

Definition at line 69 of file HybridRepSetReader.cpp.

References qmcplusplus::bessel_steed_array_cpu(), and Gvectors< ST, LT >::gmag.

Referenced by HybridRepSetReader< SA >::create_atomic_centers_Gspace().

70  {
71  bessel_steed_array_cpu(lmax, gmag[ig] * r, j_lm_G.data());
72  for (size_t l = lmax; l > 0; l--)
73  for (size_t lm = l * l; lm < (l + 1) * (l + 1); lm++)
74  j_lm_G[lm] = j_lm_G[l];
75  }
void bessel_steed_array_cpu(const int lmax, const T x, T *jl)
Compute spherical bessel function from 0 to lmax.
Definition: Bessel.h:25

◆ calc_phase_shift()

void calc_phase_shift ( const PT &  RSoA,
const size_t  ig,
VT &  phase_shift_real,
VT &  phase_shift_imag 
) const
inline

Definition at line 78 of file HybridRepSetReader.cpp.

References Gvectors< ST, LT >::gvecs_cart, and qmcplusplus::sincos().

Referenced by HybridRepSetReader< SA >::create_atomic_centers_Gspace().

79  {
80  const ST* restrict px = RSoA.data(0);
81  const ST* restrict py = RSoA.data(1);
82  const ST* restrict pz = RSoA.data(2);
83  ST* restrict v_r = phase_shift_real.data();
84  ST* restrict v_i = phase_shift_imag.data();
85  const ST& gv_x = gvecs_cart[ig][0];
86  const ST& gv_y = gvecs_cart[ig][1];
87  const ST& gv_z = gvecs_cart[ig][2];
88 
89 #pragma omp simd aligned(px, py, pz, v_r, v_i : QMC_SIMD_ALIGNMENT)
90  for (size_t iat = 0; iat < RSoA.size(); iat++)
91  qmcplusplus::sincos(px[iat] * gv_x + py[iat] * gv_y + pz[iat] * gv_z, v_i + iat, v_r + iat);
92  }
std::vector< PosType > gvecs_cart
void sincos(T a, T *restrict s, T *restrict c)
sincos function wrapper
Definition: math.hpp:62

◆ calc_Ylm_G()

void calc_Ylm_G ( const size_t  ig,
YLM_ENGINE &  Ylm,
VVT &  YlmG 
) const
inline

Definition at line 60 of file HybridRepSetReader.cpp.

References TinyVector< T, D >::data(), Gvectors< ST, LT >::gmag, Gvectors< ST, LT >::gvecs_cart, and qmcplusplus::Ylm().

Referenced by HybridRepSetReader< SA >::create_atomic_centers_Gspace().

61  {
62  PosType Ghat(0.0, 0.0, 1.0);
63  if (gmag[ig] > 0)
64  Ghat = gvecs_cart[ig] / gmag[ig];
65  Ylm.evaluateV(Ghat[0], Ghat[1], Ghat[2], YlmG.data());
66  }
std::complex< T > Ylm(int l, int m, const TinyVector< T, 3 > &r)
calculates Ylm param[in] l angular momentum param[in] m magnetic quantum number param[in] r position ...
Definition: Ylm.h:89
QMCTraits::PosType PosType
std::vector< PosType > gvecs_cart

◆ evaluate_KE()

double evaluate_KE ( const Vector< std::complex< double >> &  cG)
inline

Definition at line 124 of file HybridRepSetReader.cpp.

References qmcplusplus::dot(), Gvectors< ST, LT >::gvecs_cart, and Gvectors< ST, LT >::NumGvecs.

125  {
126  assert(cG.size() == NumGvecs);
127  double KE = 0;
128  for (size_t ig = 0; ig < NumGvecs; ig++)
129  KE += dot(gvecs_cart[ig], gvecs_cart[ig]) * (cG[ig].real() * cG[ig].real() + cG[ig].imag() * cG[ig].imag());
130  return KE / 2.0;
131  }
std::vector< PosType > gvecs_cart
Tensor< typename BinaryReturn< T1, T2, OpMultiply >::Type_t, D > dot(const AntiSymTensor< T1, D > &lhs, const AntiSymTensor< T2, D > &rhs)

◆ evaluate_psi_r() [1/2]

ValueType evaluate_psi_r ( const Vector< std::complex< double >> &  cG,
const PT &  pos 
)
inline

Definition at line 95 of file HybridRepSetReader.cpp.

References qmcplusplus::dot(), Gvectors< ST, LT >::gvecs_cart, Gvectors< ST, LT >::NumGvecs, qmcplusplus::Units::time::s, and qmcplusplus::sincos().

96  {
97  assert(cG.size() == NumGvecs);
98  std::complex<ST> val(0.0, 0.0);
99  for (size_t ig = 0; ig < NumGvecs; ig++)
100  {
101  ST s, c;
102  qmcplusplus::sincos(dot(gvecs_cart[ig], pos), &s, &c);
103  ValueType pw0(c, s);
104  val += cG[ig] * pw0;
105  }
106  return val;
107  }
std::complex< ST > ValueType
std::vector< PosType > gvecs_cart
void sincos(T a, T *restrict s, T *restrict c)
sincos function wrapper
Definition: math.hpp:62
Tensor< typename BinaryReturn< T1, T2, OpMultiply >::Type_t, D > dot(const AntiSymTensor< T1, D > &lhs, const AntiSymTensor< T2, D > &rhs)

◆ evaluate_psi_r() [2/2]

void evaluate_psi_r ( const Vector< std::complex< double >> &  cG,
const PT &  pos,
ValueType phi,
ValueType d2phi 
)
inline

Definition at line 110 of file HybridRepSetReader.cpp.

References qmcplusplus::dot(), Gvectors< ST, LT >::gvecs_cart, Gvectors< ST, LT >::NumGvecs, qmcplusplus::Units::time::s, and qmcplusplus::sincos().

111  {
112  assert(cG.size() == NumGvecs);
113  d2phi = phi = 0.0;
114  for (size_t ig = 0; ig < NumGvecs; ig++)
115  {
116  ST s, c;
117  qmcplusplus::sincos(dot(gvecs_cart[ig], pos), &s, &c);
118  ValueType pw0(c, s);
119  phi += cG[ig] * pw0;
120  d2phi += cG[ig] * pw0 * (-dot(gvecs_cart[ig], gvecs_cart[ig]));
121  }
122  }
std::complex< ST > ValueType
std::vector< PosType > gvecs_cart
void sincos(T a, T *restrict s, T *restrict c)
sincos function wrapper
Definition: math.hpp:62
Tensor< typename BinaryReturn< T1, T2, OpMultiply >::Type_t, D > dot(const AntiSymTensor< T1, D > &lhs, const AntiSymTensor< T2, D > &rhs)

Member Data Documentation

◆ gmag

◆ gvecs_cart

◆ Lattice

const LT& Lattice

Definition at line 35 of file HybridRepSetReader.cpp.

◆ NumGvecs


The documentation for this struct was generated from the following file: