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 <deal.II/dofs/dof_tools.h>
29 #include <deal.II/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:
53  SparsityMaker(bool flux_pattern = false)
54  {
55  flux_pattern_ = flux_pattern;
56  }
57  virtual
59  {
60  }
61  virtual void
63  const DOpEWrapper::DoFHandler<dim, DH>& dof_handler,
64  dealii::BlockSparsityPattern & sparsity,
65  const dealii::ConstraintMatrix& hanging_node_constraints,
66  const std::vector<unsigned int>& blocks) const;
67 
68  virtual void
70  const DOpEWrapper::DoFHandler<dim, DH>& dof_handler,
71  dealii::SparsityPattern & sparsity,
72  const dealii::ConstraintMatrix& hanging_node_constraints,
73  const std::vector<unsigned int>& blocks) const;
74 
75 
76 // /*
77 // * Experimental status:
78 // * Needed for MG prec.
79 // */
80 // virtual void
81 // ComputeMGSparsityPattern(
82 // const DOpEWrapper::DoFHandler<dim, dealii::MGDoFHandler>& dof_handler,
83 // dealii::MGLevelObject<dealii::BlockSparsityPattern> & mg_sparsity_pattern,
84 // const dealii::ConstraintMatrix& hanging_node_constraints,
85 // const std::vector<unsigned int>& blocks,
86 // const unsigned int n_levels) const;
87 //
88 // /*
89 // * Experimental status:
90 // * Needed for MG prec.
91 // */
92 // virtual void
93 // ComputeMGSparsityPattern(
94 // const DOpEWrapper::DoFHandler<dim, dealii::MGDoFHandler>& dof_handler,
95 // dealii::MGLevelObject<dealii::SparsityPattern> & mg_sparsity_pattern,
96 // const dealii::ConstraintMatrix& hanging_node_constraints,
97 // const std::vector<unsigned int>& blocks,
98 // const unsigned int n_levels) const;
99 //
100 
101  //TODO: If one wishes to change the sparsity-pattern of the control, one
102  //has to implement this here.
103  private:
104  bool flux_pattern_;
105  };
106 
107 
108  /***********************************************************/
109 
110 
111  template<template<int, int> class DH, int dim>
112  void
114  const DOpEWrapper::DoFHandler<dim, DH>& dof_handler,
115  dealii::BlockSparsityPattern & sparsity,
116  const dealii::ConstraintMatrix& hanging_node_constraints,
117  const std::vector<unsigned int>& blocks) const
118  {
119 #if DEAL_II_VERSION_GTE(8,3,0)
120  dealii::BlockDynamicSparsityPattern csp(blocks.size(),
121  blocks.size());
122 #else
123  dealii::BlockCompressedSimpleSparsityPattern csp(blocks.size(),
124  blocks.size());
125 #endif
126 
127  for (unsigned int i = 0; i < blocks.size(); i++)
128  {
129  for (unsigned int j = 0; j < blocks.size(); j++)
130  {
131  csp.block(i, j).reinit(blocks.at(i), blocks.at(j));
132  }
133  }
134  csp.collect_sizes();
135  if( flux_pattern_ )
136  {
137  dealii::DoFTools::make_flux_sparsity_pattern(
138  dof_handler.GetDEALDoFHandler(), csp, hanging_node_constraints);
139  }
140  else
141  {
142  dealii::DoFTools::make_sparsity_pattern(
143  dof_handler.GetDEALDoFHandler(), csp, hanging_node_constraints);
144  }
145  sparsity.copy_from(csp);
146  }
147 
148 /***********************************************************/
149  template<template<int, int> class DH, int dim>
150  void
152  const DOpEWrapper::DoFHandler<dim, DH>& dof_handler,
153  dealii::SparsityPattern & sparsity,
154  const dealii::ConstraintMatrix& hanging_node_constraints,
155  const std::vector<unsigned int>& blocks) const
156  {
157  unsigned int total_dofs = 0;
158  for (unsigned int j = 0; j < blocks.size(); j++)
159  {
160  total_dofs += blocks.at(j);
161  }
162 
163 #if DEAL_II_VERSION_GTE(8,3,0)
164  dealii::DynamicSparsityPattern csp(total_dofs, total_dofs);
165 #else
166  dealii::CompressedSimpleSparsityPattern csp(total_dofs, total_dofs);
167 #endif
168  if( flux_pattern_ )
169  {
170  dealii::DoFTools::make_flux_sparsity_pattern(
171  dof_handler.GetDEALDoFHandler(), csp, hanging_node_constraints);
172  }
173  else
174  {
175  dealii::DoFTools::make_sparsity_pattern(
176  dof_handler.GetDEALDoFHandler(), csp, hanging_node_constraints);
177  }
178  sparsity.copy_from(csp);
179  }
180 
182 // template<template<int, int> class DH, int dim>
183 // void
184 // SparsityMaker<DH, dim>
185 // ::ComputeMGSparsityPattern(
186 // const DOpEWrapper::DoFHandler<dim, dealii::MGDoFHandler>& dof_handler,
187 // dealii::MGLevelObject<dealii::BlockSparsityPattern> & mg_sparsity_patterns,
188 // const dealii::ConstraintMatrix& /*hanging_node_constraints*/,
189 // const std::vector<unsigned int>& blocks,
190 // const unsigned int n_levels) const
191 // {
192 // // Hard coded for FE_System with 1 FE and 2 components:
193 // // MUST be changed later!!!!!
194 // std::vector<unsigned int> block_component (dim,0);
195 //
196 //
197 // std::vector<std::vector<unsigned int> > mg_dofs_per_block;
198 // mg_dofs_per_block.resize (n_levels);
199 // mg_sparsity_patterns.resize(0, n_levels-1);
200 // mg_dofs_per_block.resize (n_levels);
201 //
202 //
203 // for (unsigned int level=0; level<n_levels; ++level)
204 // mg_dofs_per_block[level].resize (blocks.size());
205 //
206 // dealii::MGTools::count_dofs_per_block (dof_handler.GetDEALDoFHandler(),
207 // mg_dofs_per_block,
208 // block_component);
209 //
210 // for (unsigned int level=0; level<n_levels; ++level)
211 // {
212 // dealii::BlockCompressedSparsityPattern csp(mg_dofs_per_block[level],
213 // mg_dofs_per_block[level]);
214 //
215 // dealii::MGTools::make_sparsity_pattern(dof_handler.GetDEALDoFHandler(), csp, level);
216 //
217 // mg_sparsity_patterns[level].copy_from (csp);
218 //
219 // }
220 // }
221 //
223 //
224 //
225 // template<template<int, int> class DH, int dim>
226 // void
227 // SparsityMaker<DH, dim>
228 // ::ComputeMGSparsityPattern(
229 // const DOpEWrapper::DoFHandler<dim, dealii::MGDoFHandler>& dof_handler,
230 // dealii::MGLevelObject<dealii::SparsityPattern> & mg_sparsity_patterns,
231 // const dealii::ConstraintMatrix& /*hanging_node_constraints*/,
232 // const std::vector<unsigned int>& /*blocks*/,
233 // const unsigned int n_levels) const
234 // {
235 //
236 // for (unsigned int level=0; level<n_levels; ++level)
237 // {
238 // dealii::CompressedSparsityPattern csp(dof_handler.GetDEALDoFHandler().n_dofs(level), dof_handler.GetDEALDoFHandler().n_dofs(level));
239 //
240 // dealii::MGTools::make_sparsity_pattern(dof_handler.GetDEALDoFHandler(), csp, level);
241 //
242 // mg_sparsity_patterns[level].copy_from (csp);
243 //
244 // }
245 // }
246 //
247 
248 
249 
250 } //end of namespace
251 
252 #endif /* SPARSITYMAKER_H_ */
virtual ~SparsityMaker()
Definition: sparsitymaker.h:58
const DOFHANDLER< dim, dim > & GetDEALDoFHandler() const
Definition: dofhandler_wrapper.h:69
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:113
Definition: sparsitymaker.h:50
SparsityMaker(bool flux_pattern=false)
Definition: sparsitymaker.h:53