DiFfRG
Loading...
Searching...
No Matches
h_adaptivity.hh
Go to the documentation of this file.
1#pragma once
2
3// external libraries
4#include <deal.II/dofs/dof_handler.h>
5#include <deal.II/dofs/dof_tools.h>
6#include <deal.II/grid/grid_refinement.h>
7#include <deal.II/grid/tria.h>
8#include <deal.II/lac/vector.h>
9#include <deal.II/numerics/derivative_approximation.h>
10#include <deal.II/numerics/error_estimator.h>
11#include <deal.II/numerics/solution_transfer.h>
12
13// DiFfRG
16
17namespace DiFfRG
18{
19 using namespace dealii;
25 template <typename Assembler>
26 class HAdaptivity : public AbstractAdaptor<typename Assembler::Discretization::VectorType>
27 {
28 using Discretization = typename Assembler::Discretization;
29 using VectorType = typename Discretization::VectorType;
30 static constexpr uint dim = Discretization::dim;
31
32 public:
33 HAdaptivity(Assembler &assembler, const JSONValue &json)
34 : assembler(assembler), discretization(assembler.get_discretization())
35 {
36 adapt_t = json.get_double("/discretization/adaptivity/start_adapt_at");
37 adapt_dt = json.get_double("/discretization/adaptivity/adapt_dt");
38 adapt_level = json.get_uint("/discretization/adaptivity/level");
39 adapt_upper = json.get_double("/discretization/adaptivity/refine_percent");
40 adapt_lower = json.get_double("/discretization/adaptivity/coarsen_percent");
41 }
42
50 virtual bool operator()(const double t, VectorType &sol) override
51 {
52 if (adapt_level > 0 && t >= adapt_t - 1e-12 * adapt_dt && (t - last_adapt + 1e-12 * adapt_dt) >= adapt_dt) {
53 if (!adapt(sol)) return false;
54 last_adapt = t;
55 return true;
56 }
57 return false;
58 }
59
65 virtual bool adapt(VectorType &solution) override
66 {
67 auto &triangulation = discretization.get_triangulation();
68 auto &dof_handler = discretization.get_dof_handler(0);
69 auto &constraints = discretization.get_constraints(0);
70
71 Vector<double> indicator(triangulation.n_active_cells());
72 indicator = 0;
73 assembler.refinement_indicator(indicator, solution);
74
75 GridRefinement::refine_and_coarsen_fixed_fraction(triangulation, indicator, adapt_upper, adapt_lower);
76
77 std::vector<typename Triangulation<dim>::active_cell_iterator> refined_cells;
78 for (const auto &cell : triangulation.active_cell_iterators())
79 if (cell->refine_flag_set()) refined_cells.push_back(cell);
80 if (triangulation.n_levels() > adapt_level)
81 for (const auto &cell : triangulation.active_cell_iterators_on_level(adapt_level))
82 cell->clear_refine_flag();
83 for (const auto &cell : triangulation.active_cell_iterators_on_level(0))
84 cell->clear_coarsen_flag();
85
86 refined_cells.clear();
87 for (const auto &cell : triangulation.active_cell_iterators())
88 if (cell->refine_flag_set()) refined_cells.push_back(cell);
89 if (refined_cells.size() == 0) return false;
90
91 SolutionTransfer<dim, VectorType> solution_trans(dof_handler);
92
93 VectorType previous_solution = solution;
94 triangulation.prepare_coarsening_and_refinement();
95 solution_trans.prepare_for_coarsening_and_refinement(previous_solution);
96 triangulation.execute_coarsening_and_refinement();
97
98 discretization.reinit();
99 assembler.reinit();
100 assembler.reinit_vector(solution);
101
102 solution_trans.interpolate(solution);
103 constraints.distribute(solution);
104
105 return true;
106 }
107
108 protected:
109 Assembler &assembler;
111
113
116 };
117} // namespace DiFfRG
Implement a simple interface to do all adaptivity tasks, i.e. solution transfer, reinit of dofHandler...
Definition abstract_adaptor.hh:11
Implement a simple interface to do all adaptivity tasks, i.e. solution transfer, reinit of dofHandler...
Definition h_adaptivity.hh:27
typename Discretization::VectorType VectorType
Definition h_adaptivity.hh:29
typename Assembler::Discretization Discretization
Definition h_adaptivity.hh:28
double adapt_dt
Definition h_adaptivity.hh:114
double adapt_upper
Definition h_adaptivity.hh:114
double adapt_lower
Definition h_adaptivity.hh:114
VectorType indicator
Definition h_adaptivity.hh:112
static constexpr uint dim
Definition h_adaptivity.hh:30
HAdaptivity(Assembler &assembler, const JSONValue &json)
Definition h_adaptivity.hh:33
double adapt_t
Definition h_adaptivity.hh:114
Discretization & discretization
Definition h_adaptivity.hh:110
virtual bool adapt(VectorType &solution) override
Force an adaptation and transfer the solution sol to the new mes.
Definition h_adaptivity.hh:65
uint adapt_level
Definition h_adaptivity.hh:115
double last_adapt
Definition h_adaptivity.hh:114
virtual bool operator()(const double t, VectorType &sol) override
Check if an adaptation step should be done and tranfer the given solution to the new mesh.
Definition h_adaptivity.hh:50
Assembler & assembler
Definition h_adaptivity.hh:109
A wrapper around the boost json value class.
Definition json.hh:19
double get_double(const std::string &key) const
Get the value of a key in the json object.
uint get_uint(const std::string &key) const
Get the value of a key in the json object.
Definition complex_math.hh:14
unsigned int uint
Definition utils.hh:22