Skip to content

Commit 4da5661

Browse files
Test PPCG with padded leading dimension
1 parent 48dc80c commit 4da5661

1 file changed

Lines changed: 66 additions & 0 deletions

File tree

source/source_hsolver/test/diago_ppcg_test.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)