tpism_utilities.hh - pism - [fork] customized build of PISM, the parallel ice sheet model (tillflux branch)
HTML git clone git://src.adamsgaard.dk/pism
DIR Log
DIR Files
DIR Refs
DIR LICENSE
---
tpism_utilities.hh (3795B)
---
1 /* Copyright (C) 2016, 2017, 2018, 2019 PISM Authors
2 *
3 * This file is part of PISM.
4 *
5 * PISM is free software; you can redistribute it and/or modify it under the
6 * terms of the GNU General Public License as published by the Free Software
7 * Foundation; either version 3 of the License, or (at your option) any later
8 * version.
9 *
10 * PISM is distributed in the hope that it will be useful, but WITHOUT ANY
11 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13 * details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with PISM; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20 #ifndef _PISM_UTILITIES_H_
21 #define _PISM_UTILITIES_H_
22
23 #include <cstdint> // uint16_t, uint32_t
24
25 #include <algorithm> // std::min, std::max
26 #include <string>
27 #include <vector>
28 #include <set>
29
30 #include <mpi.h>
31
32 namespace pism {
33
34 // Utilities that do not expose PETSc's or PISM's API.
35
36 #ifndef __GNUC__
37 # define __attribute__(x) /* nothing */
38 #endif
39
40 double get_time();
41 std::string timestamp(MPI_Comm com);
42 std::string username_prefix(MPI_Comm com);
43 std::string args_string();
44 std::string filename_add_suffix(const std::string &filename,
45 const std::string &separator,
46 const std::string &suffix);
47
48 double wall_clock_hours(MPI_Comm com, double start_time);
49
50
51 // array
52 bool is_increasing(const std::vector<double> &a);
53
54 // string
55 bool ends_with(const std::string &str, const std::string &suffix);
56
57 std::string join(const std::vector<std::string> &strings, const std::string &separator);
58
59 std::vector<std::string> split(const std::string &input, char separator);
60
61 std::set<std::string> set_split(const std::string &input, char separator);
62
63 std::string set_join(const std::set<std::string> &input, const std::string& separator);
64
65 // set
66 bool member(const std::string &string, const std::set<std::string> &set);
67
68 /*! Helper template function for computing set unions.
69 * Ensures that elements of a take precedence. For example, if
70 *
71 * a = {{1, 2}, {3, 4}}
72 * b = {{1, 4}, {5, 6}}
73 *
74 * combine(a, b) will use the pair {1, 2} from a, not {1, 4} from b.
75 *
76 * This behavior relies on the fact that std::map::insert({a, b}) is a no-op if a key equivalent to
77 * a is already present.
78 *
79 * This is similar to a set union, but it is not symmetric. (I would expect set_union(a, b) to be
80 * the same as set_union(b, a)).
81 */
82 template<typename T>
83 T combine(const T &a, const T&b) {
84 T result = a;
85 for (const auto &element : b) {
86 result.insert(element);
87 }
88 return result;
89 }
90
91 inline double clip(double x, double a, double b) {
92 return std::min(std::max(a, x), b);
93 }
94
95 double vector_min(const std::vector<double> &input);
96
97 double vector_max(const std::vector<double> &input);
98
99 // parallel
100 void GlobalReduce(MPI_Comm comm, double *local, double *result, int count, MPI_Op op);
101
102 void GlobalMin(MPI_Comm comm, double *local, double *result, int count);
103
104 void GlobalMax(MPI_Comm comm, double *local, double *result, int count);
105
106 void GlobalSum(MPI_Comm comm, double *local, double *result, int count);
107
108 double GlobalMin(MPI_Comm comm, double local);
109
110 double GlobalMax(MPI_Comm comm, double local);
111
112 double GlobalSum(MPI_Comm comm, double local);
113
114 unsigned int GlobalSum(MPI_Comm comm, unsigned int input);
115
116 int GlobalSum(MPI_Comm comm, int input);
117
118 std::string version();
119
120 std::string printf(const char *format, ...) __attribute__((format(printf, 1, 2)));
121
122 void validate_format_string(const std::string &format);
123
124 uint64_t fletcher64(const uint32_t *data, size_t len);
125
126 } // end of namespace pism
127
128
129 #endif /* _PISM_UTILITIES_H_ */