HybridADRSolver
Loading...
Searching...
No Matches
solver.h
Go to the documentation of this file.
1
5#ifndef HYBRIDADRSOLVER_SOLVER_H
6#define HYBRIDADRSOLVER_SOLVER_H
7
8#include "types.h"
9#include <deal.II/base/conditional_ostream.h>
10#include <deal.II/base/multithread_info.h>
11#include <deal.II/base/timer.h>
12
13#include <deal.II/distributed/tria.h>
14#include <deal.II/dofs/dof_handler.h>
15#include <deal.II/fe/fe_q.h>
16#include <deal.II/fe/mapping_q.h>
17#include <deal.II/grid/grid_generator.h>
18#include <deal.II/lac/affine_constraints.h>
19
20#include <utility>
21
22namespace HybridADRSolver {
23using namespace dealii;
24
37template <int dim> class ParallelSolverBase {
38public:
46 ParallelSolverBase(MPI_Comm comm, SolverParameters params,
47 bool construct_mg_hierarchy = false);
48 virtual ~ParallelSolverBase() = default;
49
54 virtual void run(unsigned int n_refinements) = 0;
55
60
64 virtual SolverType get_solver_type() const = 0;
65
69 virtual std::string get_name() const = 0;
70
71protected:
76 virtual void setup_grid(unsigned int n_refinements);
77
81 virtual void setup_dofs() = 0;
82
86 virtual void assemble_system() = 0;
87
91 virtual void solve() = 0;
92
97 virtual void output_results(unsigned int cycle) const = 0;
98
99 // MPI communication
101 unsigned int n_mpi_processes;
102 unsigned int this_mpi_process;
103
104 // Mesh and finite element
105 parallel::distributed::Triangulation<dim> triangulation;
106 std::unique_ptr<FiniteElement<dim>> fe;
107 DoFHandler<dim> dof_handler;
108 std::unique_ptr<Mapping<dim>> mapping;
109
110 // Constraints (Dirichlet BC, hanging nodes)
111 AffineConstraints<double> constraints;
112
113 // DoF distribution info
116
117 // Parameters
119
120 // Timing
122
123 // Output
124 ConditionalOStream pcout;
125 TimerOutput computing_timer;
126
127 // Whether multigrid hierarchy was constructed
129
130private:
134 static typename parallel::distributed::Triangulation<dim>::Settings
135 get_triangulation_settings(bool construct_mg_hierarchy) {
136 if (construct_mg_hierarchy) {
137 return parallel::distributed::Triangulation<
138 dim>::construct_multigrid_hierarchy;
139 }
140 return parallel::distributed::Triangulation<dim>::default_setting;
141 }
142};
143
144template <int dim>
146 SolverParameters params,
147 bool construct_mg_hierarchy)
148 : mpi_communicator(comm),
149 n_mpi_processes(Utilities::MPI::n_mpi_processes(comm)),
150 this_mpi_process(Utilities::MPI::this_mpi_process(comm)),
151 triangulation(comm,
152 typename Triangulation<dim>::MeshSmoothing(
153 Triangulation<dim>::limit_level_difference_at_vertices |
154 Triangulation<dim>::smoothing_on_refinement |
155 Triangulation<dim>::smoothing_on_coarsening),
156 get_triangulation_settings(construct_mg_hierarchy)),
157 dof_handler(triangulation), parameters(std::move(params)),
158 pcout(std::cout, this_mpi_process == 0),
159 computing_timer(comm, pcout, TimerOutput::never, TimerOutput::wall_times),
160 has_mg_hierarchy(construct_mg_hierarchy) {
161 // Set thread limit
162 if (parameters.n_threads != numbers::invalid_unsigned_int)
163 MultithreadInfo::set_thread_limit(parameters.n_threads);
164}
165
166template <int dim>
167void ParallelSolverBase<dim>::setup_grid(const unsigned int n_refinements) {
168 // Create unit hypercube domain [0,1]^dim
169 // The 'true' parameter sets boundary IDs:
170 // - 2D: left=0, right=1, bottom=2, top=3
171 // - 3D: left=0, right=1, front=2, back=3, bottom=4, top=5
172 GridGenerator::hyper_cube(triangulation, 0.0, 1.0, true);
173
174 // Refine globally
175 triangulation.refine_global(n_refinements);
176
177 if (parameters.verbose) {
178 pcout << " Active cells: " << triangulation.n_global_active_cells()
179 << std::endl;
180 if (has_mg_hierarchy) {
181 pcout << " MG levels: " << triangulation.n_global_levels()
182 << std::endl;
183 }
184 }
185}
186
187} // namespace HybridADRSolver
188
189#endif // HYBRIDADRSOLVER_SOLVER_H
virtual SolverType get_solver_type() const =0
virtual void output_results(unsigned int cycle) const =0
const TimingResults & get_timing_results() const
Definition solver.h:59
IndexSet locally_owned_dofs
Definition solver.h:114
virtual void run(unsigned int n_refinements)=0
AffineConstraints< double > constraints
Definition solver.h:111
ParallelSolverBase(MPI_Comm comm, SolverParameters params, bool construct_mg_hierarchy=false)
Definition solver.h:145
std::unique_ptr< FiniteElement< dim > > fe
Definition solver.h:106
ConditionalOStream pcout
Definition solver.h:124
DoFHandler< dim > dof_handler
Definition solver.h:107
virtual std::string get_name() const =0
MPI_Comm mpi_communicator
Definition solver.h:100
TimerOutput computing_timer
Definition solver.h:125
TimingResults timing_results
Definition solver.h:121
unsigned int n_mpi_processes
Definition solver.h:101
unsigned int this_mpi_process
Definition solver.h:102
SolverParameters parameters
Definition solver.h:118
bool has_mg_hierarchy
Definition solver.h:128
parallel::distributed::Triangulation< dim > triangulation
Definition solver.h:105
std::unique_ptr< Mapping< dim > > mapping
Definition solver.h:108
virtual void setup_grid(unsigned int n_refinements)
Definition solver.h:167
IndexSet locally_relevant_dofs
Definition solver.h:115
Definition problem_definition.h:25
SolverType
Definition types.h:34
Definition types.h:85
Common type definitions for the hybrid solver framework.