15#ifndef GRID_HIP_PROCESS_VAB_H
16#define GRID_HIP_PROCESS_VAB_H
28 const int n,
const T *cab) {
29 return cab[
idx(b) * n +
idx(a)];
38 const int i,
const T zeta,
39 const int n,
const T *cab) {
42 return 2.0 * zeta * aip1 - a.l[
i] * aim1;
49template <
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) {
83 const T axpm0 =
get_term(a, b, n, cab);
86 return 2.0 * zetb * (aip1 - rab[
i] * axpm0) - b.l[
i] * bim1;
93template <
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 *
124__device__ __inline__
double
126 const int j,
const T zeta,
const int n,
const T *cab) {
135template <
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 *
167__device__ __inline__
double
169 const int j,
const T zetb,
const T rab[3],
const int n,
176 get_term(a, b, n, cab) * rab[j] * rab[
i]) -
184template <
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 *
216template <
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);
230 hab -= zeta * b.l[k] *
get_term(a_up, 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.