@@ -269,6 +269,72 @@ TEST_F(DiagoPPCGDiagonalTest, ConjugateGradientFallback)
269269 << " Diagonal CG fallback: too many iterations" ;
270270}
271271
272+ TEST (DiagoPPCGLeadingDimensionTest, BlockSubspaceWithPadding)
273+ {
274+ const int n_dim = 5 ;
275+ const int nband = 3 ;
276+ const int ld = 8 ;
277+
278+ std::vector<T> H_mat (n_dim * n_dim, T (0 ));
279+ for (int i = 0 ; i < n_dim; ++i)
280+ H_mat[i + i * n_dim] = T (static_cast <Real>(i + 1 ), 0 );
281+
282+ std::vector<Real> prec (n_dim);
283+ for (int i = 0 ; i < n_dim; ++i)
284+ prec[i] = static_cast <Real>(i + 1 );
285+
286+ std::vector<T> psi (ld * nband, T (17.0 , -3.0 ));
287+ std::mt19937 rng (7 );
288+ std::uniform_real_distribution<Real> dist (-1.0 , 1.0 );
289+ for (int j = 0 ; j < nband; ++j)
290+ for (int i = 0 ; i < n_dim; ++i)
291+ psi[i + j * ld] = T (dist (rng), 0.0 );
292+
293+ for (int j = 0 ; j < nband; ++j) {
294+ for (int k = 0 ; k < j; ++k) {
295+ T dot = 0 ;
296+ for (int i = 0 ; i < n_dim; ++i)
297+ dot += std::conj (psi[i + k * ld]) * psi[i + j * ld];
298+ for (int i = 0 ; i < n_dim; ++i)
299+ psi[i + j * ld] -= dot * psi[i + k * ld];
300+ }
301+ Real nrm = 0 ;
302+ for (int i = 0 ; i < n_dim; ++i)
303+ nrm += std::norm (psi[i + j * ld]);
304+ nrm = std::sqrt (nrm);
305+ for (int i = 0 ; i < n_dim; ++i)
306+ psi[i + j * ld] /= nrm;
307+ }
308+
309+ std::vector<Real> eval (nband, 0.0 );
310+ std::vector<double > ethr (nband, 1e-10 );
311+ hsolver::DiagoPPCG<T, hsolver::base_device::DEVICE_CPU > solver (
312+ /* diag_thr = */ 1e-12 ,
313+ /* max_iter = */ 80 ,
314+ /* sbsize = */ 2 ,
315+ /* rr_step = */ 3 ,
316+ /* gamma_g0 = */ false ,
317+ hsolver::PpcgStrategy::BLOCK_SUBSPACE
318+ );
319+
320+ auto h_op = [&H_mat, n_dim](T* in, T* out, int ld_in, int ncol) {
321+ dense_h_multiply (H_mat.data (), n_dim, in, out, ld_in, ncol);
322+ };
323+
324+ double avg_iter = solver.diag (
325+ h_op, nullptr , ld, nband, n_dim,
326+ psi.data (), eval.data (), ethr, prec.data ()
327+ );
328+
329+ const Real exact[] = {1.0 , 2.0 , 3.0 };
330+ for (int i = 0 ; i < nband; ++i) {
331+ EXPECT_NEAR (eval[i], exact[i], 1e-8 )
332+ << " Padded ld BLOCK: eigenvalue[" << i << " ] mismatch" ;
333+ }
334+ EXPECT_LE (avg_iter, static_cast <double >(80 ))
335+ << " Padded ld BLOCK: too many iterations" ;
336+ }
337+
272338// =============================================================================
273339// Test fixture: 2×2 matrix — smallest non-trivial case
274340// H = [[2, 1], [1, 2]], eigenvalues: 1, 3
0 commit comments