8#include <ryujin/base/compile_time_options.h>
13 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 wavetank(Triangulation<2, 2> &triangulation,
43 const double reservoir_length,
44 const double reservoir_width,
45 const double flume_length,
46 const double flume_width)
48 using namespace dealii;
50 dealii::Triangulation<2, 2> res1, res2, res3, flume,
final;
52 const double tolerance = 1.e-8;
54 Assert(reservoir_width - flume_width > tolerance,
55 dealii::ExcInternalError());
60 const double diff = (reservoir_width - flume_width) / 2.;
61 unsigned int sub_x = int(std::round(reservoir_length * 100.));
62 unsigned int sub_y = int(std::round(diff * 100.));
64 GridGenerator::subdivided_hyper_rectangle(
67 Point<2>(-reservoir_length, -reservoir_width / 2.),
68 Point<2>(0, -flume_width / 2.));
70 GridGenerator::subdivided_hyper_rectangle(
73 Point<2>(-reservoir_length, flume_width / 2.),
74 Point<2>(0, reservoir_width / 2.));
76 sub_y = int(std::round(flume_width * 100.));
78 GridGenerator::subdivided_hyper_rectangle(
81 Point<2>(-reservoir_length, -flume_width / 2.),
82 Point<2>(0, flume_width / 2.));
84 sub_x = int(std::round(flume_length * 100.));
86 GridGenerator::subdivided_hyper_rectangle(
89 Point<2>(0., -flume_width / 2.),
90 Point<2>(flume_length, flume_width / 2.));
92 final.set_mesh_smoothing(triangulation.get_mesh_smoothing());
93 GridGenerator::merge_triangulations(
94 {&res1, &res2, &res3, &flume},
final, tolerance);
95 triangulation.copy_triangulation(
final);
101 for (
auto cell : triangulation.active_cell_iterators()) {
102 for (
auto f : cell->face_indices()) {
103 const auto face = cell->face(f);
105 if (!face->at_boundary())
114 const auto center = face->center();
115 if (center[0] > flume_length - tolerance)
137 :
Geometry<dim>(
"wave tank", subsection)
139 reservoir_length_ = 157. / 100.;
140 this->add_parameter(
"reservoir length",
142 "length of water reservoir [meters]");
144 reservoir_width_ = 81 / 100.;
145 this->add_parameter(
"reservoir width",
147 "width of water reservoir [meters]");
149 flume_length_ = 600.78 / 100.;
151 "flume length", flume_length_,
"length of flume [meters]");
153 flume_width_ = 24 / 100.;
155 "flume width", flume_width_,
"width of flume [meters]");
159 dealii::Triangulation<dim> &triangulation)
const final
169 double reservoir_length_;
170 double reservoir_width_;
171 double flume_length_;
void create_coarse_triangulation(dealii::Triangulation< dim > &triangulation) const final
WaveTank(const std::string &subsection)
void wavetank(Triangulation< dim, spacedim > &, const double, const double, const double, const double)