applications/mp-melt-pool/cases/moving_droplet/moving_droplet.hpp Source File

Developer Documentation: applications/mp-melt-pool/cases/moving_droplet/moving_droplet.hpp Source File
Developer Documentation
moving_droplet.hpp
Go to the documentation of this file.
1#pragma once
2#include <deal.II/base/function.h>
3#include <deal.II/base/function_signed_distance.h>
4
5#include <deal.II/distributed/tria.h>
6
7#include <deal.II/grid/grid_generator.h>
8
11
12#include <cmath>
13#include <iostream>
14
15#include "../../melt_pool_case.hpp"
16
35{
36 using namespace MeltPoolDG::Simulation;
37
38 static double velocity = 1.0;
39
40 template <int dim>
41 class InitialLevelSet : public dealii::Function<dim>
42 {
43 public:
44 InitialLevelSet(const double radius, const double eps)
45 : dealii::Function<dim>()
46 , distance(dealii::Point<dim>(), radius)
47 , eps(eps)
48 {}
49
50 double
51 value(const dealii::Point<dim> &p, const unsigned int /* component */) const override
52 {
54 }
55
56 private:
57 const dealii::Functions::SignedDistance::Sphere<dim> distance;
58 const double eps;
59 };
60
61 template <int dim>
62 class InitialVelocityField : public dealii::Function<dim>
63 {
64 public:
65 InitialVelocityField(const dealii::Function<dim> &level_set)
66 : dealii::Function<dim>(dim)
68 {}
69
70 void
71 vector_value(const dealii::Point<dim> &p,
72 [[maybe_unused]] dealii::Vector<double> &values) const override
73 {
74 const auto hs = (level_set.value(p) + 1.) * 0.5;
75
76 if (dim == 2)
77 {
78 values[0] = hs * velocity;
79 values[1] = hs * velocity;
80 }
81 else
82 AssertThrow(false, dealii::ExcMessage("Advection field for dim!=2 not implemented."));
83 }
84
85 const dealii::Function<dim> &level_set;
86 };
87
88 template <int dim, typename number>
89 class SimulationMovingDroplet : public MeltPoolCase<dim, number>
90 {
91 public:
94 {
95 AssertDimension(dim, 2);
96 }
97
98 bool
99 add_case_specific_parameters(dealii::ParameterHandler &prm) override
100 {
101 prm.add_parameter("side length", side_length, "Side length of the quadratic domain.");
102 prm.add_parameter("radius", radius, "Droplet radius.");
103 prm.add_parameter("velocity", velocity, "Initial droplet velocity.");
104 return this->parameters.base.do_print_parameters;
105 }
106
107 void
109 {
110 this->triangulation =
111 std::make_shared<dealii::parallel::distributed::Triangulation<dim>>(this->mpi_communicator);
112
113 dealii::GridGenerator::hyper_cube(*this->triangulation,
114 -side_length / 2,
115 side_length / 2,
116 true /*colorize*/);
117 }
118
119 void
121 {
122 this->attach_boundary_condition(0, "fix_pressure_constant", "navier_stokes_p");
123
125 if (dim > 1)
127
128 this->triangulation->refine_global(this->parameters.base.global_refinements);
129 }
130
131 void
133 {
134 // Here, the initial velocity field depends on the level set function. Thus, the diffuse
135 // level set is given in the initial state on purpose.
136 const double eps = this->parameters.ls.reinit.compute_interface_thickness_parameter_epsilon(
137 dealii::GridTools::minimal_cell_diameter(*this->triangulation) /
138 this->parameters.ls.get_n_subdivisions() / std::sqrt(dim));
139
140 AssertThrow(eps > 0, dealii::ExcNotImplemented());
141
142 const auto ls = std::make_shared<InitialLevelSet<dim>>(radius, eps);
143 this->attach_initial_condition(ls, "level_set");
144
145 this->attach_initial_condition(std::make_shared<InitialVelocityField<dim>>(*ls),
146 "navier_stokes_u");
147 }
148
149 private:
150 double side_length = 400e-6;
151 double radius = 100e-6;
152 };
153} // namespace MeltPoolDG::Simulation::MovingDroplet
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
const double eps
Definition moving_droplet.hpp:58
InitialLevelSet(const double radius, const double eps)
Definition moving_droplet.hpp:44
double value(const dealii::Point< dim > &p, const unsigned int) const override
Definition moving_droplet.hpp:51
const dealii::Functions::SignedDistance::Sphere< dim > distance
Definition moving_droplet.hpp:57
const dealii::Function< dim > & level_set
Definition moving_droplet.hpp:85
void vector_value(const dealii::Point< dim > &p, dealii::Vector< double > &values) const override
Definition moving_droplet.hpp:71
InitialVelocityField(const dealii::Function< dim > &level_set)
Definition moving_droplet.hpp:65
void set_field_conditions() final
Pure virtual function to set the field conditions.
Definition moving_droplet.hpp:132
bool add_case_specific_parameters(dealii::ParameterHandler &prm) override
Add simulation-specific parameters (can be overridden).
Definition moving_droplet.hpp:99
double side_length
Definition moving_droplet.hpp:150
void set_boundary_conditions() final
Pure virtual function to set the boundary conditions.
Definition moving_droplet.hpp:120
SimulationMovingDroplet(std::string parameter_file, const MPI_Comm mpi_communicator)
Definition moving_droplet.hpp:92
void create_spatial_discretization() override
Pure virtual function to create the spatial discretization.
Definition moving_droplet.hpp:108
number tanh_characteristic_function(const number &distance, const number &eps)
Definition characteristic_functions.hpp:12
Definition moving_droplet.cpp:6
static double velocity
Definition moving_droplet.hpp:38
Definition advection_diffusion.cpp:6
Definition dealii_tensor.hpp:10