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_POISSON_USER_INTERFACE_APPLICATION_BASE_H_
23#define INCLUDE_EXADG_POISSON_USER_INTERFACE_APPLICATION_BASE_H_
24
25// deal.II
26#include <deal.II/grid/grid_generator.h>
27#include <deal.II/grid/manifold_lib.h>
28#include <deal.II/grid/tria_description.h>
29
30// ExaDG
31#include <exadg/functions_and_boundary_conditions/verify_boundary_conditions.h>
32#include <exadg/grid/grid.h>
33#include <exadg/grid/grid_parameters.h>
34#include <exadg/grid/grid_utilities.h>
35#include <exadg/operators/resolution_parameters.h>
36#include <exadg/poisson/postprocessor/postprocessor.h>
37#include <exadg/poisson/user_interface/boundary_descriptor.h>
38#include <exadg/poisson/user_interface/field_functions.h>
39#include <exadg/poisson/user_interface/parameters.h>
40#include <exadg/postprocessor/output_parameters.h>
41#include <exadg/utilities/exceptions.h>
42
43namespace ExaDG
44{
45namespace Poisson
46{
47template<int dim, int n_components, typename Number>
49{
50public:
51 static unsigned int const rank =
52 (n_components == 1) ? 0 : ((n_components == dim) ? 1 : dealii::numbers::invalid_unsigned_int);
53
54 typedef typename std::vector<
55 dealii::GridTools::PeriodicFacePair<typename dealii::Triangulation<dim>::cell_iterator>>
56 PeriodicFaces;
57
58 virtual void
59 add_parameters(dealii::ParameterHandler & prm)
60 {
61 grid_parameters.add_parameters(prm);
62 output_parameters.add_parameters(prm);
63 }
64
65 ApplicationBase(std::string parameter_file, MPI_Comm const & comm)
66 : mpi_comm(comm),
67 pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(mpi_comm) == 0),
68 parameter_file(parameter_file),
69 n_subdivisions_1d_hypercube(1)
70 {
71 }
72
73 virtual ~ApplicationBase()
74 {
75 }
76
77 void
78 set_parameters_throughput_study(unsigned int const degree,
79 unsigned int const refine_space,
80 unsigned int const n_subdivisions_1d_hypercube)
81 {
82 this->param.degree = degree;
83 this->param.grid.n_refine_global = refine_space;
84 this->n_subdivisions_1d_hypercube = n_subdivisions_1d_hypercube;
85 }
86
87 void
88 set_parameters_convergence_study(unsigned int const degree, unsigned int const refine_space)
89 {
90 this->param.degree = degree;
91 this->param.grid.n_refine_global = refine_space;
92 }
93
94 void
95 setup(std::shared_ptr<Grid<dim>> & grid,
96 std::shared_ptr<dealii::Mapping<dim>> & mapping,
97 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings)
98 {
99 // parameters
100 parse_parameters();
101 set_parameters();
102 param.check();
103 param.print(pcout, "List of parameters:");
104
105 // grid
106 grid = std::make_shared<Grid<dim>>();
107 create_grid(*grid, mapping, multigrid_mappings);
108 print_grid_info(pcout, *grid);
109
110 if(compute_aspect_ratio)
111 {
112 auto const reference_cells = grid->triangulation->get_reference_cells();
113 AssertThrow(reference_cells.size() == 1, dealii::ExcMessage("No mixed meshes allowed"));
114
115 auto const quad =
116 reference_cells[0].template get_gauss_type_quadrature<dim>(param.degree + 1);
117
118 double const aspect_ratio =
119 dealii::GridTools::compute_maximum_aspect_ratio(*mapping, *grid->triangulation, quad);
120 pcout << std::endl << "Maximum aspect ratio = " << aspect_ratio << std::endl;
121 }
122
123 // boundary conditions
124 boundary_descriptor = std::make_shared<BoundaryDescriptor<rank, dim>>();
125 set_boundary_descriptor();
126 verify_boundary_conditions(*boundary_descriptor, *grid);
127
128 // field functions
129 field_functions = std::make_shared<FieldFunctions<dim>>();
130 set_field_functions();
131 }
132
133 virtual std::shared_ptr<Poisson::PostProcessorBase<dim, n_components, Number>>
134 create_postprocessor() = 0;
135
136 Parameters const &
137 get_parameters() const
138 {
139 return param;
140 }
141
142 std::shared_ptr<BoundaryDescriptor<rank, dim> const>
143 get_boundary_descriptor() const
144 {
145 return boundary_descriptor;
146 }
147
148 std::shared_ptr<FieldFunctions<dim> const>
149 get_field_functions() const
150 {
151 return field_functions;
152 }
153
154protected:
155 virtual void
156 parse_parameters()
157 {
158 dealii::ParameterHandler prm;
159 this->add_parameters(prm);
160 prm.parse_input(parameter_file, "", true, true);
161 }
162
163 MPI_Comm const mpi_comm;
164
165 dealii::ConditionalOStream pcout;
166
167 Parameters param;
168
169 std::shared_ptr<BoundaryDescriptor<rank, dim>> boundary_descriptor;
170 std::shared_ptr<FieldFunctions<dim>> field_functions;
171
172 std::string parameter_file;
173
174 GridParameters grid_parameters;
175
176 unsigned int n_subdivisions_1d_hypercube;
177
178 OutputParameters output_parameters;
179
180 bool compute_aspect_ratio = false;
181
182private:
183 virtual void
184 set_parameters() = 0;
185
186 virtual void
187 create_grid(Grid<dim> & grid,
188 std::shared_ptr<dealii::Mapping<dim>> & mapping,
189 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings) = 0;
190
191 virtual void
192 set_boundary_descriptor() = 0;
193
194 virtual void
195 set_field_functions() = 0;
196};
197
198} // namespace Poisson
199} // namespace ExaDG
200
201
202#endif /* INCLUDE_EXADG_POISSON_USER_INTERFACE_APPLICATION_BASE_H_ */
Definition grid.h:40
Definition grid.h:84
Definition application_base.h:49
Definition parameters.h:36
Definition driver.cpp:33
Definition grid_parameters.h:32
Definition output_parameters.h:32