I think the issue is different here. PFA three files corresponding to
a coarser version of grid-2 mesh. First is the original coarse mesh,
second with single refinement, and third with two refinements. The
first refinement doesn't cause any issue, but second does. In the
first refinement, all cells are inner cells, so appropriate changes
are made to all the boundaries. But in the second refinement, there
are outer cells and inner cells, and only the inner cells are
refined. This causes a contradiction, because the outer and inner
cells share a boundary: the middle circle. Because of refinement of
inner cells, they get a new outer boundary, but the outer cells retain
their inner boundary, creating discontinuities at the middle circle.
This point is further proved if we change the refinement strategy to
the one mentioned in the "Possibilities for extensions" section. This
time, all the cells with center lying on the positive y side,
are refined . Even though boundaries are still curved, it causes no
issue. PFA "grid-3-coarse.svg" and full code also.
On Friday, April 15, 2022 at 10:06:41 PM UTC+5:30 Wolfgang Bangerth wrote:
> On 4/13/22 22:25, ankit tyagi wrote:
> > According the the github link, this can happen when using higher order
> elements.
>
> I updated the page, see here now:
>
> https://github.com/dealii/dealii/wiki/Frequently-Asked-Questions#in-my-graphical-output-the-solution-appears-discontinuous-at-hanging-nodes
>
> Best
> W.
>
> --
> ------------------------------------------------------------------------
> Wolfgang Bangerth email: [email protected]
> www: http://www.math.colostate.edu/~bangerth/
>
>
--
The deal.II project is located at http://www.dealii.org/
For mailing list/forum options, see
https://groups.google.com/d/forum/dealii?hl=en
---
You received this message because you are subscribed to the Google Groups
"deal.II User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/dealii/5f749fd2-e423-4664-8239-5972125d2152n%40googlegroups.com.
#include <deal.II/grid/tria.h>
#include <deal.II/grid/grid_generator.h>
#include <deal.II/grid/grid_out.h>
#include <iostream>
#include <fstream>
#include <cmath>
using namespace dealii;
void first_grid()
{
Triangulation<2> mesh;
GridGenerator::hyper_cube(mesh);
mesh.refine_global(4);
std::ofstream out("grid-1.svg");
GridOut grid_out;
grid_out.write_svg(mesh, out);
std::cout << "Grid-1 is written to grid-1.svg" << std::endl;
}
void second_grid()
{
Triangulation<2> mesh;
const Point<2> center(1, 0);
double inner_radius = 0.5, outer_radius = 1.0;
GridGenerator::hyper_shell(mesh,
center,
inner_radius,
outer_radius,
10);
for (unsigned int step = 0; step < 5; ++step)
{
for (auto &cell : mesh.active_cell_iterators())
{
for (const auto v : cell->vertex_indices())
{
const double distance_from_center = center.distance(cell->vertex(v));
if (std::fabs(distance_from_center - inner_radius) <= 1e-6 * inner_radius)
{
cell->set_refine_flag();
break;
}
}
}
mesh.execute_coarsening_and_refinement();
}
std::ofstream out("grid-2.svg");
GridOut grid_out;
GridOutFlags::Svg svg_flags;
svg_flags.coloring = svg_flags.Coloring::none;
grid_out.set_flags(svg_flags);
grid_out.write_svg(mesh, out);
std::cout << "Grid-2 is written to grid-2.svg" << std::endl;
}
void grid2_single_refine()
{
Triangulation<2> mesh;
const Point<2> center(1, 0);
double inner_radius = 0.5, outer_radius = 1.0;
GridGenerator::hyper_shell(mesh,
center,
inner_radius,
outer_radius,
6);
for (unsigned int step = 0; step < 1; ++step)
{
for (auto &cell : mesh.active_cell_iterators())
{
for (const auto v : cell->vertex_indices())
{
const double distance_from_center = center.distance(cell->vertex(v));
if (std::fabs(distance_from_center - inner_radius) <= 1e-6 * inner_radius)
{
cell->set_refine_flag();
break;
}
}
}
mesh.execute_coarsening_and_refinement();
}
std::ofstream out("grid-2-single-refine.svg");
GridOut grid_out;
GridOutFlags::Svg svg_flags;
svg_flags.coloring = svg_flags.Coloring::none;
grid_out.set_flags(svg_flags);
grid_out.write_svg(mesh, out);
std::cout << "Grid-2 with single refinement is written to grid-2-single-refine.svg" << std::endl;
}
void grid2_double_refine()
{
Triangulation<2> mesh;
const Point<2> center(1, 0);
double inner_radius = 0.5, outer_radius = 1.0;
GridGenerator::hyper_shell(mesh,
center,
inner_radius,
outer_radius,
6);
for (unsigned int step = 0; step < 2; ++step)
{
for (auto &cell : mesh.active_cell_iterators())
{
for (const auto v : cell->vertex_indices())
{
const double distance_from_center = center.distance(cell->vertex(v));
if (std::fabs(distance_from_center - inner_radius) <= 1e-6 * inner_radius)
{
cell->set_refine_flag();
break;
}
}
}
mesh.execute_coarsening_and_refinement();
}
std::ofstream out("grid-2-double-refine.svg");
GridOut grid_out;
GridOutFlags::Svg svg_flags;
svg_flags.coloring = svg_flags.Coloring::none;
grid_out.set_flags(svg_flags);
grid_out.write_svg(mesh, out);
std::cout << "Grid-2 with double refinement is written to grid-2-double-refine.svg" << std::endl;
}
void grid2_norefine()
{
Triangulation<2> mesh;
const Point<2> center(1, 0);
double inner_radius = 0.5, outer_radius = 1.0;
GridGenerator::hyper_shell(mesh,
center,
inner_radius,
outer_radius,
6);
std::ofstream out("grid-2-norefine.svg");
GridOut grid_out;
GridOutFlags::Svg svg_flags;
svg_flags.coloring = svg_flags.Coloring::none;
grid_out.set_flags(svg_flags);
grid_out.write_svg(mesh, out);
std::cout << "Grid-2 without refinement is written to grid-2-norefine.svg" << std::endl;
}
void third_grid()
{
Triangulation<2> mesh;
const Point<2> center(1, 0);
double inner_radius = 0.5, outer_radius = 1.0;
GridGenerator::hyper_shell(mesh,
center,
inner_radius,
outer_radius,
10);
for (unsigned int step = 0; step < 5; ++step)
{
for (auto &cell : mesh.active_cell_iterators())
{
if (cell->center()[1] > 0)
{
cell->set_refine_flag();
}
}
mesh.execute_coarsening_and_refinement();
}
std::ofstream out("grid-3.svg");
GridOut grid_out;
grid_out.write_svg(mesh, out);
std::cout << "Grid-3 is written to grid-3.svg" << std::endl;
}
void grid3_coarse()
{
Triangulation<2> mesh;
const Point<2> center(1, 0);
double inner_radius = 0.5, outer_radius = 1.0;
GridGenerator::hyper_shell(mesh,
center,
inner_radius,
outer_radius,
6);
for (unsigned int step = 0; step < 2; ++step)
{
for (auto &cell : mesh.active_cell_iterators())
{
if (cell->center()[1] > 0)
{
cell->set_refine_flag();
}
}
mesh.execute_coarsening_and_refinement();
}
std::ofstream out("grid-3-coarse.svg");
GridOut grid_out;
GridOutFlags::Svg svg_flags;
svg_flags.coloring = svg_flags.Coloring::none;
grid_out.set_flags(svg_flags);
grid_out.write_svg(mesh, out);
std::cout << "Grid-3 is written to grid-3-coarse.svg" << std::endl;
}
void grid2_nocolor()
{
Triangulation<2> mesh;
const Point<2> center(1, 0);
double inner_radius = 0.5, outer_radius = 1.0;
GridGenerator::hyper_shell(mesh,
center,
inner_radius,
outer_radius,
10);
for (unsigned int step = 0; step < 5; ++step)
{
for (auto &cell : mesh.active_cell_iterators())
{
for (const auto v : cell->vertex_indices())
{
const double distance_from_center = center.distance(cell->vertex(v));
if (std::fabs(distance_from_center - inner_radius) <= 1e-6 * inner_radius)
{
cell->set_refine_flag();
break;
}
}
}
mesh.execute_coarsening_and_refinement();
}
std::ofstream out("grid-2-nocolor.svg");
GridOut grid_out;
GridOutFlags::Svg svg_flags;
svg_flags.coloring = svg_flags.Coloring::none;
grid_out.set_flags(svg_flags);
grid_out.write_svg(mesh, out);
std::cout << "Grid-2-nocolor is written to grid-2-nocolor.svg" << std::endl;
}
int main()
{
first_grid();
second_grid();
third_grid();
grid2_nocolor();
grid2_norefine();
grid2_single_refine();
grid2_double_refine();
grid3_coarse();
}