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_PRECURSOR_H_
23#define INCLUDE_EXADG_INCOMPRESSIBLE_NAVIER_STOKES_USER_INTERFACE_APPLICATION_BASE_PRECURSOR_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/convection_diffusion/user_interface/boundary_descriptor.h>
34#include <exadg/grid/grid.h>
35#include <exadg/grid/grid_utilities.h>
36#include <exadg/incompressible_navier_stokes/postprocessor/postprocessor.h>
37#include <exadg/incompressible_navier_stokes/user_interface/boundary_descriptor.h>
38#include <exadg/incompressible_navier_stokes/user_interface/field_functions.h>
39#include <exadg/incompressible_navier_stokes/user_interface/parameters.h>
40#include <exadg/operators/resolution_parameters.h>
41#include <exadg/postprocessor/output_parameters.h>
42
43namespace ExaDG
44{
45namespace IncNS
46{
47namespace Precursor
48{
49template<int dim, typename Number>
50class Domain
51{
52public:
53 virtual void
54 add_parameters(dealii::ParameterHandler & prm, std::vector<std::string> const & subsection_names)
55 {
56 for(auto & name : subsection_names)
57 {
58 prm.enter_subsection(name);
59 }
60
61 resolution_parameters.add_parameters(prm);
62 output_parameters.add_parameters(prm);
63
64 for(auto & name : subsection_names)
65 {
66 (void)name;
67 prm.leave_subsection();
68 }
69 }
70
71 Domain(std::string parameter_file, MPI_Comm const & comm)
72 : mpi_comm(comm),
73 pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(mpi_comm) == 0),
74 parameter_file(parameter_file)
75 {
76 }
77
78 virtual ~Domain()
79 {
80 }
81
82 void
83 setup(std::shared_ptr<Grid<dim>> & grid,
84 std::shared_ptr<dealii::Mapping<dim>> & mapping,
85 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings,
86 std::vector<std::string> const & subsection_names)
87 {
88 parse_parameters(subsection_names);
89
90 // set resolution parameters
91 this->param.degree_u = this->resolution_parameters.degree;
92 this->param.grid.n_refine_global = this->resolution_parameters.refine_space;
93
94 set_parameters();
95 param.check(pcout);
96 param.print(pcout, "List of parameters:");
97
98 // grid
99 grid = std::make_shared<Grid<dim>>();
100 create_grid(*grid, mapping, multigrid_mappings);
101 print_grid_info(pcout, *grid);
102
103 // boundary conditions
104 boundary_descriptor = std::make_shared<BoundaryDescriptor<dim>>();
105 set_boundary_descriptor();
106 verify_boundary_conditions<dim>(*boundary_descriptor, *grid);
107
108 // field functions
109 field_functions = std::make_shared<FieldFunctions<dim>>();
110 set_field_functions();
111 }
112
113 virtual std::shared_ptr<PostProcessorBase<dim, Number>>
114 create_postprocessor() = 0;
115
116 Parameters const &
117 get_parameters() const
118 {
119 return param;
120 }
121
122 std::shared_ptr<BoundaryDescriptor<dim> const>
123 get_boundary_descriptor() const
124 {
125 return boundary_descriptor;
126 }
127
128 std::shared_ptr<FieldFunctions<dim> const>
129 get_field_functions() const
130 {
131 return field_functions;
132 }
133
134protected:
135 virtual void
136 parse_parameters(std::vector<std::string> const & subsection_names)
137 {
138 dealii::ParameterHandler prm;
139 this->add_parameters(prm, subsection_names);
140 prm.parse_input(parameter_file, "", true, true);
141 }
142
143 MPI_Comm const mpi_comm;
144
145 dealii::ConditionalOStream pcout;
146
147 std::string parameter_file;
148
149 Parameters param;
150
151 std::shared_ptr<FieldFunctions<dim>> field_functions;
152 std::shared_ptr<BoundaryDescriptor<dim>> boundary_descriptor;
153
154 SpatialResolutionParameters resolution_parameters;
155 OutputParameters output_parameters;
156
157private:
158 virtual void
159 set_parameters() = 0;
160
161 virtual void
162 create_grid(Grid<dim> & grid,
163 std::shared_ptr<dealii::Mapping<dim>> & mapping,
164 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings) = 0;
165
166 virtual void
167 set_boundary_descriptor() = 0;
168
169 virtual void
170 set_field_functions() = 0;
171};
172
173template<int dim, typename Number>
175{
176public:
177 ApplicationBase(std::string parameter_file, MPI_Comm const & comm)
178 : mpi_comm(comm),
179 pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(mpi_comm) == 0),
180 parameter_file(parameter_file),
181 switch_off_precursor(false) // precursor is active by default
182 {
183 }
184
185 virtual ~ApplicationBase()
186 {
187 }
188
189 void
190 add_parameters(dealii::ParameterHandler & prm)
191 {
192 AssertThrow(main.get(), dealii::ExcMessage("Domain main is uninitialized."));
193 AssertThrow(precursor.get(), dealii::ExcMessage("Domain precursor is uninitialized."));
194
195 main->add_parameters(prm, {"Main"});
196
197 if(precursor_is_active())
198 precursor->add_parameters(prm, {"Precursor"});
199 }
200
201 bool
202 precursor_is_active() const
203 {
204 return not switch_off_precursor;
205 }
206
212 std::shared_ptr<Domain<dim, Number>> precursor, main;
213
214protected:
215 MPI_Comm const mpi_comm;
216
217 dealii::ConditionalOStream pcout;
218
219 std::string parameter_file;
220
221 // This parameter allows to switch off the precursor (e.g. to test a simplified setup without
222 // precursor and prescribed boundary conditions or inflow data). The default value is false, i.e.
223 // to simulate with precursor. Set this variable to true in a derived class in order to switch off
224 // the precursor.
225 bool switch_off_precursor;
226};
227
228} // namespace Precursor
229} // namespace IncNS
230} // namespace ExaDG
231
232
233
234#endif /* INCLUDE_EXADG_INCOMPRESSIBLE_NAVIER_STOKES_USER_INTERFACE_APPLICATION_BASE_PRECURSOR_H_ \
235 */
Definition grid.h:40
Definition parameters.h:46
Definition application_base.h:175
std::shared_ptr< Domain< dim, Number > > precursor
Definition application_base.h:212
Definition application_base.h:51
Definition grid.h:84
Definition driver.cpp:33
Definition output_parameters.h:32
Definition resolution_parameters.h:81