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

Developer Documentation: applications/mp-melt-pool/cases/oscillating_droplet/oscillating_droplet.hpp Source File
Developer Documentation
oscillating_droplet.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/function.h>
4#include <deal.II/base/function_signed_distance.h>
5
6#include <deal.II/distributed/tria.h>
7
8#include <deal.II/grid/grid_generator.h>
9#include <deal.II/grid/grid_tools_geometry.h>
10
13
14#include <cmath>
15#include <iostream>
16
17#include "../../melt_pool_case.hpp"
18
32{
33 using namespace MeltPoolDG::Simulation;
34
35 template <int dim>
36 class InitialLevelSet : public dealii::Function<dim>
37 {
38 public:
39 InitialLevelSet(const std::array<double, dim> &radii, const double eps)
40 : dealii::Function<dim>()
41 , distance_ellipse(dealii::Point<dim>(), radii)
42 , eps(eps)
43 {}
44
45 double
46 value(const dealii::Point<dim> &p, const unsigned int /*component*/) const override
47 {
49 }
50
51 private:
52 const dealii::Functions::SignedDistance::Ellipsoid<dim> distance_ellipse;
53 const double eps;
54 };
55
56 template <int dim, typename number>
57 class SimulationOscillatingDroplet : public MeltPoolCase<dim, number>
58 {
59 public:
62 {
63 AssertDimension(dim, 2);
64 }
65
66 bool
67 add_case_specific_parameters(dealii::ParameterHandler &prm) override
68 {
69 prm.add_parameter("side length", side_length, "Side length of the quadratic domain.");
70 prm.add_parameter("reference radius", reference_radius, "Reference radius.");
71 prm.add_parameter("elliptical deviation",
73 "Deviation of the elliptical semiaxes from the reference radius.");
74
75 return this->parameters.base.do_print_parameters;
76 }
77
78 void
80 {
81 this->triangulation =
82 std::make_shared<dealii::parallel::distributed::Triangulation<dim>>(this->mpi_communicator);
83
84 dealii::GridGenerator::hyper_cube(*this->triangulation, -side_length / 2, side_length / 2);
85
86 this->triangulation->refine_global(this->parameters.base.global_refinements);
87 }
88
89 void
91 {
92 this->attach_boundary_condition(0, "no_slip", "navier_stokes_u");
93 this->attach_boundary_condition(0, "fix_pressure_constant", "navier_stokes_p");
94 }
95
96 void
98 {
99 const double eps = this->parameters.ls.reinit.compute_interface_thickness_parameter_epsilon(
100 dealii::GridTools::minimal_cell_diameter(*this->triangulation) /
101 this->parameters.ls.get_n_subdivisions() / std::sqrt(dim));
102
103 AssertThrow(eps > 0, dealii::ExcNotImplemented());
104
105 std::array<double, dim> radii;
106 if constexpr (dim == 2)
107 radii = {
109 else
110 AssertThrow(false, dealii::ExcNotImplemented());
111
112 this->attach_initial_condition(std::make_shared<InitialLevelSet<dim>>(radii, eps),
113 "level_set");
114
115 this->attach_initial_condition(std::shared_ptr<dealii::Function<dim>>(
116 std::make_shared<dealii::Functions::ZeroFunction<dim>>(dim)),
117 "navier_stokes_u");
118 }
119
120 private:
121 double side_length = 400e-6;
122 double reference_radius = 100e-6;
123 double elliptical_deviation = 3. / 2.;
124 };
125} // namespace MeltPoolDG::Simulation::OscillatingDroplet
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_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
double value(const dealii::Point< dim > &p, const unsigned int) const override
Definition oscillating_droplet.hpp:46
const double eps
Definition oscillating_droplet.hpp:53
InitialLevelSet(const std::array< double, dim > &radii, const double eps)
Definition oscillating_droplet.hpp:39
const dealii::Functions::SignedDistance::Ellipsoid< dim > distance_ellipse
Definition oscillating_droplet.hpp:52
double reference_radius
Definition oscillating_droplet.hpp:122
double elliptical_deviation
Definition oscillating_droplet.hpp:123
void set_boundary_conditions() final
Pure virtual function to set the boundary conditions.
Definition oscillating_droplet.hpp:90
SimulationOscillatingDroplet(std::string parameter_file, const MPI_Comm mpi_communicator)
Definition oscillating_droplet.hpp:60
void set_field_conditions() final
Pure virtual function to set the field conditions.
Definition oscillating_droplet.hpp:97
bool add_case_specific_parameters(dealii::ParameterHandler &prm) override
Add simulation-specific parameters (can be overridden).
Definition oscillating_droplet.hpp:67
void create_spatial_discretization() override
Pure virtual function to create the spatial discretization.
Definition oscillating_droplet.hpp:79
number tanh_characteristic_function(const number &distance, const number &eps)
Definition characteristic_functions.hpp:12
Definition oscillating_droplet.cpp:6
Definition advection_diffusion.cpp:6
Definition dealii_tensor.hpp:10