diff --git a/met/src/tools/other/madis2nc/madis2nc.cc b/met/src/tools/other/madis2nc/madis2nc.cc index b1192f566f..efc300b87e 100644 --- a/met/src/tools/other/madis2nc/madis2nc.cc +++ b/met/src/tools/other/madis2nc/madis2nc.cc @@ -84,11 +84,15 @@ static void clean_up(); static void setup_netcdf_out(int nhdr); static bool get_filtered_nc_data(NcVar var, float *data, const long dim, - const long cur, const char *var_name); + const long cur, const char *var_name, bool required=true); +static bool get_filtered_nc_data_opt(NcVar var, float *data, const long dim, + const long cur, const char *var_name, StringArray optional_vars); + static bool get_filtered_nc_data_2d(NcVar var, int *data, const long *dim, - const long *cur, const char *var_name, bool count_bad=false); + const long *cur, const char *var_name); static bool get_filtered_nc_data_2d(NcVar var, float *data, const long *dim, - const long *cur, const char *var_name, bool count_bad=false); + const long *cur, const char *var_name); +static void get_nc_qty_data(NcVar *nc_var, char *nc_data_arr, int buf_size, int offset); static void check_quality_control_flag(int &value, const char qty, const char *var_name); static void check_quality_control_flag(float &value, const char qty, const char *var_name); @@ -415,7 +419,7 @@ void setup_netcdf_out(int nhdr) { static bool get_filtered_nc_data(NcVar var, float *data, const long dim, const long cur, - const char *var_name) { + const char *var_name, bool required) { bool status = false; float in_fill_value; @@ -439,15 +443,15 @@ static bool get_filtered_nc_data(NcVar var, float *data, << "Fail to read data [" << var_name << "].\n\n"; } } - else { + else if (required) { mlog << Error << "\n" << method_name << "Can not read a NetCDF data because the variable [" << var_name << "] is missing.\n\n"; } if (!status) { for (int idx=0; idx 0; if (missing_vars.n() > 0) { - mlog << Error << "\n" << method_name << "Please check if the input is a MESONET.\n\n"; - for (int idx=0; idx0) { + mlog << Error << "\n" << method_name << "Please check if the input is a MESONET.\n\n"; + for (int idx=0; idx 0) { - for (int idx=0; idx BUFFER_SIZE) ? BUFFER_SIZE: (my_rec_end - i_hdr_s); float hdr_lat_arr[buf_size]; @@ -2859,76 +2865,54 @@ void process_madis_mesonet(NcFile *&f_in) { get_nc_data(&in_hdr_lon_var, hdr_lon_arr, buf_size, i_hdr_s); get_filtered_nc_data(in_hdr_elv_var, hdr_elv_arr, buf_size, i_hdr_s, "eleveation"); - if (IS_VALID_NC(in_temperatureQty_var)) get_nc_data(&in_temperatureQty_var, temperatureQty_arr, buf_size, i_hdr_s); - else memset(temperatureQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_dewpointQty_var)) get_nc_data(&in_dewpointQty_var, dewpointQty_arr, buf_size, i_hdr_s); - else memset(dewpointQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_relHumidityQty_var)) get_nc_data(&in_relHumidityQty_var, relHumidityQty_arr, buf_size, i_hdr_s); - else memset(relHumidityQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_stationPressureQty_var)) get_nc_data(&in_stationPressureQty_var, stationPressureQty_arr, buf_size, i_hdr_s); - else memset(stationPressureQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_seaLevelPressureQty_var)) get_nc_data(&in_seaLevelPressureQty_var, seaLevelPressureQty_arr, buf_size, i_hdr_s); - else memset(seaLevelPressureQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_windDirQty_var)) get_nc_data(&in_windDirQty_var, windDirQty_arr, buf_size, i_hdr_s); - else memset(windDirQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_windSpeedQty_var)) get_nc_data(&in_windSpeedQty_var, windSpeedQty_arr, buf_size, i_hdr_s); - else memset(windSpeedQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_windGustQty_var)) get_nc_data(&in_windGustQty_var, windGustQty_arr, buf_size, i_hdr_s); - else memset(windGustQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_visibilityQty_var)) get_nc_data(&in_visibilityQty_var, visibilityQty_arr, buf_size, i_hdr_s); - else memset(visibilityQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_precipRateQty_var)) get_nc_data(&in_precipRateQty_var, precipRateQty_arr, buf_size, i_hdr_s); - else memset(precipRateQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_solarRadiationQty_var)) get_nc_data(&in_solarRadiationQty_var, solarRadiationQty_arr, buf_size, i_hdr_s); - else memset(solarRadiationQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_seaSurfaceTempQty_var)) get_nc_data(&in_seaSurfaceTempQty_var, seaSurfaceTempQty_arr, buf_size, i_hdr_s); - else memset(seaSurfaceTempQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_totalColumnPWVQty_var)) get_nc_data(&in_totalColumnPWVQty_var, totalColumnPWVQty_arr, buf_size, i_hdr_s); - else memset(totalColumnPWVQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_soilTemperatureQty_var)) get_nc_data(&in_soilTemperatureQty_var, soilTemperatureQty_arr, buf_size, i_hdr_s); - else memset(soilTemperatureQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_minTemp24HourQty_var)) get_nc_data(&in_minTemp24HourQty_var, minTemp24HourQty_arr, buf_size, i_hdr_s); - else memset(minTemp24HourQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_maxTemp24HourQty_var)) get_nc_data(&in_maxTemp24HourQty_var, maxTemp24HourQty_arr, buf_size, i_hdr_s); - else memset(maxTemp24HourQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_precip3hrQty_var)) get_nc_data(&in_precip3hrQty_var, precip3hrQty_arr, buf_size, i_hdr_s); - else memset(precip3hrQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_precip6hrQty_var)) get_nc_data(&in_precip6hrQty_var, precip6hrQty_arr, buf_size, i_hdr_s); - else memset(precip6hrQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_precip12hrQty_var)) get_nc_data(&in_precip12hrQty_var, precip12hrQty_arr, buf_size, i_hdr_s); - else memset(precip12hrQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_precip10minQty_var)) get_nc_data(&in_precip10minQty_var, precip10minQty_arr, buf_size, i_hdr_s); - else memset(precip10minQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_precip1minQty_var)) get_nc_data(&in_precip1minQty_var, precip1minQty_arr, buf_size, i_hdr_s); - else memset(precip1minQty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_windDir10Qty_var)) get_nc_data(&in_windDir10Qty_var, windDir10Qty_arr, buf_size, i_hdr_s); - else memset(windDir10Qty_arr, 0, buf_size*sizeof(char)); - if (IS_VALID_NC(in_windSpeed10Qty_var)) get_nc_data(&in_windSpeed10Qty_var, windSpeed10Qty_arr, buf_size, i_hdr_s); - else memset(windSpeed10Qty_arr, 0, buf_size*sizeof(char)); - - get_filtered_nc_data(in_temperature_var, temperature_arr, buf_size, i_hdr_s, "temperature" ); - get_filtered_nc_data(in_dewpoint_var, dewpoint_arr, buf_size, i_hdr_s, "dewpoint" ); - get_filtered_nc_data(in_relHumidity_var, relHumidity_arr, buf_size, i_hdr_s, "relHumidity" ); - get_filtered_nc_data(in_stationPressure_var, stationPressure_arr, buf_size, i_hdr_s, "stationPressure" ); - get_filtered_nc_data(in_seaLevelPressure_var, seaLevelPressure_arr, buf_size, i_hdr_s, "seaLevelPressure"); - get_filtered_nc_data(in_windDir_var, windDir_arr, buf_size, i_hdr_s, "windDir" ); - get_filtered_nc_data(in_windSpeed_var, windSpeed_arr, buf_size, i_hdr_s, "windSpeed" ); - get_filtered_nc_data(in_windGust_var, windGust_arr, buf_size, i_hdr_s, "windGust" ); - get_filtered_nc_data(in_visibility_var, visibility_arr, buf_size, i_hdr_s, "visibility" ); - get_filtered_nc_data(in_precipRate_var, precipRate_arr, buf_size, i_hdr_s, "precipRate" ); - get_filtered_nc_data(in_solarRadiation_var, solarRadiation_arr, buf_size, i_hdr_s, "solarRadiation" ); - get_filtered_nc_data(in_seaSurfaceTemp_var, seaSurfaceTemp_arr, buf_size, i_hdr_s, "seaSurfaceTemp" ); - get_filtered_nc_data(in_totalColumnPWV_var, totalColumnPWV_arr, buf_size, i_hdr_s, "totalColumnPWV" ); - get_filtered_nc_data(in_soilTemperature_var, soilTemperature_arr, buf_size, i_hdr_s, "soilTemperature" ); - get_filtered_nc_data(in_minTemp24Hour_var, minTemp24Hour_arr, buf_size, i_hdr_s, "minTemp24Hour" ); - get_filtered_nc_data(in_maxTemp24Hour_var, maxTemp24Hour_arr, buf_size, i_hdr_s, "maxTemp24Hour" ); - get_filtered_nc_data(in_precip3hr_var, precip3hr_arr, buf_size, i_hdr_s, "precip3hr" ); - get_filtered_nc_data(in_precip6hr_var, precip6hr_arr, buf_size, i_hdr_s, "precip6hr" ); - get_filtered_nc_data(in_precip12hr_var, precip12hr_arr, buf_size, i_hdr_s, "precip12hr" ); - get_filtered_nc_data(in_precip10min_var, precip10min_arr, buf_size, i_hdr_s, "precip10min" ); - get_filtered_nc_data(in_precip1min_var, precip1min_arr, buf_size, i_hdr_s, "precip1min" ); - get_filtered_nc_data(in_windDir10_var, windDir10_arr, buf_size, i_hdr_s, "windDir10" ); - get_filtered_nc_data(in_windSpeed10_var, windSpeed10_arr, buf_size, i_hdr_s, "windSpeed10" ); + get_nc_qty_data(&in_temperatureQty_var, temperatureQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_dewpointQty_var, dewpointQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_relHumidityQty_var, relHumidityQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_stationPressureQty_var, stationPressureQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_seaLevelPressureQty_var, seaLevelPressureQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_windDirQty_var, windDirQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_windSpeedQty_var, windSpeedQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_windGustQty_var, windGustQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_visibilityQty_var, visibilityQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_precipRateQty_var, precipRateQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_solarRadiationQty_var, solarRadiationQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_seaSurfaceTempQty_var, seaSurfaceTempQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_totalColumnPWVQty_var, totalColumnPWVQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_soilTemperatureQty_var, soilTemperatureQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_minTemp24HourQty_var, minTemp24HourQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_maxTemp24HourQty_var, maxTemp24HourQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_precip3hrQty_var, precip3hrQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_precip6hrQty_var, precip6hrQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_precip12hrQty_var, precip12hrQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_precip10minQty_var, precip10minQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_precip1minQty_var, precip1minQty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_windDir10Qty_var, windDir10Qty_arr, buf_size, i_hdr_s); + get_nc_qty_data(&in_windSpeed10Qty_var, windSpeed10Qty_arr, buf_size, i_hdr_s); + + get_filtered_nc_data_opt(in_temperature_var, temperature_arr, buf_size, i_hdr_s, "temperature" , optional_vars); + get_filtered_nc_data_opt(in_dewpoint_var, dewpoint_arr, buf_size, i_hdr_s, "dewpoint" , optional_vars); + get_filtered_nc_data_opt(in_relHumidity_var, relHumidity_arr, buf_size, i_hdr_s, "relHumidity" , optional_vars); + get_filtered_nc_data_opt(in_stationPressure_var, stationPressure_arr, buf_size, i_hdr_s, "stationPressure" , optional_vars); + get_filtered_nc_data_opt(in_seaLevelPressure_var, seaLevelPressure_arr, buf_size, i_hdr_s, "seaLevelPressure", optional_vars); + get_filtered_nc_data_opt(in_windDir_var, windDir_arr, buf_size, i_hdr_s, "windDir" , optional_vars); + get_filtered_nc_data_opt(in_windSpeed_var, windSpeed_arr, buf_size, i_hdr_s, "windSpeed" , optional_vars); + get_filtered_nc_data_opt(in_windGust_var, windGust_arr, buf_size, i_hdr_s, "windGust" , optional_vars); + get_filtered_nc_data_opt(in_visibility_var, visibility_arr, buf_size, i_hdr_s, "visibility" , optional_vars); + get_filtered_nc_data_opt(in_precipRate_var, precipRate_arr, buf_size, i_hdr_s, "precipRate" , optional_vars); + get_filtered_nc_data_opt(in_solarRadiation_var, solarRadiation_arr, buf_size, i_hdr_s, "solarRadiation" , optional_vars); + get_filtered_nc_data_opt(in_seaSurfaceTemp_var, seaSurfaceTemp_arr, buf_size, i_hdr_s, "seaSurfaceTemp" , optional_vars); + get_filtered_nc_data_opt(in_totalColumnPWV_var, totalColumnPWV_arr, buf_size, i_hdr_s, "totalColumnPWV" , optional_vars); + get_filtered_nc_data_opt(in_soilTemperature_var, soilTemperature_arr, buf_size, i_hdr_s, "soilTemperature" , optional_vars); + get_filtered_nc_data_opt(in_minTemp24Hour_var, minTemp24Hour_arr, buf_size, i_hdr_s, "minTemp24Hour" , optional_vars); + get_filtered_nc_data_opt(in_maxTemp24Hour_var, maxTemp24Hour_arr, buf_size, i_hdr_s, "maxTemp24Hour" , optional_vars); + get_filtered_nc_data_opt(in_precip3hr_var, precip3hr_arr, buf_size, i_hdr_s, "precip3hr" , optional_vars); + get_filtered_nc_data_opt(in_precip6hr_var, precip6hr_arr, buf_size, i_hdr_s, "precip6hr" , optional_vars); + get_filtered_nc_data_opt(in_precip12hr_var, precip12hr_arr, buf_size, i_hdr_s, "precip12hr" , optional_vars); + get_filtered_nc_data_opt(in_precip10min_var, precip10min_arr, buf_size, i_hdr_s, "precip10min" , optional_vars); + get_filtered_nc_data_opt(in_precip1min_var, precip1min_arr, buf_size, i_hdr_s, "precip1min" , optional_vars); + get_filtered_nc_data_opt(in_windDir10_var, windDir10_arr, buf_size, i_hdr_s, "windDir10" , optional_vars); + get_filtered_nc_data_opt(in_windSpeed10_var, windSpeed10_arr, buf_size, i_hdr_s, "windSpeed10" , optional_vars); + dim[1] = hdr_sid_len; get_nc_data(&in_hdr_sid_var, (char *)hdr_sid_arr, dim, cur);