2#include <deal.II/base/function.h>
3#include <deal.II/base/function_signed_distance.h>
4#include <deal.II/base/mpi.h>
5#include <deal.II/base/numbers.h>
6#include <deal.II/base/parameter_handler.h>
7#include <deal.II/base/point.h>
8#include <deal.II/base/tensor_function.h>
9#include <deal.II/base/utilities.h>
11#include <deal.II/distributed/tria.h>
13#include <deal.II/grid/grid_generator.h>
14#include <deal.II/grid/grid_tools.h>
15#include <deal.II/grid/tria.h>
17#include <deal.II/lac/vector.h>
19#include <deal.II/numerics/data_out.h>
20#include <deal.II/numerics/vector_tools.h>
34#include "../../melt_pool_case.hpp"
65 const dealii::Point<dim> &p,
66 const double factor_z0,
67 const double factor_dz)
69 const double projected_radius = dim == 1 ? 0 :
71 std::sqrt(p[0] * p[0] + p[1] * p[1]);
74 (factor_z0 + factor_dz * std::cos(2 * dealii::numbers::PI * projected_radius /
93 value(
const dealii::Point<dim> &p,
const unsigned int )
const override
95 dealii::Point<dim> at_interface;
96 at_interface[dim - 1] =
100 dealii::Functions::SignedDistance::Plane<dim>(at_interface,
101 dealii::Point<dim>::unit_vector(dim - 1));
103 return plane.value(p);
118 const std::pair<double, double>
factors)
128 value(
const dealii::Point<dim> &p,
const unsigned int )
const override
130 const double y_interface_disturbed =
132 if (p[dim - 1] > y_interface_disturbed)
144 template <
int dim,
typename number>
151 2. *
dealii::numbers::PI *
152 std::sqrt(3. * this->
parameters.flow.surface_tension.surface_tension_coefficient /
164 prm.add_parameter(
"factor height",
factor_height,
"Set a factor multiplied with the height.");
165 prm.add_parameter(
"delta T",
167 "Set the delta of the wall temperature to the boiling temperature.");
168 prm.add_parameter(
"do symmetry",
170 "Exploit symmetry conditions along the center plane.");
171 prm.add_parameter(
"bc vertical faces",
173 "Set the boundary condition along vertical faces.",
174 dealii::Patterns::Selection(
"symmetry|periodic"));
175 prm.add_parameter(
"bc temperature top",
177 "Set the boundary condition at the top.",
178 dealii::Patterns::Selection(
"adiabatic|dirichlet"));
179 prm.add_parameter(
"disturbance factors",
181 "Set the factors controlling the initial interface function"
182 " z_Γ = z_0 + Δz * cos(2*π r/λ_0) with z_0 = factor_z0 * lambda_0 "
183 "and Δz = factor_delta_z * lambda_0");
185 return this->
parameters.base.do_print_parameters;
193 if (this->
parameters.base.fe.type == FiniteElementType::FE_SimplexP || dim == 1)
195#ifdef DEAL_II_WITH_METIS
196 this->
triangulation = std::make_shared<dealii::parallel::shared::Triangulation<dim>>(
198 dealii::Triangulation<dim>::none,
200 dealii::parallel::shared::Triangulation<dim>::Settings::partition_metis);
205 "Missing Metis support of the deal.II installation. "
206 "Configure deal.II with -D DEAL_II_WITH_METIS='ON' to execute this example."));
211 this->
triangulation = std::make_shared<dealii::parallel::distributed::Triangulation<dim>>(
216 const dealii::Point<dim> bottom_left = dim == 1 ? dealii::Point<dim>(
y_min) :
219 const dealii::Point<dim> top_right = dim == 1 ? dealii::Point<dim>(
y_max) :
224 std::vector<unsigned int> subdivisions(
226 5 * (this->
parameters.base.fe.type == FiniteElementType::FE_SimplexP ?
227 dealii::Utilities::pow(2, this->parameters.base.global_refinements) :
235 subdivisions[dim - 1] *= 2;
237 if (this->
parameters.base.fe.type == FiniteElementType::FE_SimplexP)
238 dealii::GridGenerator::subdivided_hyper_rectangle_with_simplices(
239 *this->
triangulation, subdivisions, bottom_left, top_right,
true );
241 dealii::GridGenerator::subdivided_hyper_rectangle(
242 *this->
triangulation, subdivisions, bottom_left, top_right,
true );
245 if constexpr (dim == 3)
247 dealii::GridGenerator::subdivided_hyper_rectangle(
tria_slice,
252 dealii::GridTools::rotate(dealii::Point<3>::unit_vector(0),
253 0.5 * dealii::numbers::PI,
264 const auto [lower_bc, upper_bc, left_bc, right_bc, front_bc, back_bc] =
265 get_colorized_rectangle_boundary_ids<dim>();
269 std::make_shared<dealii::Functions::ZeroFunction<dim>>()},
274 std::make_shared<dealii::Functions::ConstantFunction<dim>>(
278 if (bc_temperature_top ==
"dirichlet")
280 std::make_shared<dealii::Functions::ConstantFunction<dim>>(
281 this->
parameters.material.boiling_temperature)},
287 {lower_bc, std::make_shared<dealii::Functions::ConstantFunction<dim>>(-1)},
291 {upper_bc, std::make_shared<dealii::Functions::ConstantFunction<dim>>(1)},
317 if (this->
parameters.base.fe.type != FiniteElementType::FE_SimplexP)
333 this->
parameters.material.boiling_temperature + delta_T,
334 this->parameters.material.boiling_temperature,
344 if (this->
parameters.output.do_user_defined_postprocessing ==
false)
348 if constexpr (dim == 3)
352 const std::vector<std::string> req_vars = {
"level_set",
"temperature",
"velocity"};
354 slice = std::make_shared<PostProcessingTools::SliceCreator<3, double>>(
359 slice->reinit(generic_data_out);
366 if constexpr (dim >= 2)
368 dealii::Triangulation<dim - 1, dim> tria;
370 GridGenerator::create_triangulation_with_marching_cube_algorithm<dim, double>(
372 generic_data_out.get_mapping(),
373 generic_data_out.get_dof_handler(
"level_set"),
374 generic_data_out.get_vector(
"level_set"),
379 dealii::DataOut<dim - 1, dim> data_out;
380 data_out.attach_triangulation(tria);
381 if (tria.n_cells() > 0)
382 data_out.build_patches();
383 data_out.write_vtu_with_pvtu_record(
395 dealii::parallel::distributed::Triangulation<2, 3>
tria_slice;
397 mutable std::shared_ptr<PostProcessingTools::SliceCreator<3, double>>
slice;
A generic utility for managing simulation output data in the MeltPoolDG context.
Definition generic_data_out.hpp:32
Definition melt_pool_case.hpp:290
MeltPoolCaseParameters< number > parameters
Definition melt_pool_case.hpp:292
void attach_boundary_condition(std::pair< const dealii::types::boundary_id, const std::shared_ptr< dealii::Function< dim > > > id_and_function, const std::string &type, const std::string &operation_name)
Attach a boundary condition for a specific operation.
Definition simulation_case_base.hpp:345
std::shared_ptr< dealii::Triangulation< dim, spacedim > > triangulation
Definition simulation_case_base.hpp:49
const std::string parameter_file
Definition simulation_case_base.hpp:52
void attach_periodic_boundary_condition(const dealii::types::boundary_id id_in, const dealii::types::boundary_id id_out, const int direction)
Definition simulation_case_base.hpp:384
void attach_initial_condition(std::shared_ptr< dealii::Function< dim > > initial_function, const std::string &operation_name)
Definition simulation_case_base.hpp:327
const MPI_Comm mpi_communicator
Definition simulation_case_base.hpp:56
Definition film_boiling.hpp:84
const std::pair< double, double > factors
Definition film_boiling.hpp:106
double value(const dealii::Point< dim > &p, const unsigned int) const override
Definition film_boiling.hpp:93
InitialSignedDistance(const double lambda0, const std::pair< double, double > factors)
Definition film_boiling.hpp:86
const double lambda0
Definition film_boiling.hpp:105
Definition film_boiling.hpp:113
const double T_min
Definition film_boiling.hpp:137
const double lambda0
Definition film_boiling.hpp:137
const std::pair< double, double > factors
Definition film_boiling.hpp:138
double value(const dealii::Point< dim > &p, const unsigned int) const override
Definition film_boiling.hpp:128
const double T_max
Definition film_boiling.hpp:137
InitialValuesTemperature(const double T_max, const double T_min, const double lambda0, const std::pair< double, double > factors)
Definition film_boiling.hpp:115
Definition film_boiling.hpp:146
SimulationFilmBoiling(std::string parameter_file, const MPI_Comm mpi_communicator)
Definition film_boiling.hpp:148
void set_boundary_conditions() final
Pure virtual function to set the boundary conditions.
Definition film_boiling.hpp:261
std::shared_ptr< PostProcessingTools::SliceCreator< 3, double > > slice
Definition film_boiling.hpp:397
const double x_min
Definition film_boiling.hpp:392
double y_max
Definition film_boiling.hpp:391
void create_spatial_discretization() override
Pure virtual function to create the spatial discretization.
Definition film_boiling.hpp:189
bool add_case_specific_parameters(dealii::ParameterHandler &prm) override
Add simulation-specific parameters (can be overridden).
Definition film_boiling.hpp:162
const double x_max
Definition film_boiling.hpp:390
const double lambda0
Definition film_boiling.hpp:389
dealii::parallel::distributed::Triangulation< 2, 3 > tria_slice
Definition film_boiling.hpp:395
unsigned int n_written_time_step
Definition film_boiling.hpp:394
void do_postprocessing(const GenericDataOut< dim, double > &generic_data_out) const final
Definition film_boiling.hpp:341
const double y_min
Definition film_boiling.hpp:393
void set_field_conditions() final
Pure virtual function to set the field conditions.
Definition film_boiling.hpp:322
Definition film_boiling.cpp:6
static std::string bc_temperature_top
Definition film_boiling.hpp:54
static std::pair< double, double > disturbance_factors
Definition film_boiling.hpp:55
double compute_disturbed_interface(const double lambda0, const dealii::Point< dim > &p, const double factor_z0, const double factor_dz)
Definition film_boiling.hpp:64
static std::string bc_vertical_faces
Definition film_boiling.hpp:53
static double delta_T
Definition film_boiling.hpp:51
static bool do_symmetry
Definition film_boiling.hpp:52
static double factor_height
Definition film_boiling.hpp:50
Definition advection_diffusion.cpp:6
Definition dealii_tensor.hpp:10