UFO
GeodesicDistanceCalculator.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2019 Met Office UK
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  */
7 
8 #ifndef UFO_UTILS_GEODESICDISTANCECALCULATOR_H_
9 #define UFO_UTILS_GEODESICDISTANCECALCULATOR_H_
10 
11 #include <cmath>
12 
13 #include "ufo/utils/Constants.h"
15 
16 namespace ufo
17 {
18 
19 /// A DistanceCalculator implementing the distance function that maps each pair of points to
20 /// the shortest path on a spherical Earth connecting these points. (All coordinates except
21 /// the latitude and longitude are ignored.)
23  public:
24  float spatialDistanceComponent(float obsLatitude, float obsLongitude,
25  float latitudeBinCenter, float longitudeBinCenter,
26  float /*inverseLatitudeBinWidth*/,
27  float /*inverseLongitudeBinWidth*/) const override {
28  const float deg2rad = static_cast<float>(Constants::deg2rad);
29  const float re = static_cast<float>(Constants::mean_earth_rad); // km
30 
31  float q1 = std::cos((obsLongitude - longitudeBinCenter) * deg2rad);
32  float q2 = std::cos((obsLatitude - latitudeBinCenter) * deg2rad);
33  float q3 = std::cos((obsLatitude + latitudeBinCenter) * deg2rad);
34 
35  float geodesicDistance = (re * std::acos(0.5f*((1.0f+q1)*q2 - (1.0f-q1)*q3)) + 1.0f);
36  return geodesicDistance;
37  }
38 
39  float nonspatialDistanceComponent(float /*obs*/, float /*binCenter*/,
40  float /*inverseBinWidth*/) const override {
41  return 0;
42  }
43 
44  float combineDistanceComponents(float componentA, float componentB) const override {
45  return componentA + componentB;
46  }
47 
48  float finalise(float combinedComponents) const override {
49  return combinedComponents;
50  }
51 };
52 
53 } // namespace ufo
54 
55 #endif // UFO_UTILS_GEODESICDISTANCECALCULATOR_H_
Calculates distances between observations and centres of bins used during thinning.
float combineDistanceComponents(float componentA, float componentB) const override
float spatialDistanceComponent(float obsLatitude, float obsLongitude, float latitudeBinCenter, float longitudeBinCenter, float, float) const override
float nonspatialDistanceComponent(float, float, float) const override
float finalise(float combinedComponents) const override
real(kind_real), parameter, public deg2rad
Definition: RunCRTM.h:27
static constexpr double deg2rad
Definition: Constants.h:21
static constexpr double mean_earth_rad
Definition: Constants.h:40