Amandus: Simulations based on multilevel Schwarz methods
adaptivity.h
Go to the documentation of this file.
1 #ifndef amandus_adaptivity_h
2 #define amandus_adaptivity_h
3 
12 #include <amandus/amandus.h>
13 #include <amandus/integrator.h>
14 #include <amandus/refine_strategy.h>
15 #include <deal.II/algorithms/operator.h>
16 #include <deal.II/base/smartpointer.h>
17 #include <deal.II/grid/grid_refinement.h>
18 #include <deal.II/numerics/solution_transfer.h>
19 
25 template <class VECTOR, int dim>
26 class Remesher : public dealii::Algorithms::OperatorBase
27 {
28 public:
29  Remesher(AmandusApplicationSparse<dim>& app, dealii::Triangulation<dim>& tria)
30  : app(&app)
31  , tria(&tria)
32  {
33  }
34 
35 protected:
36  dealii::SmartPointer<AmandusApplicationSparse<dim>, Remesher<VECTOR, dim>> app;
37  dealii::SmartPointer<dealii::Triangulation<dim>, Remesher<VECTOR, dim>> tria;
38 };
39 
45 template <class VECTOR, int dim>
46 class InterpolatingRemesher : public Remesher<VECTOR, dim>
47 {
48 public:
50  : Remesher<VECTOR, dim>(app, tria)
51  , transfer(app.dofs())
52  {
53  this->connect_transfer();
54  }
55 
57  virtual void
59  {
60  this->transfer.prepare_for_coarsening_and_refinement(this->to_transfer);
61  }
62 
73  virtual void
75  {
76  this->app->setup_system();
77  unsigned int n_dofs = this->app->dofs().n_dofs();
78 
79  this->transferred.resize(this->to_transfer.size());
80  for (typename std::vector<VECTOR>::iterator result = this->transferred.begin();
81  result != this->transferred.end();
82  ++result)
83  {
84  result->reinit(n_dofs);
85  }
86  this->transfer.interpolate(this->to_transfer, this->transferred);
87  this->transfer.clear();
88  for (typename std::vector<VECTOR>::iterator result = this->transferred.begin();
89  result != this->transferred.end();
90  ++result)
91  {
92  this->app->hanging_nodes().distribute(*result);
93  }
94  }
95 
96 protected:
97  void
99  {
100  this->tria->signals.pre_refinement.connect(
101  std::bind(&InterpolatingRemesher<VECTOR, dim>::prepare_transfer, std::ref(*this)));
102  this->tria->signals.post_refinement.connect(
103  std::bind(&InterpolatingRemesher<VECTOR, dim>::finalize_transfer, std::ref(*this)));
104  }
105 
106  dealii::SolutionTransfer<dim, VECTOR> transfer;
108  std::vector<VECTOR> to_transfer;
110  std::vector<VECTOR> transferred;
111 };
112 
118 template <class VECTOR, int dim>
120 {
121 public:
123  : InterpolatingRemesher<VECTOR, dim>(app, tria)
124  {
125  }
126 
127  virtual void operator()(dealii::AnyData& out, const dealii::AnyData& in)
128  {
129  this->extract_vectors(out);
130  this->remesh(out, in);
131  }
132 
133  virtual void
134  extract_vectors(const dealii::AnyData& to_extract)
135  {
136  this->to_transfer.resize(0);
137  this->extracted.resize(0);
138  for (unsigned int i = 0; i < to_extract.size(); ++i)
139  {
140  if (to_extract.is_type<VECTOR*>(i))
141  {
142  this->extracted.push_back(to_extract.entry<VECTOR*>(i));
143  this->to_transfer.push_back(*(to_extract.entry<VECTOR*>(i)));
144  }
145  }
146  }
147 
148  virtual void
150  {
152  for (unsigned int i = 0; i < this->extracted.size(); ++i)
153  {
154  dealii::deallog << "Writing back result of size " << this->transferred[i].size() << std::endl;
155  *(this->extracted[i]) = this->transferred[i];
156  }
157  }
158 
159  virtual void remesh(const dealii::AnyData& out, const dealii::AnyData& in) = 0;
160 
161 protected:
162  std::vector<VECTOR*> extracted;
163 };
164 
171 template <class VECTOR, int dim>
172 class UniformRemesher : public AllInterpolatingRemesher<VECTOR, dim>
173 {
174 public:
175  UniformRemesher(AmandusApplicationSparse<dim>& app, dealii::Triangulation<dim>& tria)
176  : AllInterpolatingRemesher<VECTOR, dim>(app, tria)
177  {
178  }
179 
180  virtual void
181  remesh(const dealii::AnyData& /*out*/, const dealii::AnyData& /*in*/)
182  {
183  this->tria->set_all_refine_flags();
184  this->tria->execute_coarsening_and_refinement();
185  }
186 };
187 
199 template <class VECTOR, int dim>
200 class ErrorRemesher : public AllInterpolatingRemesher<VECTOR, dim>
201 {
202 public:
203  ErrorRemesher(AmandusApplicationSparse<dim>& app, dealii::Triangulation<dim>& tria,
204  ErrorIntegrator<dim>& error_integrator)
205  : AllInterpolatingRemesher<VECTOR, dim>(app, tria)
206  , error_integrator(&error_integrator)
207  {
208  }
209 
211  void
213  std::function<void(dealii::Triangulation<dim>&, const dealii::BlockVector<double>&)> callback)
214  {
215  this->callback = callback;
216  }
217 
218  virtual void
219  remesh(const dealii::AnyData& out, const dealii::AnyData& /*in*/)
220  {
221  this->app->error(indicator, out, *(this->error_integrator));
222  this->callback(*(this->tria), indicator);
223  this->tria->execute_coarsening_and_refinement();
224  }
225 
226 protected:
227  /*
228  dealii::SmartPointer<
229  ErrorIntegrator<dim>,
230  ErrorRemesher<VECTOR, dim> > error_integrator; //TODO SmartPointer
231  */
233  dealii::BlockVector<double> indicator;
234  std::function<void(dealii::Triangulation<dim>&, const dealii::BlockVector<double>&)> callback;
235 };
236 
243 template <class VECTOR, int dim>
244 class EstimateRemesher : public AllInterpolatingRemesher<VECTOR, dim>
245 {
246 public:
248  AmandusRefineStrategy<dim>& mark, AmandusIntegrator<dim>& estimate_integrator)
249  : AllInterpolatingRemesher<VECTOR, dim>(app, tria)
250  , estimate_integrator(&estimate_integrator)
251  , mark(mark)
252  {
253  }
254 
255  virtual void
256  remesh(const dealii::AnyData& out, const dealii::AnyData& /*in*/)
257  {
258  this->app->estimate(out, *(this->estimate_integrator));
259  const dealii::Vector<double> indicators = this->app->indicators();
260  this->mark(indicators);
261  this->tria->execute_coarsening_and_refinement();
262  }
263 
264 protected:
267 };
268 
269 #endif
virtual void extract_vectors(const dealii::AnyData &to_extract)
Definition: adaptivity.h:134
dealii::SmartPointer< dealii::Triangulation< dim >, Remesher< VECTOR, dim > > tria
Definition: adaptivity.h:37
Definition: integrator.h:137
ErrorIntegrator< dim > * error_integrator
Definition: adaptivity.h:232
Remesher interpolating all vectors for uniform refinement. Refines the mesh and interpolates all the ...
Definition: adaptivity.h:172
virtual void finalize_transfer()
Definition: adaptivity.h:74
virtual void remesh(const dealii::AnyData &out, const dealii::AnyData &)
Definition: adaptivity.h:219
std::vector< VECTOR * > extracted
Definition: adaptivity.h:162
void connect_transfer()
Definition: adaptivity.h:98
Remesher(AmandusApplicationSparse< dim > &app, dealii::Triangulation< dim > &tria)
Definition: adaptivity.h:29
virtual void operator()(dealii::AnyData &out, const dealii::AnyData &in)
Definition: adaptivity.h:127
dealii::SmartPointer< AmandusApplicationSparse< dim >, Remesher< VECTOR, dim > > app
Definition: adaptivity.h:36
AmandusIntegrator< dim > * estimate_integrator
Definition: adaptivity.h:265
void flag_callback(std::function< void(dealii::Triangulation< dim > &, const dealii::BlockVector< double > &)> callback)
Set callback for flagging.
Definition: adaptivity.h:212
EstimateRemesher(AmandusApplicationSparse< dim > &app, dealii::Triangulation< dim > &tria, AmandusRefineStrategy< dim > &mark, AmandusIntegrator< dim > &estimate_integrator)
Definition: adaptivity.h:247
Definition: amandus.h:115
Remesher that interpolates stored vectors upon refinement.
Definition: adaptivity.h:46
virtual void remesh(const dealii::AnyData &, const dealii::AnyData &)
Definition: adaptivity.h:181
dealii::BlockVector< double > indicator
Definition: adaptivity.h:233
abstract base class AmandusRefineStrategy
Definition: refine_strategy.h:25
dealii::SolutionTransfer< dim, VECTOR > transfer
Definition: adaptivity.h:106
std::vector< VECTOR > to_transfer
Vectors to be transferred to new grid.
Definition: adaptivity.h:108
Remesher interpolating all vectors and using an ErrorIntegrator to calculate criterion.
Definition: adaptivity.h:200
Base class for remeshing operators.
Definition: adaptivity.h:26
AmandusRefineStrategy< dim > & mark
Definition: adaptivity.h:266
InterpolatingRemesher(AmandusApplicationSparse< dim > &app, dealii::Triangulation< dim > &tria)
Definition: adaptivity.h:49
std::vector< VECTOR > transferred
Interpolated vectors on new grid.
Definition: adaptivity.h:110
virtual void finalize_transfer()
Definition: adaptivity.h:149
AllInterpolatingRemesher(AmandusApplicationSparse< dim > &app, dealii::Triangulation< dim > &tria)
Definition: adaptivity.h:122
UniformRemesher(AmandusApplicationSparse< dim > &app, dealii::Triangulation< dim > &tria)
Definition: adaptivity.h:175
ErrorRemesher(AmandusApplicationSparse< dim > &app, dealii::Triangulation< dim > &tria, ErrorIntegrator< dim > &error_integrator)
Definition: adaptivity.h:203
virtual void remesh(const dealii::AnyData &out, const dealii::AnyData &)
Definition: adaptivity.h:256
Definition: integrator.h:29
Interpolating remesher which interpolates all vectors.
Definition: adaptivity.h:119
Remesher interpolating all vectors and using an estimator integrator to calculate criterion...
Definition: adaptivity.h:244
virtual void prepare_transfer()
called at pre_refinement signal of triangulation
Definition: adaptivity.h:58