int f_grib_out_irr(ARG2) { float *data_tmp; int all, i, j; unsigned int n; unsigned char *gds, *old_gds, *p; if (mode == -1) { latlon = decode = 1; if (strcmp(arg1,"defined") && strcmp(arg1,"all")) fatal_error("grib_out_irr: %s should be all or defined", arg1); *local = (void *) ffopen(arg2, file_append? "ab" : "wb" ); if (*local == NULL) fatal_error("Could not open %s", arg2); return 0; } if (mode == -2) { ffclose((FILE *) *local); return 0; } if (lat == NULL || lon == NULL) fatal_error("grid_out_irr: failed, no lat-lon information",""); all = strcmp(arg1,"all") == 0; if (all) { n = ndata; } else { for (i = n = 0; i < ndata; i++) { if (DEFINED_VAL(data[i])) n++; } } if (n == 0) { fprintf(stderr,"grib_out_irr: no grid points to write out, no write\n"); return 0; } if ((gds = (unsigned char *) malloc(n * 8 + 30)) == NULL) fatal_error("grib_out_irr: memory allocation",""); if ((data_tmp = (float *) malloc(n* sizeof(float))) == NULL) fatal_error("grib_out_irr: memory allocation",""); /* sec3 = grid defintion */ uint_char(30+n*8, gds); gds[4] = 3; // sec3 gds[5] = 0; // use table 3.1 uint_char(n, gds+6); gds[10] = 0; // no optional list octets gds[11] = 0; uint2_char(130, gds+12); p = code_table_3_2_location(sec); if (p == NULL) { // no earth descripition for (i = 14; i < 30; i++) { gds[i] = 255; } } else { for (i = 14; i < 30; i++) { gds[i] = p[i-14]; } } if (all) { for (i = 0; i < ndata; i++) { int_char( (int) (lat[i] * 1000000.0), gds + 30 + i*8); int_char( (int) (lon[i] * 1000000.0), gds + 34 + i*8); data_tmp[i] = data[i]; } } else { for (j = i = 0; i < ndata; i++) { if (DEFINED_VAL(data[i])) { int_char( (int) (lat[i] * 1000000.0), gds + 30 + j*8); int_char( (int) (lon[i] * 1000000.0), gds + 34 + j*8); data_tmp[j++] = data[i]; } } } old_gds = sec[3]; sec[3] = gds; grib_wrt(sec, data_tmp, n, n, 1, use_scale, dec_scale, bin_scale, wanted_bits, max_bits, grib_type, (FILE *) *local); sec[3] = old_gds; if (flush_mode) fflush((FILE *) *local); free(data_tmp); free(gds); return 0; }
int ieee_grib_out(unsigned char **sec, float *data, unsigned int ndata, FILE *out) { unsigned int n_defined, i; int j; unsigned char *p, *sec0, *sec1, *sec2, *sec3, *sec4, *sec5, *sec6, *sec7; #ifdef IEEE_BITMAP float *data_tmp; #endif /* required passed sections */ sec0 = sec[0]; sec1 = sec[1]; sec2 = sec[2]; sec3 = sec[3]; sec4 = sec[4]; /* make a new section 6 */ #ifdef IEEE_BITMAP data_tmp = (float *) malloc(ndata * sizeof(float)); for (i = 0; i < ndata; i++) { data_tmp[i] = data[i]; } n_defined = ndata; sec6 = mk_bms(data_tmp, &n_defined); // make bitmap section if (sec6 == NULL) fatal_error("grib_out ieee memory allocation sec6",""); #else n_defined = ndata; sec6 = (unsigned char *) malloc(6); if (sec6 == NULL) fatal_error("grib_out ieee memory allocation sec6",""); uint_char(6 * sizeof (unsigned char), sec6); sec6[4] = 6; // section 5 sec6[5] = 255; // no bitmap #endif /* data representation section */ sec5 = (unsigned char *) malloc(12 * sizeof(unsigned char)); if (sec5 == NULL) fatal_error("grib_out ieee memory allocation sec5",""); uint_char(12 * sizeof (unsigned char), sec5); sec5[4] = 5; // section 5 uint_char(ndata, sec5+5); // number of points uint2_char(4,sec5+9); // data template 4 sec5[11] = 1; // precision: ieee 32-bit /* data section */ sec7 = (unsigned char *) malloc(5 + n_defined * 4); if (sec7 == NULL) fatal_error("grib_out ieee memory allocation sec7",""); uint_char(5+n_defined*4, sec7); sec7[4] = 7; p = sec7 + 5; j = 0; for (i = 0; i < n_defined; i++) { #ifdef IEEE_BITMAP flt2ieee_nan(data_tmp[i], p); #else flt2ieee_nan(data[i], p); #endif p += 4; } #ifdef IEEE_BITMAP free(data_tmp); #endif j = wrt_sec(sec0, sec1, sec2, sec3, sec4, sec5, sec6, sec7, out); free(sec5); free(sec6); free(sec7); return j; }
int grib_ieee(unsigned char **sec, float *data, unsigned int ndata, FILE *out, FILE *head, FILE *tail, FILE *c) { int i; unsigned int n_defined, j; // int flag; unsigned long int size; unsigned char *p, *sec0, *sec1, *sec2, *sec3, *sec4, *sec5, *sec6, *sec7; unsigned char s[8]; float *new_data; /* required passed sections */ sec0 = sec[0]; sec1 = sec[1]; sec2 = sec[2]; sec3 = sec[3]; sec4 = sec[4]; /* change scan mode */ // flag = flag_table_3_4(sec); // set_order(sec, output_order); /* make a new section 6 */ n_defined = ndata; sec6 = (unsigned char *) malloc(6); if (sec6 == NULL) fatal_error("grib_out ieee memory allocation sec6",""); uint_char(6 * sizeof (unsigned char), sec6); sec6[4] = 6; // section 5 sec6[5] = 255; // no bitmap /* data representation section */ sec5 = (unsigned char *) malloc(12 * sizeof(unsigned char)); if (sec5 == NULL) fatal_error("grib_out ieee memory allocation sec5",""); uint_char(12 * sizeof (unsigned char), sec5); sec5[4] = 5; // section 5 uint_char(ndata, sec5+5); // number of points uint2_char(4,sec5+9); // data template 4 sec5[11] = 1; // precision: ieee 32-bit /* data section */ new_data = (float *) malloc(n_defined * sizeof(float)); if (new_data == NULL) fatal_error("grib_out ieee memory allocation data",""); undo_output_order(data, new_data, n_defined); sec7 = (unsigned char *) malloc(5 + n_defined * 4); if (sec7 == NULL) fatal_error("grib_out ieee memory allocation sec7",""); uint_char(5+n_defined*4, sec7); sec7[4] = 7; p = sec7 + 5; for (j = 0; j < n_defined; j++) { flt2ieee_nan(new_data[j], p); p += 4; } free(new_data); size = (unsigned long int) GB2_Sec0_size + GB2_Sec8_size + (sec1 ? uint4(sec1) : 0) + (sec2 ? uint4(sec2) : 0) + (sec3 ? uint4(sec3) : 0) + (sec4 ? uint4(sec4) : 0) + (sec5 ? uint4(sec5) : 0) + (sec6 ? uint4(sec6) : 0) + (sec7 ? uint4(sec7) : 0); fprintf(c,"unsigned char head[] = {"); /* section 0 */ fwrite((void *) sec0, sizeof(char), 8, out); fwrite((void *) sec0, sizeof(char), 8, head); output_c(c, sec0, 8); uint8_char(size, s); fwrite((void *) s, sizeof(char), 8, out); fwrite((void *) s, sizeof(char), 8, head); output_c(c, s, 8); fwrite((void *)sec1, sizeof(char), uint4(sec1), out); fwrite((void *)sec1, sizeof(char), uint4(sec1), head); output_c(c, sec1, uint4(sec1)); if (sec2) fwrite((void *)sec2, sizeof(char), uint4(sec2), out); if (sec2) fwrite((void *)sec2, sizeof(char), uint4(sec2), head); if (sec2) output_c(c, sec2, uint4(sec2)); if (sec3) fwrite((void *)sec3, sizeof(char), uint4(sec3), out); if (sec3) fwrite((void *)sec3, sizeof(char), uint4(sec3), head); if (sec3) output_c(c, sec3, uint4(sec3)); if (sec4) fwrite((void *)sec4, sizeof(char), uint4(sec4), out); if (sec4) fwrite((void *)sec4, sizeof(char), uint4(sec4), head); if (sec4) output_c(c, sec4, uint4(sec4)); if (sec5) fwrite((void *)sec5, sizeof(char), uint4(sec5), out); if (sec5) fwrite((void *)sec5, sizeof(char), uint4(sec5), head); if (sec5) output_c(c, sec5, uint4(sec5)); if (sec6) fwrite((void *)sec6, sizeof(char), uint4(sec6), out); if (sec6) fwrite((void *)sec6, sizeof(char), uint4(sec6), head); if (sec6) output_c(c, sec6, uint4(sec6)); if (sec7) fwrite((void *)sec7, sizeof(char), uint4(sec7), out); if (sec7) fwrite((void *)sec7, sizeof(char), 5, head); if (sec7) output_c(c, sec7, 5); fprintf(c,"};\n\n"); s[0] = s[1] = s[2] = s[3] = 55; /* s = "7777" */ fprintf(c,"unsigned char tail[4] = {55, 55, 55, 55};\n\n"); fwrite((void *) s, sizeof(char), 4, out); fwrite((void *) s, sizeof(char), 4, tail); fprintf(c,"#define NDATA %u\n", ndata); i = 0; fprintf(c,"#define SEC0 0\n"); fprintf(c,"#define DISCIPLINE %d\n",6); fprintf(c,"#define EDITION %d\n",7); i = 16; fprintf(c,"#define SEC1 %d\n",i); fprintf(c,"#define CENTER %d\n",i+5); fprintf(c,"#define SUBCENTER %d\n",i+7); fprintf(c,"#define MASTERTABLE %d\n",i+9); fprintf(c,"#define LOCALTABLE %d\n",i+9); fprintf(c,"#define YEAR %d\n",i+12); fprintf(c,"#define MONTH %d\n",i+14); fprintf(c,"#define DAY %d\n",i+15); fprintf(c,"#define HOUR %d\n",i+16); fprintf(c,"#define MINUTE %d\n",i+17); fprintf(c,"#define SECOND %d\n",i+18); i = i + uint4(sec1); if (sec2) { fprintf(c,"#define SEC2 %d\n",i); i = i + uint4(sec2); } if (sec3) { fprintf(c,"#define SEC3 %d\n",i); i = i + uint4(sec3); } if (sec4) { fprintf(c,"#define SEC4 %d\n",i); fprintf(c,"#define PRODUCTDEFTEMPLATENUM %d\n",i+7); fprintf(c,"#define PRODUCTDEFTEMPLATE %d\n",i+9); fprintf(c,"#define PRODUCTCATEGORY %d\n",i+9); fprintf(c,"#define PRODUCTNUMBER %d\n",i+9); i = i + uint4(sec4); } if (sec5) { fprintf(c,"#define SEC5 %d\n",i); i = i + uint4(sec5); } if (sec6) { fprintf(c,"#define SEC6 %d\n",i); i = i + uint4(sec6); } if (sec7) { fprintf(c,"#define SEC7 %d\n",i); i = i + uint4(sec4); } free(sec5); free(sec6); free(sec7); // /* set scan mode to original order */ // set_flag_table_3_4(sec, flag); return 0; }
/* * HEADER:100:irr_grid:output:3:make irregular grid, nearest neighbor, X=lon-lat list Y=radius (km) Z=output grib file */ int f_irr_grid(ARG3) { int i, k, m; struct local_struct { int ngrid; double *lon_lat_list, radius; FILE *out; int *iptr; int last_GDS_change_no; }; struct local_struct *save; const char *t; unsigned char *p; double tmp; float *array; unsigned char *new_sec[8], *new_sec3; /* initialization phase */ if (mode == -1) { decode = latlon = 1; *local = save = (struct local_struct *)malloc( sizeof(struct local_struct)); if (save == NULL) fatal_error("irr_grid: memory allocation",""); /* count number of colons */ t = arg1; i = 0; while (*t) { if (*t++ == ':') i++; } if (i % 2 != 1) fatal_error("irr_grid: need lon0:lat0:lon1:lat1:..:lonN:latN",""); save->ngrid = (i + 1)/2; save->lon_lat_list = (double *) malloc(save->ngrid * 2 * sizeof(double)); save->iptr = (int *) malloc(save->ngrid * sizeof(int)); if (save->lon_lat_list == NULL || save->iptr == NULL ) fatal_error("irr_grid: memory allocation",""); t = arg1; k = sscanf(t, "%lf%n", &tmp, &m); if (k != 1) fatal_error("irr_grid: lat-lon list, %s",t); save->lon_lat_list[0] = tmp; t += m; for (i = 1; i < 2*save->ngrid; i++) { k = sscanf(t, ":%lf%n", &tmp, &m); if (k != 1) fatal_error("irr_grid: lat-lon list, %s",t); save->lon_lat_list[i] = tmp; t += m; } for (i = 0 ; i < save->ngrid; i++) { tmp = save->lon_lat_list[i*2]; if (tmp < 0.0) save->lon_lat_list[i*2] = tmp + 360.0; if (tmp > 360.0) save->lon_lat_list[i*2] = tmp - 360.0; if (fabs(save->lon_lat_list[i*2+1]) > 90.0) fatal_error("irr_grid: bad latitude",""); } if (sscanf(arg2,"%lf",&(save->radius)) != 1) fatal_error("irr_grid: radius %s", arg2); if ((save->out = ffopen(arg3, file_append ? "ab" : "wb" )) == NULL) fatal_error("irr_grid could not open file %s", arg3); } if (mode < 0) return 0; save = (struct local_struct *) *local; if (save->last_GDS_change_no != GDS_change_no) { save->last_GDS_change_no = GDS_change_no; if (lat == NULL || lon == NULL || data == NULL) fatal_error("irr_grid: no val",""); /* find the nearest points for the grid */ closest_init(sec); for (i = 0; i < save->ngrid; i++) { save->iptr[i] = closest(sec, save->lon_lat_list[i*2+1], save->lon_lat_list[i*2]); } } array = (float *) malloc(save->ngrid * sizeof(float)); new_sec3 = (unsigned char *) malloc((30+8*save->ngrid) * sizeof(unsigned char)); if (array == NULL || new_sec3 == NULL) fatal_error("irr_grid: memory allocation",""); /* sec3 = grid defintion */ uint_char(30+save->ngrid*8, new_sec3); new_sec3[4] = 3; // sec3 new_sec3[5] = 0; // use table 3.1 uint_char(save->ngrid, new_sec3+6); new_sec3[10] = 0; // no optional list octets new_sec3[11] = 0; uint2_char(130, new_sec3+12); p = code_table_3_2_location(sec); if (p == NULL) { // no earth descripition for (i = 14; i < 30; i++) { new_sec3[i] = 255; } } else { for (i = 14; i < 30; i++) { new_sec3[i] = p[i-14]; } } /* make new_sec[] with new grid definition */ for (i = 0; i < 8; i++) new_sec[i] = sec[i]; new_sec[3] = new_sec3; for (i = 0; i < save->ngrid; i++) { array[i] = save->iptr[i] >= 0 ? data[save->iptr[i]] : UNDEFINED; int_char( (int) (save->lon_lat_list[i*2+1] * 1000000.0), new_sec3 + 30 + i*8); uint_char( (int) (save->lon_lat_list[i*2] * 1000000.0), new_sec3 + 34 + i*8); } grib_wrt(new_sec, array, save->ngrid, save->ngrid, 1, use_scale, dec_scale, bin_scale, wanted_bits, max_bits, grib_type, save->out); free(array); free(new_sec3); return 0; }