ryujin 2.1.1 revision 955e869188d49b3c97ca7b1cf4fd9ceb0e6f46ef
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 "sparse_matrix_simd.h"
14#include "state_vector.h"
15
16#include <deal.II/base/parameter_acceptor.h>
17#include <deal.II/base/partitioner.h>
18#include <deal.II/base/smartpointer.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
24#include <deal.II/numerics/data_out.h>
25
26namespace ryujin
27{
51 template <int dim, typename Number = double>
52 class OfflineData : public dealii::ParameterAcceptor
53 {
54 public:
59
64
71 std::tuple<unsigned int /*i*/,
72 dealii::Tensor<1, dim, Number> /*normal*/,
73 Number /*normal mass*/,
74 Number /*boundary mass*/,
75 dealii::types::boundary_id /*id*/,
76 dealii::Point<dim>> /*position*/;
77
82 using CouplingDescription = std::tuple<unsigned int /*i*/, //
83 unsigned int /*col_idx*/,
84 unsigned int /*j*/>;
85
89 OfflineData(const MPIEnsemble &mpi_ensemble,
91 const std::string &subsection = "/OfflineData");
92
101 void prepare(const unsigned int problem_dimension,
102 const unsigned int n_precomputed_values,
103 const unsigned int n_parabolic_state_vectors,
104 bool create_matrices = true,
105 bool create_multigrid_data = true)
106 {
107 setup(problem_dimension, n_precomputed_values);
108
109 if (create_matrices)
110 this->create_matrices();
111
112 if (create_multigrid_data)
113 this->create_multigrid_data();
114
115 n_parabolic_state_vectors_ = n_parabolic_state_vectors;
116 }
117
123
124
129
135
141
147
152
165
173
180
188
201
209
215
221
227
232
240
245
251
257
262
273
278
283
284 private:
289
294 void create_constraints_and_sparsity_pattern();
295
303 void setup(const unsigned int problem_dimension,
304 const unsigned int n_precomputed_values);
305
309 void create_matrices();
310
314 void create_multigrid_data();
315
317
321
322 const MPIEnsemble &mpi_ensemble_;
323
324 std::unique_ptr<dealii::DoFHandler<dim>> dof_handler_;
325
326 dealii::AffineConstraints<Number> affine_constraints_;
327
328 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
329 scalar_partitioner_;
330
331 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
332 hyperbolic_vector_partitioner_;
333
334 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
335 precomputed_vector_partitioner_;
336
337 unsigned int n_parabolic_state_vectors_;
338
339 unsigned int n_export_indices_;
340 unsigned int n_locally_internal_;
341 unsigned int n_locally_owned_;
342 unsigned int n_locally_relevant_;
343
344 using BoundaryMap = std::vector<BoundaryDescription>;
345 BoundaryMap boundary_map_;
346 std::vector<BoundaryMap> level_boundary_map_;
347
348 using CouplingBoundaryPairs = std::vector<CouplingDescription>;
349 CouplingBoundaryPairs coupling_boundary_pairs_;
350
351 dealii::DynamicSparsityPattern sparsity_pattern_;
352
353 SparsityPatternSIMD<dealii::VectorizedArray<Number>::size()>
354 sparsity_pattern_simd_;
355
356 SparseMatrixSIMD<Number> mass_matrix_;
357 SparseMatrixSIMD<Number> mass_matrix_inverse_;
358
359 ScalarVector lumped_mass_matrix_;
360 ScalarVector lumped_mass_matrix_inverse_;
361
362 std::vector<ScalarVectorFloat> level_lumped_mass_matrix_;
363
364 SparseMatrixSIMD<Number, dim> cij_matrix_;
365 SparseMatrixSIMD<Number> incidence_matrix_;
366
367 Number measure_of_omega_;
368
369 dealii::SmartPointer<const Discretization<dim>> discretization_;
370
374 template <typename ITERATOR1, typename ITERATOR2>
375 BoundaryMap construct_boundary_map(
376 const ITERATOR1 &begin,
377 const ITERATOR2 &end,
378 const dealii::Utilities::MPI::Partitioner &partitioner) const;
379
384 template <typename ITERATOR1, typename ITERATOR2>
385 CouplingBoundaryPairs collect_coupling_boundary_pairs(
386 const ITERATOR1 &begin,
387 const ITERATOR2 &end,
388 const dealii::Utilities::MPI::Partitioner &partitioner) const;
389
391
395
396 double incidence_relaxation_even_;
397 double incidence_relaxation_odd_;
398
400 };
401
402} /* namespace ryujin */
const auto & n_export_indices() const
Definition: offline_data.h:164
Vectors::ScalarVector< float > ScalarVectorFloat
Definition: offline_data.h:63
const auto & boundary_map() const
Definition: offline_data.h:200
const auto & n_parabolic_state_vectors() const
Definition: offline_data.h:151
const auto & level_lumped_mass_matrix() const
Definition: offline_data.h:256
const auto & lumped_mass_matrix_inverse() const
Definition: offline_data.h:250
const auto & level_boundary_map() const
Definition: offline_data.h:214
const auto & scalar_partitioner() const
Definition: offline_data.h:134
const auto & sparsity_pattern() const
Definition: offline_data.h:220
const auto & n_locally_owned() const
Definition: offline_data.h:179
const auto & lumped_mass_matrix() const
Definition: offline_data.h:244
const auto & affine_constraints() const
Definition: offline_data.h:128
const auto & hyperbolic_vector_partitioner() const
Definition: offline_data.h:140
const auto & precomputed_vector_partitioner() const
Definition: offline_data.h:146
std::tuple< unsigned int, unsigned int, unsigned int > CouplingDescription
Definition: offline_data.h:84
void prepare(const unsigned int problem_dimension, const unsigned int n_precomputed_values, const unsigned int n_parabolic_state_vectors, bool create_matrices=true, bool create_multigrid_data=true)
Definition: offline_data.h:101
Vectors::ScalarVector< Number > ScalarVector
Definition: offline_data.h:58
std::tuple< unsigned int, dealii::Tensor< 1, dim, Number >, Number, Number, dealii::types::boundary_id, dealii::Point< dim > > BoundaryDescription
Definition: offline_data.h:76
const auto & mass_matrix_inverse() const
Definition: offline_data.h:239
const auto & mass_matrix() const
Definition: offline_data.h:231
const auto & discretization() const
Definition: offline_data.h:282
OfflineData(const MPIEnsemble &mpi_ensemble, const Discretization< dim > &discretization, const std::string &subsection="/OfflineData")
const auto & measure_of_omega() const
Definition: offline_data.h:277
const auto & n_locally_relevant() const
Definition: offline_data.h:187
const auto & coupling_boundary_pairs() const
Definition: offline_data.h:208
const auto & sparsity_pattern_simd() const
Definition: offline_data.h:226
const auto & dof_handler() const
Definition: offline_data.h:122
const auto & incidence_matrix() const
Definition: offline_data.h:272
const auto & n_locally_internal() const
Definition: offline_data.h:172
const auto & cij_matrix() const
Definition: offline_data.h:261
#define ACCESSOR_READ_ONLY(member)
#define ACCESSOR_READ_ONLY_NO_DEREFERENCE(member)
dealii::LinearAlgebra::distributed::Vector< Number > ScalarVector
Definition: state_vector.h:31