ryujin 2.5.0 revision c64172211cf21344cb9b9b0f3a1266aa6400d392
Loading...
Searching...
No Matches
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 - 2026 by the ryujin authors
4//
5
6#pragma once
7
8#include <ryujin/base/compile_time_options.h>
10#include <ryujin/base/gpu.h>
17
18#include <deal.II/base/parameter_acceptor.h>
19#include <deal.II/base/partitioner.h>
20#include <deal.II/base/point.h>
21#include <deal.II/base/tensor.h>
22#include <deal.II/base/types.h>
23#include <deal.II/dofs/dof_handler.h>
24#include <deal.II/lac/affine_constraints.h>
25#include <deal.II/lac/dynamic_sparsity_pattern.h>
26
27#include <memory>
28#include <string>
29#include <tuple>
30#include <vector>
31
32namespace ryujin
33{
57 template <int dim, typename Number = double>
58 class OfflineData final : public dealii::ParameterAcceptor
59 {
60 public:
65
72 std::tuple<unsigned int /*i*/,
73 dealii::Tensor<1, dim, Number> /*normal*/,
74 Number /*normal mass*/,
75 Number /*boundary mass*/,
76 dealii::types::boundary_id /*id*/,
77 dealii::Point<dim>> /*position*/;
78
85 unsigned int i;
86 unsigned int col_idx;
87 unsigned int j;
88
89 bool operator==(const CouplingDescription &) const = default;
90 };
91
95 using BoundaryMap = std::vector<BoundaryDescription>;
96
100 using CouplingBoundaryPairs = std::vector<CouplingDescription>;
101
103
107
111 OfflineData(const MPIEnsemble &mpi_ensemble,
112 const Discretization<dim> &discretization,
113 const std::string &subsection = "/OfflineData");
114
123 void prepare(const unsigned int problem_dimension,
124 const unsigned int n_precomputed_values);
125
127
131
139 ACCESSOR_READ_ONLY(dof_handler_cg)
140
141
148 ACCESSOR_READ_ONLY(dof_handler_dg)
149
150
153 const dealii::DoFHandler<dim> &dof_handler() const
154 {
155 if (discretization_->have_discontinuous_ansatz()) {
156 Assert(dof_handler_dg_, dealii::ExcInternalError());
157 return *dof_handler_dg_;
158 } else {
159 Assert(dof_handler_cg_, dealii::ExcInternalError());
160 return *dof_handler_cg_;
161 }
162 }
163
176 ACCESSOR_READ_ONLY(affine_constraints_cg)
177
178
190 ACCESSOR_READ_ONLY(affine_constraints_dg)
191
192
200 const dealii::AffineConstraints<Number> &affine_constraints() const
201 {
202 if (discretization_->have_discontinuous_ansatz()) {
203 return *affine_constraints_dg_;
204 } else {
205 return *affine_constraints_cg_;
206 }
207 }
208
213 ACCESSOR_READ_ONLY_NO_DEREFERENCE(scalar_partitioner)
214
215
219 ACCESSOR_READ_ONLY_NO_DEREFERENCE(hyperbolic_vector_partitioner)
220
221
225 ACCESSOR_READ_ONLY_NO_DEREFERENCE(precomputed_vector_partitioner)
226
227
238 ACCESSOR_READ_ONLY(n_export_indices)
239
240
246 ACCESSOR_READ_ONLY(n_locally_internal)
247
248
253 ACCESSOR_READ_ONLY(n_locally_owned)
254
255
261 ACCESSOR_READ_ONLY(n_locally_relevant)
262
263
274 ACCESSOR_READ_ONLY(boundary_map)
275
276
282 ACCESSOR_READ_ONLY(boundary_indices)
283
284
293 ACCESSOR_READ_ONLY(boundary_slots)
294
295
303 ACCESSOR_READ_ONLY(coupling_boundary_pairs)
304
305
309 ACCESSOR_READ_ONLY(level_boundary_map)
310
311
315 ACCESSOR_READ_ONLY(sparsity_pattern)
316
317
321 ACCESSOR_READ_ONLY(sparsity_pattern_simd)
322
323
326 ACCESSOR_READ_ONLY(mass_matrix)
327
328
334 ACCESSOR_READ_ONLY(mass_matrix_inverse)
335
336
339 ACCESSOR_READ_ONLY(lumped_mass_matrix)
340
341
345 ACCESSOR_READ_ONLY(lumped_mass_matrix_inverse)
346
347
351 ACCESSOR_READ_ONLY(level_lumped_mass_matrix)
352
353
358 ACCESSOR_READ_ONLY(betaij_matrix)
359
360
363 ACCESSOR_READ_ONLY(cij_matrix)
364
365
374 ACCESSOR_READ_ONLY(incidence_matrix)
375
376
379 ACCESSOR_READ_ONLY(measure_of_omega)
380
381
384 ACCESSOR_READ_ONLY(discretization)
385
386 //@}
387
388 private:
393
394 bool treat_fe_nothing_as_boundary_;
395 double incidence_relaxation_even_;
396 double incidence_relaxation_odd_;
397
399
403
404 const MPIEnsemble &mpi_ensemble_;
405
406 dealii::ObserverPointer<const Discretization<dim>> discretization_;
407
408 std::unique_ptr<dealii::DoFHandler<dim>> dof_handler_cg_;
409 std::unique_ptr<dealii::DoFHandler<dim>> dof_handler_dg_;
410
411 std::unique_ptr<dealii::AffineConstraints<Number>> affine_constraints_cg_;
412 std::unique_ptr<dealii::AffineConstraints<Number>> affine_constraints_dg_;
413
414 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
415 scalar_partitioner_;
416
417 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
418 hyperbolic_vector_partitioner_;
419
420 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
421 precomputed_vector_partitioner_;
422
423 unsigned int n_export_indices_;
424 unsigned int n_locally_internal_;
425 unsigned int n_locally_owned_;
426 unsigned int n_locally_relevant_;
427
428 BoundaryMap boundary_map_;
429 std::vector<BoundaryMap> level_boundary_map_;
430
431 std::unique_ptr<Mirrored<unsigned int *>> boundary_indices_;
432 std::vector<unsigned int> boundary_slots_;
433
434 std::unique_ptr<Mirrored<CouplingDescription *>> coupling_boundary_pairs_;
435
436 std::unique_ptr<dealii::DynamicSparsityPattern> sparsity_pattern_;
437
438 std::unique_ptr<SparsityPattern<warp_size>> sparsity_pattern_simd_;
439
440 std::unique_ptr<SparseMatrix<Number>> mass_matrix_;
441 std::unique_ptr<SparseMatrix<Number>> mass_matrix_inverse_;
442
443 std::unique_ptr<ScalarVector<Number>> lumped_mass_matrix_;
444 std::unique_ptr<ScalarVector<Number>> lumped_mass_matrix_inverse_;
445
446 std::vector<ScalarHostVector<float>> level_lumped_mass_matrix_;
447
448 std::unique_ptr<SparseMatrix<Number>> betaij_matrix_;
449 std::unique_ptr<SparseMatrix<Number, dim>> cij_matrix_;
450 std::unique_ptr<SparseMatrix<Number>> incidence_matrix_;
451
452 Number measure_of_omega_;
453
455
459
463 dealii::DoFHandler<dim> &writable_dof_handler()
464 {
465 if (this->discretization_->have_discontinuous_ansatz()) {
466 Assert(this->dof_handler_dg_, dealii::ExcInternalError());
467 return *this->dof_handler_dg_;
468 } else {
469 Assert(this->dof_handler_cg_, dealii::ExcInternalError());
470 return *this->dof_handler_cg_;
471 }
472 }
473
479 void create_dof_handlers();
480
487 void renumber_for_simd();
488
495 void create_constraints_and_sparsity_pattern();
496
504 void ensure_simd_stride_consistency();
505
511 void create_partitioner_and_simd_sparsity(
512 const unsigned int problem_dimension,
513 const unsigned int n_precomputed_values);
514
520 void create_matrices();
521
527 void create_multigrid_data();
528
532 template <typename ITERATOR1, typename ITERATOR2>
533 BoundaryMap construct_boundary_map(
534 const ITERATOR1 &begin,
535 const ITERATOR2 &end,
536 const dealii::Utilities::MPI::Partitioner &partitioner) const;
537
542 template <typename ITERATOR1, typename ITERATOR2>
543 CouplingBoundaryPairs collect_coupling_boundary_pairs(
544 const ITERATOR1 &begin,
545 const ITERATOR2 &end,
546 const dealii::Utilities::MPI::Partitioner &partitioner) const;
547
549 };
550
551} // namespace ryujin
const dealii::AffineConstraints< Number > & affine_constraints() const
const dealii::DoFHandler< dim > & dof_handler() const
void prepare(const unsigned int problem_dimension, const unsigned int n_precomputed_values)
std::vector< BoundaryDescription > BoundaryMap
std::vector< CouplingDescription > CouplingBoundaryPairs
std::tuple< unsigned int, dealii::Tensor< 1, dim, Number >, Number, Number, dealii::types::boundary_id, dealii::Point< dim > > BoundaryDescription
OfflineData(const MPIEnsemble &mpi_ensemble, const Discretization< dim > &discretization, const std::string &subsection="/OfflineData")
#define ACCESSOR_READ_ONLY(member)
#define ACCESSOR_READ_ONLY_NO_DEREFERENCE(member)
bool operator==(const CouplingDescription &) const =default