openCARP
Doxygen code documentation for the open cardiac electrophysiology simulator openCARP
mpi_utils.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) NumeriCor GmbH
2 // SPDX-License-Identifier: Apache-2.0
3 
4 #ifndef _OPENCARP_MPI_UTILS_H
5 #define _OPENCARP_MPI_UTILS_H
6 
7 #include <cassert>
8 #include <cstdint>
9 #include <limits>
10 #include <type_traits>
11 
12 #include <mpi.h>
13 
14 namespace opencarp {
15 
16 namespace detail {
17 template<typename>
18 struct always_false : std::false_type {};
19 }
20 
21 template<typename T> inline
22 MPI_Datatype mpi_datatype()
23 {
24  using value_t = std::remove_cv_t<T>;
25 
26  if constexpr (std::is_same_v<value_t, char>) {
27  return MPI_CHAR;
28  }
29 #ifdef MPI_INT8_T
30  else if constexpr (std::is_same_v<value_t, std::int8_t>) {
31  return MPI_INT8_T;
32  }
33 #endif
34 #ifdef MPI_UINT8_T
35  else if constexpr (std::is_same_v<value_t, std::uint8_t>) {
36  return MPI_UINT8_T;
37  }
38 #endif
39 #ifdef MPI_INT16_T
40  else if constexpr (std::is_same_v<value_t, std::int16_t>) {
41  return MPI_INT16_T;
42  }
43 #endif
44 #ifdef MPI_UINT16_T
45  else if constexpr (std::is_same_v<value_t, std::uint16_t>) {
46  return MPI_UINT16_T;
47  }
48 #endif
49 #ifdef MPI_INT32_T
50  else if constexpr (std::is_same_v<value_t, std::int32_t>) {
51  return MPI_INT32_T;
52  }
53 #endif
54 #ifdef MPI_UINT32_T
55  else if constexpr (std::is_same_v<value_t, std::uint32_t>) {
56  return MPI_UINT32_T;
57  }
58 #endif
59 #ifdef MPI_INT64_T
60  else if constexpr (std::is_same_v<value_t, std::int64_t>) {
61  return MPI_INT64_T;
62  }
63 #endif
64 #ifdef MPI_UINT64_T
65  else if constexpr (std::is_same_v<value_t, std::uint64_t>) {
66  return MPI_UINT64_T;
67  }
68 #endif
69  else if constexpr (std::is_same_v<value_t, signed char>) {
70  return MPI_SIGNED_CHAR;
71  }
72  else if constexpr (std::is_same_v<value_t, unsigned char>) {
73  return MPI_UNSIGNED_CHAR;
74  }
75  else if constexpr (std::is_same_v<value_t, short>) {
76  return MPI_SHORT;
77  }
78  else if constexpr (std::is_same_v<value_t, unsigned short>) {
79  return MPI_UNSIGNED_SHORT;
80  }
81  else if constexpr (std::is_same_v<value_t, int>) {
82  return MPI_INT;
83  }
84  else if constexpr (std::is_same_v<value_t, unsigned int>) {
85  return MPI_UNSIGNED;
86  }
87  else if constexpr (std::is_same_v<value_t, long>) {
88  return MPI_LONG;
89  }
90  else if constexpr (std::is_same_v<value_t, unsigned long>) {
91  return MPI_UNSIGNED_LONG;
92  }
93  else if constexpr (std::is_same_v<value_t, long long>) {
94  return MPI_LONG_LONG;
95  }
96  else if constexpr (std::is_same_v<value_t, unsigned long long>) {
97  return MPI_UNSIGNED_LONG_LONG;
98  }
99  else if constexpr (std::is_same_v<value_t, float>) {
100  return MPI_FLOAT;
101  }
102  else if constexpr (std::is_same_v<value_t, double>) {
103  return MPI_DOUBLE;
104  }
105  else if constexpr (std::is_same_v<value_t, long double>) {
106  return MPI_LONG_DOUBLE;
107  }
108  else {
110  "Unsupported MPI datatype");
111  }
112 }
113 
114 template<typename T> inline
115 std::intmax_t printable_int(T value)
116 {
117  static_assert(std::is_integral_v<T>, "printable_int requires an integral type");
118 
119  if constexpr (std::is_signed_v<T>) {
120  return static_cast<std::intmax_t>(value);
121  } else {
122  assert(value <= static_cast<T>(std::numeric_limits<std::intmax_t>::max()));
123  return static_cast<std::intmax_t>(value);
124  }
125 }
126 
127 template<typename T> inline
128 std::uintmax_t printable_uint(T value)
129 {
130  static_assert(std::is_integral_v<T>, "printable_uint requires an integral type");
131  return static_cast<std::uintmax_t>(value);
132 }
133 
134 } // namespace opencarp
135 
136 #endif
constexpr T max(T a, T b)
Definition: ion_type.h:16
std::intmax_t printable_int(T value)
Definition: mpi_utils.h:115
MPI_Datatype mpi_datatype()
Definition: mpi_utils.h:22
std::uintmax_t printable_uint(T value)
Definition: mpi_utils.h:128