3#include <deal.II/base/function.h>
4#include <deal.II/base/function_signed_distance.h>
5#include <deal.II/base/mpi_remote_point_evaluation.h>
6#include <deal.II/base/point.h>
7#include <deal.II/base/table_handler.h>
8#include <deal.II/base/tensor_function.h>
10#include <deal.II/distributed/shared_tria.h>
11#include <deal.II/distributed/tria.h>
13#include <deal.II/grid/grid_generator.h>
14#include <deal.II/grid/manifold_lib.h>
16#include <deal.II/numerics/vector_tools.h>
19#include <meltpooldg/utilities/better_enum.hpp>
23#include "../../melt_pool_case.hpp"
56 , distance_sphere(
dealii::Point<dim>(), radius)
60 value(
const dealii::Point<dim> &p,
const unsigned int )
const override
62 return -distance_sphere.value(p);
74 :
dealii::Function<dim>(dim)
79 value(
const dealii::Point<dim> &p,
const unsigned int comp)
const override
83 const double radius = p.distance(
center);
89 if constexpr (dim == 1)
97 return v * n[0] / radius;
99 return v * n[1] / radius;
103 const double phi = std::acos(n[2] / radius);
104 const double theta = std::atan2(n[1], n[0]);
107 return v * std::cos(theta) * std::sin(phi);
109 return v * std::sin(theta) * std::sin(phi);
111 return v * std::cos(phi);
115 AssertThrow(
false, dealii::ExcNotImplemented());
124 template <
int dim,
typename number>
135 prm.add_parameter(
"velocity",
velocity,
"Radial velocity on the interior edge of the shell.");
136 prm.add_parameter(
"inner radius",
inner_radius,
"inner radius");
137 prm.add_parameter(
"outer radius",
outer_radius,
"outer radius");
138 prm.add_parameter(
"shell type",
140 "Geometry type of the shell: quarter, half, full.");
141 prm.add_parameter(
"two phase",
two_phase,
"two phase");
143 return this->
parameters.base.do_print_parameters;
149 if (this->
parameters.base.fe.type == FiniteElementType::FE_SimplexP)
152 std::make_shared<dealii::parallel::shared::Triangulation<dim>>(this->
mpi_communicator);
156 this->
triangulation = std::make_shared<dealii::parallel::distributed::Triangulation<dim>>(
162 dealii::GridGenerator::hyper_shell(
167 dealii::GridGenerator::half_hyper_shell(
172 dealii::GridGenerator::quarter_hyper_shell(
176 AssertThrow(
false, dealii::ExcNotImplemented());
178 if (this->
parameters.base.fe.type != FiniteElementType::FE_SimplexP)
191 const auto dirichlet = std::make_shared<RadialBoundaryVelocity<dim>>(
center);
201 if (
shell_type == ShellType::quarter && dim == 3)
215 std::make_shared<dealii::Functions::ConstantFunction<dim>>(-1),
"level_set");
227 generic_data_out.get_time() == this->parameters.time_stepping.end_time)
229 std::cout.precision(3);
230 generic_data_out.get_vector(
"velocity").update_ghost_values();
231 generic_data_out.get_vector(
"pressure").update_ghost_values();
233 const auto analytical_velocity = [&](
const double &r) ->
double {
237 const auto analytical_pressure = [&](
const double &r) ->
double {
238 const double rho = this->
parameters.material.gas.density;
239 const double mu = this->
parameters.material.gas.dynamic_viscosity;
247 std::vector<dealii::Point<dim>> req_points;
248 dealii::TableHandler table;
255 for (
const auto r : req_radii)
257 auto p = dealii::Point<dim>();
259 req_points.emplace_back(p);
260 table.add_value(
"analytical pressure", analytical_pressure(r));
261 table.add_value(
"analytical radial velocity", analytical_velocity(r));
266 dealii::Utilities::MPI::RemotePointEvaluation<dim, dim> remote_point_evaluation;
267 remote_point_evaluation.reinit(req_points,
269 generic_data_out.get_mapping());
271 const auto pressure_vals =
272 dealii::VectorTools::point_values<1>(remote_point_evaluation,
273 generic_data_out.get_dof_handler(
"pressure"),
274 generic_data_out.get_vector(
"pressure"));
276 const auto vel_vals =
277 dealii::VectorTools::point_values<dim>(remote_point_evaluation,
278 generic_data_out.get_dof_handler(
"velocity"),
279 generic_data_out.get_vector(
"velocity"));
282 for (
unsigned int i = 0; i < vel_vals.size(); ++i)
284 table.add_value(
"pressure", pressure_vals[i]);
285 if constexpr (dim == 1)
286 table.add_value(
"radial velocity", vel_vals[i]);
288 table.add_value(
"radial velocity", vel_vals[i][0]);
291 table.set_scientific(
"analytical radial velocity",
true);
292 table.set_scientific(
"analytical pressure",
true);
293 table.set_scientific(
"radial velocity",
true);
294 table.set_scientific(
"pressure",
true);
295 std::cout << std::endl;
296 table.write_text(std::cout);
297 std::cout << std::endl;
300 generic_data_out.get_vector(
"velocity").zero_out_ghost_values();
301 generic_data_out.get_vector(
"pressure").zero_out_ghost_values();
A generic utility for managing simulation output data in the MeltPoolDG context.
Definition generic_data_out.hpp:32
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
Definition evaporating_shell.hpp:71
RadialBoundaryVelocity(const dealii::Point< dim > ¢er)
Definition evaporating_shell.hpp:73
const dealii::Point< dim > center
Definition evaporating_shell.hpp:121
double value(const dealii::Point< dim > &p, const unsigned int comp) const override
Definition evaporating_shell.hpp:79
Definition evaporating_shell.hpp:52
SignedDistanceSphereFlipped(const double radius)
Definition evaporating_shell.hpp:54
double value(const dealii::Point< dim > &p, const unsigned int) const override
Definition evaporating_shell.hpp:60
const dealii::Functions::SignedDistance::Sphere< dim > distance_sphere
Definition evaporating_shell.hpp:66
Definition evaporating_shell.hpp:126
bool add_case_specific_parameters(dealii::ParameterHandler &prm) override
Add simulation-specific parameters (can be overridden).
Definition evaporating_shell.hpp:133
SimulationEvaporatingShell(std::string parameter_file, const MPI_Comm mpi_communicator)
Definition evaporating_shell.hpp:128
unsigned int n_time_step
Definition evaporating_shell.hpp:309
void set_field_conditions() override
Pure virtual function to set the field conditions.
Definition evaporating_shell.hpp:207
void set_boundary_conditions() override
Pure virtual function to set the boundary conditions.
Definition evaporating_shell.hpp:183
const dealii::Point< dim > center
Definition evaporating_shell.hpp:306
void do_postprocessing(const GenericDataOut< dim, double > &generic_data_out) const final
Definition evaporating_shell.hpp:222
void create_spatial_discretization() override
Pure virtual function to create the spatial discretization.
Definition evaporating_shell.hpp:147
Definition evaporating_shell.cpp:6
static double inner_radius
Definition evaporating_shell.hpp:42
static double outer_radius
Definition evaporating_shell.hpp:44
static double velocity
Definition evaporating_shell.hpp:40
static ShellType shell_type
Definition evaporating_shell.hpp:46
static bool two_phase
Definition evaporating_shell.hpp:48
BETTER_ENUM(MaterialTemplate, char, none, stainless_steel, Ti64, Ti64Benchmark) BETTER_ENUM(SolidLiquidPropertiesTransitionType
Definition dealii_tensor.hpp:10