dune-istl  2.3beta2
graphcreator.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_AMG_GRAPHCREATOR_HH
4 #define DUNE_AMG_GRAPHCREATOR_HH
5 
6 #include "graph.hh"
7 #include "dependency.hh"
8 #include "pinfo.hh"
9 #include <dune/istl/operators.hh>
10 #include <dune/istl/bcrsmatrix.hh>
11 #include <dune/common/tuples.hh>
12 #include <dune/common/unused.hh>
13 
14 namespace Dune
15 {
16  namespace Amg
17  {
18  template<class M, int cat=M::category>
20  {};
21 
22  template<class M>
23  struct PropertiesGraphCreator<M,SolverCategory::sequential>
24  {
25  typedef typename M::matrix_type Matrix;
26 
28 
32  IdentityMap,
33  IdentityMap> PropertiesGraph;
34 
35  typedef Dune::tuple<MatrixGraph*,PropertiesGraph*> GraphTuple;
36 
37  template<class OF, class T>
38  static GraphTuple create(const M& matrix, T& excluded,
39  const SequentialInformation& pinfo,
40  const OF&)
41  {
42  DUNE_UNUSED_PARAMETER(excluded);
43  DUNE_UNUSED_PARAMETER(pinfo);
44  MatrixGraph* mg = new MatrixGraph(matrix.getmat());
45  PropertiesGraph* pg = new PropertiesGraph(*mg, IdentityMap(), IdentityMap());
46  return GraphTuple(mg,pg);
47  }
48 
49  static void free(GraphTuple& graphs)
50  {
51  delete get<1>(graphs);
52  }
53 
54  };
55 
56  template<class M>
57  struct PropertiesGraphCreator<M,SolverCategory::overlapping>
58  {
59  typedef typename M::matrix_type Matrix;
62  std::vector<bool> > SubGraph;
66  IdentityMap,
67  typename SubGraph::EdgeIndexMap>
69 
70  typedef Dune::tuple<MatrixGraph*,PropertiesGraph*,SubGraph*> GraphTuple;
71 
72  template<class OF, class T, class PI>
73  static GraphTuple create(const M& matrix, T& excluded,
74  PI& pinfo, const OF& of)
75  {
76  MatrixGraph* mg = new MatrixGraph(matrix.getmat());
77  typedef typename PI::ParallelIndexSet ParallelIndexSet;
78  typedef typename ParallelIndexSet::const_iterator IndexIterator;
79  IndexIterator iend = pinfo.indexSet().end();
80 
81  for(IndexIterator index = pinfo.indexSet().begin(); index != iend; ++index)
82  excluded[index->local()] = of.contains(index->local().attribute());
83 
84  SubGraph* sg= new SubGraph(*mg, excluded);
85  PropertiesGraph* pg = new PropertiesGraph(*sg, IdentityMap(), sg->getEdgeIndexMap());
86  return GraphTuple(mg,pg,sg);
87  }
88 
89  static void free(GraphTuple& graphs)
90  {
91  delete get<2>(graphs);
92  delete get<1>(graphs);
93  }
94  };
95 
96  template<class M>
97  struct PropertiesGraphCreator<M,SolverCategory::nonoverlapping>
98  {
99  typedef typename M::matrix_type Matrix;
102  std::vector<bool> > SubGraph;
106  IdentityMap,
107  typename SubGraph::EdgeIndexMap>
109 
110  typedef Dune::tuple<MatrixGraph*,PropertiesGraph*,SubGraph*> GraphTuple;
111 
112  template<class OF, class T, class PI>
113  static GraphTuple create(const M& matrix, T& excluded,
114  PI& pinfo, const OF& of)
115  {
116  MatrixGraph* mg = new MatrixGraph(matrix.getmat());
117  typedef typename PI::ParallelIndexSet ParallelIndexSet;
118  typedef typename ParallelIndexSet::const_iterator IndexIterator;
119  IndexIterator iend = pinfo.indexSet().end();
120 
121  for(IndexIterator index = pinfo.indexSet().begin(); index != iend; ++index)
122  excluded[index->local()] = of.contains(index->local().attribute());
123 
124  SubGraph* sg= new SubGraph(*mg, excluded);
125  PropertiesGraph* pg = new PropertiesGraph(*sg, IdentityMap(), sg->getEdgeIndexMap());
126  return GraphTuple(mg,pg,sg);
127  }
128 
129  static void free(GraphTuple& graphs)
130  {
131  delete get<2>(graphs);
132  delete get<1>(graphs);
133  }
134  };
135 
136  } //namespace Amg
137 } // namespace Dune
138 #endif