29 template<
typename CHI_T,
typename CHI_VT>
30 CHI_T solve_rpa_PH(CHI_VT chi0_wk, array_contiguous_view<std::complex<double>, 4> U_arr) {
32 using scalar_t = chi_wk_t::scalar_t;
34 size_t nb = chi0_wk.target_shape()[0];
36 auto chi_wk = make_gf(chi0_wk);
40 auto U = make_matrix_view(group_indices_view(U_arr, idx_group<0, 1>, idx_group<3, 2>));
42 auto I = nda::eye<scalar_t>(U.shape()[0]);
44 auto meshes_mpi = mpi_view(chi0_wk.mesh());
46#pragma omp parallel for
47 for (
unsigned int idx = 0; idx < meshes_mpi.size(); idx++){
48 auto &[w, k] = meshes_mpi[idx];
50 array<scalar_t, 4> chi_arr{nb, nb, nb, nb};
51 array<scalar_t, 4> chi0_arr{chi0_wk[w, k]};
54 auto chi = make_matrix_view(group_indices_view(chi_arr, idx_group<0, 1>, idx_group<3, 2>));
55 auto chi0 = make_matrix_view(group_indices_view(chi0_arr, idx_group<0, 1>, idx_group<3, 2>));
57 chi = nda::linalg::inv(I - chi0 * U) * chi0;
59 chi_wk[w, k] = chi_arr;
61 chi_wk = mpi::all_reduce(chi_wk);
66 chi_wk_t solve_rpa_PH(chi_wk_vt chi0_wk, array_contiguous_view<std::complex<double>, 4> U_arr) {
67 return solve_rpa_PH<chi_wk_t, chi_wk_vt>(chi0_wk, U_arr);
70 chi_Dwk_t solve_rpa_PH(chi_Dwk_vt chi0_Dwk, array_contiguous_view<std::complex<double>, 4> U_arr) {
71 return solve_rpa_PH<chi_Dwk_t, chi_Dwk_vt>(chi0_Dwk, U_arr);
74 chi_fk_t solve_rpa_PH(chi_fk_vt chi0_fk, array_contiguous_view<std::complex<double>, 4> U_arr) {
75 return solve_rpa_PH<chi_fk_t, chi_fk_vt>(chi0_fk, U_arr);