18#ifndef ICC_0_PRECOND_HH
19#define ICC_0_PRECOND_HH
24#include <boost/fusion/include/at_c.hpp>
26#include "dune/grid/common/grid.hh"
27#include "dune/istl/matrix.hh"
28#include "dune/istl/bcrsmatrix.hh"
29#include "dune/common/fmatrix.hh"
30#include "dune/common/fvector.hh"
31#include "dune/common/iteratorfacades.hh"
32#include "dune/istl/matrixindexset.hh"
34#include "dune/istl/preconditioners.hh"
55 typedef typename Op::Range
Range;
61 typedef Dune::BCRSMatrix<BlockType> BCRS_Matrix;
62 typedef typename BCRS_Matrix::ConstColIterator ColIter;
65 std::vector<std::vector<int> > mEntries;
78 virtual Dune::SolverCategory::Category
category()
const override
80 return Dune::SolverCategory::sequential;
88 BCRS_Matrix mA = op.template get<BCRS_Matrix>();
94 for (ColIter cI=mA[i].begin(); cI!=mA[i].end() && cI.index()<i; ++cI)
95 mEntries[cI.index()].push_back(i);
100 Dune::MatrixIndexSet sparsityPattern_mL(N,N);
101 for (
int i=0; i<N; ++i)
102 for (ColIter cI=mA[i].begin(); cI!=mA[i].end() && cI.index()<=i; ++cI)
103 sparsityPattern_mL.add(i,cI.index() );
105 sparsityPattern_mL.exportIdx( mL );
107 for (ColIter cI=mL[i].begin(); cI!=mL[i].end(); ++cI)
108 mL[i][cI.index()] = mA[i][cI.index()];
113 mL[k][k] = sqrt(mL[k][k]);
114 for(std::vector<int>::iterator it = mEntries[k].begin(); it!=mEntries[k].end(); it++)
115 mL[*it][k] /= mL[k][k];
116 for(std::vector<int>::iterator it = mEntries[k].begin(); it!=mEntries[k].end(); it++)
119 mL[*it][*it] -= (mL[*it][k])*(mL[*it][k]);
120 for(std::vector<int>::iterator it2 = mEntries[*it].begin(); it2!=mEntries[*it].end(); it2++)
121 if( mL.exists(*it2,k) )
122 mL[*it2][*it] -= mL[*it2][k]*tmp;
133 CoeffVector const &rhs = boost::fusion::at_c<0>(b.data);
142 for (ColIter cI = mL[i].begin(); cI != mL[i].end(); ++cI)
144 tmp -= mL[i][cI.index()]*forward[cI.index()];
145 forward[i] = tmp/mL[i][i];
148 for(
int i = N-1;i>=0;i--)
151 for(std::vector<int>::iterator it = mEntries[i].begin();it!=mEntries[i].end();it++)
152 tmp -= mL[*it][i]*sol[*it];
153 sol[i] = tmp/mL[i][i];
Incomplete Cholesky factorization by algorithm from book "Matrix Computations" by Gene Golub & Charle...
void apply(Domain &x, Range const &y)
virtual Dune::SolverCategory::Category category() const override
returns the category of the operator
void pre(Domain &, Range &)
ICC_0Preconditioner(Op &op)