19#ifndef OPM_MULTICOMM_HEADER_INCLUDED
20#define OPM_MULTICOMM_HEADER_INCLUDED
22#include <dune/common/parallel/communication.hh>
23#include <dune/common/hybridutilities.hh>
27#include <dune/common/parallel/mpicommunication.hh>
51 template <
typename T1,
typename T2>
52 void dot(
const T1& x,
const T1& y, T2& result)
const
57 double norm(
const T& x)
const
69 return Dune::Communication<int>{};
80 : colcom_(MPI_COMM_WORLD)
92 template <
typename T1,
typename T2>
93 void dot(
const T1& x,
const T1& y, T2& result)
const
96 result = colcom_.sum(result);
102 double result = x.dot(x);
103 result = colcom_.sum(result);
104 return std::sqrt(result);
107 template <
typename T>
114 Communication<MPI_Comm> colcom_;
118template <
typename... Args>
121 using TupleType = std::tuple<Args...>;
123 using field_type = double;
126 using std::tuple<Args...>::tuple;
131 return sizeof...(Args);
134 template <
size_type index>
135 typename std::tuple_element<index, TupleType>::type&
136 operator[]([[maybe_unused]]
const std::integral_constant<size_type, index> indexVariable)
138 return std::get<index>(*
this);
140 template <
size_type index>
141 const typename std::tuple_element<index, TupleType>::type&
142 operator[]([[maybe_unused]]
const std::integral_constant<size_type, index> indexVariable)
const
144 return std::get<index>(*
this);
147 template <
typename T>
150 using namespace Dune::Hybrid;
151 forEach(integralRange(Hybrid::size(*
this)), [&](
auto&& i) { (*this)[i].project(x[i]); });
153 template <
typename T1,
typename T2>
154 void dot(
const T1& x,
const T1& y, T2& result)
const
156 result = field_type(0);
157 using namespace Dune::Hybrid;
158 forEach(integralRange(Hybrid::size(*
this)), [&](
auto&& i) {
159 double result_tmp = 0;
160 (*this)[i].dot(x[i], y[i], result_tmp);
161 result += result_tmp;
164 template <
typename T>
165 field_type
norm(
const T& x)
const
167 field_type result(0);
168 using namespace Dune::Hybrid;
169 forEach(integralRange(Hybrid::size(*
this)), [&](
auto&& i) {
170 double result_tmp = 0.0;
171 (*this)[i].dot(x[i], x[i], result_tmp);
172 result += result_tmp;
174 return std::sqrt(result);
176 template <
typename T>
179 using namespace Dune::Hybrid;
180 forEach(integralRange(Hybrid::size(*
this)),
181 [&](
auto&& i) { (*this)[i].copyOwnerToAll(x[i], y[i]); });
186 return std::get<0>(*this).communicator();
Definition: MultiComm.hpp:75
void copyOwnerToAll(const T &x, T &y) const
Definition: MultiComm.hpp:108
double norm(const T &x) const
Definition: MultiComm.hpp:100
void project(T &) const
Definition: MultiComm.hpp:88
JacComm()
Definition: MultiComm.hpp:79
std::size_t size_type
Definition: MultiComm.hpp:77
void dot(const T1 &x, const T1 &y, T2 &result) const
Definition: MultiComm.hpp:93
static constexpr size_type size()
Definition: MultiComm.hpp:83
Definition: MultiComm.hpp:120
field_type norm(const T &x) const
Definition: MultiComm.hpp:165
void dot(const T1 &x, const T1 &y, T2 &result) const
Definition: MultiComm.hpp:154
std::tuple_element< index, TupleType >::type & operator[](const std::integral_constant< size_type, index > indexVariable)
Definition: MultiComm.hpp:136
std::size_t size_type
Definition: MultiComm.hpp:127
void copyOwnerToAll(const T &x, T &y) const
Definition: MultiComm.hpp:177
const std::tuple_element< index, TupleType >::type & operator[](const std::integral_constant< size_type, index > indexVariable) const
Definition: MultiComm.hpp:142
decltype(auto) communicator() const
Definition: MultiComm.hpp:184
static constexpr size_type size()
Definition: MultiComm.hpp:129
void project(T &x) const
Definition: MultiComm.hpp:148
Definition: MultiComm.hpp:39
double norm(const T &x) const
Definition: MultiComm.hpp:57
static constexpr size_type size()
Definition: MultiComm.hpp:43
std::size_t size_type
Definition: MultiComm.hpp:41
void copyOwnerToAll(const T &x, T &y) const
Definition: MultiComm.hpp:62
auto communicator() const
Definition: MultiComm.hpp:67
void dot(const T1 &x, const T1 &y, T2 &result) const
Definition: MultiComm.hpp:52
void project(T &) const
Definition: MultiComm.hpp:48
Definition: fvbaseprimaryvariables.hh:161