71 &embedded_triangulation) ==
nullptr),
73 "The embedded triangulation must not be distributed. It will be partitioned later."));
77 space_triangulation.
refine_global(parameters.space_pre_refinement_cycles);
79 parameters.embedded_pre_refinement_cycles);
84 embedded_triangulation};
88 bool global_done =
false;
90 double min_embedded = 1e10;
91 double max_embedded = 0;
92 double min_space = 1e10;
96 const bool use_space = parameters.refinement_strategy ==
"space";
97 const bool use_embedded = parameters.refinement_strategy ==
"embedded";
100 ExcMessage(
"One of the two must be true"));
102 unsigned int n_embedded_cells =
104 while (global_done ==
false)
109 space_cache.get_locally_owned_cell_bounding_boxes_rtree();
111 const auto &embedded_tree =
112 embedded_cache.get_cell_bounding_boxes_rtree();
114 unsigned int n_refs = 0;
116 for (
const auto &[embedded_box, embedded_cell] : embedded_tree)
118 const auto &[p1, p2] = embedded_box.get_boundary_points();
119 const auto diameter = p1.distance(p2);
123 for (
const auto &[space_box, space_cell] :
124 tree | bgi::adaptors::queried(bgi::intersects(embedded_box)))
126 const auto &[sp1, sp2] = space_box.get_boundary_points();
127 const auto space_diameter = sp1.distance(sp2);
128 min_space =
std::min(min_space, space_diameter);
129 max_space =
std::max(max_space, space_diameter);
132 embedded_cell->level() < parameters.max_refinement_level &&
133 parameters.refinement_factor * space_diameter <
diameter)
135 embedded_cell->set_refine_flag();
140 space_cell->level() < parameters.max_refinement_level &&
141 parameters.refinement_factor *
diameter < space_diameter)
143 space_cell->set_refine_flag();
149 deallog <<
"Cells marked for refinement: " << n_refs;
156 if (global_done ==
false)
162 deallog <<
" out of " << n_embedded_cells
163 <<
" (embedded) cells." << std::endl;
165 if (n_embedded_cells ==
172 deallog <<
" out of " << n_space_cells <<
" (space) cells."
182 deallog << std::setw(20) << std::left <<
"Min space: " << std::setw(12)
183 << std::right << min_space << std::setw(20) << std::left
184 <<
", max space: " << std::setw(12) << std::right << max_space
185 << std::setw(25) << std::left <<
", min embedded: " << std::setw(12)
186 << std::right << min_embedded << std::setw(25) << std::left
187 <<
", max embedded: " << std::setw(12) << std::right << max_embedded
190 return std::make_tuple(min_space, max_space, min_embedded, max_embedded);
198 if (parameters.space_post_refinement_cycles > 0)
199 for (
unsigned int i = 0; i < parameters.space_post_refinement_cycles; ++i)
202 space_cache.get_locally_owned_cell_bounding_boxes_rtree();
204 const auto &embedded_tree =
205 embedded_cache.get_cell_bounding_boxes_rtree();
207 for (
const auto &[embedded_box, embedded_cell] : embedded_tree)
208 for (
const auto &[space_box, space_cell] :
209 tree | bgi::adaptors::queried(bgi::intersects(embedded_box)))
210 space_cell->set_refine_flag();
219 parameters.embedded_post_refinement_cycles);
222 const auto [sm, sM, em, eM] = refine();
227 std::cout <<
"Space local min/max diameters : " << sm <<
"/" << sM
229 <<
"Embedded space min/max diameters: " << em <<
"/" << eM
void add_parameter(const std::string &entry, ParameterType ¶meter, const std::string &documentation="", ParameterHandler &prm_=prm, const Patterns::PatternBase &pattern=*Patterns::Tools::Convert< ParameterType >::to_pattern())
::VectorizedArray< Number, width > min(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
void adjust_grids(Triangulation< spacedim, spacedim > &space_triangulation, Triangulation< reduced_dim, spacedim > &embedded_triangulation, const RefinementParameters ¶meters=RefinementParameters())