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

Developer Documentation: applications/mp-melt-pool/cases/taylor_green_vortex/taylor_green_vortex.hpp Source File
Developer Documentation
taylor_green_vortex.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/function.h>
4#include <deal.II/base/numbers.h>
5#include <deal.II/base/point.h>
6#include <deal.II/base/tensor.h>
7#include <deal.II/base/tensor_function.h>
8
9#include <deal.II/distributed/tria.h>
10
11#include <deal.II/fe/fe_q.h>
12
13#include <deal.II/grid/grid_generator.h>
14#include <deal.II/grid/manifold_lib.h>
15
16#include <deal.II/numerics/vector_tools.h>
17
22
23#include <cmath>
24#include <iostream>
25#include <string>
26#include <vector>
27
28#include "../../melt_pool_case.hpp"
29
31{
32 template <int dim>
33 class InitializeVelocityField : public dealii::Function<dim>
34 {
35 public:
37 : dealii::Function<dim>(dim)
38 {}
39
40 void
41 vector_value(const dealii::Point<dim> &p, dealii::Vector<double> &values) const override
42 {
43 AssertDimension(values.size(), dim);
44
45 if constexpr (dim == 2)
46 {
47 values(0) = std::sin(p[0]) * std::cos(p[1]);
48 values(1) = -std::cos(p[0]) * std::sin(p[1]);
49 }
50 else if constexpr (dim == 3)
51 {
52 values(0) = std::sin(p[0]) * std::cos(p[1]) * std::cos(p[2]);
53 values(1) = -std::cos(p[0]) * std::sin(p[1]) * std::cos(p[2]);
54 values(2) = 0.0;
55 }
56 }
57 };
58
59 template <int dim, typename number>
60 class SimulationTaylorGreenVortex : public MeltPoolCase<dim, number>
61 {
62 public:
66
67 void
69 {
70 this->triangulation =
71 std::make_shared<dealii::parallel::distributed::Triangulation<dim>>(this->mpi_communicator);
72
73 if constexpr (dim == 2 or dim == 3)
74 {
75 const double left = -dealii::numbers::PI;
76 const double right = dealii::numbers::PI;
77
78 const unsigned int refinements =
79 dealii::Utilities::pow(2, this->parameters.base.global_refinements);
80 dealii::GridGenerator::subdivided_hyper_cube(
81 *this->triangulation, refinements, left, right, true);
82 }
83 else
84 {
85 AssertThrow(false, dealii::ExcNotImplemented());
86 }
87 }
88
89 void
91 {
92 const auto [lower_bc, upper_bc, left_bc, right_bc, front_bc, back_bc] =
93 get_colorized_rectangle_boundary_ids<dim>();
94
95 this->attach_periodic_boundary_condition(left_bc, right_bc, 0);
96
97 if constexpr (dim == 2)
98 {
99 this->attach_periodic_boundary_condition(lower_bc, upper_bc, 1);
100 }
101 else if constexpr (dim == 3)
102 {
103 this->attach_periodic_boundary_condition(front_bc, back_bc, 1);
104 this->attach_periodic_boundary_condition(lower_bc, upper_bc, 2);
105 }
106 }
107
108 void
110 {
111 this->attach_initial_condition(std::make_shared<dealii::Functions::ConstantFunction<dim>>(-1),
112 "level_set");
113
115 "navier_stokes_u");
116 }
117
118 void
119 do_postprocessing(const GenericDataOut<dim, number> &generic_data_out) const final
120 {
121 dealii::ConditionalOStream pcout(
122 std::cout, dealii::Utilities::MPI::this_mpi_process(this->mpi_communicator) == 0);
123
124 const auto &fe = generic_data_out.get_dof_handler("velocity").get_fe();
125 dealii::QGauss<dim> quadrature(fe.degree + 1);
126 dealii::FEValues<dim> fe_values(fe,
127 quadrature,
128 dealii::update_gradients | dealii::update_JxW_values);
129
130 const dealii::FEValuesExtractors::Vector velocities(0);
131
132 std::vector<dealii::Tensor<2, dim, number>> velocity_gradients(quadrature.size());
133 number H1_seminorm_squared = 0;
134 number H1_seminorm = 0;
135
136 generic_data_out.get_vector("velocity").update_ghost_values();
137
138 for (const auto &cell : generic_data_out.get_dof_handler("velocity").active_cell_iterators())
139 if (cell->is_locally_owned())
140 {
141 fe_values.reinit(cell);
142 fe_values[velocities].get_function_gradients(generic_data_out.get_vector("velocity"),
143 velocity_gradients);
144
145 for (const unsigned int q_index : fe_values.quadrature_point_indices())
146 H1_seminorm_squared +=
147 velocity_gradients[q_index].norm_square() * fe_values.JxW(q_index);
148 }
149
150 generic_data_out.get_vector("velocity").zero_out_ghost_values();
151
152 H1_seminorm_squared =
153 dealii::Utilities::MPI::sum(H1_seminorm_squared, this->mpi_communicator);
154 H1_seminorm = std::sqrt(H1_seminorm_squared);
155
156 std::ostringstream str;
157
158 str << "H1-Seminorm: " << std::setw(20) << std::left << H1_seminorm;
159
160 Journal::print_line(pcout, str.str(), "postprocessing", 1);
161 }
162 };
163
164} // namespace MeltPoolDG::Simulation::TaylorGreenVortex
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
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
InitializeVelocityField()
Definition taylor_green_vortex.hpp:36
void vector_value(const dealii::Point< dim > &p, dealii::Vector< double > &values) const override
Definition taylor_green_vortex.hpp:41
SimulationTaylorGreenVortex(std::string parameter_file, const MPI_Comm mpi_communicator)
Definition taylor_green_vortex.hpp:63
void create_spatial_discretization() override
Pure virtual function to create the spatial discretization.
Definition taylor_green_vortex.hpp:68
void do_postprocessing(const GenericDataOut< dim, number > &generic_data_out) const final
Perform specific postprocessing (can be overridden by derived classes).
Definition taylor_green_vortex.hpp:119
void set_boundary_conditions() override
Pure virtual function to set the boundary conditions.
Definition taylor_green_vortex.hpp:90
void set_field_conditions() override
Pure virtual function to set the field conditions.
Definition taylor_green_vortex.hpp:109
void print_line(const ConditionalOStream &pcout, const std::string &text="", const std::string &operation_name="", const unsigned int extra_size=0)
Definition journal.cpp:21
Definition taylor_green_vortex.cpp:6
Definition dealii_tensor.hpp:10