37 Real reciprocal_space_multiplicity = planewave_basis_.
is_gamma_only() ? 2.0 : 1.0;
38 Real stress_xx = 0, stress_yx = 0, stress_yy = 0, stress_zx = 0, stress_zy = 0,
44 const auto& g_vector = planewave_basis_.
g_vectors()[g_vector_index];
45 Real g_vector_squared = g_vector.magnitude_squared;
48 Real hartree_stress_term = reciprocal_space_multiplicity *
49 std::norm(charge_density_g[g_vector_index]) /
51 stress_xx += hartree_stress_term * 2.0 * g_vector.g_cart.x * g_vector.g_cart.x /
53 stress_yx += hartree_stress_term * 2.0 * g_vector.g_cart.y * g_vector.g_cart.x /
55 stress_yy += hartree_stress_term * 2.0 * g_vector.g_cart.y * g_vector.g_cart.y /
57 stress_zx += hartree_stress_term * 2.0 * g_vector.g_cart.z * g_vector.g_cart.x /
59 stress_zy += hartree_stress_term * 2.0 * g_vector.g_cart.z * g_vector.g_cart.y /
61 stress_zz += hartree_stress_term * 2.0 * g_vector.g_cart.z * g_vector.g_cart.z /
67 result_.
hartree[0][0] = prefactor * stress_xx - hartree_energy / cell_volume;
68 result_.
hartree[1][0] = prefactor * stress_yx;
69 result_.
hartree[1][1] = prefactor * stress_yy - hartree_energy / cell_volume;
70 result_.
hartree[2][0] = prefactor * stress_zx;
71 result_.
hartree[2][1] = prefactor * stress_zy;
72 result_.
hartree[2][2] = prefactor * stress_zz - hartree_energy / cell_volume;
73 for (
int direction_a = 0; direction_a < 3; direction_a++) {
74 for (
int direction_b = 0; direction_b < 3; direction_b++) {
75 result_.
hartree[direction_a][direction_b] =
76 -result_.
hartree[direction_a][direction_b];