67 void eval(
const std::vector<std::size_t>& dofsToNeglect = std::vector<std::size_t>())
69 for (
auto& q : averagedQuantity_)
72 auto fvGeometry =
localView(problem_().gridGeometry());
73 auto elemVolVars =
localView(gridVariables_.curGridVolVars());
74 std::vector<bool> poreVisited(problem_().gridGeometry().numDofs(),
false);
75 std::vector<Scalar> weights(averagedQuantityInfo_.size(), 0.0);
77 for (
const auto& element : elements(problem_().gridGeometry().gridView()))
79 fvGeometry.bind(element);
80 elemVolVars.bind(element, fvGeometry, sol_);
82 for (
int scvIdx = 0; scvIdx < fvGeometry.numScv(); ++scvIdx)
84 static constexpr auto dofCodim = std::decay_t<
decltype(problem_().gridGeometry().gridView())>::dimension;
85 const int dofIdxGlobal = problem_().gridGeometry().vertexMapper().subIndex(element, scvIdx, dofCodim);
87 if (poreVisited[dofIdxGlobal])
89 else if (!dofsToNeglect.empty() && std::any_of(dofsToNeglect.begin(), dofsToNeglect.end(), [&](
int dofIdx){ return dofIdx == dofIdxGlobal; }))
93 const auto& volVars = elemVolVars[scvIdx];
94 for (
int i = 0; i < averagedQuantityInfo_.size(); ++i)
96 const Scalar weight = averagedQuantityInfo_[i].weight(volVars);
97 averagedQuantity_[i] += averagedQuantityInfo_[i].quantity(volVars) * weight;
100 poreVisited[dofIdxGlobal] =
true;
105 for (
int i = 0; i < averagedQuantityInfo_.size(); ++i)
106 averagedQuantity_[i] /= weights[i];