ryujin 2.1.1 revision ee5cbcbf2346c1299c942d0e1f13b46449973c18
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 by the ryujin authors
4//
5
6#pragma once
7
8#include <compile_time_options.h>
9
10#include "mpi_ensemble.h"
11
12#include <deal.II/base/mpi.h>
13#include <deal.II/base/utilities.h>
14
15namespace ryujin
16{
36 template <typename T>
38 {
39 public:
45 template <typename... Args>
46 MPIEnsembleContainer(const MPIEnsemble &mpi_ensemble,
47 const std::string &subsection,
48 Args &&...args)
49 {
50 const auto &ensemble = mpi_ensemble.ensemble();
51 const auto &n_ensembles = mpi_ensemble.n_ensembles();
52 unsigned int digits = dealii::Utilities::needed_digits(n_ensembles - 1);
53
54 payload_.resize(n_ensembles);
55 for (int n = 0; n < n_ensembles; ++n) {
56 /* Only append "/ensemble n" if we have more than one ensemble: */
57 auto modified = subsection;
58 if (n_ensembles > 1)
59 modified +=
60 "/ensemble " + dealii::Utilities::int_to_string(n, digits);
61 payload_[n] =
62 std::make_unique<T>(std::forward<Args>(args)..., modified);
63 }
64
65 ensemble_payload_ = payload_[ensemble].get();
66 }
67
72 const T &get() const
73 {
74 return *ensemble_payload_;
75 }
76
81 operator const T &() const
82 {
83 return *ensemble_payload_;
84 }
85
86 private:
87 std::vector<std::unique_ptr<T>> payload_;
88 T *ensemble_payload_;
89 };
90
91
96 namespace
97 {
98 template <typename C>
99 static auto test(...) -> std::false_type;
100
101 template <typename C>
102 static auto test(int) -> decltype(C::n_mpi_ensembles(), std::true_type());
103 } // namespace
104
105 template <typename T>
106 constexpr bool has_n_mpi_ensembles_v = decltype(test<T>(0))::value;
107} /* namespace ryujin */
MPIEnsembleContainer(const MPIEnsemble &mpi_ensemble, const std::string &subsection, Args &&...args)
const auto & n_ensembles() const
const auto & ensemble() const
constexpr bool has_n_mpi_ensembles_v