ExaDG
Loading...
Searching...
No Matches
mapping_deformation_poisson.h
1/* ______________________________________________________________________
2 *
3 * ExaDG - High-Order Discontinuous Galerkin for the Exa-Scale
4 *
5 * Copyright (C) 2021 by the ExaDG authors
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 * ______________________________________________________________________
20 */
21
22#ifndef INCLUDE_EXADG_GRID_MAPPING_DEFORMATION_POISSON_H_
23#define INCLUDE_EXADG_GRID_MAPPING_DEFORMATION_POISSON_H_
24
25// deal.II
26#include <deal.II/base/timer.h>
27
28// ExaDG
29#include <exadg/grid/mapping_deformation_base.h>
30#include <exadg/poisson/spatial_discretization/operator.h>
31#include <exadg/utilities/print_solver_results.h>
32
33namespace ExaDG
34{
35namespace Poisson
36{
42template<int dim, typename Number>
43class DeformedMapping : public DeformedMappingBase<dim, Number>
44{
45public:
46 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
47
52 std::shared_ptr<Grid<dim> const> grid,
53 std::shared_ptr<dealii::Mapping<dim> const> mapping_undeformed,
54 std::shared_ptr<MultigridMappings<dim, Number>> const multigrid_mappings_undeformed,
55 std::shared_ptr<Poisson::BoundaryDescriptor<1, dim> const> boundary_descriptor,
56 std::shared_ptr<Poisson::FieldFunctions<dim> const> field_functions,
57 Poisson::Parameters const & param,
58 std::string const & field,
59 MPI_Comm const & mpi_comm)
60 : DeformedMappingBase<dim, Number>(mapping_undeformed, param.degree, *grid->triangulation),
61 pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(mpi_comm) == 0),
62 iterations({0, 0})
63 {
64 // create and setup PDE operator
65 pde_operator =
66 std::make_shared<Poisson::Operator<dim, dim, Number>>(grid,
68 multigrid_mappings_undeformed,
69 boundary_descriptor,
70 field_functions,
71 param,
72 field,
73 mpi_comm);
74
75 pde_operator->setup();
76
77 // finally, initialize dof vector
78 pde_operator->initialize_dof_vector(displacement);
79 }
80
81 std::shared_ptr<Poisson::Operator<dim, dim, Number> const>
82 get_pde_operator() const
83 {
84 return pde_operator;
85 }
86
87 dealii::MatrixFree<dim, Number> const &
88 get_matrix_free() const
89 {
90 return *pde_operator->get_matrix_free();
91 }
92
96 void
97 update(double const time,
98 bool const print_solver_info,
99 types::time_step time_step_number) override
100 {
101 // preconditioner update has no effect
102 (void)time_step_number;
103
104 dealii::Timer timer;
105 timer.restart();
106
107 VectorType rhs;
108 pde_operator->initialize_dof_vector(rhs);
109
110 // compute rhs and solve mesh deformation problem
111 pde_operator->rhs(rhs, time);
112
113 auto const n_iter = pde_operator->solve(displacement, rhs, time);
114 iterations.first += 1;
115 iterations.second += n_iter;
116
117 if(print_solver_info)
118 {
119 this->pcout << std::endl << "Solve moving mesh problem (Poisson):";
120 print_solver_info_linear(pcout, n_iter, timer.wall_time());
121 }
122
123 this->initialize_mapping_from_dof_vector(this->mapping_undeformed,
124 displacement,
125 pde_operator->get_dof_handler());
126 }
127
131 void
132 print_iterations() const override
133 {
134 std::vector<std::string> names;
135 std::vector<double> iterations_avg;
136
137 names = {"Linear iterations"};
138 iterations_avg.resize(1);
139 iterations_avg[0] = (double)iterations.second / std::max(1., (double)iterations.first);
140
141 print_list_of_iterations(pcout, names, iterations_avg);
142 }
143
144private:
145 // PDE operator
146 std::shared_ptr<Poisson::Operator<dim, dim, Number>> pde_operator;
147
148 // store solution of previous time step / iteration so that a good initial
149 // guess is available in the next step, easing convergence or reducing computational
150 // costs by allowing larger tolerances
151 VectorType displacement;
152
153 dealii::ConditionalOStream pcout;
154
155 std::pair<unsigned int /* calls */, unsigned long long /* iteration counts */> iterations;
156};
157
158} // namespace Poisson
159} // namespace ExaDG
160
161#endif /* INCLUDE_EXADG_GRID_MAPPING_DEFORMATION_POISSON_H_ */
Definition mapping_deformation_base.h:49
std::shared_ptr< dealii::Mapping< dim > const > mapping_undeformed
Definition mapping_deformation_base.h:106
Definition grid.h:40
void initialize_mapping_from_dof_vector(std::shared_ptr< dealii::Mapping< dim > const > mapping, VectorType const &displacement_vector, dealii::DoFHandler< dim > const &dof_handler)
Definition mapping_dof_vector.h:212
Definition grid.h:84
Definition mapping_deformation_poisson.h:44
void print_iterations() const override
Definition mapping_deformation_poisson.h:132
void update(double const time, bool const print_solver_info, types::time_step time_step_number) override
Definition mapping_deformation_poisson.h:97
DeformedMapping(std::shared_ptr< Grid< dim > const > grid, std::shared_ptr< dealii::Mapping< dim > const > mapping_undeformed, std::shared_ptr< MultigridMappings< dim, Number > > const multigrid_mappings_undeformed, std::shared_ptr< Poisson::BoundaryDescriptor< 1, dim > const > boundary_descriptor, std::shared_ptr< Poisson::FieldFunctions< dim > const > field_functions, Poisson::Parameters const &param, std::string const &field, MPI_Comm const &mpi_comm)
Definition mapping_deformation_poisson.h:51
Definition parameters.h:36
Definition driver.cpp:33
Definition boundary_descriptor.h:46
Definition field_functions.h:30