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

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