Gridpp 0.4.2
A post-processing library for gridded weather forecasts
gridpp.h
Go to the documentation of this file.
1 #ifndef GRIDPP_API_H
2 #define GRIDPP_API_H
3 #include <vector>
4 #include <string>
5 #include <boost/geometry.hpp>
6 #include <boost/geometry/geometries/point.hpp>
7 #include <boost/geometry/geometries/box.hpp>
8 #include <boost/geometry/index/rtree.hpp>
9 #ifdef _OPENMP
10  #include <omp.h>
11 #endif
12 
13 #define GRIDPP_VERSION "0.4.2"
14 #define __version__ GRIDPP_VERSION
15 
16 // Preferred vector types
17 typedef std::vector<float> vec;
18 typedef std::vector<vec> vec2;
19 typedef std::vector<vec2> vec3;
20 typedef std::vector<int> ivec;
21 typedef std::vector<ivec> ivec2;
22 
23 // Only use when double is required
24 typedef std::vector<double> dvec;
25 typedef std::vector<dvec> dvec2;
26 
27 namespace gridpp {
28  // Constants
29  static const float MV = NAN;
30  static const float MV_CML = -999;
31  static const float pi = 3.14159265;
32  static double radius_earth = 6.37e6;
33 
34  class KDTree;
35  class Points;
36  class Grid;
37  class Nearest;
38  class StructureFunction;
39  class Transform;
40 
43  OneToOne = 0,
44  MeanSlope = 10,
45  NearestSlope = 20,
46  Zero = 30,
47  };
48 
50  enum Statistic {
51  Mean = 0,
52  Min = 10,
53  Median = 20,
54  Max = 30,
55  Quantile = 40,
56  Std = 50,
57  Variance = 60,
58  Sum = 70,
59  Unknown = -1
60  };
61 
63  Statistic get_statistic(std::string name);
64 
68  std::string version();
69 
70  /****************************************
71  * Data assimilation methods *
72  ****************************************/
73 
85  const vec2& background,
86  const gridpp::Points& points,
87  const vec& pobs,
88  const vec& pratios,
89  const vec& pbackground,
90  const gridpp::StructureFunction& structure,
91  int max_points);
92 
94  const vec2& background,
95  float bsigma,
96  const gridpp::Points& points,
97  const vec& pobs,
98  const vec& psigma,
99  const vec& pbackground,
100  const gridpp::StructureFunction& structure,
101  int max_points,
102  const gridpp::Transform& transform);
103 
113  const vec3& input,
114  const gridpp::Points& points,
115  const vec& pobs,
116  const vec& psigmas,
117  const vec2& pbackground,
118  const gridpp::StructureFunction& structure,
119  int max_points);
120 
121  /****************************************
122  * Neighbourhood methods *
123  ****************************************/
124 
130  vec2 neighbourhood(const vec2& input, int radius, Statistic statistic);
131 
137  vec2 neighbourhood_ens(const vec3& input, int radius, Statistic statistic);
138 
144  vec2 neighbourhood_quantile(const vec2& input, float quantile, int radius);
145 
151  vec2 neighbourhood_quantile_ens(const vec3& input, float quantile, int radius);
152 
159  vec2 neighbourhood_quantile_fast(const vec2& input, float quantile, int radius, const vec& thresholds);
160 
167  vec2 neighbourhood_quantile_ens_fast(const vec3& input, float quantile, int radius, const vec& thresholds);
168 
174  vec2 neighbourhood_brute_force(const vec2& input, int radius, Statistic statistic);
175 
180  vec get_neighbourhood_thresholds(const vec2& input, int num_thresholds);
181 
186  vec get_neighbourhood_thresholds(const vec3& input, int num_thresholds);
187 
188  /****************************************
189  * Calibration methods *
190  ****************************************/
198  vec2 quantile_mapping(const vec2& input, const vec& x, const vec& y, gridpp::Extrapolation policy);
199 
208  vec quantile_mapping(const vec& input, const vec& x, const vec& y, gridpp::Extrapolation policy);
209 
218  float quantile_mapping(float input, const vec& ref, const vec& fcst, gridpp::Extrapolation policy);
219 
226  vec2 fill(const Grid& igrid, const vec2& input, const Points& points, const vec& radii, float value, bool outside);
227 
228  /****************************************
229  * Downscaling methods *
230  ****************************************/
237  vec2 nearest(const Grid& igrid, const Grid& ogrid, const vec2 ivalues);
244  vec nearest(const Grid& igrid, const Points& opoints, const vec2 ivalues);
245  vec2 nearest(const Grid& igrid, const Points& opoints, const vec3 ivalues);
246 
253  vec2 bilinear(const Grid& igrid, const Grid& ogrid, const vec2 ivalues);
254 
261  vec bilinear(const Grid& igrid, const Points& opoints, const vec2 ivalues);
262 
263  vec2 simple_gradient(const Grid& igrid, const Grid& ogrid, const vec2 ivalues, float elev_gradient);
264  vec simple_gradient(const Grid& igrid, const Points& opoints, const vec2 ivalues, float elev_gradient);
265 
266  /****************************************
267  * Diagnosing methods *
268  ****************************************/
269 
275  float wind_speed(float xwind, float ywind);
276  vec wind_speed(const vec& xwind, const vec& ywind);
277  vec2 wind_speed(const vec2& xwind, const vec2& ywind);
278 
284  float dewpoint(float temperature, float relative_humidity);
285 
291  vec dewpoint(const vec& temperature, const vec& relative_humidity);
292 
298  float relative_humidity(float temperature, float dewpoint);
299 
306  float wetbulb(float temperature, float pressure, float relative_humidity);
307 
315  float pressure(float ielev, float oelev, float ipressure, float itemperature=288.15);
316 
322  float qnh(float pressure, float altitude);
323 
329  vec qnh(const vec& pressure, const vec& altitude);
330 
332  void set_omp_threads(int num);
333 
335  void initialize_omp();
336 
338  namespace util {
339  // vec2 calc_gradient(const vec2& values, const vec2& aux, int radius);
340  // ivec regression(const vec& x, const vec& y);
341  double clock();
342  void debug(std::string string);
343  void warning(std::string string);
344  void error(std::string string);
345  bool is_valid(float value);
346  float calc_statistic(const vec& array, Statistic statistic);
347  float calc_quantile(const vec& array, float quantile);
348  vec calc_statistic(const vec2& array, Statistic statistic);
349  vec calc_quantile(const vec2& array, float quantile=gridpp::MV);
350  int num_missing_values(const vec2& iArray);
351 
357  int get_lower_index(float iX, const std::vector<float>& iValues);
358 
364  int get_upper_index(float iX, const std::vector<float>& iValues);
365 
373  float interpolate(float x, const std::vector<float>& iX, const std::vector<float>& iY);
374  void not_implemented_error();
375 
377  vec2 init_vec2(int Y, int X, float value=gridpp::MV);
378 
385  vec calc_even_quantiles(const vec& values, int num);
386 
388  bool compatible_size(const Grid& grid, const vec2& v);
389  bool compatible_size(const Grid& grid, const vec3& v);
390 
392  float* test_array(float* v, int n);
394  float test_vec_input(const vec& input);
396  int test_ivec_input(const ivec& input);
398  float test_vec2_input(const vec2& input);
400  float test_vec3_input(const vec3& input);
407 
411  }
412 
413  class Point {
414  public:
415  Point(float lat, float lon, float elev=gridpp::MV, float laf=gridpp::MV);
416  float lat;
417  float lon;
418  float elev;
419  float laf;
420  };
423  public:
424  StructureFunction(float localization_distance);
426  virtual float corr(const Point& p1, const Point& p2) const = 0;
430  float localization_distance() const;
431  virtual StructureFunction* clone() const = 0;
432  protected:
433  float barnes_rho(float dist, float length) const;
434  float cressman_rho(float dist, float length) const;
436  };
439  public:
440  BarnesStructure(float h, float v=0, float w=0, float hmax=gridpp::MV);
441  float corr(const Point& p1, const Point& p2) const;
442  StructureFunction* clone() const;
443  private:
444  float mH;
445  float mV;
446  float mW;
447  };
448 
451  public:
452  CressmanStructure(float h, float v=0, float w=0);
453  float corr(const Point& p1, const Point& p2) const;
454  StructureFunction* clone() const;
455  private:
456  float mH;
457  float mV;
458  float mW;
459  };
461  public:
462  CrossValidation(StructureFunction& structure, float dist=0);
463  float corr(const Point& p1, const Point& p2) const;
464  StructureFunction* clone() const;
465  private:
466  StructureFunction* m_structure;
467  float m_dist;
468  };
469 
470  class Transform {
471  public:
472  virtual float forward(float value) const = 0;
473  virtual float backward(float value) const = 0;
474  virtual vec2 forward(const vec2& input) const;
475  virtual vec2 backward(const vec2& input) const;
476  };
477  class Identity : public Transform {
478  public:
479  float forward(float value) const;
480  float backward(float value) const;
481  };
482  class Log : public Transform {
483  public:
484  float forward(float value) const;
485  float backward(float value) const;
486  };
487  class BoxCox : public Transform {
488  public:
489  BoxCox(float threshold);
490  float forward(float value) const;
491  float backward(float value) const;
492  private:
493  float mThreshold;
494  };
495 
497  class KDTree {
498  public:
499  KDTree(vec lats, vec lons);
500  KDTree& operator=(KDTree other);
501  KDTree(const KDTree& other);
502  KDTree() {};
503 
508  int get_nearest_neighbour(float lat, float lon) const;
509 
515  ivec get_neighbours(float lat, float lon, float radius) const;
516 
523  ivec get_neighbours_with_distance(float lat, float lon, float radius, vec& distances) const;
524 
530  int get_num_neighbours(float lat, float lon, float radius) const;
531 
537  ivec get_closest_neighbours(float lat, float lon, int num) const;
538 
539 
547  static bool convert_coordinates(const vec& lats, const vec& lons, vec& x_coords, vec& y_coords, vec& z_coords);
548 
556  static bool convert_coordinates(float lat, float lon, float& x_coord, float& y_coord, float& z_coord);
557  static float deg2rad(float deg);
558  static float rad2deg(float deg);
559  static float calc_distance(float lat1, float lon1, float lat2, float lon2);
560  static float calc_distance(float x0, float y0, float z0, float x1, float y1, float z1);
561  static float calc_distance_fast(float lat1, float lon1, float lat2, float lon2);
562  vec get_lats() const;
563  vec get_lons() const;
564  int size() const;
565  protected:
566  typedef boost::geometry::model::point<float, 3, boost::geometry::cs::cartesian> point;
567  typedef std::pair<point, unsigned> value;
568  typedef boost::geometry::model::box<point> box;
569  boost::geometry::index::rtree< value, boost::geometry::index::quadratic<16> > mTree;
572  };
573 
575  class Points {
576  public:
577  Points();
578  Points(vec lats, vec lons, vec elevs=vec(), vec lafs=vec());
579  Points& operator=(Points other);
580  Points(const Points& other);
581  int get_nearest_neighbour(float lat, float lon) const;
582  ivec get_neighbours(float lat, float lon, float radius) const;
583  ivec get_neighbours_with_distance(float lat, float lon, float radius, vec& distances) const;
584  int get_num_neighbours(float lat, float lon, float radius) const;
585  ivec get_closest_neighbours(float lat, float lon, int num) const;
586 
587  vec get_lats() const;
588  vec get_lons() const;
589  vec get_elevs() const;
590  vec get_lafs() const;
591  int size() const;
592  ivec get_in_domain_indices(const Grid& grid) const;
593  Points get_in_domain(const Grid& grid) const;
594  private:
595  KDTree mTree;
596  vec mLats;
597  vec mLons;
598  vec mElevs;
599  vec mLafs;
600  };
601 
603  class Grid {
604  public:
605  Grid();
606  Grid(vec2 lats, vec2 lons, vec2 elevs=vec2(), vec2 lafs=vec2());
607  ivec get_nearest_neighbour(float lat, float lon) const;
608  ivec2 get_neighbours(float lat, float lon, float radius) const;
609  ivec2 get_neighbours_with_distance(float lat, float lon, float radius, vec& distances) const;
610  int get_num_neighbours(float lat, float lon, float radius) const;
611  ivec2 get_closest_neighbours(float lat, float lon, int num) const;
612 
613  vec2 get_lats() const;
614  vec2 get_lons() const;
615  vec2 get_elevs() const;
616  vec2 get_lafs() const;
617  ivec size() const;
618  private:
619  KDTree mTree;
620  int mX;
621  vec2 get_2d(vec input) const;
622  ivec get_indices(int index) const;
623  ivec2 get_indices(ivec indices) const;
624  vec2 mLats;
625  vec2 mLons;
626  vec2 mElevs;
627  vec2 mLafs;
628  };
629 };
630 #endif
int test_ivec_input(const ivec &input)
Testing function for 1D input vector.
Definition: util.cpp:315
std::string version()
The gridpp version.
Definition: gridpp.cpp:6
vec2 neighbourhood_quantile_ens_fast(const vec3 &input, float quantile, int radius, const vec &thresholds)
Approximate neighbourhood filter space and across members for quantile operation. ...
Definition: neighbourhood.cpp:371
float laf
Definition: gridpp.h:419
static const float MV_CML
Definition: gridpp.h:30
Helper class for Grid and Points.
Definition: gridpp.h:497
Minimum of values.
Definition: gridpp.h:52
float dewpoint(float temperature, float relative_humidity)
Calculate dewpoint temperature from temperature and relative humidity.
Definition: humidity.cpp:3
Maximum of values.
Definition: gridpp.h:54
vec2 optimal_interpolation_transform(const gridpp::Grid &bgrid, const vec2 &background, float bsigma, const gridpp::Points &points, const vec &pobs, const vec &psigma, const vec &pbackground, const gridpp::StructureFunction &structure, int max_points, const gridpp::Transform &transform)
Definition: oi.cpp:193
ivec2 test_ivec2_output()
Definition: util.cpp:365
float wind_speed(float xwind, float ywind)
Diagnose wind speed from its components.
Definition: wind.cpp:4
Definition: gridpp.h:477
ivec test_ivec_output()
Testing function for 1D output vector.
Definition: util.cpp:361
vec2 optimal_interpolation(const gridpp::Grid &bgrid, const vec2 &background, const gridpp::Points &points, const vec &pobs, const vec &pratios, const vec &pbackground, const gridpp::StructureFunction &structure, int max_points)
Optimal interpolation for a deterministic field.
Definition: oi.cpp:24
Unknown statistic.
Definition: gridpp.h:59
vec2 init_vec2(int Y, int X, float value=gridpp::MV)
Initialize a vector of size Y, X, with a given value.
Definition: util.cpp:297
std::vector< dvec > dvec2
Definition: gridpp.h:25
Simple structure function based on distance, elevation, and land area fraction.
Definition: gridpp.h:438
Definition: gridpp.h:460
Extrapolation
Methods for extrapolating outside a curve.
Definition: gridpp.h:42
static double radius_earth
Definition: gridpp.h:32
Population variance of values.
Definition: gridpp.h:57
void set_omp_threads(int num)
Set the number of OpenMP threads to use.
Definition: gridpp.cpp:49
float relative_humidity(float temperature, float dewpoint)
Calculate relative humidity from temperature and dewpoint temperature.
Definition: humidity.cpp:30
vec2 nearest(const Grid &igrid, const Grid &ogrid, const vec2 ivalues)
Nearest neighbour dowscaling grid to grid.
Definition: nearest.cpp:4
Statistic get_statistic(std::string name)
Convert name of a statistic enum.
Definition: gridpp.cpp:9
boost::geometry::model::point< float, 3, boost::geometry::cs::cartesian > point
Definition: gridpp.h:566
vec2 fill(const Grid &igrid, const vec2 &input, const Points &points, const vec &radii, float value, bool outside)
Fill in values inside or outside a set of circles.
Definition: fill.cpp:3
float calc_statistic(const vec &array, Statistic statistic)
Definition: util.cpp:21
Represents a vector of locations and their metadata.
Definition: gridpp.h:575
std::pair< point, unsigned > value
Definition: gridpp.h:567
Definition: gridpp.h:470
void not_implemented_error()
Definition: util.cpp:288
vec2 simple_gradient(const Grid &igrid, const Grid &ogrid, const vec2 ivalues, float elev_gradient)
Definition: simple_gradient.cpp:22
vec2 bilinear(const Grid &igrid, const Grid &ogrid, const vec2 ivalues)
Bilinear downscaling grid to grid.
Definition: bilinear.cpp:10
Represents a 2D grid of locations and their metadata.
Definition: gridpp.h:603
Simple structure function based on distance, elevation, and land area fraction.
Definition: gridpp.h:450
Covariance structure function.
Definition: gridpp.h:422
Continue past the end-points using the mean slope of the curve.
Definition: gridpp.h:44
void initialize_omp()
Sets the number of OpenMP threads to 1 if OMP_NUM_THREADS undefined.
Definition: gridpp.cpp:37
int get_lower_index(float iX, const std::vector< float > &iValues)
Find the index in a vector that is equal or just below a value.
Definition: util.cpp:222
Continue past the end-points using the slope of the two lowermost or uppermost points in the curve...
Definition: gridpp.h:45
vec2 quantile_mapping(const vec2 &input, const vec &x, const vec &y, gridpp::Extrapolation policy)
Quantile mapping of 2D grid using a constant quantile map.
Definition: quantile_mapping.cpp:7
boost::geometry::model::box< point > box
Definition: gridpp.h:568
float test_vec_input(const vec &input)
Testing function for 1D input vector.
Definition: util.cpp:309
vec2 neighbourhood_quantile_fast(const vec2 &input, float quantile, int radius, const vec &thresholds)
Approximate spatial neighbourhood filter for quantile operation.
Definition: neighbourhood.cpp:291
vec2 neighbourhood_brute_force(const vec2 &input, int radius, Statistic statistic)
Spatial neighbourhood filter without any shortcuts.
Definition: neighbourhood.cpp:456
bool compatible_size(const Grid &grid, const vec2 &v)
Check if the grid is the same size as the 2D vector.
Definition: util.cpp:291
std::vector< int > ivec
Definition: gridpp.h:20
vec mLats
Definition: gridpp.h:570
float wetbulb(float temperature, float pressure, float relative_humidity)
Calculate wetbulb temperature from temperature, pressure, and relative humidity.
Definition: humidity.cpp:77
float lon
Definition: gridpp.h:417
Mean of values.
Definition: gridpp.h:53
vec2 neighbourhood_quantile_ens(const vec3 &input, float quantile, int radius)
Neighbourhood filter in space and across ensemble members.
Definition: neighbourhood.cpp:462
Statistic
Statistical operations to reduce a vector to a scalar.
Definition: gridpp.h:50
void debug(std::string string)
Definition: util.cpp:147
vec mLons
Definition: gridpp.h:571
Definition: gridpp.h:27
A quantile from values.
Definition: gridpp.h:55
float elev
Definition: gridpp.h:418
vec3 optimal_interpolation_ensi(const gridpp::Grid &bgrid, const vec3 &input, const gridpp::Points &points, const vec &pobs, const vec &psigmas, const vec2 &pbackground, const gridpp::StructureFunction &structure, int max_points)
Optimal interpolation using a structure function based on an ensemble See Lussana et al 2019 (DOI: 10...
Definition: oi_ensi.cpp:31
vec2 neighbourhood_ens(const vec3 &input, int radius, Statistic statistic)
Neighbourhood filter in space and across ensemble members.
Definition: neighbourhood.cpp:10
static const float pi
Definition: gridpp.h:31
int num_missing_values(const vec2 &iArray)
Definition: util.cpp:138
std::vector< double > dvec
Definition: gridpp.h:24
std::vector< vec2 > vec3
Definition: gridpp.h:19
KDTree()
Definition: gridpp.h:502
vec2 neighbourhood(const vec2 &input, int radius, Statistic statistic)
Spatial neighbourhood filter.
Definition: neighbourhood.cpp:26
float qnh(float pressure, float altitude)
Diagnose QNH from pressure and altitude.
Definition: qnh.cpp:3
float calc_quantile(const vec &array, float quantile)
Definition: util.cpp:89
vec2 test_vec2_output()
Testing function for 2D output vector.
Definition: util.cpp:345
Standard deviation of values.
Definition: gridpp.h:56
static const float MV
Definition: gridpp.h:29
vec test_vec_output()
Testing function for 1D output vector.
Definition: util.cpp:341
std::vector< vec > vec2
Definition: gridpp.h:18
vec get_neighbourhood_thresholds(const vec2 &input, int num_thresholds)
Calculate appropriate approximation thresholds for neighbourhood quantile.
Definition: neighbourhood.cpp:238
float pressure(float ielev, float oelev, float ipressure, float itemperature=288.15)
Calculate pressure at a new elevation.
Definition: pressure.cpp:2
float interpolate(float x, const std::vector< float > &iX, const std::vector< float > &iY)
Piecewise linear interpolation.o If x is outside the range of iX, then the min/max value of iY is use...
Definition: util.cpp:260
void warning(std::string string)
Definition: util.cpp:151
vec calc_even_quantiles(const vec &values, int num)
Get reasonably spaced quantiles from a vector of values, ignoring duplicate values but including the ...
Definition: util.cpp:175
boost::geometry::index::rtree< value, boost::geometry::index::quadratic< 16 > > mTree
Definition: gridpp.h:569
Definition: gridpp.h:413
Mean of values.
Definition: gridpp.h:51
bool is_valid(float value)
Definition: util.cpp:18
vec2 neighbourhood_quantile(const vec2 &input, float quantile, int radius)
Spatial neighbourhood filter.
Definition: neighbourhood.cpp:459
float mLocalizationDistance
Definition: gridpp.h:435
std::vector< ivec > ivec2
Definition: gridpp.h:21
float test_vec3_input(const vec3 &input)
Testing function for 3D input vector.
Definition: util.cpp:330
int get_upper_index(float iX, const std::vector< float > &iValues)
Find the index in a vector that is equal or just above a value.
Definition: util.cpp:241
Continue past the end-points using a slope of 0.
Definition: gridpp.h:46
std::vector< float > vec
Definition: gridpp.h:17
Continue past the end-points using a slope of 1.
Definition: gridpp.h:43
float lat
Definition: gridpp.h:416
float * test_array(float *v, int n)
Special function whose presense is needed for SWIG.
Definition: util.cpp:303
vec3 test_vec3_output()
Testing function for 3D output vector.
Definition: util.cpp:351
Sum of values.
Definition: gridpp.h:58
Definition: gridpp.h:482
double clock()
Definition: util.cpp:168
Definition: gridpp.h:487
void error(std::string string)
Definition: util.cpp:155
float test_vec2_input(const vec2 &input)
Testing function for 2D input vector.
Definition: util.cpp:321