ExaDG
Loading...
Searching...
No Matches
application_base.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_INCOMPRESSIBLE_NAVIER_STOKES_USER_INTERFACE_APPLICATION_BASE_H_
23#define INCLUDE_EXADG_INCOMPRESSIBLE_NAVIER_STOKES_USER_INTERFACE_APPLICATION_BASE_H_
24
25// deal.II
26#include <deal.II/distributed/fully_distributed_tria.h>
27#include <deal.II/distributed/tria.h>
28#include <deal.II/grid/grid_generator.h>
29#include <deal.II/grid/grid_tools.h>
30#include <deal.II/grid/manifold_lib.h>
31
32// ExaDG
33#include <exadg/grid/grid.h>
34#include <exadg/grid/grid_utilities.h>
35#include <exadg/incompressible_navier_stokes/postprocessor/postprocessor.h>
36#include <exadg/incompressible_navier_stokes/user_interface/boundary_descriptor.h>
37#include <exadg/incompressible_navier_stokes/user_interface/field_functions.h>
38#include <exadg/incompressible_navier_stokes/user_interface/parameters.h>
39#include <exadg/operators/resolution_parameters.h>
40#include <exadg/poisson/user_interface/analytical_solution.h>
41#include <exadg/poisson/user_interface/field_functions.h>
42#include <exadg/poisson/user_interface/parameters.h>
43#include <exadg/postprocessor/output_parameters.h>
44
45namespace ExaDG
46{
47namespace IncNS
48{
49template<int dim, typename Number>
51{
52public:
53 virtual void
54 add_parameters(dealii::ParameterHandler & prm)
55 {
56 output_parameters.add_parameters(prm);
57 }
58
59 ApplicationBase(std::string parameter_file, MPI_Comm const & comm)
60 : mpi_comm(comm),
61 pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(mpi_comm) == 0),
62 parameter_file(parameter_file),
63 n_subdivisions_1d_hypercube(1)
64 {
65 }
66
67 virtual ~ApplicationBase()
68 {
69 }
70
71 void
72 set_parameters_throughput_study(unsigned int const degree,
73 unsigned int const refine_space,
74 unsigned int const n_subdivisions_1d_hypercube)
75 {
76 this->param.degree_u = degree;
77 this->param.grid.n_refine_global = refine_space;
78 this->n_subdivisions_1d_hypercube = n_subdivisions_1d_hypercube;
79 }
80
81 void
82 set_parameters_convergence_study(unsigned int const degree,
83 unsigned int const refine_space,
84 unsigned int const refine_time)
85 {
86 this->param.degree_u = degree;
87 this->param.grid.n_refine_global = refine_space;
88 this->param.n_refine_time = refine_time;
89 }
90
91 virtual void
92 setup(std::shared_ptr<Grid<dim>> & grid,
93 std::shared_ptr<dealii::Mapping<dim>> & mapping,
94 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings)
95 {
96 parse_parameters();
97
98 set_parameters();
99 param.check(pcout);
100 param.print(pcout, "List of parameters:");
101
102 // grid
103 grid = std::make_shared<Grid<dim>>();
104 create_grid(*grid, mapping, multigrid_mappings);
105 print_grid_info(pcout, *grid);
106
107 // boundary conditions
108 boundary_descriptor = std::make_shared<BoundaryDescriptor<dim>>();
109 set_boundary_descriptor();
110 verify_boundary_conditions<dim>(*boundary_descriptor, *grid);
111
112 // field functions
113 field_functions = std::make_shared<FieldFunctions<dim>>();
114 set_field_functions();
115 }
116
117 virtual std::shared_ptr<PostProcessorBase<dim, Number>>
118 create_postprocessor() = 0;
119
120 Parameters const &
121 get_parameters() const
122 {
123 return param;
124 }
125
126 std::shared_ptr<BoundaryDescriptor<dim> const>
127 get_boundary_descriptor() const
128 {
129 return boundary_descriptor;
130 }
131
132 std::shared_ptr<FieldFunctions<dim> const>
133 get_field_functions() const
134 {
135 return field_functions;
136 }
137
138 // Analytical mesh motion
139 virtual std::shared_ptr<dealii::Function<dim>>
140 create_mesh_movement_function()
141 {
142 std::shared_ptr<dealii::Function<dim>> mesh_motion =
143 std::make_shared<dealii::Functions::ZeroFunction<dim>>(dim);
144
145 return mesh_motion;
146 }
147
148 // Poisson-type mesh motion (solve PDE problem)
149 void
150 setup_poisson(std::shared_ptr<Grid<dim> const> const & grid)
151 {
152 // Note that the grid parameters in Poisson::Parameters are ignored since
153 // the grid is created using the parameters specified in IncNS::Parameters
154 set_parameters_poisson();
155 poisson_param.check();
156 poisson_param.print(pcout, "List of parameters for Poisson solver (moving mesh):");
157
158 poisson_boundary_descriptor = std::make_shared<Poisson::BoundaryDescriptor<1, dim>>();
159 set_boundary_descriptor_poisson();
160 verify_boundary_conditions(*poisson_boundary_descriptor, *grid);
161
162 poisson_field_functions = std::make_shared<Poisson::FieldFunctions<dim>>();
163 set_field_functions_poisson();
164
165 AssertThrow(poisson_param.right_hand_side == false,
166 dealii::ExcMessage("Poisson problem is used for mesh movement. Hence, "
167 "the right-hand side has to be zero for the Poisson problem."));
168 }
169
170 Poisson::Parameters const &
171 get_parameters_poisson() const
172 {
173 return poisson_param;
174 }
175
176 std::shared_ptr<Poisson::BoundaryDescriptor<1, dim> const>
177 get_boundary_descriptor_poisson() const
178 {
179 return poisson_boundary_descriptor;
180 }
181
182 std::shared_ptr<Poisson::FieldFunctions<dim> const>
183 get_field_functions_poisson() const
184 {
185 return poisson_field_functions;
186 }
187
188protected:
189 virtual void
190 parse_parameters()
191 {
192 dealii::ParameterHandler prm;
193 this->add_parameters(prm);
194 prm.parse_input(parameter_file, "", true, true);
195 }
196
197 MPI_Comm const mpi_comm;
198
199 dealii::ConditionalOStream pcout;
200
201 Parameters param;
202
203 std::shared_ptr<FieldFunctions<dim>> field_functions;
204 std::shared_ptr<BoundaryDescriptor<dim>> boundary_descriptor;
205
206 // solve mesh deformation by a Poisson problem
207 Poisson::Parameters poisson_param;
208 std::shared_ptr<Poisson::FieldFunctions<dim>> poisson_field_functions;
209 std::shared_ptr<Poisson::BoundaryDescriptor<1, dim>> poisson_boundary_descriptor;
210
211 std::string parameter_file;
212
213 unsigned int n_subdivisions_1d_hypercube;
214
215 OutputParameters output_parameters;
216
217private:
218 virtual void
219 set_parameters() = 0;
220
221 virtual void
222 create_grid(Grid<dim> & grid,
223 std::shared_ptr<dealii::Mapping<dim>> & mapping,
224 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings) = 0;
225
226 virtual void
227 set_boundary_descriptor() = 0;
228
229 virtual void
230 set_field_functions() = 0;
231
232 // Poisson-type mesh motion
233 virtual void
234 set_parameters_poisson()
235 {
236 AssertThrow(false,
237 dealii::ExcMessage("Has to be overwritten by derived classes in order "
238 "to use Poisson solver for mesh movement."));
239 }
240
241 virtual void
242 set_boundary_descriptor_poisson()
243 {
244 AssertThrow(false,
245 dealii::ExcMessage("Has to be overwritten by derived classes in order "
246 "to use Poisson solver for mesh movement."));
247 }
248
249 virtual void
250 set_field_functions_poisson()
251 {
252 AssertThrow(false,
253 dealii::ExcMessage("Has to be overwritten by derived classes in order "
254 "to use Poisson solver for mesh movement."));
255 }
256};
257
258
259} // namespace IncNS
260} // namespace ExaDG
261
262
263#endif /* INCLUDE_EXADG_INCOMPRESSIBLE_NAVIER_STOKES_USER_INTERFACE_APPLICATION_BASE_H_ */
Definition grid.h:40
Definition application_base.h:51
Definition parameters.h:46
Definition grid.h:84
Definition parameters.h:36
Definition driver.cpp:33
Definition output_parameters.h:32