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

Developer Documentation: applications/mp-melt-pool/cases/rising_bubble/rising_bubble.hpp Source File
Developer Documentation
rising_bubble.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#include <deal.II/base/point.h>
6#include <deal.II/base/tensor_function.h>
7
8#include <deal.II/distributed/shared_tria.h>
9#include <deal.II/distributed/tria.h>
10
11#include <deal.II/grid/grid_generator.h>
12#include <deal.II/grid/manifold_lib.h>
13
15
16#include <iostream>
17
18#include "../../melt_pool_case.hpp"
19
21{
22
23 template <int dim>
24 class InitialValuesLS : public dealii::Function<dim>
25 {
26 public:
28 : dealii::Function<dim>()
29 , distance_sphere(dim == 1 ? dealii::Point<dim>(0.5) :
30 dim == 2 ? dealii::Point<dim>(0.5, 0.5) :
31 dealii::Point<dim>(0.5, 0.5, 0.5),
32 0.25)
33 {}
34
35 double
36 value(const dealii::Point<dim> &p, const unsigned int /*component*/) const override
37 {
38 return -distance_sphere.value(p);
39 }
40
41 private:
42 const dealii::Functions::SignedDistance::Sphere<dim> distance_sphere;
43 };
44
45 /*
46 * This class collects all relevant input data for the level set simulation
47 */
48
49 template <int dim, typename number>
50 class SimulationRisingBubble : public MeltPoolCase<dim, number>
51 {
52 public:
56
57 void
59 {
60 if (this->parameters.base.fe.type == FiniteElementType::FE_SimplexP)
61 {
62 this->triangulation =
63 std::make_shared<dealii::parallel::shared::Triangulation<dim>>(this->mpi_communicator);
64 }
65 else
66 {
67 this->triangulation = std::make_shared<dealii::parallel::distributed::Triangulation<dim>>(
68 this->mpi_communicator);
69 }
70
71 if constexpr ((dim == 2) || (dim == 3))
72 {
73 // create mesh
74 std::vector<unsigned int> subdivisions(
75 dim,
76 5 * (this->parameters.base.fe.type == FiniteElementType::FE_SimplexP ?
77 dealii::Utilities::pow(2, this->parameters.base.global_refinements) :
78 1));
79 subdivisions[dim - 1] *= 2;
80
81 const dealii::Point<dim> bottom_left;
82 const dealii::Point<dim> top_right =
83 (dim == 2 ? dealii::Point<dim>(1, 2) : dealii::Point<dim>(1, 1, 2));
84
85 if (this->parameters.base.fe.type == FiniteElementType::FE_SimplexP)
86 {
87 dealii::GridGenerator::subdivided_hyper_rectangle_with_simplices(*this->triangulation,
88 subdivisions,
89 bottom_left,
90 top_right);
91 }
92 else
93 {
94 dealii::GridGenerator::subdivided_hyper_rectangle(*this->triangulation,
95 subdivisions,
96 bottom_left,
97 top_right);
98 }
99
100 // set boundary indicator to 2 on left and right face -> symmetry boundary
101 for (const auto &cell : this->triangulation->active_cell_iterators())
102 for (unsigned int face = 0; face < cell->n_faces(); ++face)
103 if (cell->face(face)->at_boundary() &&
104 (std::fabs(cell->face(face)->center()[0] - 1) < 1e-14 ||
105 std::fabs(cell->face(face)->center()[0]) < 1e-14))
106 cell->face(face)->set_boundary_id(2);
107
108 if (this->parameters.base.fe.type != FiniteElementType::FE_SimplexP)
109 this->triangulation->refine_global(this->parameters.base.global_refinements);
110 }
111 else
112 {
113 AssertThrow(false, dealii::ExcNotImplemented());
114 }
115 }
116
117 void
119 {
120 auto dirichlet = std::make_shared<dealii::Functions::ConstantFunction<dim>>(-1.0);
121
122 // lower, right and left faces
123 this->attach_boundary_condition(0, "no_slip", "navier_stokes_u");
124 // upper face
125 this->attach_boundary_condition(2, "symmetry", "navier_stokes_u");
126
127 this->attach_boundary_condition({0, dirichlet}, "dirichlet", "level_set");
128 this->attach_boundary_condition({2, dirichlet}, "dirichlet", "level_set");
129
130 this->attach_boundary_condition(0, "fix_pressure_constant", "navier_stokes_p");
131 }
132
133 void
135 {
136 this->attach_initial_condition(std::make_shared<InitialValuesLS<dim>>(), "signed_distance");
137 this->attach_initial_condition(std::shared_ptr<dealii::Function<dim>>(
138 new dealii::Functions::ZeroFunction<dim>(dim)),
139 "navier_stokes_u");
140 }
141 };
142} // namespace MeltPoolDG::Simulation::RisingBubble
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 rising_bubble.hpp:36
const dealii::Functions::SignedDistance::Sphere< dim > distance_sphere
Definition rising_bubble.hpp:42
InitialValuesLS()
Definition rising_bubble.hpp:27
void set_boundary_conditions() override
Pure virtual function to set the boundary conditions.
Definition rising_bubble.hpp:118
void set_field_conditions() override
Pure virtual function to set the field conditions.
Definition rising_bubble.hpp:134
void create_spatial_discretization() override
Pure virtual function to create the spatial discretization.
Definition rising_bubble.hpp:58
SimulationRisingBubble(std::string parameter_file, const MPI_Comm mpi_communicator)
Definition rising_bubble.hpp:53
Definition rising_bubble.cpp:6
Definition dealii_tensor.hpp:10