12 const std::vector <float> &valuesIn,
13 const std::vector <float> &coordOut,
14 std::vector <float> &valuesOut,
19 const float missingValueFloat = util::missingValue(missingValueFloat);
21 const int nLevsIn =
static_cast<int> (coordIn.size());
23 const float coordMultiplier =
27 float previousCoordOut = coordMultiplier * std::numeric_limits<float>::max();
29 int previousLevIn = std::numeric_limits<int>::max();
32 for (
int jlevOut = 0; jlevOut < coordOut.size(); ++jlevOut) {
33 if (coordOut[jlevOut] == missingValueFloat)
continue;
45 if (coordMultiplier * coordOut[jlevOut] > coordMultiplier * previousCoordOut)
46 PosStart = previousLevIn;
49 for (
int Pos = PosStart; Pos < nLevsIn; ++Pos) {
50 if (coordMultiplier * coordIn[Pos] > coordMultiplier * coordOut[jlevOut]) {
56 previousLevIn = jlevIn;
57 previousCoordOut = coordOut[jlevOut];
60 if (coordOut[jlevOut] == coordIn[jlevIn]) {
62 valuesOut[jlevOut] = valuesIn[jlevIn];
64 coordMultiplier * coordOut[jlevOut] > coordMultiplier * coordIn[nLevsIn - 1]) {
70 valuesOut[jlevOut] = missingValueFloat;
72 valuesOut[jlevOut] = valuesIn[nLevsIn - 1];
74 coordMultiplier * coordOut[jlevOut] < coordMultiplier * coordIn[0]) {
81 valuesOut[jlevOut] = missingValueFloat;
83 valuesOut[jlevOut] = valuesIn[0];
88 float Interp_factor = 0.0;
91 if (coordOut[jlevOut] > 0.0 &&
92 coordIn[jlevIn] > 0.0 &&
93 coordIn[jlevIn + 1] > 0.0) {
94 Interp_factor = std::log(coordOut[jlevOut] / coordIn[jlevIn]) /
95 std::log(coordIn[jlevIn + 1] / coordIn[jlevIn]);
99 if (coordIn[jlevIn + 1] - coordIn[jlevIn] != 0) {
100 Interp_factor = (coordOut[jlevOut] - coordIn[jlevIn]) /
101 (coordIn[jlevIn + 1] - coordIn[jlevIn]);
105 if (valuesIn[jlevIn] != missingValueFloat &&
106 valuesIn[jlevIn + 1] != missingValueFloat) {
107 valuesOut[jlevOut] = valuesIn[jlevIn] +
108 (valuesIn[jlevIn + 1] - valuesIn[jlevIn]) * Interp_factor;
void profileVerticalInterpolation(const std::vector< float > &coordIn, const std::vector< float > &valuesIn, const std::vector< float > &coordOut, std::vector< float > &valuesOut, const ProfileInterpolation::InterpolationMethod interpMethod, const ProfileInterpolation::CoordinateOrder coordOrder, const ProfileInterpolation::OutOfBoundsTreatment outOfBounds)