@@ -119,8 +119,6 @@ void DiagoPPCG<T, Device>::update_polak_ribiere(
119119
120120 for (int j = 0 ; j < n_band_; ++j)
121121 {
122- T* pj = p.data () + j * ld_psi_;
123- T* zn = z_new.data () + j * ld_psi_;
124122 const Real beta_num_zr = static_cast <Real>(beta_nums[j]);
125123 const Real beta_num_zo = static_cast <Real>(beta_nums[n_band_ + j]);
126124 Real beta = 0 ;
@@ -131,16 +129,23 @@ void DiagoPPCG<T, Device>::update_polak_ribiere(
131129 if (beta < 0 )
132130 beta = 0 ;
133131 }
132+ beta_nums[j] = static_cast <double >(beta);
134133
135- // d_new = z_new + beta * d_old
134+ // Save <z_new, r_new> as denominator for next iteration.
135+ beta_denom[j] = beta_num_zr + static_cast <Real>(1.0e-30 );
136+ }
137+
138+ // d_new = z_new + beta * d_old
136139#ifdef _OPENMP
137- #pragma omp parallel for schedule(static) if (n_dim_ > 4096)
140+ #pragma omp parallel for collapse(2) schedule(static) if (n_dim_ * n_band_ > 4096)
138141#endif
142+ for (int j = 0 ; j < n_band_; ++j)
143+ {
139144 for (int ig = 0 ; ig < n_dim_; ++ig)
140- pj[ig] = zn[ig] + beta * pj[ig];
141-
142- // Save <z_new, r_new> as denominator for next iteration.
143- beta_denom[j] = beta_num_zr + static_cast <Real>( 1.0e-30 );
145+ {
146+ const int off = idx (ig, j, ld_psi_);
147+ p[off] = z_new[off] + static_cast <Real>(beta_nums[j]) * p[off];
148+ }
144149 }
145150
146151 // Persist state for next iteration.
0 commit comments