48 const Eigen::VectorXd& adiag,
const Eigen::VectorXd& bdiag,
Index nroots) {
50 if (adiag.size() != bdiag.size()) {
51 throw std::runtime_error(
"BuildFullBSEXRankedInitialGuess: size mismatch.");
54 const Index n = adiag.size();
55 const Index nguess = std::min<Index>(n, std::max<Index>(4 * nroots, 8));
63 std::vector<RankedMode> ranked;
66 for (
Index i = 0; i < n; ++i) {
67 const double a = adiag(i);
68 const double b = bdiag(i);
70 const double disc = std::max(0.0, (a - b) * (a + b));
71 const double omega = std::sqrt(disc);
73 ranked.push_back({omega, a, i});
76 std::sort(ranked.begin(), ranked.end(),
77 [](
const RankedMode& lhs,
const RankedMode& rhs) {
78 if (lhs.omega != rhs.omega) {
79 return lhs.omega < rhs.omega;
84 Eigen::MatrixXd guess = Eigen::MatrixXd::Zero(2 * n, nguess);
87 for (
Index col = 0; col < nguess; ++col) {
88 const Index i = ranked[col].idx;