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_CONVECTION_DIFFUSION_USER_INTERFACE_APPLICATION_BASE_H_
23#define INCLUDE_EXADG_CONVECTION_DIFFUSION_USER_INTERFACE_APPLICATION_BASE_H_
24
25// deal.II
26#include <deal.II/distributed/tria.h>
27#include <deal.II/grid/grid_generator.h>
28
29// ExaDG
30#include <exadg/convection_diffusion/postprocessor/postprocessor.h>
31#include <exadg/convection_diffusion/user_interface/boundary_descriptor.h>
32#include <exadg/convection_diffusion/user_interface/field_functions.h>
33#include <exadg/convection_diffusion/user_interface/parameters.h>
34#include <exadg/grid/grid.h>
35#include <exadg/grid/grid_utilities.h>
36#include <exadg/postprocessor/output_parameters.h>
37
38namespace ExaDG
39{
40namespace ConvDiff
41{
42template<int dim, typename Number>
44{
45public:
46 virtual void
47 add_parameters(dealii::ParameterHandler & prm)
48 {
49 output_parameters.add_parameters(prm);
50 }
51
52 ApplicationBase(std::string parameter_file, MPI_Comm const & comm)
53 : mpi_comm(comm),
54 pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(mpi_comm) == 0),
55 parameter_file(parameter_file),
56 n_subdivisions_1d_hypercube(1)
57 {
58 }
59
60 virtual ~ApplicationBase()
61 {
62 }
63
64 void
65 set_parameters_throughput_study(unsigned int const degree,
66 unsigned int const refine_space,
67 unsigned int const n_subdivisions_1d_hypercube)
68 {
69 this->param.degree = degree;
70 this->param.grid.n_refine_global = refine_space;
71 this->n_subdivisions_1d_hypercube = n_subdivisions_1d_hypercube;
72 }
73
74 void
75 set_parameters_convergence_study(unsigned int const degree,
76 unsigned int const refine_space,
77 unsigned int const refine_time)
78 {
79 this->param.degree = degree;
80 this->param.grid.n_refine_global = refine_space;
81 this->param.n_refine_time = refine_time;
82 }
83
84 void
85 setup(std::shared_ptr<Grid<dim>> & grid,
86 std::shared_ptr<dealii::Mapping<dim>> & mapping,
87 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings)
88 {
89 parse_parameters();
90
91 // parameters
92 set_parameters();
93 param.check();
94 param.print(pcout, "List of parameters:");
95
96 // grid
97 grid = std::make_shared<Grid<dim>>();
98 create_grid(*grid, mapping, multigrid_mappings);
99 print_grid_info(pcout, *grid);
100
101 // boundary conditions
102 boundary_descriptor = std::make_shared<BoundaryDescriptor<dim>>();
103 set_boundary_descriptor();
104 verify_boundary_conditions(*boundary_descriptor, *grid);
105
106 // field functions
107 field_functions = std::make_shared<FieldFunctions<dim>>();
108 set_field_functions();
109 }
110
111 virtual std::shared_ptr<dealii::Function<dim>>
112 create_mesh_movement_function()
113 {
114 std::shared_ptr<dealii::Function<dim>> mesh_motion =
115 std::make_shared<dealii::Functions::ZeroFunction<dim>>(dim);
116
117 return mesh_motion;
118 }
119
120 virtual std::shared_ptr<PostProcessorBase<dim, Number>>
121 create_postprocessor() = 0;
122
123 Parameters const &
124 get_parameters() const
125 {
126 return param;
127 }
128
129 std::shared_ptr<BoundaryDescriptor<dim> const>
130 get_boundary_descriptor() const
131 {
132 return boundary_descriptor;
133 }
134
135 std::shared_ptr<FieldFunctions<dim> const>
136 get_field_functions() const
137 {
138 return field_functions;
139 }
140
141protected:
142 virtual void
143 parse_parameters()
144 {
145 dealii::ParameterHandler prm;
146 this->add_parameters(prm);
147 prm.parse_input(parameter_file, "", true, true);
148 }
149
150 MPI_Comm const mpi_comm;
151
152 dealii::ConditionalOStream pcout;
153
154 Parameters param;
155
156 std::shared_ptr<FieldFunctions<dim>> field_functions;
157 std::shared_ptr<BoundaryDescriptor<dim>> boundary_descriptor;
158
159 std::string parameter_file;
160
161 unsigned int n_subdivisions_1d_hypercube;
162
163 OutputParameters output_parameters;
164
165private:
166 virtual void
167 set_parameters() = 0;
168
169 virtual void
170 create_grid(Grid<dim> & grid,
171 std::shared_ptr<dealii::Mapping<dim>> & mapping,
172 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings) = 0;
173
174 virtual void
175 set_boundary_descriptor() = 0;
176
177 virtual void
178 set_field_functions() = 0;
179};
180
181} // namespace ConvDiff
182} // namespace ExaDG
183
184
185#endif /* INCLUDE_EXADG_CONVECTION_DIFFUSION_USER_INTERFACE_APPLICATION_BASE_H_ */
Definition application_base.h:44
Definition parameters.h:46
Definition grid.h:40
Definition grid.h:84
Definition driver.cpp:33
Definition output_parameters.h:32