13 namespace GridGenerator
23 template <
int dim,
int spacedim,
template <
int,
int>
class Triangulation>
24 void annulus(Triangulation<dim, spacedim> &,
30 AssertThrow(
false, dealii::ExcNotImplemented());
36 template <
template <
int,
int>
class Triangulation>
37 void annulus(Triangulation<2, 2> &triangulation,
39 const double inner_radius,
40 const double outer_radius,
43 constexpr int dim = 2;
44 constexpr double eps = 1.0e-10;
46 using namespace dealii;
53 const auto assign_manifolds = [&](
auto &tria) {
54 for (
const auto &cell : tria.cell_iterators()) {
59 bool cell_on_annulus =
true;
60 for (
unsigned int v : cell->vertex_indices()) {
61 const auto vertex = cell->vertex(v);
62 const auto distance = vertex.norm();
63 if (!(inner_radius - eps <= distance && distance <= outer_radius)) {
64 cell_on_annulus =
false;
69 cell->set_all_manifold_ids(1);
74 for (
const unsigned int f : cell->face_indices()) {
75 const auto face = cell->face(f);
77 bool face_on_annulus =
true;
78 for (
unsigned int v : face->vertex_indices()) {
79 const auto vertex = face->vertex(v);
80 const auto distance = vertex.norm();
81 if (!(inner_radius - eps <= distance &&
82 distance <= outer_radius)) {
83 face_on_annulus =
false;
88 face->set_all_manifold_ids(1);
92 tria.set_manifold(1, SphericalManifold<dim>());
93 dealii::TransfiniteInterpolationManifold<dim> transfinite_manifold;
94 transfinite_manifold.initialize(tria);
95 tria.set_manifold(0, transfinite_manifold);
99 dealii::Triangulation<dim> tria_inner;
101 dealii::Triangulation<dim> temp;
102 GridGenerator::hyper_ball_balanced(
103 temp, dealii::Point<dim>(), inner_radius);
104 temp.refine_global(2);
105 GridGenerator::flatten_triangulation(temp, tria_inner);
109 dealii::Triangulation<dim>
annulus;
110 GridGenerator::hyper_shell(
111 annulus, dealii::Point<dim>(), inner_radius, outer_radius, 32);
114 dealii::Triangulation<dim> tria_outer;
116 dealii::Triangulation<dim> temp;
117 GridGenerator::hyper_shell(temp,
118 dealii::Point<dim>(),
120 length / 2. * std::sqrt(2),
123 for (
const auto &cell : temp.cell_iterators()) {
124 static_assert(dim == 2,
"not implemented");
125 for (
unsigned int i = 0; i < 4; ++i) {
126 auto &vertex = cell->vertex(i);
127 if (std::abs(vertex[0]) < eps && std::abs(vertex[1]) > length / 2.)
128 vertex[1] = std::copysign(length / 2., vertex[1]);
129 if (std::abs(vertex[1]) < eps && std::abs(vertex[0]) > length / 2.)
130 vertex[0] = std::copysign(length / 2., vertex[0]);
133 assign_manifolds(temp);
134 temp.refine_global(2);
135 GridGenerator::flatten_triangulation(temp, tria_outer);
139 dealii::Triangulation<dim, dim> coarse_triangulation;
140 coarse_triangulation.set_mesh_smoothing(
141 triangulation.get_mesh_smoothing());
142 GridGenerator::merge_triangulations(
143 {&tria_inner, &
annulus, &tria_outer}, coarse_triangulation, 1.e-12);
149 coarse_triangulation.reset_all_manifolds();
150 coarse_triangulation.set_all_manifold_ids(0);
152 assign_manifolds(coarse_triangulation);
153 coarse_triangulation.refine_global(2);
157 std::set<typename dealii::Triangulation<dim>::active_cell_iterator>
160 for (
const auto &cell : coarse_triangulation.active_cell_iterators()) {
161 for (
auto f : cell->face_indices()) {
162 auto face = cell->face(f);
163 const auto position = face->center();
164 const auto radius = position.norm();
165 const auto inner_value = inner_radius;
166 const auto outer_value = outer_radius;
169 radius - inner_value > 1.e-8 && outer_value - radius > 1.e-3;
171 bool partial_annulus =
172 std::abs(position[1]) -
173 std::abs(position[0]) *
174 std::tan(dealii::numbers::PI / 180. * angle) <
177 if (in_anulus && partial_annulus) {
178 cells_to_remove.insert(cell);
183 GridGenerator::create_triangulation_with_removed_cells(
184 coarse_triangulation, cells_to_remove, coarse_triangulation);
189 dealii::Triangulation<dim> flattened_triangulation;
190 flattened_triangulation.set_mesh_smoothing(
191 triangulation.get_mesh_smoothing());
192 GridGenerator::flatten_triangulation(coarse_triangulation,
193 flattened_triangulation);
194 triangulation.copy_triangulation(flattened_triangulation);
195 assign_manifolds(triangulation);
202 for (
auto cell : triangulation.active_cell_iterators()) {
203 for (
auto f : cell->face_indices()) {
204 const auto face = cell->face(f);
206 if (!face->at_boundary())
218 template <
template <
int,
int>
class Triangulation>
219 void annulus(Triangulation<3, 3> & ,
225 using namespace dealii;
226 AssertThrow(
false, dealii::ExcNotImplemented());