for (unsigned int i = 1; i < radii.size() - 1; ++i)
{
// Find tangental faces in cells and refine in tangental direction.
for (auto cell : triangulation.active_cell_iterators()) {
if (grid_center.distance (cell->center()) < radii[i-1]) continue;
for (unsigned int f=0; f < GeometryInfo<dim>::faces_per_cell; ++f)
{
bool is_tangental = true;
const double dist = grid_center.distance (cell->face(f)->vertex(0));
for (unsigned int v=0; v < GeometryInfo<dim>::vertices_per_face; ++v)
{
double dist2 = grid_center.distance (cell->face(f)->vertex(v));
if (std::abs( dist2 - dist) > min_width)
{
is_tangental = false;
break;
}
}
if (is_tangental)
{
// Number of faces is two time larger than number of axis.
cell->set_refine_flag(RefinementCase<dim>::cut_axis(f/2));
break;
}
} // end of for all faces
} // end of for all cells
triangulation.execute_coarsening_and_refinement ();
// Scale to current radius
for (auto cell : triangulation.active_cell_iterators())
{
for (unsigned int v=0; v < GeometryInfo<dim>::vertices_per_cell; ++v)
{
const double dist = grid_center.distance (cell->vertex(v));
if (dist > radii[i-1]*1.0001 && dist < outer_radius * 0.9999)
for (int j = 0; j < dim; ++j)
cell->vertex(v)(j) *= radii[i]/dist;
} // end of for all vertices
} // end of for all cells
Triangulation<dim> tmp;
GridGenerator::flatten_triangulation(triangulation,tmp);
triangulation.clear();
triangulation.copy_triangulation(tmp);
cell->set_refine_flag(RefinementCase<dim>::cut_axis(f/2));