ryujin 2.1.1 revision 61395bc58278f41c93a581f9251f0a9c9dc4b8a9
offline_data.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2020 - 2024 by the ryujin authors
4//
5
6#pragma once
7
8#include <compile_time_options.h>
9
10#include "convenience_macros.h"
11#include "discretization.h"
13#include "sparse_matrix_simd.h"
14
15#include <deal.II/base/parameter_acceptor.h>
16#include <deal.II/base/partitioner.h>
17#include <deal.II/dofs/dof_handler.h>
18#include <deal.II/lac/affine_constraints.h>
19#include <deal.II/lac/la_parallel_vector.h>
20#include <deal.II/lac/sparse_matrix.h>
21
22#include <deal.II/numerics/data_out.h>
23
24namespace ryujin
25{
46 template <int dim, typename Number = double>
47 class OfflineData : public dealii::ParameterAcceptor
48 {
49 public:
54 using scalar_type = dealii::LinearAlgebra::distributed::Vector<Number>;
55
62 std::tuple<dealii::Tensor<1, dim, Number> /*normal*/,
63 Number /*normal mass*/,
64 Number /*boundary mass*/,
65 dealii::types::boundary_id /*id*/,
66 dealii::Point<dim>> /*position*/;
67
71 OfflineData(const MPI_Comm &mpi_communicator,
73 const std::string &subsection = "/OfflineData");
74
82 void prepare(const unsigned int problem_dimension)
83 {
84 setup(problem_dimension);
85 assemble();
86 create_multigrid_data();
87 }
88
94
95
100
106
113
126
134
141
149
162
170
176
182
188
193
198
203
209
216
221
226
231
232 private:
237 void create_constraints_and_sparsity_pattern();
238
246 void setup(const unsigned int problem_dimension);
247
251 void assemble();
252
256 void create_multigrid_data();
257
258 std::unique_ptr<dealii::DoFHandler<dim>> dof_handler_;
259
260 dealii::AffineConstraints<Number> affine_constraints_;
261
262 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
263 scalar_partitioner_;
264
265 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
266 vector_partitioner_;
267
268 unsigned int n_export_indices_;
269 unsigned int n_locally_internal_;
270 unsigned int n_locally_owned_;
271 unsigned int n_locally_relevant_;
272
273 using boundary_map_type =
274 std::multimap<dealii::types::global_dof_index, boundary_description>;
275 using coupling_boundary_pairs_type =
276 std::vector<std::tuple<dealii::types::global_dof_index,
277 unsigned int,
278 dealii::types::global_dof_index>>;
279 boundary_map_type boundary_map_;
280 coupling_boundary_pairs_type coupling_boundary_pairs_;
281
282 std::vector<boundary_map_type> level_boundary_map_;
283
284 dealii::DynamicSparsityPattern sparsity_pattern_;
285
286 SparsityPatternSIMD<dealii::VectorizedArray<Number>::size()>
287 sparsity_pattern_simd_;
288
289 SparseMatrixSIMD<Number> mass_matrix_;
290
291 dealii::LinearAlgebra::distributed::Vector<Number> lumped_mass_matrix_;
292 dealii::LinearAlgebra::distributed::Vector<Number>
293 lumped_mass_matrix_inverse_;
294
295 std::vector<dealii::LinearAlgebra::distributed::Vector<float>>
296 level_lumped_mass_matrix_;
297
298 SparseMatrixSIMD<Number> betaij_matrix_;
299 SparseMatrixSIMD<Number, dim> cij_matrix_;
300
301 Number measure_of_omega_;
302
303 dealii::SmartPointer<const Discretization<dim>> discretization_;
304
305 const MPI_Comm &mpi_communicator_;
306
310 template <typename ITERATOR1, typename ITERATOR2>
311 boundary_map_type construct_boundary_map(
312 const ITERATOR1 &begin,
313 const ITERATOR2 &end,
314 const dealii::Utilities::MPI::Partitioner &partitioner) const;
315
320 template <typename ITERATOR1, typename ITERATOR2>
321 coupling_boundary_pairs_type collect_coupling_boundary_pairs(
322 const ITERATOR1 &begin,
323 const ITERATOR2 &end,
324 const dealii::Utilities::MPI::Partitioner &partitioner) const;
325 };
326
327} /* namespace ryujin */
auto & cij_matrix() const
Definition: offline_data.h:220
auto & dof_handler() const
Definition: offline_data.h:93
auto & n_locally_owned() const
Definition: offline_data.h:140
const auto & scalar_partitioner() const
Definition: offline_data.h:105
auto & n_locally_internal() const
Definition: offline_data.h:133
auto & coupling_boundary_pairs() const
Definition: offline_data.h:169
auto & boundary_map() const
Definition: offline_data.h:161
auto & sparsity_pattern() const
Definition: offline_data.h:181
std::tuple< dealii::Tensor< 1, dim, Number >, Number, Number, dealii::types::boundary_id, dealii::Point< dim > > boundary_description
Definition: offline_data.h:66
auto & level_lumped_mass_matrix() const
Definition: offline_data.h:208
auto & betaij_matrix() const
Definition: offline_data.h:215
const auto & vector_partitioner() const
Definition: offline_data.h:112
auto & discretization() const
Definition: offline_data.h:230
auto & mass_matrix() const
Definition: offline_data.h:192
auto & sparsity_pattern_simd() const
Definition: offline_data.h:187
auto & lumped_mass_matrix() const
Definition: offline_data.h:197
auto & n_locally_relevant() const
Definition: offline_data.h:148
void prepare(const unsigned int problem_dimension)
Definition: offline_data.h:82
auto & level_boundary_map() const
Definition: offline_data.h:175
dealii::LinearAlgebra::distributed::Vector< Number > scalar_type
Definition: offline_data.h:54
OfflineData(const MPI_Comm &mpi_communicator, const Discretization< dim > &discretization, const std::string &subsection="/OfflineData")
auto & measure_of_omega() const
Definition: offline_data.h:225
auto & lumped_mass_matrix_inverse() const
Definition: offline_data.h:202
auto & n_export_indices() const
Definition: offline_data.h:125
auto & affine_constraints() const
Definition: offline_data.h:99
#define ACCESSOR_READ_ONLY(member)
#define ACCESSOR_READ_ONLY_NO_DEREFERENCE(member)