ryujin 2.1.1 revision 9391072059490dd712e0ea92785f21acd6605f00
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"
12#include "sparse_matrix_simd.h"
13#include "state_vector.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
59
66 std::tuple<unsigned int /*i*/,
67 dealii::Tensor<1, dim, Number> /*normal*/,
68 Number /*normal mass*/,
69 Number /*boundary mass*/,
70 dealii::types::boundary_id /*id*/,
71 dealii::Point<dim>> /*position*/;
72
77 using CouplingDescription = std::tuple<unsigned int /*i*/, //
78 unsigned int /*col_idx*/,
79 unsigned int /*j*/>;
80
84 OfflineData(const MPI_Comm &mpi_communicator,
86 const std::string &subsection = "/OfflineData");
87
96 void prepare(const unsigned int problem_dimension,
97 const unsigned int n_precomputed_values)
98 {
99 setup(problem_dimension, n_precomputed_values);
100 assemble();
101 create_multigrid_data();
102 }
103
109
110
115
121
127
133
146
154
161
169
182
190
196
202
208
213
221
226
232
238
243
254
259
264
265 private:
270
275 void create_constraints_and_sparsity_pattern();
276
284 void setup(const unsigned int problem_dimension,
285 const unsigned int n_precomputed_values);
286
290 void assemble();
291
295 void create_multigrid_data();
296
297 std::unique_ptr<dealii::DoFHandler<dim>> dof_handler_;
298
299 dealii::AffineConstraints<Number> affine_constraints_;
300
301 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
302 scalar_partitioner_;
303
304 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
305 hyperbolic_vector_partitioner_;
306
307 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
308 precomputed_vector_partitioner_;
309
310 unsigned int n_export_indices_;
311 unsigned int n_locally_internal_;
312 unsigned int n_locally_owned_;
313 unsigned int n_locally_relevant_;
314
315 using BoundaryMap = std::vector<BoundaryDescription>;
316 BoundaryMap boundary_map_;
317 std::vector<BoundaryMap> level_boundary_map_;
318
319 using CouplingBoundaryPairs = std::vector<CouplingDescription>;
320 CouplingBoundaryPairs coupling_boundary_pairs_;
321
322 dealii::DynamicSparsityPattern sparsity_pattern_;
323
324 SparsityPatternSIMD<dealii::VectorizedArray<Number>::size()>
325 sparsity_pattern_simd_;
326
327 SparseMatrixSIMD<Number> mass_matrix_;
328 SparseMatrixSIMD<Number> mass_matrix_inverse_;
329
330 ScalarVector lumped_mass_matrix_;
331 ScalarVector lumped_mass_matrix_inverse_;
332
333 std::vector<ScalarVectorFloat> level_lumped_mass_matrix_;
334
335 SparseMatrixSIMD<Number, dim> cij_matrix_;
336 SparseMatrixSIMD<Number> incidence_matrix_;
337
338 Number measure_of_omega_;
339
340 dealii::SmartPointer<const Discretization<dim>> discretization_;
341
342 const MPI_Comm &mpi_communicator_;
343
347 template <typename ITERATOR1, typename ITERATOR2>
348 BoundaryMap construct_boundary_map(
349 const ITERATOR1 &begin,
350 const ITERATOR2 &end,
351 const dealii::Utilities::MPI::Partitioner &partitioner) const;
352
357 template <typename ITERATOR1, typename ITERATOR2>
358 CouplingBoundaryPairs collect_coupling_boundary_pairs(
359 const ITERATOR1 &begin,
360 const ITERATOR2 &end,
361 const dealii::Utilities::MPI::Partitioner &partitioner) const;
362
364
368
369 double incidence_relaxation_even_;
370 double incidence_relaxation_odd_;
371
373 };
374
375} /* namespace ryujin */
Vectors::ScalarVector< float > ScalarVectorFloat
Definition: offline_data.h:58
auto & cij_matrix() const
Definition: offline_data.h:242
auto & dof_handler() const
Definition: offline_data.h:108
auto & n_locally_owned() const
Definition: offline_data.h:160
void prepare(const unsigned int problem_dimension, const unsigned int n_precomputed_values)
Definition: offline_data.h:96
auto & incidence_matrix() const
Definition: offline_data.h:253
const auto & scalar_partitioner() const
Definition: offline_data.h:120
auto & n_locally_internal() const
Definition: offline_data.h:153
auto & coupling_boundary_pairs() const
Definition: offline_data.h:189
auto & boundary_map() const
Definition: offline_data.h:181
auto & sparsity_pattern() const
Definition: offline_data.h:201
auto & level_lumped_mass_matrix() const
Definition: offline_data.h:237
auto & mass_matrix_inverse() const
Definition: offline_data.h:220
const auto & hyperbolic_vector_partitioner() const
Definition: offline_data.h:126
auto & discretization() const
Definition: offline_data.h:263
const auto & precomputed_vector_partitioner() const
Definition: offline_data.h:132
std::tuple< unsigned int, unsigned int, unsigned int > CouplingDescription
Definition: offline_data.h:79
auto & mass_matrix() const
Definition: offline_data.h:212
auto & sparsity_pattern_simd() const
Definition: offline_data.h:207
Vectors::ScalarVector< Number > ScalarVector
Definition: offline_data.h:53
auto & lumped_mass_matrix() const
Definition: offline_data.h:225
std::tuple< unsigned int, dealii::Tensor< 1, dim, Number >, Number, Number, dealii::types::boundary_id, dealii::Point< dim > > BoundaryDescription
Definition: offline_data.h:71
auto & n_locally_relevant() const
Definition: offline_data.h:168
auto & level_boundary_map() const
Definition: offline_data.h:195
OfflineData(const MPI_Comm &mpi_communicator, const Discretization< dim > &discretization, const std::string &subsection="/OfflineData")
auto & measure_of_omega() const
Definition: offline_data.h:258
auto & lumped_mass_matrix_inverse() const
Definition: offline_data.h:231
auto & n_export_indices() const
Definition: offline_data.h:145
auto & affine_constraints() const
Definition: offline_data.h:114
#define ACCESSOR_READ_ONLY(member)
#define ACCESSOR_READ_ONLY_NO_DEREFERENCE(member)
dealii::LinearAlgebra::distributed::Vector< Number > ScalarVector
Definition: state_vector.h:31