22 const std::vector<basis::ElementBases> &field_bases,
23 const std::vector<basis::ElementBases> &gbases,
25 const Eigen::MatrixXd &dof_values,
26 Eigen::MatrixXd &values,
27 Eigen::MatrixXd *gradients =
nullptr)
29 if (dof_values.size() <= 0)
32 const bool has_element_samples =
36 if (has_element_samples)
48 gradients->row(i).setZero();
52 Eigen::MatrixXd local_sol, local_grad;
54 mesh, 1, field_bases, gbases,
55 element_id, sample.
local_points.row(i), dof_values, local_sol, local_grad);
56 values(i) = local_sol(0);
58 gradients->row(i) = local_grad;
65 values.resize(sample.
node_ids.size(), 1);
66 for (
int i = 0; i < sample.
node_ids.size(); ++i)
68 const int node_id = sample.
node_ids(i);
69 if (node_id < 0 || node_id >= dof_values.rows())
71 values(i) = dof_values(node_id);
84 std::vector<Eigen::Triplet<double>> blocks;
85 blocks.reserve(primary.nonZeros());
86 for (
int k = 0; k < primary.outerSize(); ++k)
88 for (StiffnessMatrix::InnerIterator it(primary, k); it; ++it)
89 blocks.emplace_back(it.row(), it.col(), it.value());
92 expanded.resize(full_size, full_size);
93 expanded.setFromTriplets(blocks.begin(), blocks.end());
94 expanded.makeCompressed();