ryujin 2.1.1 revision dbf0e3ba7acdb60b6d558e4257815df4a8f8daf9
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 "mpi_ensemble.h"
13#include "observer_pointer.h"
14#include "sparse_matrix_simd.h"
15#include "state_vector.h"
16
17#include <deal.II/base/parameter_acceptor.h>
18#include <deal.II/base/partitioner.h>
19#include <deal.II/dofs/dof_handler.h>
20#include <deal.II/lac/affine_constraints.h>
21#include <deal.II/lac/la_parallel_vector.h>
22#include <deal.II/lac/sparse_matrix.h>
23#include <deal.II/numerics/data_out.h>
24
25namespace ryujin
26{
50 template <int dim, typename Number = double>
51 class OfflineData : public dealii::ParameterAcceptor
52 {
53 public:
58
63
70 std::tuple<unsigned int /*i*/,
71 dealii::Tensor<1, dim, Number> /*normal*/,
72 Number /*normal mass*/,
73 Number /*boundary mass*/,
74 dealii::types::boundary_id /*id*/,
75 dealii::Point<dim>> /*position*/;
76
81 using CouplingDescription = std::tuple<unsigned int /*i*/, //
82 unsigned int /*col_idx*/,
83 unsigned int /*j*/>;
84
88 OfflineData(const MPIEnsemble &mpi_ensemble,
90 const std::string &subsection = "/OfflineData");
91
100 void prepare(const unsigned int problem_dimension,
101 const unsigned int n_precomputed_values,
102 const unsigned int n_parabolic_state_vectors)
103 {
104 setup(problem_dimension, n_precomputed_values);
105
106 create_matrices();
107
108 if (!dof_handler_->has_hp_capabilities())
109 create_multigrid_data();
110
111 n_parabolic_state_vectors_ = n_parabolic_state_vectors;
112 }
113
119
120
125
131
137
143
148
161
169
176
184
197
205
211
217
223
228
236
241
247
253
260
265
276
281
286
287 private:
292
297 void create_constraints_and_sparsity_pattern();
298
306 void setup(const unsigned int problem_dimension,
307 const unsigned int n_precomputed_values);
308
312 void create_matrices();
313
317 void create_multigrid_data();
318
320
324
325 const MPIEnsemble &mpi_ensemble_;
326
327 std::unique_ptr<dealii::DoFHandler<dim>> dof_handler_;
328
329 dealii::AffineConstraints<Number> affine_constraints_;
330
331 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
332 scalar_partitioner_;
333
334 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
335 hyperbolic_vector_partitioner_;
336
337 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
338 precomputed_vector_partitioner_;
339
340 unsigned int n_parabolic_state_vectors_;
341
342 unsigned int n_export_indices_;
343 unsigned int n_locally_internal_;
344 unsigned int n_locally_owned_;
345 unsigned int n_locally_relevant_;
346
347 using BoundaryMap = std::vector<BoundaryDescription>;
348 BoundaryMap boundary_map_;
349 std::vector<BoundaryMap> level_boundary_map_;
350
351 using CouplingBoundaryPairs = std::vector<CouplingDescription>;
352 CouplingBoundaryPairs coupling_boundary_pairs_;
353
354 dealii::DynamicSparsityPattern sparsity_pattern_;
355
356 SparsityPatternSIMD<dealii::VectorizedArray<Number>::size()>
357 sparsity_pattern_simd_;
358
359 SparseMatrixSIMD<Number> mass_matrix_;
360 SparseMatrixSIMD<Number> mass_matrix_inverse_;
361
362 ScalarVector lumped_mass_matrix_;
363 ScalarVector lumped_mass_matrix_inverse_;
364
365 std::vector<ScalarVectorFloat> level_lumped_mass_matrix_;
366
367 SparseMatrixSIMD<Number> betaij_matrix_;
368 SparseMatrixSIMD<Number, dim> cij_matrix_;
369 SparseMatrixSIMD<Number> incidence_matrix_;
370
371 Number measure_of_omega_;
372
373 dealii::ObserverPointer<const Discretization<dim>> discretization_;
374
378 template <typename ITERATOR1, typename ITERATOR2>
379 BoundaryMap construct_boundary_map(
380 const ITERATOR1 &begin,
381 const ITERATOR2 &end,
382 const dealii::Utilities::MPI::Partitioner &partitioner) const;
383
388 template <typename ITERATOR1, typename ITERATOR2>
389 CouplingBoundaryPairs collect_coupling_boundary_pairs(
390 const ITERATOR1 &begin,
391 const ITERATOR2 &end,
392 const dealii::Utilities::MPI::Partitioner &partitioner) const;
393
395
399
400 bool treat_fe_nothing_as_boundary_;
401 double incidence_relaxation_even_;
402 double incidence_relaxation_odd_;
403
405 };
406
407} /* namespace ryujin */
const auto & n_export_indices() const
Definition: offline_data.h:160
Vectors::ScalarVector< float > ScalarVectorFloat
Definition: offline_data.h:62
const auto & boundary_map() const
Definition: offline_data.h:196
const auto & n_parabolic_state_vectors() const
Definition: offline_data.h:147
const auto & betaij_matrix() const
Definition: offline_data.h:259
const auto & level_lumped_mass_matrix() const
Definition: offline_data.h:252
const auto & lumped_mass_matrix_inverse() const
Definition: offline_data.h:246
const auto & level_boundary_map() const
Definition: offline_data.h:210
const auto & scalar_partitioner() const
Definition: offline_data.h:130
void prepare(const unsigned int problem_dimension, const unsigned int n_precomputed_values, const unsigned int n_parabolic_state_vectors)
Definition: offline_data.h:100
const auto & sparsity_pattern() const
Definition: offline_data.h:216
const auto & n_locally_owned() const
Definition: offline_data.h:175
const auto & lumped_mass_matrix() const
Definition: offline_data.h:240
const auto & affine_constraints() const
Definition: offline_data.h:124
const auto & hyperbolic_vector_partitioner() const
Definition: offline_data.h:136
const auto & precomputed_vector_partitioner() const
Definition: offline_data.h:142
std::tuple< unsigned int, unsigned int, unsigned int > CouplingDescription
Definition: offline_data.h:83
Vectors::ScalarVector< Number > ScalarVector
Definition: offline_data.h:57
std::tuple< unsigned int, dealii::Tensor< 1, dim, Number >, Number, Number, dealii::types::boundary_id, dealii::Point< dim > > BoundaryDescription
Definition: offline_data.h:75
const auto & mass_matrix_inverse() const
Definition: offline_data.h:235
const auto & mass_matrix() const
Definition: offline_data.h:227
const auto & discretization() const
Definition: offline_data.h:285
OfflineData(const MPIEnsemble &mpi_ensemble, const Discretization< dim > &discretization, const std::string &subsection="/OfflineData")
const auto & measure_of_omega() const
Definition: offline_data.h:280
const auto & n_locally_relevant() const
Definition: offline_data.h:183
const auto & coupling_boundary_pairs() const
Definition: offline_data.h:204
const auto & sparsity_pattern_simd() const
Definition: offline_data.h:222
const auto & dof_handler() const
Definition: offline_data.h:118
const auto & incidence_matrix() const
Definition: offline_data.h:275
const auto & n_locally_internal() const
Definition: offline_data.h:168
const auto & cij_matrix() const
Definition: offline_data.h:264
#define ACCESSOR_READ_ONLY(member)
#define ACCESSOR_READ_ONLY_NO_DEREFERENCE(member)
dealii::LinearAlgebra::distributed::Vector< Number > ScalarVector
Definition: state_vector.h:33
SmartPointer< T, P > ObserverPointer