4#include <sycl/sycl.hpp>
7namespace diagonalizer {
12 static sycl::queue queue{sycl::default_selector_v};
17 int number_of_plane_waves,
18 const double* kinetic_energy,
19 const std::complex<double>* psi,
20 std::complex<double>* hpsi) {
21 int total_elements = number_of_vectors * number_of_plane_waves;
22 if (total_elements == 0)
26 .parallel_for(sycl::range<1>(total_elements),
27 [=](sycl::id<1> idx) {
29 int g_index = index % number_of_plane_waves;
30 hpsi[index] = kinetic_energy[g_index] * psi[index];
36 int number_of_plane_waves,
37 const float* kinetic_energy,
38 const std::complex<float>* psi,
39 std::complex<float>* hpsi) {
40 int total_elements = number_of_vectors * number_of_plane_waves;
41 if (total_elements == 0)
45 .parallel_for(sycl::range<1>(total_elements),
46 [=](sycl::id<1> idx) {
48 int g_index = index % number_of_plane_waves;
49 hpsi[index] = kinetic_energy[g_index] * psi[index];
55 int number_of_plane_waves,
56 int local_smooth_grid_points,
57 const int* g_to_fft_mapping,
58 const int* minus_g_to_fft_mapping,
60 const std::complex<double>* psi,
61 std::complex<double>* fft_workspace) {
62 int total_elements = number_of_vectors * number_of_plane_waves;
63 if (total_elements == 0)
67 .memset(fft_workspace,
69 number_of_vectors * local_smooth_grid_points *
sizeof(std::complex<double>))
73 sycl::range<1>(total_elements),
74 [=](sycl::id<1> idx) {
76 int vector_index = index / number_of_plane_waves;
77 int g_index = index % number_of_plane_waves;
78 std::complex<double> val = psi[index];
79 int fft_index = g_to_fft_mapping[g_index];
81 fft_workspace[vector_index * local_smooth_grid_points + fft_index] = val;
83 if (is_gamma_only && g_index > 0 && minus_g_to_fft_mapping !=
nullptr) {
84 int fft_minus = minus_g_to_fft_mapping[g_index];
86 fft_workspace[vector_index * local_smooth_grid_points + fft_minus] =
95 int number_of_plane_waves,
96 int local_smooth_grid_points,
97 const int* g_to_fft_mapping,
98 const int* minus_g_to_fft_mapping,
100 const std::complex<float>* psi,
101 std::complex<float>* fft_workspace) {
102 int total_elements = number_of_vectors * number_of_plane_waves;
103 if (total_elements == 0)
107 .memset(fft_workspace,
109 number_of_vectors * local_smooth_grid_points *
sizeof(std::complex<float>))
113 sycl::range<1>(total_elements),
114 [=](sycl::id<1> idx) {
116 int vector_index = index / number_of_plane_waves;
117 int g_index = index % number_of_plane_waves;
118 std::complex<float> val = psi[index];
119 int fft_index = g_to_fft_mapping[g_index];
120 if (fft_index >= 0) {
121 fft_workspace[vector_index * local_smooth_grid_points + fft_index] = val;
123 if (is_gamma_only && g_index > 0 && minus_g_to_fft_mapping !=
nullptr) {
124 int fft_minus = minus_g_to_fft_mapping[g_index];
125 if (fft_minus >= 0) {
126 fft_workspace[vector_index * local_smooth_grid_points + fft_minus] =
135 int number_of_plane_waves,
136 int local_smooth_grid_points,
137 const int* g_to_fft_mapping,
138 const int* minus_g_to_fft_mapping,
140 const std::complex<double>* psi,
141 std::complex<float>* fft_workspace) {
142 int total_elements = number_of_vectors * number_of_plane_waves;
143 if (total_elements == 0)
147 .memset(fft_workspace,
149 number_of_vectors * local_smooth_grid_points *
sizeof(std::complex<float>))
153 sycl::range<1>(total_elements),
154 [=](sycl::id<1> idx) {
156 int vector_index = index / number_of_plane_waves;
157 int g_index = index % number_of_plane_waves;
158 std::complex<double> val = psi[index];
159 std::complex<float> val_single(
static_cast<float>(val.real()),
160 static_cast<float>(val.imag()));
161 int fft_index = g_to_fft_mapping[g_index];
162 if (fft_index >= 0) {
163 fft_workspace[vector_index * local_smooth_grid_points + fft_index] = val_single;
165 if (is_gamma_only && g_index > 0 && minus_g_to_fft_mapping !=
nullptr) {
166 int fft_minus = minus_g_to_fft_mapping[g_index];
167 if (fft_minus >= 0) {
168 fft_workspace[vector_index * local_smooth_grid_points + fft_minus] =
169 std::conj(val_single);
177 int local_smooth_grid_points,
178 const double* potential,
179 std::complex<double>* fft_workspace) {
180 int total_elements = number_of_vectors * local_smooth_grid_points;
181 if (total_elements == 0)
185 .parallel_for(sycl::range<1>(total_elements),
186 [=](sycl::id<1> idx) {
188 int grid_index = index % local_smooth_grid_points;
189 fft_workspace[index] *= potential[grid_index];
195 int local_smooth_grid_points,
196 const float* potential,
197 std::complex<float>* fft_workspace) {
198 int total_elements = number_of_vectors * local_smooth_grid_points;
199 if (total_elements == 0)
203 .parallel_for(sycl::range<1>(total_elements),
204 [=](sycl::id<1> idx) {
206 int grid_index = index % local_smooth_grid_points;
207 fft_workspace[index] *= potential[grid_index];
213 int number_of_plane_waves,
214 int local_smooth_grid_points,
215 const int* g_to_fft_mapping,
216 const std::complex<double>* fft_workspace,
217 std::complex<double>* hpsi) {
218 int total_elements = number_of_vectors * number_of_plane_waves;
219 if (total_elements == 0)
224 sycl::range<1>(total_elements),
225 [=](sycl::id<1> idx) {
227 int vector_index = index / number_of_plane_waves;
228 int g_index = index % number_of_plane_waves;
229 int fft_index = g_to_fft_mapping[g_index];
230 if (fft_index >= 0) {
232 fft_workspace[vector_index * local_smooth_grid_points + fft_index];
239 int number_of_plane_waves,
240 int local_smooth_grid_points,
241 const int* g_to_fft_mapping,
242 const std::complex<float>* fft_workspace,
243 std::complex<float>* hpsi) {
244 int total_elements = number_of_vectors * number_of_plane_waves;
245 if (total_elements == 0)
250 sycl::range<1>(total_elements),
251 [=](sycl::id<1> idx) {
253 int vector_index = index / number_of_plane_waves;
254 int g_index = index % number_of_plane_waves;
255 int fft_index = g_to_fft_mapping[g_index];
256 if (fft_index >= 0) {
258 fft_workspace[vector_index * local_smooth_grid_points + fft_index];
265 int number_of_plane_waves,
266 int local_smooth_grid_points,
267 const int* g_to_fft_mapping,
268 const std::complex<float>* fft_workspace,
269 std::complex<double>* hpsi) {
270 int total_elements = number_of_vectors * number_of_plane_waves;
271 if (total_elements == 0)
276 sycl::range<1>(total_elements),
277 [=](sycl::id<1> idx) {
279 int vector_index = index / number_of_plane_waves;
280 int g_index = index % number_of_plane_waves;
281 int fft_index = g_to_fft_mapping[g_index];
282 if (fft_index >= 0) {
283 std::complex<float> val =
284 fft_workspace[vector_index * local_smooth_grid_points + fft_index];
285 hpsi[index] += std::complex<double>(
static_cast<double>(val.real()),
286 static_cast<double>(val.imag()));
293 int number_of_plane_waves,
294 const double* eigenvalues,
295 const std::complex<double>* hamiltonian_ritz_vectors,
296 const std::complex<double>* overlap_ritz_vectors,
297 std::complex<double>* residual_wavefunctions) {
298 int total_elements = number_of_bands * number_of_plane_waves;
299 if (total_elements == 0)
303 .parallel_for(sycl::range<1>(total_elements),
304 [=](sycl::id<1> idx) {
306 int band_index = index / number_of_plane_waves;
307 residual_wavefunctions[index] =
308 hamiltonian_ritz_vectors[index] -
309 eigenvalues[band_index] * overlap_ritz_vectors[index];
315 int number_of_plane_waves,
316 const double* kinetic_energy_squared,
317 const double* eigenvalues,
318 const bool* band_converged,
320 std::complex<double>* residual_wavefunctions) {
321 int total_elements = number_of_bands * number_of_plane_waves;
322 if (total_elements == 0)
327 sycl::range<1>(total_elements),
328 [=](sycl::id<1> idx) {
330 int band_index = index / number_of_plane_waves;
331 if (band_converged[band_index]) {
334 int g_index = index % number_of_plane_waves;
335 double value_x = kinetic_energy_squared[g_index] - eigenvalues[band_index];
337 0.5 * (1.0 + value_x + std::sqrt(1.0 + (value_x - 1.0) * (value_x - 1.0)));
338 if (denominator < floor_value) {
339 denominator = floor_value;
341 residual_wavefunctions[index] /= denominator;
void launch_apply_preconditioner(int number_of_bands, int number_of_plane_waves, const double *kinetic_energy_squared, const double *eigenvalues, const bool *band_converged, double floor_value, std::complex< double > *residual_wavefunctions)
void launch_apply_kinetic_energy_single(int number_of_vectors, int number_of_plane_waves, const float *kinetic_energy, const std::complex< float > *psi, std::complex< float > *hpsi)
void launch_gather_fft_grid_to_g_single(int number_of_vectors, int number_of_plane_waves, int local_smooth_grid_points, const int *g_to_fft_mapping, const std::complex< float > *fft_workspace, std::complex< float > *hpsi)
void launch_apply_kinetic_energy(int number_of_vectors, int number_of_plane_waves, const double *kinetic_energy, const std::complex< double > *psi, std::complex< double > *hpsi)
void launch_multiply_potential(int number_of_vectors, int local_smooth_grid_points, const double *potential, std::complex< double > *fft_workspace)
void launch_multiply_potential_single(int number_of_vectors, int local_smooth_grid_points, const float *potential, std::complex< float > *fft_workspace)
void launch_gather_fft_grid_to_g_mixed(int number_of_vectors, int number_of_plane_waves, int local_smooth_grid_points, const int *g_to_fft_mapping, const std::complex< float > *fft_workspace, std::complex< double > *hpsi)
static sycl::queue get_sycl_queue()
void launch_scatter_g_to_fft_grid(int number_of_vectors, int number_of_plane_waves, int local_smooth_grid_points, const int *g_to_fft_mapping, const int *minus_g_to_fft_mapping, bool is_gamma_only, const std::complex< double > *psi, std::complex< double > *fft_workspace)
void launch_gather_fft_grid_to_g(int number_of_vectors, int number_of_plane_waves, int local_smooth_grid_points, const int *g_to_fft_mapping, const std::complex< double > *fft_workspace, std::complex< double > *hpsi)
void launch_compute_residuals(int number_of_bands, int number_of_plane_waves, const double *eigenvalues, const std::complex< double > *hamiltonian_ritz_vectors, const std::complex< double > *overlap_ritz_vectors, std::complex< double > *residual_wavefunctions)
void launch_scatter_g_to_fft_grid_mixed(int number_of_vectors, int number_of_plane_waves, int local_smooth_grid_points, const int *g_to_fft_mapping, const int *minus_g_to_fft_mapping, bool is_gamma_only, const std::complex< double > *psi, std::complex< float > *fft_workspace)
void launch_scatter_g_to_fft_grid_single(int number_of_vectors, int number_of_plane_waves, int local_smooth_grid_points, const int *g_to_fft_mapping, const int *minus_g_to_fft_mapping, bool is_gamma_only, const std::complex< float > *psi, std::complex< float > *fft_workspace)