/home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/discretization/mesh/h_adaptivity.hh Source File#

DiFfRG: /home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/discretization/mesh/h_adaptivity.hh Source File
DiFfRG
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
43 virtual ~HAdaptivity() = default;
44
52 virtual bool operator()(const double t, VectorType &sol) override
53 {
54 if (adapt_level > 0 && t >= adapt_t - 1e-12 * adapt_dt && (t - last_adapt + 1e-12 * adapt_dt) >= adapt_dt) {
55 if (!adapt(sol)) return false;
56 last_adapt = t;
57 return true;
58 }
59 return false;
60 }
61
67 virtual bool adapt(VectorType &solution) override
68 {
69 auto &triangulation = discretization.get_triangulation();
70 auto &dof_handler = discretization.get_dof_handler(0);
71 auto &constraints = discretization.get_constraints(0);
72
73 Vector<double> indicator(triangulation.n_active_cells());
74 indicator = 0;
75 assembler.refinement_indicator(indicator, solution);
76
77 GridRefinement::refine_and_coarsen_fixed_fraction(triangulation, indicator, adapt_upper, adapt_lower);
78
79 std::vector<typename Triangulation<dim>::active_cell_iterator> refined_cells;
80 for (const auto &cell : triangulation.active_cell_iterators())
81 if (cell->refine_flag_set()) refined_cells.push_back(cell);
82 if (triangulation.n_levels() > adapt_level)
83 for (const auto &cell : triangulation.active_cell_iterators_on_level(adapt_level))
84 cell->clear_refine_flag();
85 for (const auto &cell : triangulation.active_cell_iterators_on_level(0))
86 cell->clear_coarsen_flag();
87
88 refined_cells.clear();
89 for (const auto &cell : triangulation.active_cell_iterators())
90 if (cell->refine_flag_set()) refined_cells.push_back(cell);
91 if (refined_cells.size() == 0) return false;
92
93 SolutionTransfer<dim, VectorType> solution_trans(dof_handler);
94
95 VectorType previous_solution = solution;
96 triangulation.prepare_coarsening_and_refinement();
97 solution_trans.prepare_for_coarsening_and_refinement(previous_solution);
98 triangulation.execute_coarsening_and_refinement();
99
100 discretization.reinit();
101 assembler.reinit();
102 assembler.reinit_vector(solution);
103
104 solution_trans.interpolate(solution);
105 constraints.distribute(solution);
106
107 return true;
108 }
109
110 protected:
111 Assembler &assembler;
113
115
118 };
119} // 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:116
double adapt_upper
Definition h_adaptivity.hh:116
double adapt_lower
Definition h_adaptivity.hh:116
VectorType indicator
Definition h_adaptivity.hh:114
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:116
Discretization & discretization
Definition h_adaptivity.hh:112
virtual ~HAdaptivity()=default
virtual bool adapt(VectorType &solution) override
Force an adaptation and transfer the solution sol to the new mes.
Definition h_adaptivity.hh:67
uint adapt_level
Definition h_adaptivity.hh:117
double last_adapt
Definition h_adaptivity.hh:116
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:52
Assembler & assembler
Definition h_adaptivity.hh:111
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:10
unsigned int uint
Definition utils.hh:24