104 AssertThrow(dim == 1 || x_min < x_max,
106 "The upper bound of the domain must be greater than the lower bound! Abort..."));
107 AssertThrow(z_min < z_max,
109 "The upper bound of the domain must be greater than the lower bound! Abort..."));
110 if constexpr (dim == 3)
114 "The upper bound of the domain must be greater than the lower bound! Abort..."));
116 if constexpr (dim == 1)
118#ifdef DEAL_II_WITH_METIS
119 this->triangulation = std::make_shared<dealii::parallel::shared::Triangulation<1>>(
120 this->mpi_communicator,
121 dealii::Triangulation<dim>::none,
123 dealii::parallel::shared::Triangulation<dim>::Settings::partition_metis);
128 "Missing Metis support of the deal.II installation. "
129 "Configure deal.II with -D DEAL_II_WITH_METIS='ON' to execute this example."));
132 const dealii::Point<1> left(z_min);
133 const dealii::Point<1> right(z_max);
134 dealii::GridGenerator::hyper_rectangle(*this->triangulation, left, right);
135 this->triangulation->refine_global(this->parameters.base.global_refinements);
137 else if constexpr (dim == 2)
139 this->triangulation =
140 std::make_shared<dealii::parallel::distributed::Triangulation<2>>(this->mpi_communicator);
142 if constexpr (std::is_same_v<CaseClass, Heat::HeatTransferCase<dim, number>>)
144 if (not do_two_phase)
146 std::vector<unsigned> refinements(2, 1);
149 const dealii::Point<2> left(0, -z_max);
150 const dealii::Point<2> right(x_max, 0);
151 dealii::GridGenerator::subdivided_hyper_rectangle(*this->triangulation,
155 this->triangulation->refine_global(this->parameters.base.global_refinements);
159 std::vector<unsigned> refinements(2, 1);
163 const dealii::Point<2> left(0, -z_max);
164 const dealii::Point<2> right(x_max, z_max);
165 dealii::GridGenerator::subdivided_hyper_rectangle(*this->triangulation,
169 this->triangulation->refine_global(this->parameters.base.global_refinements);
174 std::vector<unsigned> refinements(2, 1);
178 const dealii::Point<2> left(0, -z_max);
179 const dealii::Point<2> right(x_max, z_max);
180 dealii::GridGenerator::subdivided_hyper_rectangle(*this->triangulation,
184 this->triangulation->refine_global(this->parameters.base.global_refinements);
187 else if constexpr (dim == 3)
189 this->triangulation =
190 std::make_shared<dealii::parallel::distributed::Triangulation<3>>(this->mpi_communicator);
192 if constexpr (std::is_same_v<CaseClass, Heat::HeatTransferCase<dim, number>>)
194 if (not do_two_phase)
196 std::vector<unsigned int> refinements(3, 1);
200 const dealii::Point<3> left(0, -y_max, -z_max);
201 const dealii::Point<3> right(x_max, y_max, z_max);
202 dealii::GridGenerator::subdivided_hyper_rectangle(*this->triangulation,
206 this->triangulation->refine_global(this->parameters.base.global_refinements);
210 std::vector<unsigned int> refinements(3, 1);
215 const dealii::Point<3> left(0, 0, z_max);
216 const dealii::Point<3> right(x_max, y_max, -z_max);
217 dealii::GridGenerator::subdivided_hyper_rectangle(*this->triangulation,
221 this->triangulation->refine_global(this->parameters.base.global_refinements);
226 std::vector<unsigned int> refinements(3, 1);
231 const dealii::Point<3> left(0, 0, z_max);
232 const dealii::Point<3> right(x_max, y_max, -z_max);
233 dealii::GridGenerator::subdivided_hyper_rectangle(*this->triangulation,
237 this->triangulation->refine_global(this->parameters.base.global_refinements);
241 AssertThrow(
false, dealii::ExcMessage(
"Impossible dimension! Abort ..."));
249 if constexpr (std::is_same_v<CaseClass, Heat::HeatTransferCase<dim, number>>)
251 const dealii::types::boundary_id right_bc = 10;
252 for (
const auto &cell : this->triangulation->cell_iterators())
254 for (
auto &face : cell->face_iterators())
255 if (face->at_boundary())
257 if (face->center()[0] == x_max)
258 face->set_boundary_id(right_bc);
261 this->attach_boundary_condition(
262 {right_bc, std::make_shared<dealii::Functions::ConstantFunction<dim>>(T_0)},
266 else if constexpr (std::is_same_v<CaseClass, MeltPoolCase<dim, number>>)
268 const dealii::types::boundary_id lower_bc = 1;
269 const dealii::types::boundary_id upper_bc = 2;
270 const dealii::types::boundary_id left_bc = 3;
271 const dealii::types::boundary_id right_bc = 4;
272 [[maybe_unused]]
const dealii::types::boundary_id front_bc = 5;
273 [[maybe_unused]]
const dealii::types::boundary_id back_bc = 6;
274 for (
const auto &cell : this->triangulation->cell_iterators())
275 for (
auto &face : cell->face_iterators())
276 if (face->at_boundary())
278 if constexpr (dim == 1)
280 if (face->center()[0] == z_max)
281 face->set_boundary_id(lower_bc);
282 else if (face->center()[0] == z_min)
283 face->set_boundary_id(upper_bc);
287 if (face->center()[0] == x_max)
288 face->set_boundary_id(right_bc);
289 else if (face->center()[0] == x_min)
290 face->set_boundary_id(left_bc);
292 if constexpr (dim == 2)
294 if (face->center()[1] == -z_max)
295 face->set_boundary_id(lower_bc);
296 if (face->center()[1] == z_max)
297 face->set_boundary_id(upper_bc);
299 if constexpr (dim == 3)
301 if (face->center()[1] == -y_max)
302 face->set_boundary_id(lower_bc);
303 if (face->center()[1] == y_max)
304 face->set_boundary_id(upper_bc);
305 if (face->center()[2] == -z_max)
306 face->set_boundary_id(front_bc);
307 if (face->center()[2] == z_max)
308 face->set_boundary_id(back_bc);
312 this->attach_boundary_condition(left_bc,
"no_slip",
"navier_stokes_u");
313 this->attach_boundary_condition(right_bc,
"no_slip",
"navier_stokes_u");
314 this->attach_boundary_condition(lower_bc,
"no_slip",
"navier_stokes_u");
315 this->attach_boundary_condition(upper_bc,
"symmetry",
"navier_stokes_u");
316 if constexpr (dim == 3)
318 this->attach_boundary_condition(front_bc,
"no_slip",
"navier_stokes_u");
319 this->attach_boundary_condition(back_bc,
"no_slip",
"navier_stokes_u");
321 this->attach_boundary_condition(lower_bc,
"fix_pressure_constant",
"navier_stokes_p");
322 this->attach_boundary_condition(
323 {lower_bc, std::make_shared<dealii::Functions::ConstantFunction<dim>>(T_0)},
334 this->attach_initial_condition(std::make_shared<dealii::Functions::ConstantFunction<dim>>(T_0),
337 if constexpr (std::is_same_v<CaseClass, Heat::HeatTransferCase<dim, number>>)
340 if (this->parameters.heat.operator_type != Heat::TwoPhaseOperatorType::cut)
344 LevelSet::LevelSetType::smoothed_heaviside,
346 "prescribed_heaviside");
350 const number offset = 6e-6;
353 LevelSet::LevelSetType::signed_distance,
355 "prescribed_signed_distance");
356 if (this->parameters.amr.do_amr and
357 this->parameters.application_specific_parameters.amr_strategy ==
358 Heat::AMRStrategy::generic)
361 LevelSet::LevelSetType::smoothed_heaviside,
363 "prescribed_heaviside");
367 if constexpr (std::is_same_v<CaseClass, MeltPoolCase<dim, number>>)
369 const number eps = this->parameters.ls.reinit.compute_interface_thickness_parameter_epsilon(
370 dealii::GridTools::minimal_cell_diameter(*this->triangulation) /
371 this->parameters.ls.get_n_subdivisions() / std::sqrt(dim));
372 this->attach_initial_condition(
375 this->attach_initial_condition(
376 std::shared_ptr<dealii::Function<dim, number>>(
377 std::make_shared<dealii::Functions::ZeroFunction<dim, number>>(dim)),