3#ifndef DUNE_PDELAB_BACKEND_ISTL_MATRIXFREE_ITERATIVEBLOCKJACOBIPRECONDITIONER_HH
4#define DUNE_PDELAB_BACKEND_ISTL_MATRIXFREE_ITERATIVEBLOCKJACOBIPRECONDITIONER_HH
10#include <dune/pdelab/localoperator/pointdiagonalwrapper.hh>
11#include <dune/pdelab/localoperator/blockdiagonalwrapper.hh>
14#include<dune/pdelab/backend/istl/matrixfree/assembledblockjacobipreconditioner.hh>
31 typedef X domain_type;
33 typedef typename X::BaseContainer InvDiagonal;
34 typedef typename X::value_type value_type;
47 LocalPointJacobiPreconditioner(
const InvDiagonal& invDiagonal,
48 const value_type diagonalWeight,
49 const bool precondition=
true)
50 : _precondition(precondition)
51 , _invDiagonal(invDiagonal)
52 , _diagonalWeight(diagonalWeight)
55 void pre (domain_type& x, range_type& b)
override {}
57 void apply (domain_type& v,
const range_type& d)
override
60 std::transform(d.data(),
64 [=](
const value_type& a,
const value_type& b){
65 return _diagonalWeight*a*b;
69 std::copy(d.data(),d.data()+d.size(),v.data());
73 void post (domain_type& x)
override {}
76 const bool _precondition;
77 const InvDiagonal& _invDiagonal;
78 const value_type _diagonalWeight;
91 template<
typename BlockDiagonalLocalOperator,
typename W,
typename XView,
typename EG,
typename LFSU,
typename LFSV>
97 using weight_type =
typename W::WeightedAccumulationView::weight_type;
98 static constexpr bool isLinear = BlockDiagonalLocalOperator::isLinear;
109 : _blockDiagonalLocalOperator(blockDiagonalLocalOperator)
113 , _tmp(lfsu.size(),0.0)
117 void apply(
const W& z, W& y)
const override
120 typename W::WeightedAccumulationView y_view(y, _weight);
122 applyLocalDiagonalBlock(_blockDiagonalLocalOperator, _eg, _lfsu, z, z, _lfsv, y_view);
124 applyLocalDiagonalBlock(_blockDiagonalLocalOperator, _eg, _lfsu, *_u, z, _lfsv, y_view);
133 void setLinearizationPoint(
const XView& u)
138 void setWeight(
const weight_type& weight)
144 const BlockDiagonalLocalOperator& _blockDiagonalLocalOperator;
154 class WeightedPointDiagonalAccumulationView
159 using value_type =
typename Container::value_type;
160 using size_type =
typename Container::size_type;
161 using weight_type = value_type;
163 const weight_type& weight()
170 return _container.data();
173 const auto data()
const
175 return _container.data();
178 template<
typename LFSV>
179 void accumulate(
const LFSV& lfsv, size_type i, value_type value)
181 _container.data()[lfsv.localIndex(i)] += _weight * value;
184 WeightedPointDiagonalAccumulationView(Container& container, weight_type weight)
185 : _container(container)
190 Container& _container;
212 const size_t maxiter=100,
213 const bool precondition=
true,
214 const double weight=1.0,
261 template<
typename BlockDiagonalLocalOperator,
262 typename PointDiagonalLocalOperator,
264 typename DomainField,
271 using GridView =
typename GridFunctionSpace::Traits::GridViewType;
272 using Grid =
typename GridView::Traits::Grid;
274 using value_type = DomainField;
283 static constexpr bool doPatternVolume =
true;
284 static constexpr bool doAlphaVolume =
true;
285 static constexpr bool isLinear = BlockDiagonalLocalOperator::isLinear;
302 const PointDiagonalLocalOperator& pointDiagonalLocalOperator,
306 const bool verbose=0)
307 : _blockDiagonalLocalOperator(blockDiagonalLocalOperator)
308 , _pointDiagonalLocalOperator(pointDiagonalLocalOperator)
309 , _gridFunctionSpace(gridFunctionSpace)
310 , _solverStatistics(solverStatiscits)
311 , _mapper(gridFunctionSpace.gridView())
312 , _invDiagonalCache(_mapper.size())
313 , _solveroptions(solveroptions)
315 , _requireSetup(true)
323 return _requireSetup;
325 void setRequireSetup(
bool v)
336 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename Y>
337 void alpha_volume(
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, Y& y)
const
339 const int size = lfsu.size();
340 assert(lfsv.size() == size);
343 std::size_t cache_idx = _mapper.
index(eg.entity());
344 _invDiagonalCache[cache_idx].resize(lfsu.size());
345 using TmpView = impl::WeightedPointDiagonalAccumulationView<InvDiagonal>;
346 TmpView view(_invDiagonalCache[cache_idx], y.weight());
347 assembleLocalPointDiagonal(_pointDiagonalLocalOperator, eg, lfsu, x, lfsv, view);
350 for(
auto& val : _invDiagonalCache[cache_idx]){
357 template<
typename EG,
typename LFSU,
typename Z,
typename LFSV,
typename Y>
360 assert(not _requireSetup);
363 std::size_t cache_idx = _mapper.
index(eg.entity());
364 const auto& invDiagonal = _invDiagonalCache[cache_idx];
368 impl::LocalPointJacobiPreconditioner<LocalVector> pointJacobi(invDiagonal,
372 op(_blockDiagonalLocalOperator, eg, lfsu, lfsv);
373 op.setWeight(y.weight());
383 std::copy(z.data(), z.data()+z.size(), z_tmp.
data());
387 solver.
apply(y_tmp, z_tmp, stat);
389 std::transform(y.data(),
393 std::plus<value_type>{});
402 template<
typename EG,
typename LFSU,
typename X,
typename Z,
typename LFSV,
typename Y>
405 assert(not _requireSetup);
408 std::size_t cache_idx = _mapper.
index(eg.entity());
409 const auto& invDiagonal = _invDiagonalCache[cache_idx];
413 impl::LocalPointJacobiPreconditioner<LocalVector> pointJacobi(invDiagonal,
417 op(_blockDiagonalLocalOperator, eg, lfsu, lfsv);
418 op.setLinearizationPoint(x);
419 op.setWeight(y.weight());
429 std::copy(z.data(), z.data()+z.size(), z_tmp.
data());
433 solver.
apply(y_tmp, z_tmp, stat);
435 std::transform(y.data(),
439 std::plus<value_type>{});
443 BlockDiagonalLocalOperator _blockDiagonalLocalOperator;
444 PointDiagonalLocalOperator _pointDiagonalLocalOperator;
448 mutable std::vector<InvDiagonal> _invDiagonalCache;
Base class for all implementations of iterative solvers.
Definition: solver.hh:201
virtual void apply(X &x, X &b, double reduction, InverseOperatorResult &res)
Apply inverse operator with given reduction factor.
Definition: solver.hh:372
A linear operator.
Definition: operators.hh:65
X::field_type field_type
The field type of the operator.
Definition: operators.hh:72
sparsity pattern generator
Definition: pattern.hh:14
A grid function space.
Definition: gridfunctionspace.hh:191
Local operator that can be used to create a fully matrix-free Jacobi preconditioner.
Definition: iterativeblockjacobipreconditioner.hh:269
void jacobian_apply_volume(const EG &eg, const LFSU &lfsu, const Z &z, const LFSV &lfsv, Y &y) const
Apply fully matrix-free preconditioner - linear case.
Definition: iterativeblockjacobipreconditioner.hh:358
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, Y &y) const
Prepare fully matrix-free preconditioner.
Definition: iterativeblockjacobipreconditioner.hh:337
void jacobian_apply_volume(const EG &eg, const LFSU &lfsu, const X &x, const Z &z, const LFSV &lfsv, Y &y) const
Apply fully matrix-free preconditioner - nonlinear case.
Definition: iterativeblockjacobipreconditioner.hh:403
IterativeBlockJacobiPreconditionerLocalOperator(const BlockDiagonalLocalOperator &blockDiagonalLocalOperator, const PointDiagonalLocalOperator &pointDiagonalLocalOperator, const GridFunctionSpace &gridFunctionSpace, SolverStatistics< int > &solverStatiscits, BlockSolverOptions solveroptions, const bool verbose=0)
Constructor.
Definition: iterativeblockjacobipreconditioner.hh:301
Default flags for all local operators.
Definition: flags.hh:19
std::vector< value_type > BaseContainer
The type of the underlying storage container.
Definition: localvector.hh:188
auto data()
Access underlying container.
Definition: localvector.hh:244
void append(const T x)
Add new data point.
Definition: solverstatistics.hh:52
Base class for matrix free definition of preconditioners.
Definition: preconditioner.hh:30
Index index(const EntityType &e) const
Map entity to array index.
Definition: scsgmapper.hh:69
Implementations of the inverse operator interface.
constexpr T accumulate(Range &&range, T value, F &&f)
Accumulate values.
Definition: hybridutilities.hh:289
Dune namespace.
Definition: alignedallocator.hh:11
Define general, extensible interface for operators. The available implementation wraps a matrix.
Mapper classes are used to attach data to a grid.
Provides a class for collecting statistics on the number of block-solves.
Static tag representing a codimension.
Definition: dimension.hh:22
Statistics about the application of an inverse operator.
Definition: solver.hh:46
int iterations
Number of iterations.
Definition: solver.hh:65
Options for IterativeBlockJacobiPreconditionerLocalOperator.
Definition: iterativeblockjacobipreconditioner.hh:202
double _weight
Weight for point-jacobi.
Definition: iterativeblockjacobipreconditioner.hh:229
size_t _maxiter
Maximal number of iterations.
Definition: iterativeblockjacobipreconditioner.hh:225
BlockSolverOptions(const double resreduction=1e-5, const size_t maxiter=100, const bool precondition=true, const double weight=1.0, const int verbose=0)
Constructor.
Definition: iterativeblockjacobipreconditioner.hh:211
double _resreduction
Residual reduction, i.e. solver accuracy.
Definition: iterativeblockjacobipreconditioner.hh:223
int _verbose
verbosity level
Definition: iterativeblockjacobipreconditioner.hh:231
bool _precondition
Precondition with point-Jacobi?
Definition: iterativeblockjacobipreconditioner.hh:227
Create ISTL operator that applies a local block diagonal.
Definition: iterativeblockjacobipreconditioner.hh:94
Dune::SolverCategory::Category category() const override
Category of the linear operator (see SolverCategory::Category)
Definition: iterativeblockjacobipreconditioner.hh:100
void applyscaleadd(field_type alpha, const W &z, W &y) const override
apply operator to x, scale and add:
Definition: iterativeblockjacobipreconditioner.hh:127
void apply(const W &z, W &y) const override
apply operator to x: The input vector is consistent and the output must also be consistent on the in...
Definition: iterativeblockjacobipreconditioner.hh:117
Category
Definition: solvercategory.hh:21
@ sequential
Category for sequential solvers.
Definition: solvercategory.hh:23