6#include "dune/grid/common/grid.hh"
7#include "dune/grid/common/entity.hh"
8#include "dune/grid/io/file/dgfparser/dgfparser.hh"
9#include "dune/istl/matrix.hh"
10#include "dune/istl/bcrsmatrix.hh"
11#include "dune/common/fmatrix.hh"
12#include "dune/common/iteratorfacades.hh"
13#include "dune/istl/matrixindexset.hh"
22 std::cout << std::endl;
23 for(
int i=0;i<bcrsMatrix.N();i++)
25 for(
int k =0;k<bcrsMatrix.M();k++)
27 if(bcrsMatrix.exists(i,k))
28 std::cout <<
"(" << i <<
"," << k <<
") : " << bcrsMatrix[i][k] <<
"\n";
30 std::cout << std::endl;
32 std::cout << std::endl;
36 template <
class Gr
id >
39 static const int dim = Grid::dimension;
40 typedef typename Grid::LevelGridView::IndexSet::IndexType IndexType;
41 typedef typename std::pair<IndexType,double> FatherIndexValue;
42 typedef typename std::vector<FatherIndexValue> FatherSimplexPairs;
45 void findParents(
const Grid& grid,
int level );
56 for(
int level=1; level<=maxLevel; level++) findParents( grid, level );
61 template <
class Gr
id >
64 typedef typename Grid::template Codim<0>::LevelIterator ElementLevelIterator;
65 typedef typename Grid::template Codim<dim>::Entity VertexPointer;
66 typedef typename Grid::template Codim<0>::Entity ElementPointer;
67 typedef typename Grid::LevelGridView::IndexSet::IndexType IndexType;
69 std::vector<FatherSimplexPairs> levelParents( grid.size(level,dim), FatherSimplexPairs(dim+1) );
73 std::vector<bool> toProcess(grid.size(dim),
true);
75 typename Grid::LevelGridView::IndexSet
const& indexSet = grid.levelIndexSet(level) ;
76 typename Grid::LevelGridView::IndexSet
const& fatherIndexSet = grid.levelIndexSet(level-1);
84 ElementLevelIterator itEnd = grid.levelGridView(level).template end<0>() ;
85 for(ElementLevelIterator it = grid.levelGridView(level).template begin<0>() ; it != itEnd; ++it)
87 std::vector<IndexType> fatherIndices(dim+1);
88 ElementPointer itFather = it->father();
89 for(
int i=0 ; i<=dim ; i++)
91 fatherIndices[i] = fatherIndexSet.subIndex(itFather, i, dim);
95 for(
int i=0 ; i<=dim ; i++ )
97 IndexType idx_child = indexSet.subIndex(*it, i, dim);
99 if(toProcess[idx_child])
101 toProcess[idx_child]=
false;
103 double relativeCoor = 1 ;
104 geomInFatherCorner = it->geometryInFather().corner(i);
109 double val = geomInFatherCorner[
component-1];
113 levelParents[idx_child][0] = std::make_pair(fatherIndices[0],relativeCoor);
120 levelParentsVector[level-1] = levelParents;
127 typedef typename Grid::template Codim<Grid::dimension>::LevelIterator VertexLevelIterator;
128 typedef typename Grid::LevelGridView::IndexSet::IndexType IndexType;
129 typedef typename std::pair<IndexType,double> FatherIndexValue;
136 auto maxLevel = grid_.maxLevel();
137 for(
int level = 1 ; level <= maxLevel ; level++)
139 int prolCols = grid_.size( level-1, Grid::dimension ) ;
140 int prolRows = grid_.size( level, Grid::dimension ) ;
145 Dune::BCRSMatrix<M> prolMatrix(prolRows,prolCols, prolRows*((Grid::dimension)+1),Dune::BCRSMatrix<M>::row_wise);
146 typedef Dune::BCRSMatrix<M>::CreateIterator Iter;
148 for(Iter row=prolMatrix.createbegin(); row!=prolMatrix.createend(); ++row)
150 for(
int k = 0 ; k <= Grid::dimension ; k++ )
152 row.insert( parentalNodes.levelParentsVector[level-1][row.index()][k].first );
156 for(
int row = 0 ; row < prolRows ; row++)
158 for(
int k = 0 ; k <= Grid::dimension ; k++ )
160 if( parentalNodes.levelParentsVector[level-1][row][k].second > 0.9 )
161 prolMatrix[row][ parentalNodes.levelParentsVector[level-1][row][k].first ]
162 = parentalNodes.levelParentsVector[level-1][row][k].second;
165 prolStack.push_back( prolMatrix );
174 indexOnNextLevel.resize(maxLevel, std::vector<size_t>());
175 for(
int l = 0; l < maxLevel; l++ )
177 auto bcrsMatrix = prolStack[l];
178 indexOnNextLevel[l].resize(bcrsMatrix.M());
179 for(
size_t k =0; k < bcrsMatrix.M(); k++)
181 for(
size_t i = 0; i < bcrsMatrix.N(); i++ )
183 if(bcrsMatrix.exists(i,k) && bcrsMatrix[i][k] > 0.9 )
185 indexOnNextLevel[l][k] = i;
193 levelIndexMapper.resize(maxLevel);
194 for(
int l = 0 ; l < maxLevel; l++ )
197 for(
size_t k = 0; k < indexOnNextLevel[l].size(); k++ )
200 levelIndexMapper[l].resize(indexOnNextLevel[l].size());
202 for(
int j = 0; j < maxLevel-l; j++ )
205 tmpIdx = indexOnNextLevel[l+j][tmpIdx];
206 levelIndexMapper[l][k].push_back(tmpIdx);
221 template<
class CoeffVector>
222 void mv(
unsigned level, CoeffVector
const& source, CoeffVector& target)
224 unsigned int maxIndex = parentalNodes.levelParentsVector[level].size();
225 target.resize(maxIndex);
226 for(
unsigned int i = 0 ; i <maxIndex ; i++ )
229 unsigned int maxIndexOld = parentalNodes.levelParentsVector[level][i].size();
230 for(
unsigned int j = 0 ; j < maxIndexOld; j++ )
232 FatherIndexValue tmp = parentalNodes.levelParentsVector[level][i][j];
233 target[i] += source[ tmp.first ] * tmp.second ;
241 if( targetLevel <= currentLevel )
return currentIndex;
242 return levelIndexMapper[currentLevel][currentIndex][(targetLevel-currentLevel-1)];
250 std::vector<Dune::BCRSMatrix<M>> prolStack;
251 std::vector<std::vector<size_t>> indexOnNextLevel;
252 std::vector<std::vector<std::vector<size_t>>> levelIndexMapper;
285 template <
class Gr
id >
296 template <
class Gr
id >
299 using namespace Dune;
301 int maxLevel = grid.maxLevel();
305 for(
int level = 1 ; level <= maxLevel ; level++)
307 int prolCols = grid.size( level-1, Grid::dimension ) ;
308 int prolRows = grid.size( level, Grid::dimension ) ;
313 BCRSMatrix<M> prolMatrix(prolRows,prolCols, prolRows*((Grid::dimension)+1),BCRSMatrix<M>::row_wise);
314 typedef BCRSMatrix<M>::CreateIterator Iter;
316 for(Iter row=prolMatrix.createbegin(); row!=prolMatrix.createend(); ++row)
318 for(
int k = 0 ; k <= Grid::dimension ; k++ )
324 for(
int row = 0 ; row < prolRows ; row++)
326 for(
int k = 0 ; k <= Grid::dimension ; k++ )
332 prolStack.push_back( prolMatrix );
352 template <
class Grd >
363 template <
class Grd >
370 levelMatrixStack.push_back(bcrsA);
372 for(
int i = 0 ; i < prols ; i++)
375 std::unique_ptr<Dune::MatrixIndexSet> C = conjugationPattern<double,M>( ps.
prolStack[prols-1-i] , levelMatrixStack[ i ] , onlyLowerTriangle);
376 Dune::BCRSMatrix<M> Cnew;
385 levelMatrixStack.push_back( Cnew );
389 bool abscompare(
double a,
double b ) {
return fabs( a ) < fabs( b ) ; }
391 double ld(
double val ) {
return log(val)/log(2.0) ; }
std::vector< Dune::BCRSMatrix< M > > levelMatrixStack
MlStack(ProlongationStack< Grd > const &ps, Dune::BCRSMatrix< M > const &bcrsA, bool onlyLowerTriangle=false)
ParentalNodes(Grid const &grid)
std::vector< std::vector< FatherSimplexPairs > > levelParentsVector
Prolongation(Grid const &grid_)
void mv(unsigned level, CoeffVector const &source, CoeffVector &target)
size_t getIndexOnLevel(int currentLevel, size_t currentIndex, int targetLevel)
ProlongationStack(const Grid &grid)
std::vector< Dune::BCRSMatrix< M > > prolStack
Finds the parent nodes and their interpolation weight for each node in the grid. usage eg....
void conjugation(Dune::BCRSMatrix< Entry > &C, Dune::BCRSMatrix< Dune::FieldMatrix< Scalar, 1, 1 > > const &P, Dune::BCRSMatrix< Entry > const &A, bool onlyLowerTriangle=false)
Computes the triple sparse matrix product .
auto & component(LinearProductSpace< Scalar, Sequence > &x)
bool abscompare(double a, double b)
void bcrsPrint(const Dune::BCRSMatrix< Dune::FieldMatrix< double, 1, 1 > > &bcrsMatrix)