15 #ifndef GRID_HIP_PROCESS_VAB_H
16 #define GRID_HIP_PROCESS_VAB_H
28 const int n,
const T *cab) {
38 const int i,
const T
zeta,
39 const int n,
const T *cab) {
42 return 2.0 *
zeta * aip1 -
a.l[
i] * aim1;
49 template <
bool compute_tau,
typename T>
50 __device__ __inline__
double
52 const T zetb,
const int n,
const T *cab) {
57 for (
int k = 0; k < 3; k++) {
59 auto a_down =
down(k,
a);
61 auto b_down =
down(k,
b);
62 force += 0.5 *
a.l[k] *
b.l[k] *
80 __device__ __inline__
double
82 const T zetb,
const T rab[3],
const int n,
const T *cab) {
86 return 2.0 * zetb * (aip1 - rab[
i] * axpm0) -
b.l[
i] * bim1;
93 template <
bool compute_tau,
typename T>
95 const int i,
const T
zeta,
const T zetb,
96 const T rab[3],
const int n,
const T *cab) {
101 for (
int k = 0; k < 3; k++) {
102 const auto a_up =
up(k,
a);
103 const auto a_down =
down(k,
a);
104 const auto b_up =
up(k,
b);
105 const auto b_down =
down(k,
b);
106 force += 0.5 *
a.l[k] *
b.l[k] *
108 force -=
zeta *
b.l[k] *
110 force -=
a.l[k] * zetb *
112 force += 2.0 *
zeta * zetb *
123 template <
typename T>
124 __device__ __inline__
double
126 const int j,
const T
zeta,
const int n,
const T *cab) {
135 template <
bool compute_tau,
typename T>
137 const int i,
const int j,
const T
zeta,
138 const T zetb,
const int n,
const T *cab) {
144 for (
int k = 0; k < 3; k++) {
145 const auto a_up =
up(k,
a);
146 const auto a_down =
down(k,
a);
147 const auto b_up =
up(k,
b);
148 const auto b_down =
down(k,
b);
149 virial += 0.5 *
a.l[k] *
b.l[k] *
155 virial += 2.0 *
zeta * zetb *
166 template <
typename T>
167 __device__ __inline__
double
169 const int j,
const T zetb,
const T rab[3],
const int n,
184 template <
bool compute_tau,
typename T>
185 __device__ __inline__
double
187 const T
zeta,
const T zetb,
const T rab[3],
const int n,
194 for (
int k = 0; k < 3; k++) {
195 const auto a_up =
up(k,
a);
196 const auto a_down =
down(k,
a);
197 const auto b_up =
up(k,
b);
198 const auto b_down =
down(k,
b);
199 virial += 0.5 *
a.l[k] *
b.l[k] *
201 virial -=
zeta *
b.l[k] *
203 virial -=
a.l[k] * zetb *
205 virial += 2.0 *
zeta * zetb *
216 template <
bool compute_tau,
typename T>
218 const T
zeta,
const T zetb,
const int n,
224 for (
int k = 0; k < 3; k++) {
225 const auto a_up =
up(k,
a);
226 const auto a_down =
down(k,
a);
227 const auto b_up =
up(k,
b);
228 const auto b_down =
down(k,
b);
229 hab += 0.5 *
a.l[k] *
b.l[k] *
get_term(a_down, b_down, n, cab);
231 hab -=
a.l[k] * zetb *
get_term(a_down, b_up, n, cab);
232 hab += 2.0 *
zeta * zetb *
get_term(a_up, b_up, n, cab);
242 bool calculate_virial,
251 if (calculate_forces || calculate_virial) {
257 if (calculate_virial) {
static void const int const int i
__device__ __inline__ double get_virial_a_normal(const orbital &a, const orbital &b, const int i, const int j, const T zeta, const int n, const T *cab)
Returns element i,j of virial on atom a for compute_tau=false.
__device__ __inline__ double get_virial_b(const orbital &a, const orbital &b, const int i, const int j, const T zeta, const T zetb, const T rab[3], const int n, const T *cab)
Returns element i,j of virial on atom b.
__device__ __inline__ double get_force_b_normal(const orbital &a, const orbital &b, const int i, const T zetb, const T rab[3], const int n, const T *cab)
Returns i'th component of force on atom b for compute_tau=false.
__device__ __inline__ T get_virial_a(const orbital &a, const orbital &b, const int i, const int j, const T zeta, const T zetb, const int n, const T *cab)
Returns element i,j of virial on atom a.
ldiffs_value process_get_ldiffs(bool calculate_forces, bool calculate_virial, bool compute_tau)
Returns difference in angular momentum range for given flags.
__device__ __inline__ double get_virial_b_normal(const orbital &a, const orbital &b, const int i, const int j, const T zetb, const T rab[3], const int n, const T *cab)
Returns element i,j of virial on atom b for compute_tau=false.
__inline__ __device__ orbital down(const int i, const orbital &a)
Decrease i'th component of given orbital angular momentum.
__device__ __inline__ T get_hab(const orbital &a, const orbital &b, const T zeta, const T zetb, const int n, const T *cab)
Returns element i,j of hab matrix.
__device__ __inline__ double get_force_a(const orbital &a, const orbital &b, const int i, const T zeta, const T zetb, const int n, const T *cab)
Returns i'th component of force on atom a.
__device__ __inline__ T get_force_a_normal(const orbital &a, const orbital &b, const int i, const T zeta, const int n, const T *cab)
Returns i'th component of force on atom a for compute_tau=false.
__inline__ __device__ int idx(const orbital a)
Return coset index of given orbital angular momentum.
__device__ __inline__ orbital up(const int i, const orbital &a)
Increase i'th component of given orbital angular momentum.
__device__ __inline__ T get_term(const orbital &a, const orbital &b, const int n, const T *cab)
Returns matrix element cab[idx(b)][idx(a)].
__device__ __inline__ T get_force_b(const orbital &a, const orbital &b, const int i, const T zeta, const T zetb, const T rab[3], const int n, const T *cab)
Returns i'th component of force on atom b.
Differences in angular momentum.
Orbital angular momentum.