ryujin 2.5.0 revision 3a6c8d57210175dea14d8116e1fe878f349f8c1c
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) 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>
16
17#include <deal.II/base/parameter_acceptor.h>
18#include <deal.II/base/partitioner.h>
19#include <deal.II/base/point.h>
20#include <deal.II/base/tensor.h>
21#include <deal.II/base/types.h>
22#include <deal.II/dofs/dof_handler.h>
23#include <deal.II/lac/affine_constraints.h>
24#include <deal.II/lac/dynamic_sparsity_pattern.h>
25
26#include <memory>
27#include <string>
28#include <tuple>
29#include <vector>
30
31namespace ryujin
32{
33 namespace Interface
34 {
49 template <int dim, typename Number = double>
50 class OfflineData : public dealii::ParameterAcceptor
51 {
52 public:
57
64 std::tuple<unsigned int /*i*/,
65 dealii::Tensor<1, dim, Number> /*normal*/,
66 Number /*normal mass*/,
67 Number /*boundary mass*/,
68 dealii::types::boundary_id /*id*/,
69 dealii::Point<dim>> /*position*/;
70
77 unsigned int i;
78 unsigned int col_idx;
79 unsigned int j;
80
81 bool operator==(const CouplingDescription &) const = default;
82 };
83
87 using BoundaryMap = std::vector<BoundaryDescription>;
88
92 using CouplingBoundaryPairs = std::vector<CouplingDescription>;
93
95
99
108 virtual void prepare(const unsigned int problem_dimension,
109 const unsigned int n_precomputed_values) = 0;
110
112
116
124 ACCESSOR_READ_ONLY(dof_handler_cg)
125
126
133 ACCESSOR_READ_ONLY(dof_handler_dg)
134
135
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
161 ACCESSOR_READ_ONLY(affine_constraints_cg)
162
163
175 ACCESSOR_READ_ONLY(affine_constraints_dg)
176
177
185 const dealii::AffineConstraints<Number> &affine_constraints() const
186 {
187 if (discretization_->have_discontinuous_ansatz()) {
189 } else {
191 }
192 }
193
198 ACCESSOR_READ_ONLY_NO_DEREFERENCE(scalar_partitioner)
199
200
204 ACCESSOR_READ_ONLY_NO_DEREFERENCE(hyperbolic_vector_partitioner)
205
206
210 ACCESSOR_READ_ONLY_NO_DEREFERENCE(precomputed_vector_partitioner)
211
212
223 ACCESSOR_READ_ONLY(n_export_indices)
224
225
231 ACCESSOR_READ_ONLY(n_locally_internal)
232
233
238 ACCESSOR_READ_ONLY(n_locally_owned)
239
240
246 ACCESSOR_READ_ONLY(n_locally_relevant)
247
248
259 ACCESSOR_READ_ONLY(boundary_map)
260
261
267 ACCESSOR_READ_ONLY(boundary_indices)
268
269
278 ACCESSOR_READ_ONLY(boundary_slots)
279
280
288 ACCESSOR_READ_ONLY(coupling_boundary_pairs)
289
290
294 ACCESSOR_READ_ONLY(level_boundary_map)
295
296
300 ACCESSOR_READ_ONLY(sparsity_pattern)
301
302
306 ACCESSOR_READ_ONLY(sparsity_pattern_simd)
307
308
311 ACCESSOR_READ_ONLY(mass_matrix)
312
313
319 ACCESSOR_READ_ONLY(mass_matrix_inverse)
320
321
324 ACCESSOR_READ_ONLY(lumped_mass_matrix)
325
326
330 ACCESSOR_READ_ONLY(lumped_mass_matrix_inverse)
331
332
336 ACCESSOR_READ_ONLY(level_lumped_mass_matrix)
337
338
343 ACCESSOR_READ_ONLY(betaij_matrix)
344
345
348 ACCESSOR_READ_ONLY(cij_matrix)
349
350
359 ACCESSOR_READ_ONLY(incidence_matrix)
360
361
364 ACCESSOR_READ_ONLY(measure_of_omega)
365
366
369 ACCESSOR_READ_ONLY(discretization)
370
371 //@}
372
373 protected:
377 OfflineData(const Discretization<dim> &discretization,
378 const std::string &subsection)
379 : ParameterAcceptor(subsection)
380 , discretization_(&discretization)
386 {
387 }
388
393
394 dealii::ObserverPointer<const Discretization<dim>> discretization_;
395
396 std::unique_ptr<dealii::DoFHandler<dim>> dof_handler_cg_;
397 std::unique_ptr<dealii::DoFHandler<dim>> dof_handler_dg_;
398
399 std::unique_ptr<dealii::AffineConstraints<Number>> affine_constraints_cg_;
400 std::unique_ptr<dealii::AffineConstraints<Number>> affine_constraints_dg_;
401
402 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
404
405 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
407
408 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
410
411 unsigned int n_export_indices_;
413 unsigned int n_locally_owned_;
415
417 std::vector<BoundaryMap> level_boundary_map_;
418
419 std::unique_ptr<Mirrored<unsigned int *>> boundary_indices_;
420 std::vector<unsigned int> boundary_slots_;
421
422 std::unique_ptr<Mirrored<CouplingDescription *>> coupling_boundary_pairs_;
423
424 std::unique_ptr<dealii::DynamicSparsityPattern> sparsity_pattern_;
425
426 std::unique_ptr<SparsityPattern<warp_size>> sparsity_pattern_simd_;
427
428 std::unique_ptr<SparseMatrix<Number>> mass_matrix_;
429 std::unique_ptr<SparseMatrix<Number>> mass_matrix_inverse_;
430
431 std::unique_ptr<ScalarVector<Number>> lumped_mass_matrix_;
432 std::unique_ptr<ScalarVector<Number>> lumped_mass_matrix_inverse_;
433
434 std::vector<ScalarHostVector<float>> level_lumped_mass_matrix_;
435
436 std::unique_ptr<SparseMatrix<Number>> betaij_matrix_;
437 std::unique_ptr<SparseMatrix<Number, dim>> cij_matrix_;
438 std::unique_ptr<SparseMatrix<Number>> incidence_matrix_;
439
441
443 };
444 } // namespace Interface
445} // namespace ryujin
std::unique_ptr< SparseMatrix< Number > > mass_matrix_inverse_
dealii::ObserverPointer< const Discretization< dim > > discretization_
std::unique_ptr< SparseMatrix< Number > > mass_matrix_
std::vector< BoundaryMap > level_boundary_map_
std::unique_ptr< dealii::AffineConstraints< Number > > affine_constraints_dg_
std::unique_ptr< SparseMatrix< Number > > incidence_matrix_
std::unique_ptr< SparsityPattern< warp_size > > sparsity_pattern_simd_
std::tuple< unsigned int, dealii::Tensor< 1, dim, Number >, Number, Number, dealii::types::boundary_id, dealii::Point< dim > > BoundaryDescription
std::vector< unsigned int > boundary_slots_
std::shared_ptr< const dealii::Utilities::MPI::Partitioner > precomputed_vector_partitioner_
std::unique_ptr< ScalarVector< Number > > lumped_mass_matrix_
const dealii::AffineConstraints< Number > & affine_constraints() const
std::unique_ptr< Mirrored< CouplingDescription * > > coupling_boundary_pairs_
std::unique_ptr< Mirrored< unsigned int * > > boundary_indices_
const dealii::DoFHandler< dim > & dof_handler() const
std::unique_ptr< dealii::DoFHandler< dim > > dof_handler_dg_
OfflineData(const Discretization< dim > &discretization, const std::string &subsection)
std::unique_ptr< dealii::AffineConstraints< Number > > affine_constraints_cg_
std::unique_ptr< dealii::DoFHandler< dim > > dof_handler_cg_
std::shared_ptr< const dealii::Utilities::MPI::Partitioner > scalar_partitioner_
std::vector< BoundaryDescription > BoundaryMap
std::vector< CouplingDescription > CouplingBoundaryPairs
virtual void prepare(const unsigned int problem_dimension, const unsigned int n_precomputed_values)=0
std::unique_ptr< dealii::DynamicSparsityPattern > sparsity_pattern_
std::unique_ptr< ScalarVector< Number > > lumped_mass_matrix_inverse_
std::vector< ScalarHostVector< float > > level_lumped_mass_matrix_
std::unique_ptr< SparseMatrix< Number > > betaij_matrix_
std::shared_ptr< const dealii::Utilities::MPI::Partitioner > hyperbolic_vector_partitioner_
std::unique_ptr< SparseMatrix< Number, dim > > cij_matrix_
#define ACCESSOR_READ_ONLY(member)
#define ACCESSOR_READ_ONLY_NO_DEREFERENCE(member)
bool operator==(const CouplingDescription &) const =default