phaseflow
FEM solver for the Navier-Stokes-Boussinesq equations coupled with enthalpy-based phase change
 All Classes Namespaces Files Functions Variables Macros Pages
refinement.h
Go to the documentation of this file.
1 #ifndef _refinement_h_
2 #define _refinement_h_
3 
4 namespace Refinement
5 {
6 
10  template <int dim>
12  Triangulation<dim> &triangulation,
13  DoFHandler<dim> &dof_handler,
14  Vector<double> &solution,
15  SolutionTransfer<dim> &solution_trans,
16  const FE_Q<dim> fe,
17  const unsigned int min_grid_level,
18  const unsigned int max_grid_level,
19  const unsigned int max_cells,
20  const double refine_fraction,
21  const double coarsen_fraction)
22  {
23  Vector<float> estimated_error_per_cell(triangulation.n_active_cells());
24  KellyErrorEstimator<dim>::estimate(
25  dof_handler,
26  QGauss<dim-1>(fe.degree+1),
27  typename FunctionMap<dim>::type(),
28  solution,
29  estimated_error_per_cell);
30  GridRefinement::refine_and_coarsen_fixed_fraction(
31  triangulation,
32  estimated_error_per_cell,
33  refine_fraction,
34  coarsen_fraction);
35  if (triangulation.n_levels() > max_grid_level)
36  {
37  for (auto cell = triangulation.begin_active(max_grid_level);
38  cell != triangulation.end(); ++cell)
39  {
40  cell->clear_refine_flag ();
41  }
42  }
43  for (auto cell = triangulation.begin_active(min_grid_level);
44  cell != triangulation.end_active(min_grid_level); ++cell)
45  {
46  cell->clear_coarsen_flag ();
47  }
48  if ((max_cells > 0) & (triangulation.n_active_cells() > max_cells))
49  {
50  for (auto cell = triangulation.begin_active(); cell != triangulation.end(); ++cell)
51  {
52  cell->clear_refine_flag ();
53  }
54  }
55  triangulation.prepare_coarsening_and_refinement();
56  solution_trans.prepare_for_coarsening_and_refinement(solution);
57  triangulation.execute_coarsening_and_refinement();
58  }
59 
64  template <int dim>
66  {
67  Assert(false, ExcNotImplemented());
68  }
69 
70  template <int dim>
72  Triangulation<dim> &triangulation,
73  const std::vector<unsigned int> boundary_ids,
74  const unsigned int refinement_cycles)
75  {
76  for (unsigned int i = 0; i < refinement_cycles; i++)
77  {
78  for (auto cell : triangulation.active_cell_iterators())
79  {
80  if (!(cell->at_boundary()))
81  {
82  continue;
83  }
84  for (unsigned int f=0; f<GeometryInfo<dim>::faces_per_cell; ++f)
85  {
86  if (!cell->face(f)->at_boundary())
87  {
88  continue;
89  }
90  bool flagged = false;
91  for (auto boundary_id : boundary_ids)
92  {
93  if (cell->face(f)->boundary_id() == boundary_id)
94  {
95  cell->set_refine_flag();
96  flagged = true;
97  break;
98  }
99  }
100  if (flagged)
101  {
102  break;
103  }
104  }
105  }
106  triangulation.execute_coarsening_and_refinement();
107  }
108  }
109 
110 }
111 
112 #endif
void refine_mesh_near_boundaries(Triangulation< dim > &triangulation, const std::vector< unsigned int > boundary_ids, const unsigned int refinement_cycles)
Definition: refinement.h:71
void adaptive_refine_mesh(Triangulation< dim > &triangulation, DoFHandler< dim > &dof_handler, Vector< double > &solution, SolutionTransfer< dim > &solution_trans, const FE_Q< dim > fe, const unsigned int min_grid_level, const unsigned int max_grid_level, const unsigned int max_cells, const double refine_fraction, const double coarsen_fraction)
Adaptive grid refinement method from deal.II's step-26 tutorial.
Definition: refinement.h:11