applications/mp-level-set/cases/rotating_bubble.hpp Source File

Developer Documentation: applications/mp-level-set/cases/rotating_bubble.hpp Source File
Developer Documentation
rotating_bubble.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#include <deal.II/base/point.h>
5#include <deal.II/base/tensor_function.h>
6
7#include <deal.II/distributed/tria.h>
8
9#include <deal.II/grid/grid_generator.h>
10
11#include <deal.II/lac/vector.h>
12
13#include <deal.II/numerics/error_estimator.h>
14#include <deal.II/numerics/vector_tools.h>
15
18
19#include <cmath>
20#include <iostream>
21
22#include "../level_set_case.hpp"
23
25{
26 template <int dim, typename number>
27 class InitializePhi : public dealii::Function<dim>
28 {
29 public:
31 : dealii::Function<dim>()
32 , distance_sphere(dim == 1 ? dealii::Point<dim, number>(0.0) :
33 dim == 2 ? dealii::Point<dim, number>(0.0, 0.5) :
34 dealii::Point<dim, number>(0.0, 0.5, 0.0),
35 0.25 /*radius*/)
36 {}
37
38 number
39 value(const dealii::Point<dim, number> &p, const unsigned int /*component*/) const override
40 {
41 return -distance_sphere.value(p);
42 }
43
44 private:
45 const dealii::Functions::SignedDistance::Sphere<dim> distance_sphere;
46 };
47
48 template <int dim, typename number>
49 class AdvectionField : public dealii::Function<dim, number>
50 {
51 public:
53 : dealii::Function<dim, number>(dim)
54 {}
55
56 void
57 vector_value(const dealii::Point<dim, number> &p, dealii::Vector<number> &values) const override
58 {
59 if constexpr (dim >= 2)
60 {
61 const number x = p[0];
62 const number y = p[1];
63
64 values[0] = 4 * y;
65 values[1] = -4 * x;
66 }
67 else
68 AssertThrow(false, dealii::ExcMessage("Advection field for dim!=2 not implemented"));
69
70 if constexpr (dim == 3)
71 values[2] = 0;
72 }
73 };
74
75 /*
76 * This class collects all relevant input data for the level set simulation
77 */
78
79 template <int dim, typename number>
81 {
82 public:
84 : LevelSet::LevelSetCase<dim, number>(parameter_file, mpi_communicator)
85 {}
86
87 void
89 {
90 if (dim == 1 || this->parameters.base.fe.type == FiniteElementType::FE_SimplexP)
91 {
92 AssertDimension(dealii::Utilities::MPI::n_mpi_processes(this->mpi_communicator), 1);
93 this->triangulation = std::make_shared<dealii::Triangulation<dim>>();
94 }
95 else
96 {
97 this->triangulation = std::make_shared<dealii::parallel::distributed::Triangulation<dim>>(
98 this->mpi_communicator);
99 }
100
101 if (this->parameters.base.fe.type == FiniteElementType::FE_SimplexP)
102 {
103 dealii::GridGenerator::subdivided_hyper_cube_with_simplices(
104 *this->triangulation,
105 dealii::Utilities::pow(2, this->parameters.base.global_refinements),
108 }
109 else
110 {
111 dealii::GridGenerator::hyper_cube(*this->triangulation, left_domain, right_domain);
112 this->triangulation->refine_global(this->parameters.base.global_refinements);
113 }
114 }
115
116 void
118 {
119 /*
120 * create a pair of (boundary_id, dirichlet_function)
121 */
122 constexpr dealii::types::boundary_id inflow_bc = 42;
123 constexpr dealii::types::boundary_id do_nothing = 0;
124
126 {inflow_bc, std::make_shared<dealii::Functions::ConstantFunction<dim>>(-1.0)},
127 "dirichlet",
128 "level_set");
129 /*
130 * mark inflow edges with boundary label (no boundary on outflow edges must be prescribed
131 * due to the hyperbolic nature of the analyzed problem
132 *
133 out in
134 (-1,1) +---------------+ (1,1)
135 | : |
136 in | : | out
137 |_______________|
138 | : |
139 out | : | in
140 | : |
141 +---------------+
142 * (-1,-1) in out (1,-1)
143 */
144 if constexpr (dim > 1)
145 {
146 for (const auto &cell : this->triangulation->cell_iterators())
147 for (const auto &face : cell->face_iterators())
148 if ((face->at_boundary()))
149 {
150 const number half_line = (right_domain + left_domain) / 2;
151
152 if (face->center()[0] == left_domain && face->center()[1] > half_line)
153 face->set_boundary_id(inflow_bc);
154 else if (face->center()[0] == right_domain && face->center()[1] < half_line)
155 face->set_boundary_id(inflow_bc);
156 else if (face->center()[1] == right_domain && face->center()[0] > half_line)
157 face->set_boundary_id(inflow_bc);
158 else if (face->center()[1] == left_domain && face->center()[0] < half_line)
159 face->set_boundary_id(inflow_bc);
160 else
161 face->set_boundary_id(do_nothing);
162 }
163 }
164 }
165
166 void
168 {
170 "signed_distance");
171 this->attach_field_function(std::make_shared<AdvectionField<dim, number>>(),
172 "prescribed_velocity",
173 "level_set");
174 }
175
176 private:
177 number left_domain = -1.0;
178 number right_domain = 1.0;
179 };
180} // namespace MeltPoolDG::Simulation::RotatingBubble
Definition level_set_case.hpp:76
LevelSetCase(const std::string &parameter_file_in, MPI_Comm mpi_communicator_in)
Definition level_set_case.hpp:80
LevelSetCaseParameters< number > parameters
Definition level_set_case.hpp:78
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
void attach_field_function(std::shared_ptr< dealii::Function< dim > > function, const std::string &type, const std::string &operation_name)
Definition simulation_case_base.hpp:315
const MPI_Comm mpi_communicator
Definition simulation_case_base.hpp:56
void vector_value(const dealii::Point< dim, number > &p, dealii::Vector< number > &values) const override
Definition rotating_bubble.hpp:57
AdvectionField()
Definition rotating_bubble.hpp:52
const dealii::Functions::SignedDistance::Sphere< dim > distance_sphere
Definition rotating_bubble.hpp:45
number value(const dealii::Point< dim, number > &p, const unsigned int) const override
Definition rotating_bubble.hpp:39
InitializePhi()
Definition rotating_bubble.hpp:30
void create_spatial_discretization() override
Pure virtual function to create the spatial discretization.
Definition rotating_bubble.hpp:88
void set_boundary_conditions() override
Pure virtual function to set the boundary conditions.
Definition rotating_bubble.hpp:117
number left_domain
Definition rotating_bubble.hpp:177
number right_domain
Definition rotating_bubble.hpp:178
SimulationRotatingBubble(std::string parameter_file, const MPI_Comm mpi_communicator)
Definition rotating_bubble.hpp:83
void set_field_conditions() override
Pure virtual function to set the field conditions.
Definition rotating_bubble.hpp:167
Definition rotating_bubble.cpp:6
Definition dealii_tensor.hpp:10