ryujin 2.5.0 revision c64172211cf21344cb9b9b0f3a1266aa6400d392
Loading...
Searching...
No Matches
mpi_ensemble_container.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2025 - 2026 by the ryujin authors
4//
5
6#pragma once
7
8#include <ryujin/base/compile_time_options.h>
10
11#include <deal.II/base/mpi.h>
12#include <deal.II/base/utilities.h>
13
14namespace ryujin
15{
35 template <typename T>
37 {
38 public:
44 template <typename... Args>
45 MPIEnsembleContainer(const MPIEnsemble &mpi_ensemble,
46 const std::string &subsection,
47 Args &&...args)
48 {
49 const auto &ensemble = mpi_ensemble.ensemble();
50 const auto &n_ensembles = mpi_ensemble.n_ensembles();
51 unsigned int digits = dealii::Utilities::needed_digits(n_ensembles - 1);
52
53 payload_.resize(n_ensembles);
54 for (int n = 0; n < n_ensembles; ++n) {
55 /* Only append "/ensemble n" if we have more than one ensemble: */
56 auto modified = subsection;
57 if (n_ensembles > 1)
58 modified +=
59 "/ensemble " + dealii::Utilities::int_to_string(n, digits);
60 payload_[n] =
61 std::make_unique<T>(std::forward<Args>(args)..., modified);
62 }
63
64 ensemble_payload_ = payload_[ensemble].get();
65 }
66
71 const T &get() const
72 {
73 return *ensemble_payload_;
74 }
75
80 operator const T &() const
81 {
82 return *ensemble_payload_;
83 }
84
85 private:
86 std::vector<std::unique_ptr<T>> payload_;
87 T *ensemble_payload_;
88 };
89
90
91#ifndef DOXYGEN
92 namespace
93 {
94 template <typename C>
95 static auto test(...) -> std::false_type;
96
97 template <typename C>
98 static auto test(int) -> decltype(C::n_mpi_ensembles(), std::true_type());
99 } // namespace
100#endif
101
106 template <typename T>
107 constexpr bool has_n_mpi_ensembles_v = decltype(test<T>(0))::value;
108} // namespace ryujin
MPIEnsembleContainer(const MPIEnsemble &mpi_ensemble, const std::string &subsection, Args &&...args)
constexpr bool has_n_mpi_ensembles_v