41 const std::function<
void(
Index, Eigen::MatrixXd&)>& makeX)
const {
48 const Index block = std::max<Index>(
49 1, std::min<Index>(
qptotal_,
Index(kBlockBytes / (8.0 *
double(nrows) *
51 const Index chunk = std::max<Index>(
52 1, std::min<Index>(auxsize,
Index(kChunkBytes / (8.0 *
double(nrows) *
55 std::vector<Eigen::MatrixXd> X(
static_cast<std::size_t
>(block));
61#pragma omp parallel for schedule(dynamic)
62 for (
Index j = 0; j < nb; ++j) {
63 makeX(m0 + j, X[std::size_t(j)]);
65 for (
Index s0 = 0; s0 < auxsize; s0 += chunk) {
66 const Index ns = std::min(chunk, auxsize - s0);
68 Xc.resize(nrows * ns, nb);
69#pragma omp parallel for schedule(static)
71 Eigen::Map<Eigen::MatrixXd>(Mc.col(n).data(), nrows, ns) =
72 Mmn_[n + qpmin].block(0, s0, nrows, ns);
74 for (
Index j = 0; j < nb; ++j) {
75 Eigen::Map<Eigen::MatrixXd>(Xc.col(j).data(), nrows, ns) =
76 X[std::size_t(j)].middleCols(s0, ns);
78 A.middleRows(m0, nb).noalias() += Xc.transpose() * Mc;
135 const Eigen::VectorXd& frequencies)
const {
137#pragma omp parallel for schedule(dynamic)
138 for (
Index gw_level1 = 0; gw_level1 <
qptotal_; gw_level1++) {
139 for (
Index gw_level2 = gw_level1 + 1; gw_level2 <
qptotal_; gw_level2++) {
141 gw_level1, gw_level2, frequencies[gw_level1], frequencies[gw_level2]);
142 result(gw_level2, gw_level1) = sigma_c;
145 result = result.selfadjointView<Eigen::Lower>();