12 namespace GridGenerator
28 template <
int dim,
int spacedim,
template <
int,
int>
class Triangulation>
35 AssertThrow(
false, dealii::ExcNotImplemented());
41 template <
template <
int,
int>
class Triangulation>
42 void cylinder(Triangulation<2, 2> &triangulation,
45 const double cylinder_position,
46 const double cylinder_diameter)
48 constexpr int dim = 2;
50 using namespace dealii;
52 dealii::Triangulation<dim, dim> tria1, tria2, tria3, tria4, tria5, tria6,
55 GridGenerator::hyper_cube_with_cylindrical_hole(
56 tria1, cylinder_diameter / 2., cylinder_diameter, 0.5, 1,
false);
58 GridGenerator::subdivided_hyper_rectangle(
61 Point<2>(-cylinder_diameter, -cylinder_diameter),
62 Point<2>(cylinder_diameter, -height / 2.));
64 GridGenerator::subdivided_hyper_rectangle(
67 Point<2>(-cylinder_diameter, cylinder_diameter),
68 Point<2>(cylinder_diameter, height / 2.));
70 GridGenerator::subdivided_hyper_rectangle(
73 Point<2>(cylinder_diameter, -cylinder_diameter),
74 Point<2>(length - cylinder_position, cylinder_diameter));
76 GridGenerator::subdivided_hyper_rectangle(
79 Point<2>(cylinder_diameter, cylinder_diameter),
80 Point<2>(length - cylinder_position, height / 2.));
82 GridGenerator::subdivided_hyper_rectangle(
85 Point<2>(cylinder_diameter, -height / 2.),
86 Point<2>(length - cylinder_position, -cylinder_diameter));
88 tria7.set_mesh_smoothing(triangulation.get_mesh_smoothing());
89 GridGenerator::merge_triangulations(
90 {&tria1, &tria2, &tria3, &tria4, &tria5, &tria6},
94 triangulation.copy_triangulation(tria7);
98 triangulation.set_manifold(0, PolarManifold<2>(Point<2>()));
102 for (
auto cell : triangulation.active_cell_iterators())
103 for (
unsigned int v = 0; v < GeometryInfo<dim>::vertices_per_cell;
105 auto &vertex = cell->vertex(v);
106 if (vertex[0] <= -cylinder_diameter + 1.e-6)
107 vertex[0] = -cylinder_position;
114 for (
auto cell : triangulation.active_cell_iterators()) {
115 for (
auto f : GeometryInfo<2>::face_indices()) {
116 const auto face = cell->face(f);
118 if (!face->at_boundary())
128 const auto center = face->center();
130 if (center[0] > length - cylinder_position - 1.e-6) {
135 if (center[0] < -cylinder_position + 1.e-6) {
147 template <
template <
int,
int>
class Triangulation>
148 void cylinder(Triangulation<3, 3> &triangulation,
151 const double cylinder_position,
152 const double cylinder_diameter)
154 using namespace dealii;
156 dealii::Triangulation<2, 2> tria1;
158 cylinder(tria1, length, height, cylinder_position, cylinder_diameter);
160 dealii::Triangulation<3, 3> tria2;
161 tria2.set_mesh_smoothing(triangulation.get_mesh_smoothing());
163 GridGenerator::extrude_triangulation(tria1, 4, height, tria2,
true);
164 GridTools::transform(
165 [height](
auto point) {
166 return point - dealii::Tensor<1, 3>{{0, 0, height / 2.}};
170 triangulation.copy_triangulation(tria2);
176 triangulation.set_manifold(
177 0, CylindricalManifold<3>(Tensor<1, 3>{{0., 0., 1.}}, Point<3>()));
183 for (
auto cell : triangulation.active_cell_iterators()) {
184 for (
auto f : GeometryInfo<3>::face_indices()) {
185 const auto face = cell->face(f);
187 if (!face->at_boundary())
197 const auto center = face->center();
199 if (center[0] > length - cylinder_position - 1.e-6) {
204 if (center[0] < -cylinder_position + 1.e-6) {
231 :
Geometry<dim>(
"cylinder", subsection)
235 "length", length_,
"length of computational domain");
239 "height", height_,
"height of computational domain");
241 object_position_ = 0.6;
242 this->add_parameter(
"object position",
244 "x position of immersed cylinder center point");
246 object_diameter_ = 0.5;
247 this->add_parameter(
"object diameter",
249 "diameter of immersed cylinder");
265 double object_position_;
266 double object_diameter_;
Cylinder(const std::string subsection)
void create_triangulation(typename Geometry< dim >::Triangulation &triangulation) final
typename Discretization< dim >::Triangulation Triangulation
void cylinder(Triangulation< dim, spacedim > &, const double, const double, const double, const double)