UFO
SpatialBinSelector.cc
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 #include <algorithm>
9 #include <cmath>
10 #include <vector>
11 
12 #include "ufo/utils/Constants.h"
15 
16 namespace ufo {
17 
19  SpatialBinCountRoundingMode roundingMode)
20  : latitudeBinSelector_(latitudeLowerBound_, latitudeUpperBound_, numLatitudeBins) {
21  longitudeBinSelectors_.reserve(numLatitudeBins);
22  for (IndexType latBin = 0; latBin < numLatitudeBins; ++latBin) {
23  ValueType latBinCenter = latitudeBinCenter(latBin);
24 
25  const int equatorToMeridianLengthRatio = 2;
26  const float tentativeNumLongitudeBins =
27  equatorToMeridianLengthRatio * numLatitudeBins *
28  std::cos(latBinCenter * static_cast<float>(Constants::deg2rad));
29  const IndexType numLonBins = roundNumBins(tentativeNumLongitudeBins, roundingMode);
30 
31  longitudeBinSelectors_.emplace_back(
32  static_cast<ValueType>(longitudeLowerBound_),
33  static_cast<ValueType>(longitudeUpperBound_), numLonBins);
34  }
35 }
36 
38  : latitudeBinSelector_(latitudeLowerBound_, latitudeUpperBound_, numLatitudeBins),
39  longitudeBinSelectors_(numLatitudeBins,
40  EquispacedBinSelector(longitudeLowerBound_, longitudeUpperBound_,
41  numLongitudeBins))
42 {}
43 
45  size_t n = 0;
46  for (const EquispacedBinSelector & selector : longitudeBinSelectors_)
47  n += selector.numBins();
48  return n;
49 }
50 
52  float idealNumBins, SpatialBinCountRoundingMode roundingMode) {
53  IndexType numBins = static_cast<IndexType>(
54  roundingMode == SpatialBinCountRoundingMode::DOWN ?
55  idealNumBins : std::round(idealNumBins));
56  return std::max(1, numBins);
57 }
58 
59 } // namespace ufo
ufo::SpatialBinSelector::SpatialBinSelector
SpatialBinSelector(IndexType numLatitudeBins, SpatialBinCountRoundingMode roundingMode)
Partition a sphere into bins whose centers lie on a reduced Gaussian grid.
Definition: SpatialBinSelector.cc:18
ufo::SpatialBinSelector::roundNumBins
static IndexType roundNumBins(float idealNumBins, SpatialBinCountRoundingMode roundingMode)
Return idealNumBins rounded to a positive integer according to the rounding strategy roundingMode.
Definition: SpatialBinSelector.cc:51
ufo::SpatialBinSelector::longitudeLowerBound_
static constexpr ValueType longitudeLowerBound_
Definition: SpatialBinSelector.h:34
EquispacedBinSelector.h
ufo::SpatialBinSelector::longitudeBinSelectors_
std::vector< EquispacedBinSelector > longitudeBinSelectors_
Definition: SpatialBinSelector.h:110
ufo
Definition: RunCRTM.h:27
SpatialBinSelector.h
ufo::SpatialBinSelector::ValueType
float ValueType
Definition: SpatialBinSelector.h:28
ufo::SpatialBinCountRoundingMode::DOWN
@ DOWN
ufo::Constants::deg2rad
static constexpr double deg2rad
Definition: Constants.h:21
ufo::SpatialBinSelector::IndexType
int IndexType
Definition: SpatialBinSelector.h:29
ufo::EquispacedBinSelector
Represents a set of consecutive intervals (bins) of the same width.
Definition: EquispacedBinSelector.h:22
ufo::SpatialBinSelector::latitudeBinCenter
ValueType latitudeBinCenter(IndexType latitudeBin) const
Return the latitude at the center of the zonal band of bins with index latitudeBin.
Definition: SpatialBinSelector.h:70
Constants.h
ufo::SpatialBinSelector::longitudeUpperBound_
static constexpr ValueType longitudeUpperBound_
Definition: SpatialBinSelector.h:35
ufo::SpatialBinSelector::totalNumBins
IndexType totalNumBins() const
Return the number of bins into which the sphere is split.
Definition: SpatialBinSelector.cc:44
ufo::SpatialBinCountRoundingMode
SpatialBinCountRoundingMode
Definition: SpatialBinSelector.h:19