16 #ifndef dealii_utilities_h 17 #define dealii_utilities_h 19 #include <deal.II/base/config.h> 21 #include <deal.II/base/exceptions.h> 26 #include <type_traits> 30 #ifdef DEAL_II_WITH_TRILINOS 31 # include <Epetra_Comm.h> 32 # include <Epetra_Map.h> 33 # ifdef DEAL_II_WITH_MPI 34 # include <Epetra_MpiComm.h> 36 # include <Epetra_SerialComm.h> 40 #include <boost/archive/binary_iarchive.hpp> 41 #include <boost/archive/binary_oarchive.hpp> 42 #include <boost/serialization/array.hpp> 43 #include <boost/serialization/complex.hpp> 44 #include <boost/serialization/vector.hpp> 46 #ifdef DEAL_II_WITH_ZLIB 47 # include <boost/iostreams/device/back_inserter.hpp> 48 # include <boost/iostreams/filter/gzip.hpp> 49 # include <boost/iostreams/filtering_stream.hpp> 50 # include <boost/iostreams/stream.hpp> 53 DEAL_II_NAMESPACE_OPEN
105 template <
typename number>
136 dim_string(
const int dim,
const int spacedim);
203 std::vector<std::string>
211 std::vector<std::string>
224 std::vector<std::string>
226 const unsigned int width,
227 const char delimiter =
' ');
244 std::pair<int, unsigned int>
253 const std::string &from,
254 const std::string &to);
262 trim(
const std::string &input);
301 template <
int N,
typename T>
329 template <
int a,
int N>
345 static const int value = 1;
352 constexpr
unsigned int 353 pow(
const unsigned int base,
const unsigned int iexp)
355 return iexp == 0 ? 1 : base * ::Utilities::pow(base, iexp - 1);
379 template <
typename Iterator,
typename T>
381 lower_bound(Iterator first, Iterator last,
const T &val);
389 template <
typename Iterator,
typename T,
typename Comp>
391 lower_bound(Iterator first, Iterator last,
const T &val,
const Comp comp);
398 std::vector<unsigned int>
406 std::vector<unsigned int>
414 std::vector<unsigned long long int>
422 std::vector<unsigned long long int>
442 template <
typename T>
444 pack(
const T &
object,
445 std::vector<char> &dest_buffer,
446 const bool allow_compression =
true);
458 template <
typename T>
460 pack(
const T &
object,
const bool allow_compression =
true);
494 template <
typename T>
496 unpack(
const std::vector<char> &buffer,
const bool allow_compression =
true);
508 template <
typename T>
510 unpack(
const std::vector<char>::const_iterator &cbegin,
511 const std::vector<char>::const_iterator &cend,
512 const bool allow_compression =
true);
548 template <
typename T,
int N>
550 unpack(
const std::vector<char> &buffer,
551 T (&unpacked_object)[N],
552 const bool allow_compression =
true);
564 template <
typename T,
int N>
566 unpack(
const std::vector<char>::const_iterator &cbegin,
567 const std::vector<char>::const_iterator &cend,
568 T (&unpacked_object)[N],
569 const bool allow_compression =
true);
628 template <
typename To,
typename From>
635 if (To *cast = dynamic_cast<To *>(p.get()))
637 std::unique_ptr<To> result(cast);
642 throw std::bad_cast();
774 #ifdef DEAL_II_WITH_TRILINOS 839 duplicate_communicator(
const Epetra_Comm &communicator);
897 duplicate_map(
const Epetra_BlockMap &map,
const Epetra_Comm &comm);
910 template <
int N,
typename T>
918 return ::internal::NumberType<T>::value(1);
926 return n * n * n * n;
929 for (
int d = 1; d < N; ++d)
937 template <
typename Iterator,
typename T>
946 template <
typename Iterator,
typename T,
typename Comp>
948 lower_bound(Iterator first, Iterator last,
const T &val,
const Comp comp)
955 "The given iterators do not satisfy the proper ordering."));
957 unsigned int len =
static_cast<unsigned int>(last - first);
974 if (!comp(*first, val))
979 if (!comp(*first, val))
984 if (!comp(*first, val))
989 if (!comp(*first, val))
994 if (!comp(*first, val))
999 if (!comp(*first, val))
1002 DEAL_II_FALLTHROUGH;
1004 if (!comp(*first, val))
1023 const unsigned int half = len >> 1;
1024 const Iterator middle = first + half;
1031 if (comp(*middle, val))
1044 template <
typename T>
1047 std::vector<char> &dest_buffer,
1048 const bool allow_compression)
1051 (void)allow_compression;
1060 #if __GNUG__ && __GNUC__ < 5 1061 if (__has_trivial_copy(T) &&
sizeof(T) < 256)
1063 # ifdef DEAL_II_WITH_CXX17 1064 if constexpr (std::is_trivially_copyable<T>() &&
sizeof(T) < 256)
1066 if (std::is_trivially_copyable<T>() &&
sizeof(T) < 256)
1070 const size_t previous_size = dest_buffer.size();
1071 dest_buffer.resize(previous_size +
sizeof(T));
1073 std::memcpy(dest_buffer.data() + previous_size, &object,
sizeof(T));
1081 const size_t previous_size = dest_buffer.size();
1082 #ifdef DEAL_II_WITH_ZLIB 1083 if (allow_compression)
1085 boost::iostreams::filtering_ostream out;
1087 boost::iostreams::gzip_compressor(boost::iostreams::gzip_params(
1088 boost::iostreams::gzip::best_compression)));
1089 out.push(boost::iostreams::back_inserter(dest_buffer));
1091 boost::archive::binary_oarchive archive(out);
1098 std::ostringstream out;
1099 boost::archive::binary_oarchive archive(out);
1102 const std::string &s = out.str();
1103 dest_buffer.reserve(dest_buffer.size() + s.size());
1104 std::move(s.begin(), s.end(), std::back_inserter(dest_buffer));
1107 return (dest_buffer.size() - previous_size);
1112 template <
typename T>
1114 pack(
const T &
object,
const bool allow_compression)
1116 std::vector<char> buffer;
1117 pack<T>(object, buffer, allow_compression);
1122 template <
typename T>
1124 unpack(
const std::vector<char>::const_iterator &cbegin,
1125 const std::vector<char>::const_iterator &cend,
1126 const bool allow_compression)
1129 (void)allow_compression;
1138 #if __GNUG__ && __GNUC__ < 5 1139 if (__has_trivial_copy(T) &&
sizeof(T) < 256)
1141 # ifdef DEAL_II_WITH_CXX17 1142 if constexpr (std::is_trivially_copyable<T>() &&
sizeof(T) < 256)
1144 if (std::is_trivially_copyable<T>() &&
sizeof(T) < 256)
1150 std::memcpy(&
object, &*cbegin,
sizeof(T));
1155 std::string decompressed_buffer;
1159 #ifdef DEAL_II_WITH_ZLIB 1160 if (allow_compression)
1162 boost::iostreams::filtering_ostream decompressing_stream;
1163 decompressing_stream.push(boost::iostreams::gzip_decompressor());
1164 decompressing_stream.push(
1165 boost::iostreams::back_inserter(decompressed_buffer));
1166 decompressing_stream.write(&*cbegin, std::distance(cbegin, cend));
1171 decompressed_buffer.assign(cbegin, cend);
1175 std::istringstream in(decompressed_buffer);
1176 boost::archive::binary_iarchive archive(in);
1184 template <
typename T>
1186 unpack(
const std::vector<char> &buffer,
const bool allow_compression)
1188 return unpack<T>(buffer.cbegin(), buffer.cend(), allow_compression);
1192 template <
typename T,
int N>
1194 unpack(
const std::vector<char>::const_iterator &cbegin,
1195 const std::vector<char>::const_iterator &cend,
1196 T (&unpacked_object)[N],
1197 const bool allow_compression)
1207 #
if __GNUG__ && __GNUC__ < 5
1208 __has_trivial_copy(T)
1210 std::is_trivially_copyable<T>()
1212 &&
sizeof(T) * N < 256)
1214 Assert(std::distance(cbegin, cend) ==
sizeof(T) * N,
1216 std::memcpy(unpacked_object, &*cbegin,
sizeof(T) * N);
1220 std::string decompressed_buffer;
1223 (void)allow_compression;
1224 #ifdef DEAL_II_WITH_ZLIB 1225 if (allow_compression)
1227 boost::iostreams::filtering_ostream decompressing_stream;
1228 decompressing_stream.push(boost::iostreams::gzip_decompressor());
1229 decompressing_stream.push(
1230 boost::iostreams::back_inserter(decompressed_buffer));
1231 decompressing_stream.write(&*cbegin, std::distance(cbegin, cend));
1236 decompressed_buffer.assign(cbegin, cend);
1240 std::istringstream in(decompressed_buffer);
1241 boost::archive::binary_iarchive archive(in);
1243 archive >> unpacked_object;
1248 template <
typename T,
int N>
1251 T (&unpacked_object)[N],
1252 const bool allow_compression)
1254 unpack<T, N>(buffer.cbegin(),
1263 DEAL_II_NAMESPACE_CLOSE
1268 namespace serialization
1275 template <
class Archive,
typename... Args>
1277 serialize(Archive &ar, std::tuple<Args...> &t,
const unsigned int version)
1279 ar &std::get<N - 1>(t);
1280 Serialize<N - 1>::serialize(ar, t, version);
1287 template <
class Archive,
typename... Args>
1289 serialize(Archive &ar, std::tuple<Args...> &t,
const unsigned int version)
1297 template <
class Archive,
typename... Args>
1299 serialize(Archive &ar, std::tuple<Args...> &t,
const unsigned int version)
1301 Serialize<
sizeof...(Args)>::serialize(ar, t, version);
Iterator lower_bound(Iterator first, Iterator last, const T &val)
std::vector< std::string > split_string_list(const std::string &s, const std::string &delimiter=",")
static const unsigned int invalid_unsigned_int
constexpr unsigned int pow(const unsigned int base, const unsigned int iexp)
std::string dealii_version_string()
unsigned int get_n_mpi_processes(const Epetra_Comm &mpi_communicator)
std::string trim(const std::string &input)
std::pair< int, unsigned int > get_integer_at_position(const std::string &name, const unsigned int position)
const Epetra_Comm & comm_self()
std::string to_string(const number value, const unsigned int digits=numbers::invalid_unsigned_int)
void get_memory_stats(MemoryStats &stats)
std::unique_ptr< To > dynamic_unique_cast(std::unique_ptr< From > &&p)
double string_to_double(const std::string &s)
static::ExceptionBase & ExcMessage(std::string arg1)
double generate_normal_random_number(const double a, const double sigma)
#define Assert(cond, exc)
bool match_at_string_start(const std::string &name, const std::string &pattern)
void posix_memalign(void **memptr, size_t alignment, size_t size)
std::vector< unsigned int > invert_permutation(const std::vector< unsigned int > &permutation)
std::string int_to_string(const unsigned int value, const unsigned int digits=numbers::invalid_unsigned_int)
size_t pack(const T &object, std::vector< char > &dest_buffer, const bool allow_compression=true)
std::string replace_in_string(const std::string &input, const std::string &from, const std::string &to)
std::string dim_string(const int dim, const int spacedim)
void destroy_communicator(Epetra_Comm &communicator)
std::vector< std::string > break_text_into_lines(const std::string &original_text, const unsigned int width, const char delimiter= ' ')
std::string get_hostname()
const Epetra_Comm & comm_world()
T unpack(const std::vector< char > &buffer, const bool allow_compression=true)
int string_to_int(const std::string &s)
std::vector< unsigned int > reverse_permutation(const std::vector< unsigned int > &permutation)
static::ExceptionBase & ExcNotImplemented()
unsigned int get_this_mpi_process(const Epetra_Comm &mpi_communicator)
const std::string get_current_vectorization_level()
Epetra_Map duplicate_map(const Epetra_BlockMap &map, const Epetra_Comm &comm)
unsigned int needed_digits(const unsigned int max_number)
static::ExceptionBase & ExcInternalError()