DOpE
sparsitymaker.h
Go to the documentation of this file.
1 
24 #ifndef SPARSITYMAKER_H_
25 #define SPARSITYMAKER_H_
26 
27 #include "dofhandler_wrapper.h"
28 #include <dofs/dof_tools.h>
29 #include <lac/constraint_matrix.h>
30 
31 // Multi-level routines (step-16 in deal.II)
32 #include <deal.II/multigrid/mg_dof_handler.h>
33 #include <deal.II/multigrid/mg_constrained_dofs.h>
34 #include <deal.II/multigrid/multigrid.h>
35 #include <deal.II/multigrid/mg_transfer.h>
36 #include <deal.II/multigrid/mg_tools.h>
37 #include <deal.II/multigrid/mg_coarse.h>
38 #include <deal.II/multigrid/mg_smoother.h>
39 #include <deal.II/multigrid/mg_matrix.h>
40 
41 
42 
43 namespace DOpE
44 {
49  template<template<int, int> class DH, int dim>
51  {
52  public:
54  {
55  }
56  virtual
58  {
59  }
60  virtual void
62  const DOpEWrapper::DoFHandler<dim, DH>& dof_handler,
63  dealii::BlockSparsityPattern & sparsity,
64  const dealii::ConstraintMatrix& hanging_node_constraints,
65  const std::vector<unsigned int>& blocks) const;
66 
67  virtual void
69  const DOpEWrapper::DoFHandler<dim, DH>& dof_handler,
70  dealii::SparsityPattern & sparsity,
71  const dealii::ConstraintMatrix& hanging_node_constraints,
72  const std::vector<unsigned int>& blocks) const;
73 
74 
75  /*
76  * Experimental status:
77  * Needed for MG prec.
78  */
79  virtual void
82  dealii::MGLevelObject<dealii::BlockSparsityPattern> & mg_sparsity_pattern,
83  const dealii::ConstraintMatrix& hanging_node_constraints,
84  const std::vector<unsigned int>& blocks,
85  const unsigned int n_levels) const;
86 
87  /*
88  * Experimental status:
89  * Needed for MG prec.
90  */
91  virtual void
94  dealii::MGLevelObject<dealii::SparsityPattern> & mg_sparsity_pattern,
95  const dealii::ConstraintMatrix& hanging_node_constraints,
96  const std::vector<unsigned int>& blocks,
97  const unsigned int n_levels) const;
98 
99 
100  //TODO: If one wishes to change the sparsity-pattern of the control, one
101  //has to implement this here.
102 
103  };
104 
105 
106  /***********************************************************/
107 
108 
109  template<template<int, int> class DH, int dim>
110  void
112  const DOpEWrapper::DoFHandler<dim, DH>& dof_handler,
113  dealii::BlockSparsityPattern & sparsity,
114  const dealii::ConstraintMatrix& hanging_node_constraints,
115  const std::vector<unsigned int>& blocks) const
116  {
117  dealii::BlockCompressedSimpleSparsityPattern csp(blocks.size(),
118  blocks.size());
119  for (unsigned int i = 0; i < blocks.size(); i++)
120  {
121  for (unsigned int j = 0; j < blocks.size(); j++)
122  {
123  csp.block(i, j).reinit(blocks.at(i), blocks.at(j));
124  }
125  }
126  csp.collect_sizes();
127  dealii::DoFTools::make_sparsity_pattern(
128  dof_handler.GetDEALDoFHandler(), csp, hanging_node_constraints);
129  sparsity.copy_from(csp);
130  }
131 
132 /***********************************************************/
133  template<template<int, int> class DH, int dim>
134  void
136  const DOpEWrapper::DoFHandler<dim, DH>& dof_handler,
137  dealii::SparsityPattern & sparsity,
138  const dealii::ConstraintMatrix& hanging_node_constraints,
139  const std::vector<unsigned int>& blocks) const
140  {
141  unsigned int total_dofs = 0;
142  for (unsigned int j = 0; j < blocks.size(); j++)
143  {
144  total_dofs += blocks.at(j);
145  }
146 
147  dealii::CompressedSimpleSparsityPattern csp(total_dofs, total_dofs);
148  dealii::DoFTools::make_sparsity_pattern(
149  dof_handler.GetDEALDoFHandler(), csp, hanging_node_constraints);
150  sparsity.copy_from(csp);
151  }
152 
153 /***********************************************************/
154  template<template<int, int> class DH, int dim>
155  void
159  dealii::MGLevelObject<dealii::BlockSparsityPattern> & mg_sparsity_patterns,
160  const dealii::ConstraintMatrix& /*hanging_node_constraints*/,
161  const std::vector<unsigned int>& blocks,
162  const unsigned int n_levels) const
163  {
164  // Hard coded for FE_System with 1 FE and 2 components:
165  // MUST be changed later!!!!!
166  std::vector<unsigned int> block_component (dim,0);
167 
168 
169  std::vector<std::vector<unsigned int> > mg_dofs_per_block;
170  mg_dofs_per_block.resize (n_levels);
171  mg_sparsity_patterns.resize(0, n_levels-1);
172  mg_dofs_per_block.resize (n_levels);
173 
174 
175  for (unsigned int level=0; level<n_levels; ++level)
176  mg_dofs_per_block[level].resize (blocks.size());
177 
178  dealii::MGTools::count_dofs_per_block (dof_handler.GetDEALDoFHandler(),
179  mg_dofs_per_block,
180  block_component);
181 
182  for (unsigned int level=0; level<n_levels; ++level)
183  {
184  dealii::BlockCompressedSparsityPattern csp(mg_dofs_per_block[level],
185  mg_dofs_per_block[level]);
186 
187  dealii::MGTools::make_sparsity_pattern(dof_handler.GetDEALDoFHandler(), csp, level);
188 
189  mg_sparsity_patterns[level].copy_from (csp);
190 
191  }
192  }
193 
194 /***********************************************************/
195 
196 
197  template<template<int, int> class DH, int dim>
198  void
202  dealii::MGLevelObject<dealii::SparsityPattern> & mg_sparsity_patterns,
203  const dealii::ConstraintMatrix& /*hanging_node_constraints*/,
204  const std::vector<unsigned int>& /*blocks*/,
205  const unsigned int n_levels) const
206  {
207 
208  for (unsigned int level=0; level<n_levels; ++level)
209  {
210  dealii::CompressedSparsityPattern csp(dof_handler.GetDEALDoFHandler().n_dofs(level), dof_handler.GetDEALDoFHandler().n_dofs(level));
211 
212  dealii::MGTools::make_sparsity_pattern(dof_handler.GetDEALDoFHandler(), csp, level);
213 
214  mg_sparsity_patterns[level].copy_from (csp);
215 
216  }
217  }
218 
219 
220 
221 
222 } //end of namespace
223 
224 #endif /* SPARSITYMAKER_H_ */
virtual void ComputeMGSparsityPattern(const DOpEWrapper::DoFHandler< dim, dealii::MGDoFHandler > &dof_handler, dealii::MGLevelObject< dealii::BlockSparsityPattern > &mg_sparsity_pattern, const dealii::ConstraintMatrix &hanging_node_constraints, const std::vector< unsigned int > &blocks, const unsigned int n_levels) const
Definition: sparsitymaker.h:157
virtual ~SparsityMaker()
Definition: sparsitymaker.h:57
const DOFHANDLER< dim, dim > & GetDEALDoFHandler() const
Definition: dofhandler_wrapper.h:69
SparsityMaker()
Definition: sparsitymaker.h:53
Definition: dofhandler_wrapper.h:129
virtual void ComputeSparsityPattern(const DOpEWrapper::DoFHandler< dim, DH > &dof_handler, dealii::BlockSparsityPattern &sparsity, const dealii::ConstraintMatrix &hanging_node_constraints, const std::vector< unsigned int > &blocks) const
Definition: sparsitymaker.h:111
Definition: sparsitymaker.h:50
const dealii::MGDoFHandler< dim > & GetDEALDoFHandler() const
Definition: dofhandler_wrapper.h:143