diff --git a/src/mpim_grid/grid_convert.h b/src/mpim_grid/grid_convert.h index 30b10839bf9590bf33ba22cdcfa63f091fc2a187..adb2931639c1a0a08545c0482481e7af9dddab4d 100644 --- a/src/mpim_grid/grid_convert.h +++ b/src/mpim_grid/grid_convert.h @@ -15,7 +15,7 @@ gcLLtoXYZ(double lon, double lat, std::array<double, 3> &xyz) } static inline void -gcLLtoXYZ(double lon, double lat, double *xyz) +gcLLtoXYZ(double lon, double lat, double (&xyz)[3]) { auto cos_lat = std::cos(lat); xyz[0] = cos_lat * std::cos(lon); diff --git a/src/pointsearch_full.h b/src/pointsearch_full.h index 67163d21e1d18869cb38308ff6e46972f57fcc97..e7f661e54c1cab433a30b13be38565a6ff957049 100644 --- a/src/pointsearch_full.h +++ b/src/pointsearch_full.h @@ -24,10 +24,7 @@ public: { create(lons, lats); } - ~PointsearchFull() - { - if (m_pointsXYZ) delete[] m_pointsXYZ; - } + ~PointsearchFull() {} size_t search_nearest(const PointLonLat &pointLL, size_t *index, double *dist) override @@ -85,14 +82,14 @@ public: private: size_t m_n{ 0 }; - double (*m_pointsXYZ)[3]{ nullptr }; + std::unique_ptr<double[][3]> m_pointsXYZ; const PointsearchParams &m_params; void create(const Varray<double> &lons, const Varray<double> &lats) { auto n = lons.size(); - m_pointsXYZ = new double[n][3]; + m_pointsXYZ = std::make_unique<double[][3]>(n); #ifdef HAVE_OPENMP4 #pragma omp simd diff --git a/src/pointsearch_spherepart.h b/src/pointsearch_spherepart.h index f89f3b55bd6adf3644c0fe54b2df54c43575e9ca..d2cbb3f8ae04a8cf5b2f5a5102d061b9a4674111 100644 --- a/src/pointsearch_spherepart.h +++ b/src/pointsearch_spherepart.h @@ -39,19 +39,19 @@ public: auto searchArcRadius = chord_to_arc_length(m_params.searchRadius); - double tgtPoint[1][3]; - gcLLtoXYZ(pointLL.get_lon(), pointLL.get_lat(), tgtPoint[0]); + double tgtPoint[3]; + gcLLtoXYZ(pointLL.get_lon(), pointLL.get_lat(), tgtPoint); if (!m_params.extrapolation) for (int i = 0; i < 3; ++i) - if (tgtPoint[0][i] < m_min[i] || tgtPoint[0][i] > m_max[i]) return 0; + if (tgtPoint[i] < m_min[i] || tgtPoint[i] > m_max[i]) return 0; size_t local_point_ids_array_size = 0; size_t num_local_point_ids; size_t *local_point_ids = nullptr; double cos_angle; - yac_point_sphere_part_search_NN(m_yacPointSearch, 1, tgtPoint, &cos_angle, nullptr, nullptr, &local_point_ids, + yac_point_sphere_part_search_NN(m_yacPointSearch, 1, &tgtPoint, &cos_angle, nullptr, nullptr, &local_point_ids, &local_point_ids_array_size, &num_local_point_ids); size_t numIndices = 0; @@ -124,6 +124,7 @@ private: float m_min[3] = { 0 }; float m_max[3] = { 0 }; std::unique_ptr<double[][3]> m_pointsXYZ; + point_sphere_part_search *m_yacPointSearch{ nullptr }; const PointsearchParams &m_params; @@ -137,11 +138,11 @@ private: double max[3] = { -1.e9, -1.e9, -1.e9 }; #ifdef HAVE_OPENMP45 -#pragma omp parallel for if (n > cdoMinLoopSize) schedule(static) reduction(min : min[:3]) reduction(max : max[:3]) +#pragma omp parallel for if (n > cdoMinLoopSize) schedule(static) reduction(min : min[ : 3]) reduction(max : max[ : 3]) #endif for (size_t i = 0; i < n; ++i) { - auto pointXYZ = m_pointsXYZ[i]; + auto &pointXYZ = m_pointsXYZ[i]; gcLLtoXYZ(lons[i], lats[i], pointXYZ); min_point(min, pointXYZ); max_point(max, pointXYZ);