diff --git a/dune/tectonic/ellipticenergy.hh b/dune/tectonic/ellipticenergy.hh index ce755278872773f90ba2b6e7aeffba224a1eca12..368264837f5fbcc58596f5b91740b2f333d68778 100644 --- a/dune/tectonic/ellipticenergy.hh +++ b/dune/tectonic/ellipticenergy.hh @@ -19,7 +19,8 @@ template <size_t dim> class EllipticEnergy { using Nonlinearity = LocalFriction<dim>; EllipticEnergy(SmallMatrix const &A, SmallVector const &b, - shared_ptr<Nonlinearity const> phi, size_t ignore = dim) + shared_ptr<Nonlinearity const> phi, + typename Dune::BitSetVector<dim>::const_reference ignore) : A(A), b(b), phi(phi), ignore(ignore) {} double operator()(SmallVector const &v) const { @@ -31,15 +32,16 @@ template <size_t dim> class EllipticEnergy { shared_ptr<Nonlinearity const> const phi; /* Dimension that should be ignored; goes from 0 to dim-1; the special value dim means that no dimension should be ignored */ - size_t const ignore; + typename Dune::BitSetVector<dim>::const_reference const ignore; void gradient(SmallVector const &x, SmallVector &y) const { A.mv(x, y); y -= b; phi->addGradient(x, y); - if (ignore != dim) - y[ignore] = 0; + for (size_t i = 0; i < dim; ++i) + if (ignore[i]) + y[i] = 0; } }; } diff --git a/dune/tectonic/myblockproblem.hh b/dune/tectonic/myblockproblem.hh index 8d5a112e919c2a2d8e19936c722aae62122b01ab..4601c7c2a8cb9d26a053c0e1ac4f2002edf07ea7 100644 --- a/dune/tectonic/myblockproblem.hh +++ b/dune/tectonic/myblockproblem.hh @@ -239,22 +239,6 @@ class MyBlockProblem<ConvexProblem>::IterateObject { LocalVector &ui, size_t m, typename Dune::BitSetVector<block_size>::const_reference ignore) { { - size_t ic = - block_size; // Special value that indicates nothing should be ignored - switch (ignore.count()) { - case 0: // Full problem - break; - case 1: - for (ic = 0; ic < block_size; ++ic) - if (ignore[ic]) - break; - break; - case block_size: // Ignore the whole node - return; - default: - assert(false); - } - LocalMatrix const *localA = nullptr; LocalVector localb(problem.f[m]); @@ -269,7 +253,7 @@ class MyBlockProblem<ConvexProblem>::IterateObject { assert(localA != nullptr); auto const phi = problem.phi.restriction(m); - Dune::EllipticEnergy<block_size> localJ(*localA, localb, phi, ic); + Dune::EllipticEnergy<block_size> localJ(*localA, localb, phi, ignore); Dune::minimise(localJ, ui, localsteps, bisection); } }