40 void solve(
int kpoint_index_state,
42 int number_of_plane_waves,
44 const std::vector<int>& g_vector_indices,
45 const std::vector<Real>& kinetic_energy_squared,
46 const std::vector<Real>& real_space_potential,
47 const Crystal& crystal_structure,
53 std::vector<Complex> hamiltonian_matrix(number_of_plane_waves * number_of_plane_waves,
57 for (
int g_index = 0; g_index < number_of_plane_waves; g_index++) {
58 hamiltonian_matrix[g_index + g_index * number_of_plane_waves] =
59 kinetic_energy_squared[g_index];
68 for (
int plane_wave_index_jg = 0; plane_wave_index_jg < number_of_plane_waves;
69 plane_wave_index_jg++) {
70 std::vector<Complex> psi_g(number_of_grid_points,
Complex(0.0, 0.0));
71 const auto& g_vector_j =
72 planewave_basis.
g_vectors()[g_vector_indices[plane_wave_index_jg]];
73 int miller_x_j =
static_cast<int>(std::round(g_vector_j.miller.x));
74 int miller_y_j =
static_cast<int>(std::round(g_vector_j.miller.y));
75 int miller_z_j =
static_cast<int>(std::round(g_vector_j.miller.z));
76 if (std::abs(miller_x_j) <= fft_dimension_x / 2 &&
77 std::abs(miller_y_j) <= fft_dimension_y / 2 &&
78 std::abs(miller_z_j) <= fft_dimension_z / 2) {
80 miller_x_j, miller_y_j, miller_z_j);
81 psi_g[fft_grid_index] =
Complex(1.0, 0.0);
86 for (
int grid_point_index = 0; grid_point_index < number_of_grid_points;
88 psi_g[grid_point_index] =
Complex(real_space_potential[grid_point_index], 0.0) *
89 psi_g[grid_point_index];
94 for (
int g_index = 0; g_index < number_of_plane_waves; g_index++) {
95 const auto& g_vector_i = planewave_basis.
g_vectors()[g_vector_indices[g_index]];
96 int miller_x_i =
static_cast<int>(std::round(g_vector_i.miller.x));
97 int miller_y_i =
static_cast<int>(std::round(g_vector_i.miller.y));
98 int miller_z_i =
static_cast<int>(std::round(g_vector_i.miller.z));
99 if (std::abs(miller_x_i) <= fft_dimension_x / 2 &&
100 std::abs(miller_y_i) <= fft_dimension_y / 2 &&
101 std::abs(miller_z_i) <= fft_dimension_z / 2) {
103 miller_x_i, miller_y_i, miller_z_i);
104 hamiltonian_matrix[g_index + plane_wave_index_jg * number_of_plane_waves] +=
105 psi_g[fft_grid_index_i];
123 if (kpoint_index <
static_cast<int>(cached_projector_map_.size()) &&
124 cached_projector_map_[kpoint_index] !=
nullptr) {
125 kleinman_bylander_potential_ptr = cached_projector_map_[kpoint_index];
127 Vector3D kpoint_coordinates = kpoint_grid[kpoint_index].coordinates;
135 number_of_plane_waves,
137 computed_projectors);
138 kleinman_bylander_potential_ptr = &computed_projectors;
140 const auto& kleinman_bylander_potential = *kleinman_bylander_potential_ptr;
142 int combined_projector_index = 0;
143 for (
int atom_index = 0; atom_index < crystal_structure.
number_of_atoms(); atom_index++) {
145 int number_of_projectors =
149 int projector_index_start = combined_projector_index;
150 std::vector<int> projector_angular_momenta, projector_magnetic_projections,
151 projector_beta_indices;
152 for (
int beta_index = 0; beta_index < number_of_projectors; beta_index++) {
153 int angular_momentum =
155 species_type_index, beta_index);
157 projector_angular_momenta.push_back(angular_momentum);
158 projector_magnetic_projections.push_back(magnetic_projection);
159 projector_beta_indices.push_back(beta_index);
160 combined_projector_index++;
163 int number_of_projectors_for_atom =
static_cast<int>(projector_angular_momenta.size());
165 for (
int projector_index_a = 0; projector_index_a < number_of_projectors_for_atom;
166 projector_index_a++) {
167 for (
int projector_index_b = 0; projector_index_b < number_of_projectors_for_atom;
168 projector_index_b++) {
169 Real d_matrix_element_value =
175 if (std::abs(d_matrix_element_value) <
179 int combined_projector_index_a = projector_index_start + projector_index_a;
180 int combined_projector_index_b = projector_index_start + projector_index_b;
182 for (
int g_index = 0; g_index < number_of_plane_waves; g_index++) {
183 for (
int plane_wave_index_jg = 0;
184 plane_wave_index_jg < number_of_plane_waves;
185 plane_wave_index_jg++) {
186 hamiltonian_matrix[g_index +
187 plane_wave_index_jg * number_of_plane_waves] +=
188 d_matrix_element_value *
189 kleinman_bylander_potential[combined_projector_index_a][g_index] *
190 std::conj(kleinman_bylander_potential[combined_projector_index_b]
191 [plane_wave_index_jg]);
200 pseudopotential_quantum_system,
201 kleinman_bylander_potential,
204 std::vector<Complex> overlap_matrix;
205 overlap_operator->build_dense_matrix(number_of_plane_waves, overlap_matrix);
212 number_of_plane_waves * number_of_plane_waves);
214 number_of_plane_waves * number_of_plane_waves);
216 std::vector<Real> lapack_eigenvalues(number_of_plane_waves);
217 std::vector<Complex> eigenvectors(number_of_plane_waves * number_of_plane_waves);
228 subspace_diagonalizer_->solve(number_of_plane_waves,
229 hamiltonian_matrix.data(),
230 overlap_matrix.data(),
231 lapack_eigenvalues.data(),
235 for (
int band_index = 0; band_index < number_of_bands; band_index++) {
237 kpoint_index_state, band_index, lapack_eigenvalues[band_index]);
240 for (
int g_index = 0; g_index < number_of_plane_waves; g_index++) {
241 band_data[g_index] = eigenvectors[band_index * number_of_plane_waves + g_index];