diff --git a/ChangeLog b/ChangeLog index bb53339f726cb2aecf8f45fed8b2b24073f36906..d0d6da1e5a2dbf6bc79649296489350f996b619d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,10 @@ * Using CDI library version 2.5.0 * Version 2.5.0 release +2024-11-14 Uwe Schulzweida + + * intgridknn: added method arithmetic_average + 2024-11-12 Uwe Schulzweida * New operator: intgridknn - k-nearest-neighbor remapping diff --git a/src/knn_weights.h b/src/knn_weights.h index 8fcb444c147ba836a03e9327a715dfe463822c1a..55592dbc0eb9747e3c474304ca706e4950e1b327 100644 --- a/src/knn_weights.h +++ b/src/knn_weights.h @@ -25,6 +25,23 @@ private: size_t m_maxNeighbors = 0; KnnMethod m_method{ KnnMethod::distanceWeighted }; + void + apply_mask(const Vmask &gridMask) + { + size_t n = 0; + for (size_t i = 0; i < m_numNeighbors; ++i) + { + if (gridMask[m_indices[i]]) + { + m_indices[n] = m_indices[i]; + m_dist[n] = m_dist[i]; + n++; + } + } + + m_numNeighbors = n; + } + public: size_t m_numNeighbors = 0; std::vector<size_t> m_indices; // source indices at nearest neighbors @@ -153,7 +170,13 @@ public: size_t compute_weights_arithmetic_average() { - return 0; + if (m_numNeighbors) + { + double weight = 1.0 / m_numNeighbors; + for (size_t i = 0; i < m_numNeighbors; ++i) { m_dist[i] = weight; } + } + + return m_numNeighbors; } size_t @@ -190,38 +213,16 @@ public: size_t compute_weights(const Vmask &gridMask) { - // Compute weights based on inverse distance if grid mask is false, eliminate those points - size_t n = 0; - for (size_t i = 0; i < m_numNeighbors; ++i) - { - if (gridMask[m_indices[i]]) - { - m_indices[n] = m_indices[i]; - m_dist[n] = m_dist[i]; - n++; - } - } - - m_numNeighbors = n; + // Compute weights if grid mask is false, eliminate those points + apply_mask(gridMask); return compute_weights(); } size_t compute_weights(const Vmask &gridMask, double searchRadius, double weight0, double weightR) { - // Compute weights based on inverse distance if mask is false, eliminate those points - size_t n = 0; - for (size_t i = 0; i < m_numNeighbors; ++i) - { - if (gridMask[m_indices[i]]) - { - m_indices[n] = m_indices[i]; - m_dist[n] = m_dist[i]; - n++; - } - } - - m_numNeighbors = n; + // Compute weights if mask is false, eliminate those points + apply_mask(gridMask); double distTotal = 0.0; // sum of neighbor distances (for normalizing) for (size_t i = 0; i < m_numNeighbors; ++i)