38 const Matrix3x3& reciprocal_lattice_vectors =
41 Real reciprocal_space_multiplicity = planewave_basis_.
is_gamma_only() ? 2.0 : 1.0;
53 for (
int kpoint_index = 0; kpoint_index < number_of_kpoints; kpoint_index++) {
54 int kpoint_state_index = spin_index * number_of_kpoints + kpoint_index;
62 const auto& plane_wave_indices_kpoint =
64 Vector3D kpoint_coordinates_crystal = kpoint_grid_[kpoint_index].coordinates;
65 Real kpoint_weight = kpoint_grid_[kpoint_index].weight;
68 Vector3D kpoint_coordinates_cartesian;
69 for (
int direction = 0; direction < 3; direction++) {
70 kpoint_coordinates_cartesian[direction] =
71 kpoint_coordinates_crystal.
x * reciprocal_lattice_vectors[0][direction] +
72 kpoint_coordinates_crystal.
y * reciprocal_lattice_vectors[1][direction] +
73 kpoint_coordinates_crystal.
z * reciprocal_lattice_vectors[2][direction];
76 for (
int band_index = 0; band_index < number_of_bands; band_index++) {
77 Real occupation = scf_state_.
occupation(kpoint_state_index, band_index);
81 for (
int g_vector_index = 0; g_vector_index < number_of_plane_waves;
83 const auto& g_vector =
84 planewave_basis_.
g_vectors()[plane_wave_indices_kpoint[g_vector_index]];
86 kpoint_plus_g_vector.
x =
87 (kpoint_coordinates_cartesian.
x + g_vector.g_cart.x) *
89 kpoint_plus_g_vector.
y =
90 (kpoint_coordinates_cartesian.
y + g_vector.g_cart.y) *
92 kpoint_plus_g_vector.
z =
93 (kpoint_coordinates_cartesian.
z + g_vector.g_cart.z) *
96 Real wavefunction_coefficient_squared =
98 kpoint_state_index, band_index, g_vector_index));
100 for (
int direction_a = 0; direction_a < 3; direction_a++) {
101 for (
int direction_b = direction_a; direction_b < 3; direction_b++) {
102 result_.
kinetic[direction_a][direction_b] +=
103 reciprocal_space_multiplicity * kpoint_weight * occupation *
105 kpoint_plus_g_vector[direction_a] *
106 kpoint_plus_g_vector[direction_b] *
107 wavefunction_coefficient_squared /
115 for (
int direction_a = 0; direction_a < 3; direction_a++) {
116 for (
int direction_b = direction_a + 1; direction_b < 3; direction_b++) {
117 result_.
kinetic[direction_b][direction_a] =
118 result_.
kinetic[direction_a][direction_b];