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_
ufo::GeodesicDistanceCalculator::nonspatialDistanceComponent
float nonspatialDistanceComponent(float, float, float) const override
Definition: GeodesicDistanceCalculator.h:39
ufo
Definition: RunCRTM.h:27
ufo::Constants::mean_earth_rad
static constexpr double mean_earth_rad
Definition: Constants.h:39
DistanceCalculator.h
ufo::Constants::deg2rad
static constexpr double deg2rad
Definition: Constants.h:21
ufo::GeodesicDistanceCalculator::spatialDistanceComponent
float spatialDistanceComponent(float obsLatitude, float obsLongitude, float latitudeBinCenter, float longitudeBinCenter, float, float) const override
Definition: GeodesicDistanceCalculator.h:24
ufo_constants_mod::deg2rad
real(kind_real), parameter, public deg2rad
Definition: ufo_constants_mod.F90:50
ufo::GeodesicDistanceCalculator::combineDistanceComponents
float combineDistanceComponents(float componentA, float componentB) const override
Definition: GeodesicDistanceCalculator.h:44
Constants.h
ufo::GeodesicDistanceCalculator::finalise
float finalise(float combinedComponents) const override
Definition: GeodesicDistanceCalculator.h:48
ufo::DistanceCalculator
Calculates distances between observations and centres of bins used during thinning.
Definition: DistanceCalculator.h:33
ufo::GeodesicDistanceCalculator
Definition: GeodesicDistanceCalculator.h:22