ryujin 2.1.1 revision ee5cbcbf2346c1299c942d0e1f13b46449973c18
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 <compile_time_options.h>
9
10#include "convenience_macros.h"
11#include "discretization.h"
12#include "gpu.h"
13#include "mpi_ensemble.h"
14#include "observer_pointer.h"
15#include "sparse_matrix.h"
16#include "sparsity_pattern.h"
17#include "state_vector.h"
18
19#include <deal.II/base/parameter_acceptor.h>
20#include <deal.II/base/partitioner.h>
21#include <deal.II/dofs/dof_handler.h>
22#include <deal.II/lac/affine_constraints.h>
23#include <deal.II/lac/la_parallel_vector.h>
24#include <deal.II/lac/sparse_matrix.h>
25#include <deal.II/numerics/data_out.h>
26
27namespace ryujin
28{
52 template <int dim, typename Number = double>
53 class OfflineData final : public dealii::ParameterAcceptor
54 {
55 public:
60
67 std::tuple<unsigned int /*i*/,
68 dealii::Tensor<1, dim, Number> /*normal*/,
69 Number /*normal mass*/,
70 Number /*boundary mass*/,
71 dealii::types::boundary_id /*id*/,
72 dealii::Point<dim>> /*position*/;
73
80 unsigned int i;
81 unsigned int col_idx;
82 unsigned int j;
83
84 bool operator==(const CouplingDescription &) const = default;
85 };
86
88
92
96 OfflineData(const MPIEnsemble &mpi_ensemble,
98 const std::string &subsection = "/OfflineData");
99
108 void prepare(const unsigned int problem_dimension,
109 const unsigned int n_precomputed_values);
110
112
116
125
126
134
138 const dealii::DoFHandler<dim> &dof_handler() const
139 {
140 if (discretization_->have_discontinuous_ansatz()) {
141 Assert(dof_handler_dg_, dealii::ExcInternalError());
142 return *dof_handler_dg_;
143 } else {
144 Assert(dof_handler_cg_, dealii::ExcInternalError());
145 return *dof_handler_cg_;
146 }
147 }
148
152 dealii::DoFHandler<dim> &dof_handler()
153 {
154 if (discretization_->have_discontinuous_ansatz()) {
155 Assert(dof_handler_dg_, dealii::ExcInternalError());
156 return *dof_handler_dg_;
157 } else {
158 Assert(dof_handler_cg_, dealii::ExcInternalError());
159 return *dof_handler_cg_;
160 }
161 }
162
176
177
190
199 const dealii::AffineConstraints<Number> &affine_constraints() const
200 {
201 if (discretization_->have_discontinuous_ansatz()) {
202 return affine_constraints_dg_;
203 } else {
204 return affine_constraints_cg_;
205 }
206 }
207
213
214
219
225
238
246
253
261
274
282
293
303
309
315
321
326
334
339
345
351
358
363
374
379
384
385 private:
387
391
392 bool treat_fe_nothing_as_boundary_;
393 double incidence_relaxation_even_;
394 double incidence_relaxation_odd_;
395
397
401
402 const MPIEnsemble &mpi_ensemble_;
403
404 dealii::ObserverPointer<const Discretization<dim>> discretization_;
405
406 std::unique_ptr<dealii::DoFHandler<dim>> dof_handler_cg_;
407 std::unique_ptr<dealii::DoFHandler<dim>> dof_handler_dg_;
408
409 dealii::AffineConstraints<Number> affine_constraints_cg_;
410 dealii::AffineConstraints<Number> affine_constraints_dg_;
411
412 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
413 scalar_partitioner_;
414
415 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
416 hyperbolic_vector_partitioner_;
417
418 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
419 precomputed_vector_partitioner_;
420
421 unsigned int n_export_indices_;
422 unsigned int n_locally_internal_;
423 unsigned int n_locally_owned_;
424 unsigned int n_locally_relevant_;
425
426 using BoundaryMap = std::vector<BoundaryDescription>;
427 BoundaryMap boundary_map_;
428 std::vector<BoundaryMap> level_boundary_map_;
429
430 Mirrored<unsigned int *> boundary_indices_{"offline_data_boundary_indices"};
431 std::vector<unsigned int> boundary_slots_;
432
433 using CouplingBoundaryPairs = std::vector<CouplingDescription>;
434 Mirrored<CouplingDescription *> coupling_boundary_pairs_{
435 "offline_data_coupling_boundary_pairs"};
436
437 dealii::DynamicSparsityPattern sparsity_pattern_;
438
439 SparsityPattern<warp_size> sparsity_pattern_simd_;
440
441 SparseMatrix<Number> mass_matrix_;
442 SparseMatrix<Number> mass_matrix_inverse_;
443
444 using ScalarVector = Vectors::ScalarVector<Number>;
445 ScalarVector lumped_mass_matrix_;
446 ScalarVector lumped_mass_matrix_inverse_;
447
448 using ScalarHostVectorFloat = Vectors::ScalarHostVector<float>;
449 std::vector<ScalarHostVectorFloat> level_lumped_mass_matrix_;
450
451 SparseMatrix<Number> betaij_matrix_;
452 SparseMatrix<Number, dim> cij_matrix_;
453 SparseMatrix<Number> incidence_matrix_;
454
455 Number measure_of_omega_;
456
458
462
468 void create_dof_handlers();
469
476 void renumber_for_simd();
477
484 void create_constraints_and_sparsity_pattern();
485
493 void ensure_simd_stride_consistency();
494
500 void create_partitioner_and_simd_sparsity(
501 const unsigned int problem_dimension,
502 const unsigned int n_precomputed_values);
503
509 void create_matrices();
510
516 void create_multigrid_data();
517
521 template <typename ITERATOR1, typename ITERATOR2>
522 BoundaryMap construct_boundary_map(
523 const ITERATOR1 &begin,
524 const ITERATOR2 &end,
525 const dealii::Utilities::MPI::Partitioner &partitioner) const;
526
531 template <typename ITERATOR1, typename ITERATOR2>
532 CouplingBoundaryPairs collect_coupling_boundary_pairs(
533 const ITERATOR1 &begin,
534 const ITERATOR2 &end,
535 const dealii::Utilities::MPI::Partitioner &partitioner) const;
536
538 };
539
540} /* namespace ryujin */
const auto & n_export_indices() const
const dealii::AffineConstraints< Number > & affine_constraints() const
const auto & boundary_map() const
const dealii::DoFHandler< dim > & dof_handler() const
const auto & dof_handler_dg() const
const auto & betaij_matrix() const
void prepare(const unsigned int problem_dimension, const unsigned int n_precomputed_values)
const auto & level_lumped_mass_matrix() const
const auto & lumped_mass_matrix_inverse() const
const auto & level_boundary_map() const
const auto & scalar_partitioner() const
const auto & sparsity_pattern() const
const auto & n_locally_owned() const
const auto & lumped_mass_matrix() const
dealii::DoFHandler< dim > & dof_handler()
const auto & hyperbolic_vector_partitioner() const
const auto & boundary_indices() const
const auto & precomputed_vector_partitioner() const
const auto & affine_constraints_dg() const
std::tuple< unsigned int, dealii::Tensor< 1, dim, Number >, Number, Number, dealii::types::boundary_id, dealii::Point< dim > > BoundaryDescription
const auto & mass_matrix_inverse() const
const auto & boundary_slots() const
const auto & mass_matrix() const
const auto & discretization() const
const auto & measure_of_omega() const
const auto & n_locally_relevant() const
const auto & coupling_boundary_pairs() const
const auto & dof_handler_cg() const
const auto & sparsity_pattern_simd() const
const auto & incidence_matrix() const
const auto & affine_constraints_cg() const
const auto & n_locally_internal() const
const auto & cij_matrix() const
#define ACCESSOR_READ_ONLY(member)
#define ACCESSOR_READ_ONLY_NO_DEREFERENCE(member)
SmartPointer< T, P > ObserverPointer
bool operator==(const CouplingDescription &) const =default