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

Developer Documentation: applications/mp-level-set/cases/stefans_problem.hpp Source File
Developer Documentation
stefans_problem.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
13#include <deal.II/lac/vector.h>
14
15#include <deal.II/numerics/vector_tools.h>
16
18
19#include <cmath>
20#include <iostream>
21#include <string>
22
23#include "../level_set_case.hpp"
24
26{
27 using namespace MeltPoolDG::Simulation;
28
29 template <int dim, typename number>
31 {
32 public:
34 : LevelSet::LevelSetCase<dim, number>(parameter_file, mpi_communicator)
35 {}
36
37 void
39 {
40 if (this->parameters.base.fe.type == FiniteElementType::FE_SimplexP || dim == 1)
41 {
42#ifdef DEAL_II_WITH_METIS
43 this->triangulation = std::make_shared<dealii::parallel::shared::Triangulation<dim>>(
44 this->mpi_communicator,
45 dealii::Triangulation<dim>::none,
46 false,
47 dealii::parallel::shared::Triangulation<dim>::Settings::partition_metis);
48#else
49 AssertThrow(
50 false,
51 dealii::ExcMessage(
52 "Missing Metis support of the deal.II installation. "
53 "Configure deal.II with -D DEAL_II_WITH_METIS='ON' to execute this example."));
54#endif
55 }
56 else
57 {
58 this->triangulation = std::make_shared<dealii::parallel::distributed::Triangulation<dim>>(
59 this->mpi_communicator);
60 }
61 // create mesh
62 const dealii::Point<dim, number> bottom_left =
63 dim == 1 ? dealii::Point<dim, number>(y_min) :
64 dim == 2 ? dealii::Point<dim, number>(x_min, y_min) :
65 dealii::Point<dim, number>(x_min, x_min, y_min);
66 const dealii::Point<dim, number> top_right =
67 dim == 1 ? dealii::Point<dim, number>(y_max) :
68 dim == 2 ? dealii::Point<dim, number>(x_max, y_max) :
69 dealii::Point<dim, number>(x_max, x_max, y_max);
70
71
72 if (this->parameters.base.fe.type == FiniteElementType::FE_SimplexP)
73 {
74 // create mesh
75 std::vector<unsigned int> subdivisions(
76 dim, 5 * dealii::Utilities::pow(2, this->parameters.base.global_refinements));
77 subdivisions[dim - 1] *= 2;
78
79 dealii::GridGenerator::subdivided_hyper_rectangle_with_simplices(
80 *this->triangulation, subdivisions, bottom_left, top_right, true);
81 }
82 else
83 {
84 dealii::GridGenerator::hyper_rectangle(*this->triangulation,
85 bottom_left,
86 top_right,
87 true);
88 this->triangulation->refine_global(this->parameters.base.global_refinements);
89 }
90 }
91
92 void
94 {
95 // faces in dim-1 direction
96 const dealii::types::boundary_id upper_bc = 2 * (dim - 1) + 1;
97
99 {upper_bc, std::make_shared<dealii::Functions::ConstantFunction<dim>>(-1.0)},
100 "dirichlet",
101 "level_set");
102 }
103
104 void
106 {
108 std::make_shared<dealii::Functions::SignedDistance::Plane<dim>>(
109 dealii::Point<dim, number>::unit_vector(dim - 1) * y_interface,
110 -dealii::Point<dim, number>::unit_vector(dim - 1)),
111 "signed_distance");
112 this->attach_field_function(std::make_shared<dealii::Functions::ZeroFunction<dim>>(dim),
113 "prescribed_velocity",
114 "level_set");
115 }
116
117 private:
118 const number x_min = 0.0;
119 const number x_max = 1.0;
120 const number y_min = 0.0;
121 const number y_max = 1.0;
122 const number y_interface = 0.5;
123 };
124} // namespace MeltPoolDG::Simulation::StefansProblem
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
const number y_interface
Definition stefans_problem.hpp:122
SimulationStefansProblem(std::string parameter_file, const MPI_Comm mpi_communicator)
Definition stefans_problem.hpp:33
const number y_max
Definition stefans_problem.hpp:121
void set_boundary_conditions() final
Pure virtual function to set the boundary conditions.
Definition stefans_problem.hpp:93
const number x_min
Definition stefans_problem.hpp:118
const number y_min
Definition stefans_problem.hpp:120
void set_field_conditions() final
Pure virtual function to set the field conditions.
Definition stefans_problem.hpp:105
const number x_max
Definition stefans_problem.hpp:119
void create_spatial_discretization() override
Pure virtual function to create the spatial discretization.
Definition stefans_problem.hpp:38
Definition stefans_problem.cpp:6
Definition advection_diffusion.cpp:6