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

Developer Documentation: applications/mp-melt-pool/cases/spurious_currents/spurious_currents.hpp Source File
Developer Documentation
spurious_currents.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#include <deal.II/grid/manifold_lib.h>
12
15
16#include <iostream>
17
18#include "../../melt_pool_case.hpp"
19
21{
22 static double side_length = 5.0;
23 static double radius = 0.5;
24 static double radius_2 = 0.75;
25
26 template <int dim, typename number>
27 class SimulationSpuriousCurrents : public MeltPoolCase<dim, number>
28 {
29 public:
33
34 bool
35 add_case_specific_parameters(dealii::ParameterHandler &prm) override
36 {
37 prm.add_parameter("droplet shape",
39 "Shape of the droplet: circle or ellipse",
40 dealii::Patterns::Selection("circle|ellipse"));
41 prm.add_parameter("side length", side_length, "Side length of the quadratic domain.");
42 prm.add_parameter("radius",
43 radius,
44 "Radius of (i) circle or (ii) of the first semi-axis of an ellipse.");
45 prm.add_parameter("radius 2", radius_2, "Radius of second semi-axis of an ellipse.");
46
47 return this->parameters.base.do_print_parameters;
48 }
49
50 void
52 {
53 this->triangulation =
54 std::make_shared<dealii::parallel::distributed::Triangulation<dim>>(this->mpi_communicator);
55
56 if constexpr (dim == 2)
57 {
58 dealii::GridGenerator::hyper_cube(*this->triangulation,
59 -side_length / 2.,
60 side_length / 2);
61 this->triangulation->refine_global(this->parameters.base.global_refinements);
62 }
63 else
64 {
65 AssertThrow(false, dealii::ExcNotImplemented());
66 }
67 }
68
69 void
71 {
73 {0, std::make_shared<dealii::Functions::ConstantFunction<dim>>(-1)},
74 "dirichlet",
75 "level_set");
76 this->attach_boundary_condition(0, "no_slip", "navier_stokes_u");
77 this->attach_boundary_condition(0, "fix_pressure_constant", "navier_stokes_p");
78 }
79
80 void
82 {
83 const double eps = this->parameters.ls.reinit.compute_interface_thickness_parameter_epsilon(
84 dealii::GridTools::minimal_cell_diameter(*this->triangulation) /
85 this->parameters.ls.get_n_subdivisions() / std::sqrt(dim));
86
87 AssertThrow(eps > 0, dealii::ExcNotImplemented());
88
89 // introduce slightly non-symmetric geometry
90 dealii::Point<dim> center;
91 for (unsigned int d = 0; d < dim; ++d)
92 center[d] = 0.02 + 0.01 * d;
93
94 if (droplet_shape == "circle")
95 {
98 std::make_shared<dealii::Functions::SignedDistance::Sphere<dim>>(center, radius)),
99 "signed_distance");
100 }
101 else if (droplet_shape == "ellipse")
102 {
103 std::array<double, dim> radii;
104 if constexpr (dim == 2)
105 radii = {{radius_2, radius}};
106 else
107 AssertThrow(false, dealii::ExcNotImplemented());
108
111 std::make_shared<dealii::Functions::SignedDistance::Ellipsoid<dim>>(center, radii)),
112 "signed_distance");
113 }
114 else
115 AssertThrow(false,
116 dealii::ExcMessage("Unknown droptlet shape: \"" + droplet_shape +
117 "\"! Abort..."));
118 this->attach_initial_condition(std::make_shared<dealii::Functions::ZeroFunction<dim>>(dim),
119 "navier_stokes_u");
120 }
121
122 private:
123 std::string droplet_shape = "circle";
124 };
125} // namespace MeltPoolDG::Simulation::SpuriousCurrents
Wrapper function that flips the sign of another function.
Definition functions.hpp:22
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
bool add_case_specific_parameters(dealii::ParameterHandler &prm) override
Add simulation-specific parameters (can be overridden).
Definition spurious_currents.hpp:35
void create_spatial_discretization() override
Pure virtual function to create the spatial discretization.
Definition spurious_currents.hpp:51
SimulationSpuriousCurrents(std::string parameter_file, const MPI_Comm mpi_communicator)
Definition spurious_currents.hpp:30
void set_field_conditions() override
Pure virtual function to set the field conditions.
Definition spurious_currents.hpp:81
std::string droplet_shape
Definition spurious_currents.hpp:123
void set_boundary_conditions() override
Pure virtual function to set the boundary conditions.
Definition spurious_currents.hpp:70
Definition spurious_currents.cpp:6
static double radius_2
Definition spurious_currents.hpp:24
static double side_length
Definition spurious_currents.hpp:22
static double radius
Definition spurious_currents.hpp:23