8#include <compile_time_options.h>
14 namespace GridGenerator
34 template <
int dim,
int spacedim,
template <
int,
int>
class Triangulation>
42 AssertThrow(
false, dealii::ExcNotImplemented());
48 template <
template <
int,
int>
class Triangulation>
49 void twotanks(Triangulation<2, 2> &triangulation,
50 const double tank_length,
51 const double tank_width,
52 const double tunnel_length,
53 const double tunnel_width,
54 const unsigned int subdivisions_factor)
56 using namespace dealii;
58 dealii::Triangulation<2, 2> res1, res2, res3, tank1, tank2, tunnel,
final;
60 const double tolerance = 1.e-8;
63 tank_width - tunnel_width > tolerance,
65 " !!! The tank width must be larger than the tunnel width !!!"));
70 const double diff = (tank_width - tunnel_width) / 2.;
72 static_cast<int>(std::round(tank_length * subdivisions_factor));
74 static_cast<int>(std::round(diff * subdivisions_factor));
76 GridGenerator::subdivided_hyper_rectangle(
79 Point<2>(-tank_length, -tank_width / 2.),
80 Point<2>(0, -tunnel_width / 2.));
82 GridGenerator::subdivided_hyper_rectangle(
85 Point<2>(-tank_length, tunnel_width / 2.),
86 Point<2>(0, tank_width / 2.));
88 sub_y =
static_cast<int>(std::round(tunnel_width * subdivisions_factor));
90 GridGenerator::subdivided_hyper_rectangle(
93 Point<2>(-tank_length, -tunnel_width / 2.),
94 Point<2>(0, tunnel_width / 2.));
97 tank1.set_mesh_smoothing(triangulation.get_mesh_smoothing());
98 GridGenerator::merge_triangulations(
99 {&res1, &res2, &res3}, tank1, tolerance);
102 tank2.copy_triangulation(tank1);
103 dealii::Point<2> shift_vector(tunnel_length + tank_length, 0.);
104 dealii::GridTools::shift(shift_vector, tank2);
107 sub_x =
static_cast<int>(std::round(tunnel_length * subdivisions_factor));
109 GridGenerator::subdivided_hyper_rectangle(
112 Point<2>(0., -tunnel_width / 2.),
113 Point<2>(tunnel_length, tunnel_width / 2.));
117 final.set_mesh_smoothing(triangulation.get_mesh_smoothing());
118 GridGenerator::merge_triangulations(
119 {&tank1, &tunnel, &tank2},
final, tolerance);
123 triangulation.copy_triangulation(
final);
129 for (
auto cell : triangulation.active_cell_iterators()) {
130 for (
auto f : cell->face_indices()) {
131 const auto face = cell->face(f);
133 if (!face->at_boundary())
142 const auto center = face->center();
143 if (center[0] > tank_length + tunnel_length - tolerance)
146 if (center[0] < -tank_length + tolerance)
168 :
Geometry<dim>(
"two tanks", subsection)
172 "tank length", tank_length_,
"length of tanks [units]");
175 this->add_parameter(
"tank width", tank_width_,
"width of tank [units]");
177 tunnel_length_ = 10.;
179 "tunnel length", tunnel_length_,
"length of tunnel [units]");
183 "tunnel width", tunnel_width_,
"width of tunnel [units]");
186 subdivisions_factor_ = 1;
187 this->add_parameter(
"subdivisions factor",
188 subdivisions_factor_,
189 "A number used for introducing subdivions in both "
190 "x-y direction. Useful when dealing with "
191 "measurements that are less than 1. ");
195 dealii::Triangulation<dim> &triangulation)
const final
202 subdivisions_factor_);
208 double tunnel_length_;
209 double tunnel_width_;
211 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)