/* Name- processMirs03.c Language- C Type- MAIN Version- 1.0 Date- 2/17/2017 Programmer- Mike Pettey (IMSG) Function- This program extracts data from P72 EDR files in HDF5 format and writes the data to an EDGE orbital file. The selected data is defined in the run script. Also in the run script are the starting date (YYYYMMDD) and hour and the ending date and hour. */ #include #include #include #include #include #include #include "nprovs_to_netcdf.h" #define ERR(e) {printf("Error: %s, error num = %d\n", nc_strerror(e),e);} #define NDIMS 1 int defineVariable(int nc_group_id, char *var_name, nc_type var_type, int ndims, int *dimids, char *attr_string, char *attr); void writeVariableFloat(int group_id, int var_id, size_t *index, size_t *num_vals, float value); void writeVariableShort(int group_id, int var_id, size_t *index, size_t *num_vals, short value); void writeVariableInteger(int group_id, int var_id, size_t *index, size_t *num_vals, long value); void writeArrayFloat(int group_id, int var_id, size_t *index, size_t *num_vals, float *value); void writeArrayShort(int group_id, int var_id, size_t *index, size_t *num_vals, short *value); void writeVariableByte(int group_id, int var_id, size_t *index, size_t *num_vals, char value); void writeAttributeShort(int grp, char *attrVariable, short attrValue); void writeAttributeText(int grp, char *attrVariable, char *attrValue); void processMIRS(int date_to_process, struct file_data *files, struct platform *platform_ptr, int num_collocations, int platform_index, int data_type, int nc_date_group) { int n, i, date_type, recnum, collocation_num, retval; int nc_group_id, collocation_group_id; size_t num_colls, index[1], num_vals[1], index_2D[2], num_vals_2D[2]; float missing_float, latitude, longitude, layer_values[100], level_values[101]; float channels[22]; short qc_values[4]; int year, month, day, hour, minute, second; long offset, yyyymmdd, hhmmss; char col_dir_name[50], granule_name[101]; char *string[1]; short *buffer; int col_scalar_dim; int scalar_dim, dim_levels, dim_layers, dim_channels, dim_qc; int dimid_scalar[1], col_dimid_scalar[1]; int dimid_levels[2], dimid_layers[2], dimid_channels[2], dimid_qc[2]; int col_vid_lat, col_vid_lon, col_vid_date, col_vid_time; int vid_lat, vid_lon, vid_date, vid_time; int vid_press_layer, vid_press_level, vid_temp, vid_wvmr; int vid_clw_prof, vid_rainprof, vid_snowprof, vid_iceprof, vid_graupelprof; int vid_loczen, vid_relazimuth, vid_solzen, vid_scanline, vid_granule; int vid_scanpos, vid_node, vid_scene; int vid_emmis, vid_chansel, vid_chan_untemp, vid_chan_temp; int vid_winddir, vid_windspeed, vid_skintemp, vid_surfpres; int vid_terrain, vid_uwind, vid_vwind, vid_qcflag, vid_chisq, vid_chiflag; int vid_tpw, vid_clw, vid_rainmass, vid_snowmass, vid_icemass, vid_graupel; int vid_ctp, vid_cbp, vid_cld_thick, vid_rainrate, vid_rainflag; int vid_snowrate, vid_preciptype, vid_snowcover, vid_snowwater, vid_seaice; int vid_surfmoist, vid_liqh2o, vid_snowgrain, vid_multiice, vid_firstice; int vid_granulename, vid_version, vid_release; int vid_closeness, vid_distdiff, vid_timediff; FILE *in; num_colls = (size_t)num_collocations; missing_float = -32768.0; // If this is the baseline platform, then create another subgroup // for the collocation information if (platform_index == 0) { sprintf(col_dir_name, "Collocation_Info"); if ((retval = nc_def_grp(nc_date_group, col_dir_name, &collocation_group_id))) { if (retval != -42) ERR(retval); } writeAttributeShort(collocation_group_id, "Baseline_Data_Type", platform_ptr->type); writeAttributeText(collocation_group_id, "Baseline_Platform", platform_ptr->description); writeAttributeShort(collocation_group_id, "Baseline_Platform_ID", platform_ptr->id); } // Create a subgroup for this system platform if ((retval = nc_def_grp(nc_date_group, platform_ptr->dir_name, &nc_group_id))) { //if (retval != -42) ERR(retval); } // Set the platform type attribute to the data group type writeAttributeText(nc_group_id, "Platform_Name", platform_ptr->description); // clean_description? writeAttributeShort(nc_group_id, "Platform_ID", platform_ptr->id); writeAttributeShort(nc_group_id, "Platform_Type", platform_ptr->type); writeAttributeText(nc_group_id, "Platform_Data_Source", "MIRS Version 3"); //writeAttributeText(nc_group_id, "Platform_NPROVS_Source_Name", nprovs_name); writeAttributeText(nc_group_id, "Platform_NPROVS_Source_Name", platform_ptr->description); // clean_description? // Define the dimensions if ((retval = nc_def_dim(nc_group_id, "Num_Collocations", num_colls, &scalar_dim))) ERR(retval); dimid_scalar[0] = scalar_dim; if ((retval = nc_def_dim(nc_group_id, "Levels", 101, &dim_levels))) ERR(retval); dimid_levels[0] = scalar_dim; dimid_levels[1] = dim_levels; if ((retval = nc_def_dim(nc_group_id, "Layers", 100, &dim_layers))) ERR(retval); dimid_layers[0] = scalar_dim; dimid_layers[1] = dim_layers; if ((retval = nc_def_dim(nc_group_id, "Channels", 22, &dim_channels))) ERR(retval); dimid_channels[0] = scalar_dim; dimid_channels[1] = dim_channels; if ((retval = nc_def_dim(nc_group_id, "Num_QC", 4, &dim_qc))) ERR(retval); dimid_qc[0] = scalar_dim; dimid_qc[1] = dim_qc; if (platform_index == 0) { if ((retval = nc_def_dim(collocation_group_id, "Num_Collocations", num_colls, &col_scalar_dim))) ERR(retval); col_dimid_scalar[0] = col_scalar_dim; } // Define the variables vid_lat = defineVariable(nc_group_id, "latitude", NC_FLOAT, 1, dimid_scalar, "units", "degrees_north"); vid_lon = defineVariable(nc_group_id, "longitude", NC_FLOAT, 1, dimid_scalar, "units", "degrees_east"); vid_date = defineVariable(nc_group_id, "date", NC_INT, 1, dimid_scalar, "format", "yyyymmdd"); vid_time = defineVariable(nc_group_id, "time", NC_INT, 1, dimid_scalar, "format", "hhmmss"); vid_loczen = defineVariable(nc_group_id, "local_zenith_angle", NC_FLOAT, 1, dimid_scalar, "units", "degrees"); vid_relazimuth = defineVariable(nc_group_id, "relative_azimuth_angle", NC_FLOAT, 1, dimid_scalar, "units", "degrees"); vid_solzen = defineVariable(nc_group_id, "solar_zenith_angle", NC_FLOAT, 1, dimid_scalar, "units", "degrees"); vid_scanline = defineVariable(nc_group_id, "granule_scan_line", NC_SHORT, 1, dimid_scalar, NULL, NULL); vid_granule = defineVariable(nc_group_id, "granule_number", NC_SHORT, 1, dimid_scalar, NULL, NULL); vid_scanpos = defineVariable(nc_group_id, "scan_position", NC_SHORT, 1, dimid_scalar, NULL, NULL); vid_node = defineVariable(nc_group_id, "orbital_node", NC_BYTE, 1, dimid_scalar, "values", "0=ascending, 1=descending"); vid_scene = defineVariable(nc_group_id, "scene_type", NC_BYTE, 1, dimid_scalar, "values", "0=simple scene, 1=retrieved scene"); vid_press_layer = defineVariable(nc_group_id, "pressure_layers", NC_FLOAT, 2, dimid_layers, "units", "hPa"); vid_press_level = defineVariable(nc_group_id, "pressure_levels", NC_FLOAT, 2, dimid_levels, "units", "hPa"); vid_temp = defineVariable(nc_group_id, "temperature", NC_FLOAT, 2, dimid_layers, "units", "K"); vid_wvmr = defineVariable(nc_group_id, "water_vapor_mixing_ratio", NC_FLOAT, 2, dimid_layers, "units", "g/kg"); vid_clw_prof = defineVariable(nc_group_id, "cloud_liquid_water_profile", NC_FLOAT, 2, dimid_layers, "units", "mm"); vid_rainprof = defineVariable(nc_group_id, "rain_mass_profile", NC_FLOAT, 2, dimid_layers, "units", "mm"); vid_snowprof = defineVariable(nc_group_id, "snow_mass_profile", NC_FLOAT, 2, dimid_layers, "units", "mm"); vid_iceprof = defineVariable(nc_group_id, "ice_mass_profile", NC_FLOAT, 2, dimid_layers, "units", "mm"); vid_graupelprof = defineVariable(nc_group_id, "graupel_mass_profile", NC_FLOAT, 2, dimid_layers, "units", "mm"); vid_emmis = defineVariable(nc_group_id, "emmisivity", NC_FLOAT, 2, dimid_channels, NULL, NULL); vid_chansel = defineVariable(nc_group_id, "channel_selection", NC_SHORT, 2, dimid_channels, NULL, NULL); vid_chan_untemp = defineVariable(nc_group_id, "uncorrected_channel_temperature", NC_FLOAT, 2, dimid_channels, "units", "K"); vid_chan_temp = defineVariable(nc_group_id, "channel_temperature", NC_FLOAT, 2, dimid_channels, "units", "K"); vid_winddir = defineVariable(nc_group_id, "wind_direction", NC_FLOAT, 1, dimid_scalar, NULL, NULL); vid_windspeed = defineVariable(nc_group_id, "wind_speed", NC_FLOAT, 1, dimid_scalar, "units", "m/sec"); vid_skintemp = defineVariable(nc_group_id, "skin_temperature", NC_FLOAT, 1, dimid_scalar, "units", "K"); vid_surfpres = defineVariable(nc_group_id, "surface_pressure", NC_FLOAT, 1, dimid_scalar, "units", "hPa"); vid_terrain = defineVariable(nc_group_id, "surface_type", NC_BYTE, 1, dimid_scalar, "values", "0=sea, 1=sea ice, 2=land, 3=snow"); vid_uwind = defineVariable(nc_group_id, "u_direction_wind_speed", NC_FLOAT, 1, dimid_scalar, "units", "m/sec"); vid_vwind = defineVariable(nc_group_id, "v_direction_wind_speed", NC_FLOAT, 1, dimid_scalar, "units", "m/sec"); vid_qcflag = defineVariable(nc_group_id, "qc_flag", NC_SHORT, 2, dimid_qc, NULL, NULL); vid_chisq = defineVariable(nc_group_id, "convergency_rate_(chi_sq)", NC_FLOAT, 1, dimid_scalar, "values", "less than 3 = good; greater than 10 = bad"); vid_chiflag = defineVariable(nc_group_id, "chi_sq_flag", NC_BYTE, 1, dimid_scalar, "values", "0=good, 1=questionable, 2=bad"); vid_tpw = defineVariable(nc_group_id, "total_precipitable_water", NC_FLOAT, 1, dimid_scalar, "unit", "mm"); vid_clw = defineVariable(nc_group_id, "cloud_liquid_water", NC_FLOAT, 1, dimid_scalar, "unit", "mm"); vid_rainmass = defineVariable(nc_group_id, "integrated_rain_water_path", NC_FLOAT, 1, dimid_scalar, "unit", "mm"); vid_snowmass = defineVariable(nc_group_id, "integrated_snow_water_path", NC_FLOAT, 1, dimid_scalar, "unit", "mm"); vid_icemass = defineVariable(nc_group_id, "integrated_ice_water_path", NC_FLOAT, 1, dimid_scalar, "unit", "mm"); vid_graupel = defineVariable(nc_group_id, "integrated_graupel_water_path", NC_FLOAT, 1, dimid_scalar, "unit", "mm"); vid_ctp = defineVariable(nc_group_id, "cloud_top_pressure", NC_FLOAT, 1, dimid_scalar, "unit", "hPa"); vid_cbp = defineVariable(nc_group_id, "cloud_base_pressure", NC_FLOAT, 1, dimid_scalar, "unit", "hPa"); vid_cld_thick = defineVariable(nc_group_id, "cloud_thickness", NC_FLOAT, 1, dimid_scalar, "unit", "hPa"); vid_rainrate = defineVariable(nc_group_id, "rain_rate", NC_FLOAT, 1, dimid_scalar, "unit", "mm/hr"); vid_rainflag = defineVariable(nc_group_id, "rain_flag", NC_BYTE, 1, dimid_scalar, "values", "0=no rain, 1=rain"); vid_snowrate = defineVariable(nc_group_id, "snow_fall_rate", NC_FLOAT, 1, dimid_scalar, "unit", "mm/hr"); vid_preciptype = defineVariable(nc_group_id, "precipitation_type", NC_BYTE, 1, dimid_scalar, "values", "frozen/liquid"); vid_snowcover = defineVariable(nc_group_id, "snow_cover", NC_BYTE, 1, dimid_scalar, "values", "0/1"); vid_snowwater = defineVariable(nc_group_id, "snow_water_equivalent", NC_FLOAT, 1, dimid_scalar, "unit", "cm"); vid_seaice = defineVariable(nc_group_id, "sea_ice_concentration", NC_FLOAT, 1, dimid_scalar, "unit", "percent"); vid_surfmoist = defineVariable(nc_group_id, "surface_moisture", NC_FLOAT, 1, dimid_scalar, NULL, NULL); vid_liqh2o = defineVariable(nc_group_id, "liquid_water_path", NC_FLOAT, 1, dimid_scalar, "unit", "mm"); vid_snowgrain = defineVariable(nc_group_id, "snow_grain_size", NC_FLOAT, 1, dimid_scalar, "unit", "mm"); vid_multiice = defineVariable(nc_group_id, "multi_year_sea_ice_concentration", NC_FLOAT, 1, dimid_scalar, "unit", "percent"); vid_firstice = defineVariable(nc_group_id, "first_year_sea_ice_concentration", NC_FLOAT, 1, dimid_scalar, "unit", "percent"); vid_granulename = defineVariable(nc_group_id, "granule_file_name", NC_STRING, 1, dimid_scalar, "string_length", "101"); vid_version = defineVariable(nc_group_id, "program_version_number", NC_FLOAT, 1, dimid_scalar, NULL, NULL); vid_release = defineVariable(nc_group_id, "program_release_number", NC_FLOAT, 1, dimid_scalar, NULL, NULL); vid_closeness = defineVariable(nc_group_id, "nprovs_closeness_value", NC_FLOAT, 1, dimid_scalar, NULL, NULL); vid_distdiff = defineVariable(nc_group_id, "nprovs_distance_difference", NC_FLOAT, 1, dimid_scalar, NULL, NULL); vid_timediff = defineVariable(nc_group_id, "nprovs_time_difference", NC_FLOAT, 1, dimid_scalar, NULL, NULL); if (platform_index == 0) { col_vid_lat = defineVariable(collocation_group_id, "latitude", NC_FLOAT, 1, col_dimid_scalar, "units", "degrees_north"); col_vid_lon = defineVariable(collocation_group_id, "longitude", NC_FLOAT, 1, col_dimid_scalar, "units", "degrees_east"); col_vid_date = defineVariable(collocation_group_id, "date", NC_INT, 1, col_dimid_scalar, "format", "yyyymmdd"); col_vid_time = defineVariable(collocation_group_id, "time", NC_INT, 1, col_dimid_scalar, "format", "hhmmss"); } // Allocate the memory used by the data buffer buffer = (short *)malloc(platform_ptr->length); collocation_num = -1; // Loop through each record in all of the files and read the data for // this data group into the buffer for (date_type=0; date_type<3; date_type++) { if (date_type == 0) { if ((in=fopen("prev_day.file", "r")) == NULL) { printf("\n\nThe previous day file could not be opened for input.\n"); printf("It will be skipped.\n\n"); in = NULL; } } else if (date_type == 1) { if ((in=fopen("in.file", "r")) == NULL) { printf("\n\nThe input file could not be opened for input.\n"); printf("It will be skipped.\n\n"); in = NULL; } } else { if ((in=fopen("next_day.file", "r")) == NULL) { printf("\n\nThe next day file could not be opened for input.\n"); printf("It will be skipped.\n\n"); in = NULL; } } for (recnum=0; recnumoffset; fseek(in, offset, SEEK_SET); fread(buffer, platform_ptr->length, 1, in); // Process this record if it matches the date to process if (files[date_type].use_record[recnum] == TRUE) { collocation_num++; // Index and num_vals are used to save a single value within the // variable array index[0] = collocation_num; num_vals[0] = 1; index_2D[0] = collocation_num; index_2D[1] = 0; num_vals_2D[0] = 1; num_vals_2D[1] = 100; // Latitude and longitude if (buffer[3] != -32768) latitude = buffer[3] / 128.0; else latitude = -32768.0; if (buffer[4] != -32768) longitude = buffer[4] / 128.0; else longitude = -32768.0; writeVariableFloat(nc_group_id, vid_lat, index, num_vals, latitude); writeVariableFloat(nc_group_id, vid_lon, index, num_vals, longitude); // Date and time year = buffer[5]; month = buffer[6] / 100; day = buffer[6] % 100; hour = buffer[7]; minute = buffer[8] / 100; second = buffer[8] % 100; if ((buffer[5] != -32768) && (buffer[6] != -32768)) yyyymmdd = (year * 10000) + (month * 100) + day; else yyyymmdd = -32768; if ((buffer[7] != -32768) && (buffer[8] != -32768)) hhmmss = (hour * 10000) + (minute * 100) + second; else hhmmss = -32768; writeVariableInteger(nc_group_id, vid_date, index, num_vals, yyyymmdd); writeVariableInteger(nc_group_id, vid_time, index, num_vals, hhmmss); // If this is the baseline system, save the collocation information if (platform_index == 0) { writeVariableFloat(collocation_group_id, col_vid_lat, index, num_vals, latitude); writeVariableFloat(collocation_group_id, col_vid_lon, index, num_vals, longitude); writeVariableInteger(collocation_group_id, col_vid_date, index, num_vals, yyyymmdd); writeVariableInteger(collocation_group_id, col_vid_time, index, num_vals, hhmmss); } // Save the tpw and skin temperature if (buffer[11] != -32768) writeVariableFloat(nc_group_id, vid_loczen, index, num_vals, (buffer[11]/10.0)); else writeVariableFloat(nc_group_id, vid_loczen, index, num_vals, -32768.0); if (buffer[12] != -32768) writeVariableFloat(nc_group_id, vid_relazimuth, index, num_vals, (buffer[12]/10.0)); else writeVariableFloat(nc_group_id, vid_relazimuth, index, num_vals, -32768.0); if (buffer[13] != -32768) writeVariableFloat(nc_group_id, vid_solzen, index, num_vals, (buffer[13]/10.0)); else writeVariableFloat(nc_group_id, vid_solzen, index, num_vals, -32768.0); writeVariableShort(nc_group_id, vid_scanline, index, num_vals, buffer[14]); writeVariableShort(nc_group_id, vid_granule, index, num_vals, buffer[15]); writeVariableShort(nc_group_id, vid_scanpos, index, num_vals, buffer[16]); if (buffer[17] != -32768) writeVariableByte(nc_group_id, vid_node, index, num_vals, (char)buffer[17]); else writeVariableByte(nc_group_id, vid_node, index, num_vals, (char)-128); if (buffer[18] != -32768) writeVariableByte(nc_group_id, vid_scene, index, num_vals, (char)buffer[18]); else writeVariableByte(nc_group_id, vid_scene, index, num_vals, (char)-128); // QC values for (n=0; n<4; n++) { if (buffer[1056+n] != -32768) qc_values[n] = buffer[1056+n]; else qc_values[n] = -32768; } index_2D[0] = collocation_num; index_2D[1] = 0; num_vals_2D[0] = 1; num_vals_2D[1] = 4; writeArrayShort(nc_group_id, vid_qcflag, index_2D, num_vals_2D, qc_values); // Pressures layers for (n=0; n<100; n++) { if (buffer[20+n] == -32768) layer_values[n] = -32768.0; else if (n < 30) layer_values[n] = buffer[20+n] / 1000.0; else layer_values[n] = buffer[20+n] / 10.0; } index_2D[0] = collocation_num; index_2D[1] = 0; num_vals_2D[0] = 1; num_vals_2D[1] = 100; writeArrayFloat(nc_group_id, vid_press_layer, index_2D, num_vals_2D, layer_values); // Pressures levels for (n=0; n<101; n++) { if (buffer[120+n] == -32768) level_values[n] = -32768.0; else if (n < 30) level_values[n] = buffer[120+n] / 1000.0; else level_values[n] = buffer[120+n] / 10.0; } index_2D[0] = collocation_num; index_2D[1] = 0; num_vals_2D[0] = 1; num_vals_2D[1] = 101; writeArrayFloat(nc_group_id, vid_press_level, index_2D, num_vals_2D, level_values); // Temperatures for (n=0; n<100; n++) { if (buffer[221+n] == -32768) layer_values[n] = -32768.0; else layer_values[n] = buffer[221+n] / 64.0; } index_2D[0] = collocation_num; index_2D[1] = 0; num_vals_2D[0] = 1; num_vals_2D[1] = 100; writeArrayFloat(nc_group_id, vid_temp, index_2D, num_vals_2D, layer_values); // Water vapor mixing ratio for (n=0; n<100; n++) { if (buffer[321+n] == -32768) layer_values[n] = -32768.0; else layer_values[n] = (float)(exp(buffer[321+n]/1024.0)); //printf("MIRS WVMR: %d %d %d %f\n", recnum, n, buffer[321+n], layer_values[n]); } writeArrayFloat(nc_group_id, vid_wvmr, index_2D, num_vals_2D, layer_values); // Cloud liquid water for (n=0; n<100; n++) { if ((buffer[521+n] == -32768) || (buffer[521+n] == 0)) layer_values[n] = -32768.0; else layer_values[n] = buffer[521+n] / 100.0; } writeArrayFloat(nc_group_id, vid_clw_prof, index_2D, num_vals_2D, layer_values); // Rain mass for (n=0; n<100; n++) { if (buffer[621+n] == -32768) layer_values[n] = -32768.0; else layer_values[n] = buffer[621+n] / 100.0; } writeArrayFloat(nc_group_id, vid_rainprof, index_2D, num_vals_2D, layer_values); // Snow mass for (n=0; n<100; n++) { if (buffer[721+n] == -32768) layer_values[n] = -32768.0; else layer_values[n] = buffer[721+n] / 100.0; } writeArrayFloat(nc_group_id, vid_snowprof, index_2D, num_vals_2D, layer_values); // Ice mass for (n=0; n<100; n++) { if (buffer[821+n] == -32768) layer_values[n] = -32768.0; else layer_values[n] = buffer[821+n] / 100.0; } writeArrayFloat(nc_group_id, vid_iceprof, index_2D, num_vals_2D, layer_values); // Graupel mass for (n=0; n<100; n++) { if (buffer[921+n] == -32768) layer_values[n] = -32768.0; else layer_values[n] = buffer[921+n] / 100.0; } writeArrayFloat(nc_group_id, vid_graupelprof, index_2D, num_vals_2D, layer_values); // Emmisivity for (n=0; n<22; n++) { if (buffer[1021+n] == -32768) channels[n] = -32768.0; else channels[n] = buffer[1021+n] / 100.0; } index_2D[0] = collocation_num; index_2D[1] = 0; num_vals_2D[0] = 1; num_vals_2D[1] = 22; writeArrayFloat(nc_group_id, vid_emmis, index_2D, num_vals_2D, channels); // Channel selection for (n=0; n<22; n++) { channels[n] = buffer[1088+n]; } writeArrayShort(nc_group_id, vid_chansel, index_2D, num_vals_2D, channels); // Uncorrected channel temperatures for (n=0; n<22; n++) { if (buffer[1110+n] == -32768) channels[n] = -32768.0; else channels[n] = buffer[1110+n] / 64.0; } writeArrayFloat(nc_group_id, vid_chan_untemp, index_2D, num_vals_2D, channels); // Channel temperatures for (n=0; n<22; n++) { if (buffer[1132+n] == -32768) channels[n] = -32768.0; else channels[n] = buffer[1132+n] / 64.0; } writeArrayFloat(nc_group_id, vid_chan_temp, index_2D, num_vals_2D, channels); // Wind direction and other variables if (buffer[1049] != -32768) writeVariableFloat(nc_group_id, vid_winddir, index, num_vals, (buffer[1049]/100.0)); else writeVariableFloat(nc_group_id, vid_winddir, index, num_vals, -32768.0); if (buffer[1050] != -32768) writeVariableFloat(nc_group_id, vid_windspeed, index, num_vals, (buffer[1050]/100.0)); else writeVariableFloat(nc_group_id, vid_windspeed, index, num_vals, -32768.0); if (buffer[1051] != -32768) writeVariableFloat(nc_group_id, vid_skintemp, index, num_vals, (buffer[1051]/64.0)); else writeVariableFloat(nc_group_id, vid_skintemp, index, num_vals, -32768.0); if (buffer[1052] != -32768) writeVariableFloat(nc_group_id, vid_surfpres, index, num_vals, (buffer[1052]/10.0)); else writeVariableFloat(nc_group_id, vid_surfpres, index, num_vals, -32768.0); if (buffer[1053] != -32768) writeVariableByte(nc_group_id, vid_terrain, index, num_vals, (char)buffer[1053]); else writeVariableByte(nc_group_id, vid_terrain, index, num_vals, (char)-128); if (buffer[1054] != -32768) writeVariableFloat(nc_group_id, vid_uwind, index, num_vals, (buffer[1054]/100.0)); else writeVariableFloat(nc_group_id, vid_uwind, index, num_vals, -32768.0); if (buffer[1055] != -32768) writeVariableFloat(nc_group_id, vid_vwind, index, num_vals, (buffer[1055]/100.0)); else writeVariableFloat(nc_group_id, vid_vwind, index, num_vals, -32768.0); // if (buffer[1056] != -32768) // writeVariableByte(nc_group_id, vid_qcflag, index, num_vals, (char)buffer[1056]); // else // writeVariableByte(nc_group_id, vid_qcflag, index, num_vals, (char)-128); if (buffer[1071] != -32768) writeVariableFloat(nc_group_id, vid_chisq, index, num_vals, (buffer[1071]/10.0)); else writeVariableFloat(nc_group_id, vid_chisq, index, num_vals, -32768.0); if (buffer[1072] != -32768) writeVariableByte(nc_group_id, vid_chiflag, index, num_vals, (char)buffer[1072]); else writeVariableByte(nc_group_id, vid_chiflag, index, num_vals, (char)-128); if (buffer[1160] != -32768) writeVariableFloat(nc_group_id, vid_tpw, index, num_vals, (buffer[1160]/10.0)); else writeVariableFloat(nc_group_id, vid_tpw, index, num_vals, -32768.0); if (buffer[1161] != -32768) writeVariableFloat(nc_group_id, vid_clw, index, num_vals, (buffer[1161]/100.0)); else writeVariableFloat(nc_group_id, vid_clw, index, num_vals, -32768.0); if (buffer[1162] != -32768) writeVariableFloat(nc_group_id, vid_rainmass, index, num_vals, (buffer[1162]/100.0)); else writeVariableFloat(nc_group_id, vid_rainmass, index, num_vals, -32768.0); if (buffer[1163] != -32768) writeVariableFloat(nc_group_id, vid_snowmass, index, num_vals, (buffer[1163]/100.0)); else writeVariableFloat(nc_group_id, vid_snowmass, index, num_vals, -32768.0); if (buffer[1164] != -32768) writeVariableFloat(nc_group_id, vid_icemass, index, num_vals, (buffer[1164]/100.0)); else writeVariableFloat(nc_group_id, vid_icemass, index, num_vals, -32768.0); if (buffer[1165] != -32768) writeVariableFloat(nc_group_id, vid_graupel, index, num_vals, (buffer[1165]/100.0)); else writeVariableFloat(nc_group_id, vid_graupel, index, num_vals, -32768.0); if (buffer[1166] != -32768) writeVariableFloat(nc_group_id, vid_ctp, index, num_vals, (buffer[1166]/10.0)); else writeVariableFloat(nc_group_id, vid_ctp, index, num_vals, -32768.0); if (buffer[1167] != -32768) writeVariableFloat(nc_group_id, vid_cbp, index, num_vals, (buffer[1167]/10.0)); else writeVariableFloat(nc_group_id, vid_cbp, index, num_vals, -32768.0); if (buffer[1168] != -32768) writeVariableFloat(nc_group_id, vid_cld_thick, index, num_vals, (buffer[1168]/10.0)); else writeVariableFloat(nc_group_id, vid_cld_thick, index, num_vals, -32768.0); // Rain rate if (buffer[1169] != -32768) writeVariableFloat(nc_group_id, vid_rainrate, index, num_vals, (buffer[1169]/10.0)); else writeVariableFloat(nc_group_id, vid_rainrate, index, num_vals, -32768.0); if (buffer[1170] != -32768) writeVariableByte(nc_group_id, vid_rainflag, index, num_vals, (char)buffer[1170]); else writeVariableByte(nc_group_id, vid_rainflag, index, num_vals, (char)-128); if (buffer[1171] != -32768) writeVariableFloat(nc_group_id, vid_snowrate, index, num_vals, (buffer[1171]/100.0)); else writeVariableFloat(nc_group_id, vid_snowrate, index, num_vals, -32768.0); if (buffer[1172] != -32768) writeVariableByte(nc_group_id, vid_preciptype, index, num_vals, (char)buffer[1172]); else writeVariableByte(nc_group_id, vid_preciptype, index, num_vals, (char)-128); if (buffer[1173] != -32768) writeVariableByte(nc_group_id, vid_snowcover, index, num_vals, (char)buffer[1173]); else writeVariableByte(nc_group_id, vid_snowcover, index, num_vals, (char)-128); if (buffer[1174] != -32768) writeVariableFloat(nc_group_id, vid_snowwater, index, num_vals, (buffer[1174]/100.0)); else writeVariableFloat(nc_group_id, vid_snowwater, index, num_vals, -32768.0); if (buffer[1175] != -32768) writeVariableFloat(nc_group_id, vid_seaice, index, num_vals, (buffer[1175]/1.0)); else writeVariableFloat(nc_group_id, vid_seaice, index, num_vals, -32768.0); // Surface moisture if (buffer[1176] != -32768) writeVariableFloat(nc_group_id, vid_surfmoist, index, num_vals, (buffer[1176]/10.0)); else writeVariableFloat(nc_group_id, vid_surfmoist, index, num_vals, -32768.0); if (buffer[1177] != -32768) writeVariableFloat(nc_group_id, vid_liqh2o, index, num_vals, (buffer[1177]/100.0)); else writeVariableFloat(nc_group_id, vid_liqh2o, index, num_vals, -32768.0); if (buffer[1178] != -32768) writeVariableFloat(nc_group_id, vid_snowgrain, index, num_vals, (buffer[1178]/100.0)); else writeVariableFloat(nc_group_id, vid_snowgrain, index, num_vals, -32768.0); if (buffer[1179] != -32768) writeVariableFloat(nc_group_id, vid_multiice, index, num_vals, (buffer[1179]/1.0)); else writeVariableFloat(nc_group_id, vid_multiice, index, num_vals, -32768.0); if (buffer[1180] != -32768) writeVariableFloat(nc_group_id, vid_firstice, index, num_vals, (buffer[1180]/1.0)); else writeVariableFloat(nc_group_id, vid_firstice, index, num_vals, -32768.0); // Granule file name for (i=0; i<100; i++) granule_name[i] = (char)buffer[2285+i]; granule_name[100] = '\0'; string[0] = granule_name; if (retval = nc_put_vara_string(nc_group_id, vid_granulename, index, num_vals, (const char **)string)) ERR(retval); // Program version if (buffer[2385] != -32768) writeVariableFloat(nc_group_id, vid_version, index, num_vals, (buffer[2385]/100.0)); else writeVariableFloat(nc_group_id, vid_version, index, num_vals, -32768.0); if (buffer[2386] != -32768) writeVariableFloat(nc_group_id, vid_release, index, num_vals, (buffer[2386]/100.0)); else writeVariableFloat(nc_group_id, vid_release, index, num_vals, -32768.0); if (buffer[2397] != -32768) writeVariableFloat(nc_group_id, vid_closeness, index, num_vals, (buffer[2397]/1.0)); else writeVariableFloat(nc_group_id, vid_closeness, index, num_vals, -32768.0); if (buffer[2398] != -32768) writeVariableFloat(nc_group_id, vid_distdiff, index, num_vals, (buffer[2398]/1.0)); else writeVariableFloat(nc_group_id, vid_distdiff, index, num_vals, -32768.0); if (buffer[2399] != -32768) writeVariableFloat(nc_group_id, vid_timediff, index, num_vals, (buffer[2399]/1.0)); else writeVariableFloat(nc_group_id, vid_timediff, index, num_vals, -32768.0); } // if (yyyymmdd == date_to_process... } // for (recnum=0... if (in != NULL) fclose(in); } // for (date_type=0... // Free the memory used by the buffer free(buffer); } // end of file