From 05720fb08dfe2deeb09999e5b52c3861078903bb Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Wed, 17 Mar 2021 18:13:34 -0600 Subject: [PATCH 1/5] #1715 Do not combined if there are no overlapping beteewn TQZ and UV records --- met/src/tools/other/pb2nc/pb2nc.cc | 61 +++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/met/src/tools/other/pb2nc/pb2nc.cc b/met/src/tools/other/pb2nc/pb2nc.cc index fa497ae3fa..d2ede4d362 100644 --- a/met/src/tools/other/pb2nc/pb2nc.cc +++ b/met/src/tools/other/pb2nc/pb2nc.cc @@ -2930,16 +2930,27 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, float *pqtzuv_tq, *pqtzuv_uv; float *pqtzuv_merged = (float *) 0; float *next_pqtzuv, *prev_pqtzuv; + float tq_pres_max, tq_pres_min, uv_pres_max, uv_pres_min; std::map::iterator it, it_tq, it_uv; // Gets pressure levels for TQZ records - for (it=pqtzuv_map_tq.begin(); it!=pqtzuv_map_tq.end(); ++it) { - tq_levels.add(int(it->first)); + it=pqtzuv_map_tq.begin(); + tq_pres_min = tq_pres_max = it->first; + for (; it!=pqtzuv_map_tq.end(); ++it) { + float pres_v = it->first; + if (tq_pres_min > pres_v) tq_pres_min = pres_v; + if (tq_pres_max > pres_v) tq_pres_min = pres_v; + tq_levels.add(nint(pres_v)); } // Gets pressure levels for common records - for (it=pqtzuv_map_uv.begin(); it!=pqtzuv_map_uv.end(); ++it) { - if (tq_levels.has(int(it->first))) { - common_levels.add(int(it->first)); + it=pqtzuv_map_uv.begin(); + uv_pres_min = uv_pres_max = it->first; + for (; it!=pqtzuv_map_uv.end(); ++it) { + float pres_v = it->first; + if (uv_pres_min > pres_v) uv_pres_min = pres_v; + if (uv_pres_max > pres_v) uv_pres_min = pres_v; + if (tq_levels.has(nint(pres_v))) { + common_levels.add(nint(pres_v)); } } @@ -2947,6 +2958,19 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, log_tqz_and_uv(pqtzuv_map_tq, pqtzuv_map_uv, method_name); } + bool no_overlap = (tq_pres_max < uv_pres_min) || (tq_pres_min > uv_pres_max); + mlog << Debug(6) << method_name << "TQZ pressures: " << tq_pres_max + << " to " << tq_pres_min << " UV pressures: " << uv_pres_max + << " to " << uv_pres_min << (no_overlap ? "no overlap" : "overlapping") << "\n"; + if( no_overlap ) { + mlog << Warning << method_name + << "Can not combine TQ and UV records because of no overlapping.\n"; + mlog << Warning << " TQZ record count: " << tq_count + << ", UV record count: " << uv_count + << " common_levels: " << common_levels.n() << "\n"; + return pqtzuv_map_merged.size(); + } + // Select first record by 1) merging two records with the same pressure // level or 2) interpolate next_pqtzuv = (float *)0; @@ -2955,14 +2979,14 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, pqtzuv_tq = (float *)it_tq->second; pqtzuv_uv = (float *)it_uv->second;; pqtzuv_merged = new float[mxr8vt]; - if (common_levels.has(int(it_tq->first)) - || common_levels.has(int(it_uv->first))) { + if (common_levels.has(nint(it_tq->first)) + || common_levels.has(nint(it_uv->first))) { // Found the records with the same precsure level if (it_tq->first != it_uv->first) { - if (common_levels.has(int(it_uv->first))) { + if (common_levels.has(nint(it_uv->first))) { pqtzuv_uv = pqtzuv_map_uv[it_uv->first]; } - else if (common_levels.has(int(it_tq->first))) { + else if (common_levels.has(nint(it_tq->first))) { pqtzuv_tq = pqtzuv_map_tq[it_tq->first]; } } @@ -2978,7 +3002,7 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, prev_pqtzuv = (float *)it_uv->second; ++it_uv; } - next_pqtzuv = it_uv->second; + next_pqtzuv = (float *)it_uv->second; } else { //Interpolate TQZ into UV @@ -2988,8 +3012,9 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, prev_pqtzuv = (float *)it_tq->second; ++it_tq; } - next_pqtzuv = it_tq->second; + next_pqtzuv = (float *)it_tq->second; } + // Interpolate TQZ and UV as the first pressure level interpolate_pqtzuv(prev_pqtzuv, pqtzuv_merged, next_pqtzuv); } float first_pres = (pqtzuv_merged == 0 ? bad_data_float : pqtzuv_merged[0]); @@ -3006,6 +3031,7 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, if(mlog.verbosity_level() >= PBL_DEBUG_LEVEL) { log_merged_tqz_uv(pqtzuv_map_tq, pqtzuv_map_uv, pqtzuv_map_merged, method_name); } + delete [] pqtzuv_merged; } return pqtzuv_map_merged.size(); @@ -3058,7 +3084,7 @@ float compute_pbl(map pqtzuv_map_tq, pbl_data_vgrd[index] = pqtzuv[5]; if (!is_eq(pbl_data_spfh[index], bad_data_float)) spfh_cnt++; if (!is_eq(pbl_data_hgt[index], bad_data_float)) hgt_cnt++; - selected_levels.add(int(it->first)); + selected_levels.add(nint(it->first)); } index--; @@ -3080,7 +3106,7 @@ float compute_pbl(map pqtzuv_map_tq, if (!is_eq(highest_pressure, bad_data_float)) { index = MAX_PBL_LEVEL - 1; for (; it!=pqtzuv_map_tq.end(); ++it) { - int pres_level = int(it->first); + int pres_level = nint(it->first); if (selected_levels.has(pres_level)) break; float *pqtzuv = pqtzuv_map_merged[it->first]; @@ -3228,8 +3254,9 @@ int interpolate_by_pressure(int length, float *pres_data, float *var_data) { void interpolate_pqtzuv(float *prev_pqtzuv, float *cur_pqtzuv, float *next_pqtzuv) { static const char *method_name = "interpolate_pqtzuv() "; - - if ((prev_pqtzuv[0] == cur_pqtzuv[0]) || (next_pqtzuv[0] == cur_pqtzuv[0])) { + if ((nint(prev_pqtzuv[0]) == nint(cur_pqtzuv[0])) + || (nint(next_pqtzuv[0]) == nint(cur_pqtzuv[0])) + || (nint(prev_pqtzuv[0]) == nint(next_pqtzuv[0]))) { mlog << Error << method_name << " Can't interpolate because of same pressure levels. prev: " << prev_pqtzuv[0] << ", cur: " << cur_pqtzuv[0] @@ -3283,8 +3310,8 @@ void merge_records(float *first_pqtzuv, map pqtzuv_map_pivot, if (first_pres < it_pivot->first) break; } mlog << Debug(8) << method_name << "pivot->first: " << it_pivot->first - << " aux->first " << it_aux->first << " first_pres: " << first_pres - << " prev_pqtzuv[0]" << prev_pqtzuv[0] << "\n"; + << " aux->first: " << it_aux->first << " first_pres: " << first_pres + << " prev_pqtzuv[0]: " << prev_pqtzuv[0] << "\n"; // Find next UV level for (; it_aux!=pqtzuv_map_aux.end(); ++it_aux) { // Skip the records below the first mathcing/interpolated level From eeb6a57b7bcdb41f9ca9d76ca00f6d2387c84e73 Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Wed, 17 Mar 2021 19:03:31 -0600 Subject: [PATCH 2/5] #1715 Do not combined if there are no overlapping beteewn TQZ and UV records --- met/src/tools/other/pb2nc/pb2nc.cc | 36 ++++++++++++++++++------------ 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/met/src/tools/other/pb2nc/pb2nc.cc b/met/src/tools/other/pb2nc/pb2nc.cc index d2ede4d362..ee53e20edb 100644 --- a/met/src/tools/other/pb2nc/pb2nc.cc +++ b/met/src/tools/other/pb2nc/pb2nc.cc @@ -2934,21 +2934,21 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, std::map::iterator it, it_tq, it_uv; // Gets pressure levels for TQZ records - it=pqtzuv_map_tq.begin(); + it = pqtzuv_map_tq.begin(); tq_pres_min = tq_pres_max = it->first; for (; it!=pqtzuv_map_tq.end(); ++it) { float pres_v = it->first; if (tq_pres_min > pres_v) tq_pres_min = pres_v; - if (tq_pres_max > pres_v) tq_pres_min = pres_v; + if (tq_pres_max < pres_v) tq_pres_max = pres_v; tq_levels.add(nint(pres_v)); } // Gets pressure levels for common records - it=pqtzuv_map_uv.begin(); + it = pqtzuv_map_uv.begin(); uv_pres_min = uv_pres_max = it->first; for (; it!=pqtzuv_map_uv.end(); ++it) { float pres_v = it->first; if (uv_pres_min > pres_v) uv_pres_min = pres_v; - if (uv_pres_max > pres_v) uv_pres_min = pres_v; + if (uv_pres_max < pres_v) uv_pres_max = pres_v; if (tq_levels.has(nint(pres_v))) { common_levels.add(nint(pres_v)); } @@ -2961,7 +2961,7 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, bool no_overlap = (tq_pres_max < uv_pres_min) || (tq_pres_min > uv_pres_max); mlog << Debug(6) << method_name << "TQZ pressures: " << tq_pres_max << " to " << tq_pres_min << " UV pressures: " << uv_pres_max - << " to " << uv_pres_min << (no_overlap ? "no overlap" : "overlapping") << "\n"; + << " to " << uv_pres_min << (no_overlap ? " no overlap!" : " overlapping") << "\n"; if( no_overlap ) { mlog << Warning << method_name << "Can not combine TQ and UV records because of no overlapping.\n"; @@ -2970,23 +2970,25 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, << " common_levels: " << common_levels.n() << "\n"; return pqtzuv_map_merged.size(); } - + // Select first record by 1) merging two records with the same pressure // level or 2) interpolate + int tq_pres, uv_pres; next_pqtzuv = (float *)0; it_tq = pqtzuv_map_tq.begin(); it_uv = pqtzuv_map_uv.begin(); pqtzuv_tq = (float *)it_tq->second; pqtzuv_uv = (float *)it_uv->second;; pqtzuv_merged = new float[mxr8vt]; - if (common_levels.has(nint(it_tq->first)) - || common_levels.has(nint(it_uv->first))) { + tq_pres = nint(it_tq->first); + uv_pres = nint(it_uv->first); + if (common_levels.has(tq_pres) || common_levels.has(uv_pres)) { // Found the records with the same precsure level - if (it_tq->first != it_uv->first) { - if (common_levels.has(nint(it_uv->first))) { + if (tq_pres != uv_pres) { + if (common_levels.has(uv_pres)) { pqtzuv_uv = pqtzuv_map_uv[it_uv->first]; } - else if (common_levels.has(nint(it_tq->first))) { + else if (common_levels.has(tq_pres)) { pqtzuv_tq = pqtzuv_map_tq[it_tq->first]; } } @@ -3228,9 +3230,14 @@ int interpolate_by_pressure(int length, float *pres_data, float *var_data) { << var_data[idx_start] << " and " << var_data[idx_end] << "\n"; float data_diff = var_data[idx_end] - var_data[idx_start]; for (idx2 = idx_start+1; idx2 Date: Thu, 18 Mar 2021 08:17:17 -0600 Subject: [PATCH 3/5] #1715 Do not combined if there are no overlapping beteewn TQZ and UV records --- met/src/tools/other/pb2nc/pb2nc.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/met/src/tools/other/pb2nc/pb2nc.cc b/met/src/tools/other/pb2nc/pb2nc.cc index ee53e20edb..e6b63d6b85 100644 --- a/met/src/tools/other/pb2nc/pb2nc.cc +++ b/met/src/tools/other/pb2nc/pb2nc.cc @@ -3230,7 +3230,7 @@ int interpolate_by_pressure(int length, float *pres_data, float *var_data) { << var_data[idx_start] << " and " << var_data[idx_end] << "\n"; float data_diff = var_data[idx_end] - var_data[idx_start]; for (idx2 = idx_start+1; idx2 Date: Thu, 18 Mar 2021 13:28:13 -0600 Subject: [PATCH 4/5] #1715 Added blank line for Warning --- met/src/tools/other/pb2nc/pb2nc.cc | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/met/src/tools/other/pb2nc/pb2nc.cc b/met/src/tools/other/pb2nc/pb2nc.cc index e6b63d6b85..99930cd399 100644 --- a/met/src/tools/other/pb2nc/pb2nc.cc +++ b/met/src/tools/other/pb2nc/pb2nc.cc @@ -2960,14 +2960,13 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, bool no_overlap = (tq_pres_max < uv_pres_min) || (tq_pres_min > uv_pres_max); mlog << Debug(6) << method_name << "TQZ pressures: " << tq_pres_max - << " to " << tq_pres_min << " UV pressures: " << uv_pres_max + << " to " << tq_pres_min << " UV pressures: " << uv_pres_max << " to " << uv_pres_min << (no_overlap ? " no overlap!" : " overlapping") << "\n"; if( no_overlap ) { - mlog << Warning << method_name - << "Can not combine TQ and UV records because of no overlapping.\n"; - mlog << Warning << " TQZ record count: " << tq_count - << ", UV record count: " << uv_count - << " common_levels: " << common_levels.n() << "\n"; + mlog << Warning << "\n" << method_name + << "Can not combine TQ and UV records because of no overlapping" + << " TQZ count: " << tq_count << ", UV count: " << uv_count + << " common_levels: " << common_levels.n() << "\n\n"; return pqtzuv_map_merged.size(); } @@ -3177,10 +3176,10 @@ void insert_pbl(float *obs_arr, const float pbl_value, const int pbl_code, hdr_info << unix_to_yyyymmdd_hhmmss(hdr_vld_ut) << " " << hdr_typ << " " << hdr_sid; if (is_eq(pbl_value, bad_data_float)) { - mlog << Warning << "Failed to compute PBL " << hdr_info << "\n\n"; + mlog << Warning << "\nFailed to compute PBL " << hdr_info << "\n\n"; } else if (pbl_value < hdr_elv) { - mlog << Warning << "Not saved because the computed PBL (" << pbl_value + mlog << Warning << "\nNot saved because the computed PBL (" << pbl_value << ") is less than the station elevation (" << hdr_elv << "). " << hdr_info << "\n\n"; obs_arr[4] = 0; @@ -3194,7 +3193,7 @@ void insert_pbl(float *obs_arr, const float pbl_value, const int pbl_code, << " lat: " << hdr_lat << ", lon: " << hdr_lon << ", elv: " << hdr_elv << " " << hdr_info << "\n\n"; if (obs_arr[4] > MAX_PBL) { - mlog << Warning << " Computed PBL (" << obs_arr[4] << " from " + mlog << Warning << "\nComputed PBL (" << obs_arr[4] << " from " << pbl_value << ") is too high, Reset to " << MAX_PBL << " " << hdr_info<< "\n\n"; obs_arr[4] = MAX_PBL; From b394068fa28c5a71158976d610455103a18abfa1 Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Thu, 18 Mar 2021 13:42:22 -0600 Subject: [PATCH 5/5] #1715 Added a blank line for Error --- met/src/tools/other/pb2nc/pb2nc.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/met/src/tools/other/pb2nc/pb2nc.cc b/met/src/tools/other/pb2nc/pb2nc.cc index 99930cd399..09d36f8f02 100644 --- a/met/src/tools/other/pb2nc/pb2nc.cc +++ b/met/src/tools/other/pb2nc/pb2nc.cc @@ -2437,7 +2437,7 @@ void write_netcdf_hdr_data() { // Check for no messages retained if(dim_count <= 0) { - mlog << Error << method_name << " -> " + mlog << Error << "\n" << method_name << " -> " << "No PrepBufr messages retained. Nothing to write.\n\n"; // Delete the NetCDF file remove_temp_file(ncfile); @@ -3071,7 +3071,7 @@ float compute_pbl(map pqtzuv_map_tq, hgt_cnt = spfh_cnt = 0; for (it=pqtzuv_map_merged.begin(); it!=pqtzuv_map_merged.end(); ++it) { if (index < 0) { - mlog << Error << method_name << "negative index: " << index << "\n"; + mlog << Error << "\n" << method_name << "negative index: " << index << "\n\n"; break; } @@ -3091,7 +3091,7 @@ float compute_pbl(map pqtzuv_map_tq, index--; } if (index != -1) { - mlog << Error << method_name << "Missing some levels (" << index << ")\n"; + mlog << Error << "\n" << method_name << "Missing some levels (" << index << ")\n\n"; } if (pbl_level > MAX_PBL_LEVEL) { @@ -3264,7 +3264,7 @@ void interpolate_pqtzuv(float *prev_pqtzuv, float *cur_pqtzuv, float *next_pqtzu if ((nint(prev_pqtzuv[0]) == nint(cur_pqtzuv[0])) || (nint(next_pqtzuv[0]) == nint(cur_pqtzuv[0])) || (nint(prev_pqtzuv[0]) == nint(next_pqtzuv[0]))) { - mlog << Error << method_name + mlog << Error << "\n" << method_name << " Can't interpolate because of same pressure levels. prev: " << prev_pqtzuv[0] << ", cur: " << cur_pqtzuv[0] << ", next: " << prev_pqtzuv[0] << "\n";