8#include <ryujin/base/compile_time_options.h>
13 namespace GridGenerator
33 template <
int dim,
int spacedim,
template <
int,
int>
class Triangulation>
41 AssertThrow(
false, dealii::ExcNotImplemented());
47 template <
template <
int,
int>
class Triangulation>
48 void twotanks(Triangulation<2, 2> &triangulation,
49 const double tank_length,
50 const double tank_width,
51 const double tunnel_length,
52 const double tunnel_width,
53 const unsigned int subdivisions_factor)
55 using namespace dealii;
57 dealii::Triangulation<2, 2> res1, res2, res3, tank1, tank2, tunnel,
final;
59 const double tolerance = 1.e-8;
62 tank_width - tunnel_width > tolerance,
64 " !!! The tank width must be larger than the tunnel width !!!"));
69 const double diff = (tank_width - tunnel_width) / 2.;
71 static_cast<int>(std::round(tank_length * subdivisions_factor));
73 static_cast<int>(std::round(diff * subdivisions_factor));
75 GridGenerator::subdivided_hyper_rectangle(
78 Point<2>(-tank_length, -tank_width / 2.),
79 Point<2>(0, -tunnel_width / 2.));
81 GridGenerator::subdivided_hyper_rectangle(
84 Point<2>(-tank_length, tunnel_width / 2.),
85 Point<2>(0, tank_width / 2.));
87 sub_y =
static_cast<int>(std::round(tunnel_width * subdivisions_factor));
89 GridGenerator::subdivided_hyper_rectangle(
92 Point<2>(-tank_length, -tunnel_width / 2.),
93 Point<2>(0, tunnel_width / 2.));
96 tank1.set_mesh_smoothing(triangulation.get_mesh_smoothing());
97 GridGenerator::merge_triangulations(
98 {&res1, &res2, &res3}, tank1, tolerance);
101 tank2.copy_triangulation(tank1);
102 dealii::Point<2> shift_vector(tunnel_length + tank_length, 0.);
103 dealii::GridTools::shift(shift_vector, tank2);
106 sub_x =
static_cast<int>(std::round(tunnel_length * subdivisions_factor));
108 GridGenerator::subdivided_hyper_rectangle(
111 Point<2>(0., -tunnel_width / 2.),
112 Point<2>(tunnel_length, tunnel_width / 2.));
116 final.set_mesh_smoothing(triangulation.get_mesh_smoothing());
117 GridGenerator::merge_triangulations(
118 {&tank1, &tunnel, &tank2},
final, tolerance);
122 triangulation.copy_triangulation(
final);
128 for (
auto cell : triangulation.active_cell_iterators()) {
129 for (
auto f : cell->face_indices()) {
130 const auto face = cell->face(f);
132 if (!face->at_boundary())
141 const auto center = face->center();
142 if (center[0] > tank_length + tunnel_length - tolerance)
145 if (center[0] < -tank_length + tolerance)
167 :
Geometry<dim>(
"two tanks", subsection)
171 "tank length", tank_length_,
"length of tanks [units]");
174 this->add_parameter(
"tank width", tank_width_,
"width of tank [units]");
176 tunnel_length_ = 10.;
178 "tunnel length", tunnel_length_,
"length of tunnel [units]");
182 "tunnel width", tunnel_width_,
"width of tunnel [units]");
185 subdivisions_factor_ = 1;
186 this->add_parameter(
"subdivisions factor",
187 subdivisions_factor_,
188 "A number used for introducing subdivions in both "
189 "x-y direction. Useful when dealing with "
190 "measurements that are less than 1. ");
194 dealii::Triangulation<dim> &triangulation)
const final
201 subdivisions_factor_);
207 double tunnel_length_;
208 double tunnel_width_;
210 unsigned int subdivisions_factor_;
TwoTanks(const std::string &subsection)
void create_coarse_triangulation(dealii::Triangulation< dim > &triangulation) const final
void twotanks(Triangulation< dim, spacedim > &, const double, const double, const double, const double, const unsigned int)