applications/mp-melt-pool/cases/thermo_capillary_droplet/thermo_capillary_two_droplets.hpp Source File

Developer Documentation: applications/mp-melt-pool/cases/thermo_capillary_droplet/thermo_capillary_two_droplets.hpp Source File
Developer Documentation
thermo_capillary_two_droplets.hpp
Go to the documentation of this file.
1#pragma once
2#include <deal.II/base/exceptions.h>
3#include <deal.II/base/function.h>
4#include <deal.II/base/function_signed_distance.h>
5#include <deal.II/base/mpi.h>
6#include <deal.II/base/point.h>
7#include <deal.II/base/types.h>
8#include <deal.II/base/utilities.h>
9
10#include <deal.II/distributed/shared_tria.h>
11#include <deal.II/distributed/tria.h>
12
13#include <deal.II/grid/grid_generator.h>
14#include <deal.II/grid/grid_tools_geometry.h>
15#include <deal.II/grid/tria.h>
16
21
22#include <cmath>
23#include <memory>
24#include <string>
25#include <vector>
26
27#include "../../melt_pool_case.hpp"
28
107{
108 using namespace MeltPoolDG::Simulation;
109
110 static constexpr double radius = 0.048;
111 static constexpr double x_outer = 8. * radius;
112 static constexpr double z_outer = 16. * radius;
113 static constexpr double reference_temperature = 0.0;
114 static constexpr double temperature_gradient = 10.;
115
116 template <int dim>
117 class InitialValuesLS : public dealii::Function<dim>
118 {
119 public:
120 InitialValuesLS(const double eps)
121 : dealii::Function<dim>()
122 , eps(eps)
123 , center1(dim == 2 ? dealii::Point<dim>(2.9 * radius, 4.0 * radius) :
124 dealii::Point<dim>(2.9 * radius, 0, 4.0 * radius))
125
126 , center2(dim == 2 ? dealii::Point<dim>(5.1 * radius, 5.8 * radius) :
127 dealii::Point<dim>(5.1 * radius, 0, 5.8 * radius))
130 {}
131
132 double
133 value(const dealii::Point<dim> &p, const unsigned int /*component*/) const override
134 {
135 if ((p - center1).norm() < (p - center2).norm()) // closer to first droplet center
137 else // closer to second droplet center
139 }
140
141 const double eps;
142 const dealii::Point<dim> center1;
143 const dealii::Point<dim> center2;
144 const dealii::Functions::SignedDistance::Sphere<dim> sphere1;
145 const dealii::Functions::SignedDistance::Sphere<dim> sphere2;
146 };
147
148
149 template <int dim>
150 class InitialValuesTemperature : public dealii::Function<dim>
151 {
152 public:
154 : dealii::Function<dim>()
155 {}
156
157 double
158 value(const dealii::Point<dim> &p, const unsigned int /*component*/) const override
159 {
160 return reference_temperature + p[dim - 1] * temperature_gradient;
161 }
162 };
163 /*
164 * This class collects all relevant input data for the level set simulation
165 */
166
167 template <int dim, typename number>
169 {
170 public:
175
176 void
178 {
179 if (this->parameters.base.fe.type == FiniteElementType::FE_SimplexP)
180 {
181#ifdef DEAL_II_WITH_METIS
182 this->triangulation = std::make_shared<dealii::parallel::shared::Triangulation<dim>>(
183 this->mpi_communicator,
184 dealii::Triangulation<dim>::none,
185 false,
186 dealii::parallel::shared::Triangulation<dim>::Settings::partition_metis);
187#else
188 AssertThrow(
189 false,
190 dealii::ExcMessage(
191 "Missing Metis support of the deal.II installation. "
192 "Configure deal.II with -D DEAL_II_WITH_METIS='ON' to execute this example."));
193#endif
194 }
195 else
196 {
197 this->triangulation = std::make_shared<dealii::parallel::distributed::Triangulation<dim>>(
198 this->mpi_communicator);
199 }
200
201 if constexpr (dim == 2 or dim == 3)
202 {
203 // create mesh
204 const dealii::Point<dim> bottom_left =
205 dim == 2 ? dealii::Point<dim>(0, 0) : dealii::Point<dim>(0, 0, 0);
206 const dealii::Point<dim> top_right = dim == 2 ? dealii::Point<dim>(x_outer, z_outer) :
207 dealii::Point<dim>(x_outer, 0, z_outer);
208
209 // create mesh
210 if (this->parameters.base.fe.type == FiniteElementType::FE_SimplexP)
211 {
212 std::vector<unsigned int> subdivisions(
213 dim, 4 * dealii::Utilities::pow(2, this->parameters.base.global_refinements));
214 subdivisions[dim - 1] *= 2;
215 dealii::GridGenerator::subdivided_hyper_rectangle_with_simplices(*this->triangulation,
216 subdivisions,
217 bottom_left,
218 top_right);
219 }
220 else
221 {
222 std::vector<unsigned int> subdivisions(dim, 4);
223 subdivisions[dim - 1] *= 2;
224 dealii::GridGenerator::subdivided_hyper_rectangle(*this->triangulation,
225 subdivisions,
226 bottom_left,
227 top_right);
228 }
229 }
230 else
231 {
232 AssertThrow(false, dealii::ExcNotImplemented());
233 }
234 }
235
236 void
238 {
239 /*
240 * create a pair of (boundary_id, dirichlet_function)
241 */
242
243 const dealii::types::boundary_id lower_bc = 1;
244 const dealii::types::boundary_id upper_bc = 2;
245 const dealii::types::boundary_id left_bc = 3;
246 const dealii::types::boundary_id right_bc = 4;
247
248 if constexpr (dim == 2)
249 {
250 for (const auto &cell : this->triangulation->cell_iterators())
251 for (const auto &face : cell->face_iterators())
252 if (face->at_boundary())
253 {
254 if (face->center()[1] == 0.0)
255 face->set_boundary_id(lower_bc);
256 else if (face->center()[1] == z_outer)
257 face->set_boundary_id(upper_bc);
258 else if (face->center()[0] == 0.0)
259 face->set_boundary_id(left_bc);
260 else if (face->center()[0] == x_outer)
261 face->set_boundary_id(right_bc);
262 }
263 }
264 else
265 {
266 AssertThrow(false, dealii::ExcNotImplemented());
267 }
268
269 this->attach_boundary_condition(lower_bc, "fix_pressure_constant", "navier_stokes_p");
270 this->attach_boundary_condition(lower_bc, "no_slip", "navier_stokes_u");
271 this->attach_boundary_condition(upper_bc, "no_slip", "navier_stokes_u");
272 this->attach_periodic_boundary_condition(left_bc, right_bc, 0);
273
274 this->attach_boundary_condition({lower_bc, std::make_shared<InitialValuesTemperature<dim>>()},
275 "dirichlet",
276 "heat_transfer");
277 this->attach_boundary_condition({upper_bc, std::make_shared<InitialValuesTemperature<dim>>()},
278 "dirichlet",
279 "heat_transfer");
280
281
282 if (this->parameters.base.fe.type != FiniteElementType::FE_SimplexP)
283 this->triangulation->refine_global(this->parameters.base.global_refinements);
284 }
285
286 void
288 {
289 const double eps = this->parameters.ls.reinit.compute_interface_thickness_parameter_epsilon(
290 dealii::GridTools::minimal_cell_diameter(*this->triangulation) /
291 this->parameters.ls.get_n_subdivisions() / std::sqrt(dim));
292
293 AssertThrow(eps > 0, dealii::ExcNotImplemented());
294
295 this->attach_initial_condition(std::make_shared<InitialValuesLS<dim>>(eps), "level_set");
296 this->attach_initial_condition(std::make_shared<dealii::Functions::ZeroFunction<dim>>(dim),
297 "navier_stokes_u");
299 "heat_transfer");
300 }
301 };
302} // namespace MeltPoolDG::Simulation::ThermoCapillaryTwoDroplets
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_periodic_boundary_condition(const dealii::types::boundary_id id_in, const dealii::types::boundary_id id_out, const int direction)
Definition simulation_case_base.hpp:384
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
Definition thermo_capillary_two_droplets.hpp:118
const dealii::Functions::SignedDistance::Sphere< dim > sphere1
Definition thermo_capillary_two_droplets.hpp:144
const dealii::Point< dim > center2
Definition thermo_capillary_two_droplets.hpp:143
double value(const dealii::Point< dim > &p, const unsigned int) const override
Definition thermo_capillary_two_droplets.hpp:133
const dealii::Functions::SignedDistance::Sphere< dim > sphere2
Definition thermo_capillary_two_droplets.hpp:145
InitialValuesLS(const double eps)
Definition thermo_capillary_two_droplets.hpp:120
const dealii::Point< dim > center1
Definition thermo_capillary_two_droplets.hpp:142
const double eps
Definition thermo_capillary_two_droplets.hpp:141
double value(const dealii::Point< dim > &p, const unsigned int) const override
Definition thermo_capillary_two_droplets.hpp:158
InitialValuesTemperature()
Definition thermo_capillary_two_droplets.hpp:153
void create_spatial_discretization() override
Pure virtual function to create the spatial discretization.
Definition thermo_capillary_two_droplets.hpp:177
void set_boundary_conditions() final
Pure virtual function to set the boundary conditions.
Definition thermo_capillary_two_droplets.hpp:237
void set_field_conditions() final
Pure virtual function to set the field conditions.
Definition thermo_capillary_two_droplets.hpp:287
SimulationThermoCapillaryTwoDroplets(std::string parameter_file, const MPI_Comm mpi_communicator)
Definition thermo_capillary_two_droplets.hpp:171
number tanh_characteristic_function(const number &distance, const number &eps)
Definition characteristic_functions.hpp:12
Definition thermo_capillary_two_droplets.cpp:6
static constexpr double reference_temperature
Definition thermo_capillary_two_droplets.hpp:113
static constexpr double temperature_gradient
Definition thermo_capillary_two_droplets.hpp:114
static constexpr double z_outer
Definition thermo_capillary_two_droplets.hpp:112
static constexpr double x_outer
Definition thermo_capillary_two_droplets.hpp:111
static constexpr double radius
Definition thermo_capillary_two_droplets.hpp:110
Definition advection_diffusion.cpp:6
Definition dealii_tensor.hpp:10