static void compare_files(const char* file1,const char* file2,FILE* out) { FILE *f1 = fopen(file1,"r"); FILE *f2 = fopen(file2,"r"); int e1 = 0; int e2 = 0; grib_handle *h1; grib_handle *h2; const void* b1; const void* b2; size_t s1; size_t s2; int count = 0; if(!f1) { perror(file1); exit(1); } if(!f2) { perror(file2); exit(1); } h1 = grib_handle_new_from_file(NULL,f1,&e1); h2 = grib_handle_new_from_file(NULL,f2,&e2); while(h1 && h2) { ++count; GRIB_CHECK(grib_get_message(h1,&b1,&s1),file1); GRIB_CHECK(grib_get_message(h2,&b2,&s2),file2); compare_handles(count,h1,h2,out); grib_handle_delete(h1); grib_handle_delete(h2); e1 = e2 = 0; h1 = grib_handle_new_from_file(NULL,f1,&e1); h2 = grib_handle_new_from_file(NULL,f2,&e2); } GRIB_CHECK(e1,file1); GRIB_CHECK(e2,file2); if(h1 != h2) { fprintf(stderr,"%s: Premature eof on %s\n",prog,h1 == 0 ? file1 : file2); exit(1); } }
int main(int argc, char *argv[]) { FILE *f=NULL; char* infname=NULL; int ret=0; grib_context* gc; grib_handle* h; FILE* of=NULL; const void* buffer=NULL; size_t size=0; char* ofname=NULL; if ( argc < 3 ) usage(argv[0]); infname=argv[1]; ofname=argv[2]; f = fopen(infname,"r"); if(!f) { perror(infname); exit(1); } gc = grib_context_get_default(); h=grib_handle_new(gc); if (!h) { printf("Error: unable to create handle\n"); exit(1); } GRIB_CHECK(grib_load_from_text_file(h,f),infname); if(fclose(f)) { perror(infname); exit(1); } of = fopen(ofname,"w"); if(!of) { perror(ofname); exit(1); } grib_get_message(h,&buffer,&size); if(fwrite(buffer,1,size,of) != size) { perror(ofname); exit(1); } if(fclose(of)) { perror(ofname); exit(1); } return ret; }
int dump_file(const char* file,const char* out) { FILE *f = fopen(file,"r"); FILE *o = fopen(out,"w"); int e = 0; grib_handle *h; const void* b; size_t s; int count = 0; char identifier[10]; size_t size = sizeof(identifier); if(!f) { perror(file); exit(1); } h = grib_handle_new_from_file(NULL,f,&e); while(h) { GRIB_CHECK(grib_get_message(h,&b,&s),file); GRIB_CHECK(grib_get_string(h,"identifier",identifier,&size),file); ++count; fprintf(o,"%s { # %d\n",identifier,count); dump_handle(o,h); fprintf(o,"};\n"); grib_handle_delete(h); e = 0; h = grib_handle_new_from_file(NULL,f,&e); } GRIB_CHECK(e,file); return 0; }
size_t grib_handle_write(grib_handle* h,char* filename) { FILE* of=NULL; const void *buffer; size_t size; of = fopen(filename,"w"); if(!of) { perror(filename); exit(1); } GRIB_CHECK(grib_get_message(h,&buffer,&size),0); if(fwrite(buffer,1,size,of) != size) { perror(filename); exit(1); } fclose(of); return size; }
void split(grib_handle *h) { char wmo_name[1024]; char origin[80]; char model[80]; char expver[80]; char levtype[80]; char type[80]; char tigge_name[80]; long level = 0; long number = 0; size_t size; const void* buffer; FILE *f; sget(h,"type",type,sizeof(type)); sget(h,"levtype",levtype,sizeof(levtype)); if(strcmp(type,"fc") != 0) number = get(h,"number"); if(strcmp(levtype,"sfc") == 0) strcpy(levtype,"sl"); else level = get(h,"level"); sprintf(wmo_name,"z_tigge_c_%s_%08ld%04ld00_%s_%s_%s_%s_%04ld_%03ld_%04ld_%s.grib", sget(h,"origin",origin,sizeof(origin)), get(h,"date"), get(h,"time"), sget(h,"model",model,sizeof(model)), sget(h,"expver",expver,sizeof(expver)), type, levtype, get(h,"endStep"), number, level, sget(h,"tigge_short_name",tigge_name,sizeof(tigge_name)) ); if(print_names) printf("%s\n",wmo_name); if(unique) { if(access(wmo_name,F_OK) == 0) { fprintf(stderr,"tigge_split: %s already exists\n",wmo_name); exit(1); } } f = fopen(wmo_name,"w"); if(!f) { perror(wmo_name); exit(1); } CHECK(grib_get_message(h,&buffer,&size) == 0); if(fwrite(buffer,1,size,f) != size) { perror(wmo_name); exit(1); } if(fclose(f)) { perror(wmo_name); exit(1); } }
int codes_get_message(grib_handle* h ,const void** message, size_t *message_length ) { return grib_get_message(h,message,message_length); }
static int execute(grib_action* act, grib_handle *h) { grib_action_write* a = (grib_action_write*) act; int err = GRIB_SUCCESS; size_t size; const void* buffer = NULL; const char* filename = NULL; char string[1024] = { 0, }; grib_file* of = NULL; if ((err = grib_get_message(h, &buffer, &size)) != GRIB_SUCCESS) { grib_context_log(act->context, GRIB_LOG_ERROR,"unable to get message\n"); return err; } if (strlen(a->name) != 0) { err = grib_recompose_name(h, NULL, a->name, string, 0); filename = string; } else { if (act->context->outfilename) { filename = act->context->outfilename; err = grib_recompose_name(h, NULL, act->context->outfilename, string, 0); if (!err) filename = string; } else { filename = "filter.out"; } } Assert(filename); if (a->append) of = grib_file_open(filename, "a", &err); else of = grib_file_open(filename, "w", &err); if (!of || !of->handle) { grib_context_log(act->context, GRIB_LOG_ERROR,"unable to open file %s\n", filename); return GRIB_IO_PROBLEM; } if (h->gts_header) { if (fwrite(h->gts_header, 1, h->gts_header_len, of->handle) != h->gts_header_len) { grib_context_log(act->context, (GRIB_LOG_ERROR) | (GRIB_LOG_PERROR), "Error writing GTS header to %s", filename); return GRIB_IO_PROBLEM; } } if (fwrite(buffer, 1, size, of->handle) != size) { grib_context_log(act->context, (GRIB_LOG_ERROR) | (GRIB_LOG_PERROR), "Error writing to %s", filename); return GRIB_IO_PROBLEM; } if (a->padtomultiple) { char* zeros; size_t padding = a->padtomultiple - size % a->padtomultiple; /* printf("XXX padding=%d size=%d padtomultiple=%d\n",padding,size,a->padtomultiple); */ zeros = (char*)calloc(padding, 1); Assert(zeros); if (fwrite(zeros, 1, padding, of->handle) != padding) { grib_context_log(act->context, (GRIB_LOG_ERROR) | (GRIB_LOG_PERROR), "Error writing to %s", filename); free(zeros); return GRIB_IO_PROBLEM; } free(zeros); } if (h->gts_header) { char gts_trailer[4] = { '\x0D', '\x0D', '\x0A', '\x03' }; if (fwrite(gts_trailer, 1, 4, of->handle) != 4) { grib_context_log(act->context, (GRIB_LOG_ERROR) | (GRIB_LOG_PERROR), "Error writing GTS trailer to %s", filename); return GRIB_IO_PROBLEM; } } grib_file_close(filename, 0, &err); if (err != GRIB_SUCCESS) { grib_context_log(act->context, GRIB_LOG_ERROR,"unable to write message\n"); return err; } return err; }
int main(int argc, char** argv) { int err = 0; size_t size=0; FILE* in = NULL; char* infile = "../../data/regular_latlon_surface.grib1"; FILE* out = NULL; char* outfile = "out.precision.grib1"; grib_handle *h = NULL; const void* buffer = NULL; double* values1=NULL; double* values2=NULL; double maxa=0; double maxv=0,minv=0; double maxr=0,r=0; long decimalPrecision; long bitsPerValue1=0, bitsPerValue2=0; int i=0; in = fopen(infile,"r"); if(!in) { printf("ERROR: unable to open input file %s\n",infile); return 1; } out = fopen(outfile,"w"); if(!out) { printf("ERROR: unable to open output file %s\n",outfile); fclose(in); return 1; } /* create a new handle from a message in a file */ h = grib_handle_new_from_file(0,in,&err); if (h == NULL) { printf("Error: unable to create handle from file %s\n",infile); } /* bitsPerValue before changing the packing parameters */ GRIB_CHECK(grib_get_long(h,"bitsPerValue",&bitsPerValue1),0); assert(bitsPerValue1 == 16); /* get the size of the values array*/ GRIB_CHECK(grib_get_size(h,"values",&size),0); assert(size == 496); values1 = (double*)malloc(size*sizeof(double)); /* get data values before changing the packing parameters*/ GRIB_CHECK(grib_get_double_array(h,"values",values1,&size),0); /* changing decimal precision to 2 means that 2 decimal digits are preserved when packing. */ decimalPrecision=2; GRIB_CHECK(grib_set_long(h,"changeDecimalPrecision",decimalPrecision),0); /* bitsPerValue after changing the packing parameters */ GRIB_CHECK(grib_get_long(h,"bitsPerValue",&bitsPerValue2),0); assert(bitsPerValue2 == 12); values2 = (double*)malloc(size*sizeof(double)); /* get data values after changing the packing parameters*/ GRIB_CHECK(grib_get_double_array(h,"values",values2,&size),0); /* computing error */ maxa=0; maxr=0; maxv=values2[0]; minv=maxv; for (i=0;i<size;i++) { double a=fabs(values2[i]-values1[i]); if ( values2[i] > maxv ) maxv=values2[i]; if ( values2[i] < minv ) minv=values2[i]; if ( values2[i] !=0 ) r=fabs((values2[i]-values1[i])/values2[i]); if ( a > maxa ) maxa=a; if ( r > maxr ) maxr=r; } printf("max absolute error = %g\n",maxa); printf("max relative error = %g\n",maxr); printf("min value = %g\n",minv); printf("max value = %g\n",maxv); assert(fabs(minv - EXPECTED_MIN) < EPSILON); assert(fabs(maxv - EXPECTED_MAX) < EPSILON); /* get the coded message in a buffer */ GRIB_CHECK(grib_get_message(h,&buffer,&size),0); /* write the buffer in a file*/ if(fwrite(buffer,1,size,out) != size) { perror(argv[1]); exit(1); } grib_handle_delete(h); fclose(in); fclose(out); return 0; }
static void compare_handles(int n,grib_handle* h1,grib_handle* h2,FILE* out) { size_t len1 = 0; size_t len2 = 0; double *dval1 = NULL, *dval2 = NULL, *dval3 = NULL; double maxe = 0,mine = 0; double maxa = 0,mina = 0; int i,maxi = 0,maxai = 0; double lat,lon; GRIB_CHECK(grib_get_size(h1,"values",&len1),NULL); GRIB_CHECK(grib_get_size(h2,"values",&len2),NULL); if(len1 != len2) { printf("Field size mismatch %ld != %ld\n",(long)len1,(long)len2); exit(1); } dval1 = (double*)grib_context_malloc(h1->context,len1*sizeof(double)); Assert(dval1); dval2 = (double*)grib_context_malloc(h2->context,len2*sizeof(double)); Assert(dval2); if(out) dval3 = (double*)grib_context_malloc(h2->context,len2*sizeof(double)); Assert(dval2); GRIB_CHECK(grib_get_double_array(h1,"values",dval1,&len1),NULL); GRIB_CHECK(grib_get_double_array(h2,"values",dval2,&len2),NULL); for(i = 0; i < len1; i++) { double e = err(dval1[i],dval2[i]); double a = fabs(dval1[i]-dval2[i]); if(i == 0) maxe = mine = e; if(i == 0) maxa = mina = a; if(out) dval3[i] = absolute ? a : e; if(e < mine) mine = e; if(e > maxe) { maxe = e; maxi = i; } if(a < mina) mina = a; if(a > maxa) { maxa = a; maxai = i; } } if(out) { const void *buffer; size_t size; GRIB_CHECK(grib_set_long(h1,"generatingProcessIdentifier",255),NULL); /* To prevent Magics to scale the field */ GRIB_CHECK(grib_set_long(h1,"numberOfBitsContainingEachPackedValue",24),NULL); GRIB_CHECK(grib_set_double_array(h1,"values",dval3,len1),NULL); GRIB_CHECK(grib_get_message(h1,&buffer,&size),NULL); if(fwrite(buffer,1,size,out) != size) { perror(outname); exit(1); } } printf("Field %ld: min relative error: %g%%, max relative error: %g%% [%g,%g,%g]\n",(long)n,mine*100,maxe*100, dval1[maxi],dval2[maxi],fabs(dval1[maxi]-dval2[maxi])); if(location(h1,maxi,&lat,&lon)) printf(" latitude = %g, longitude = %g\n",lat,lon); printf("Field %ld: min absolute error: %g, max absolute error: %g [%g,%g]\n",(long)n,mina,maxa, dval1[maxai],dval2[maxai]); if(location(h1,maxai,&lat,&lon)) printf(" latitude = %g, longitude = %g\n",lat,lon); grib_context_free(h1->context,dval1); grib_context_free(h2->context,dval2); grib_context_free(h2->context,dval3); }
int main(int argc, char** argv) { int err = 0; size_t size=0; FILE* in = NULL; char* infile = "../../data/regular_latlon_surface.grib1"; FILE* out = NULL; char* outfile = "out.grib1"; grib_handle *h = NULL; const void* buffer = NULL; size_t values_len; double* values; double missing=9999; int i=0; in = fopen(infile,"r"); if(!in) { printf("ERROR: unable to open input file %s\n",infile); return 1; } out = fopen(outfile,"w"); if(!out) { printf("ERROR: unable to open output file %s\n",outfile); fclose(in); return 1; } h = grib_handle_new_from_file(0,in,&err); if (h == NULL) { printf("Error: unable to create handle from file %s\n",infile); } GRIB_CHECK(grib_set_double(h,"missingValue",missing),0); /* get the size of the values array*/ GRIB_CHECK(grib_get_size(h,"values",&values_len),0); values = (double*)malloc(values_len*sizeof(double)); /* get data values*/ GRIB_CHECK(grib_get_double_array(h,"values",values,&values_len),0); GRIB_CHECK(grib_set_long(h,"bitmapPresent",1),0); for(i = 0; i < 10; i++) values[i]=missing; GRIB_CHECK(grib_set_double_array(h,"values",values,values_len),0); /* get the coded message in a buffer */ GRIB_CHECK(grib_get_message(h,&buffer,&size),0); /* write the buffer in a file*/ if(fwrite(buffer,1,size,out) != size) { perror(outfile); exit(1); } /* delete handle */ grib_handle_delete(h); fclose(in); fclose(out); return 0; }
int main(int argc, const char *argv[]) { int i,j; FILE *in,*out; int e; grib_handle *result = NULL,*h; double* values = NULL; double *tmp = NULL; size_t size,count; fprintf(stderr, "\nWARNING: The tool %s is deprecated.\n\n", argv[0]); if(argc < 3) usage(argv[0]); out = fopen(argv[argc-1],"w"); if(!out) { perror(argv[argc-1]); exit(1); } for(i = 1; i < argc-1; i++) { in = fopen(argv[i],"r"); if(!in) { perror(argv[i]); exit(1); } while( (h = grib_handle_new_from_file(NULL,in,&e)) != NULL ) { if(result == NULL) { GRIB_CHECK(grib_get_size(h,"values",&size),argv[i]); values = (double*)calloc(size,sizeof(double)); assert(values); tmp = (double*)calloc(size,sizeof(double)); assert(tmp); result = h; } GRIB_CHECK(grib_get_size(h,"values",&count),argv[i]); assert(count == size); GRIB_CHECK(grib_get_double_array(h,"values",tmp,&count),argv[i]); assert(count == size); for(j = 0; j < count; j++) values[j] += tmp[j]; if(h != result) grib_handle_delete(h); } GRIB_CHECK(e,argv[argc-2]); } if(result) { const void *buffer; GRIB_CHECK(grib_set_double_array(result,"values",values,size),argv[i]); GRIB_CHECK(grib_get_message(result,&buffer,&size),argv[0]); if(fwrite(buffer,1,size,out) != size) { perror(argv[argc-1]); exit(1); } grib_handle_delete(result); } if(fclose(out)) { perror(argv[argc-1]); exit(1); } return 0; }
int main(int argc,const char** argv) { grib_handle *h = NULL; size_t size = 0; double* vdouble = NULL; FILE* f = NULL; const void* buffer = NULL; if(argc != 2) { fprintf(stderr,"usage: %s out\n",argv[0]); exit(1); } h = grib_handle_new_from_samples(NULL,"GRIB2"); if(!h) { fprintf(stderr,"Cannot create grib handle\n"); exit(1); } GRIB_CHECK(grib_set_long(h,"parametersVersion",1),0); GRIB_CHECK(grib_set_long(h,"truncateLaplacian",0),0); GRIB_CHECK(grib_set_long(h,"truncateDegrees",0),0); GRIB_CHECK(grib_set_long(h,"dummy",1),0); GRIB_CHECK(grib_set_long(h,"changingPrecision",0),0); GRIB_CHECK(grib_set_long(h,"unitsFactor",1),0); GRIB_CHECK(grib_set_long(h,"unitsBias",0),0); GRIB_CHECK(grib_set_long(h,"timeRangeIndicatorFromStepRange",-1),0); GRIB_CHECK(grib_set_long(h,"missingValue",9999),0); /* 0 = Meteorological products (grib2/tables/4/0.0.table) */ GRIB_CHECK(grib_set_long(h,"discipline",0),0); GRIB_CHECK(grib_set_long(h,"editionNumber",2),0); /* 98 = European Center for Medium-Range Weather Forecasts (grib1/0.table) */ GRIB_CHECK(grib_set_long(h,"centre",98),0); GRIB_CHECK(grib_set_long(h,"subCentre",0),0); /* 4 = Version implemented on 7 November 2007 (grib2/tables/1.0.table) */ GRIB_CHECK(grib_set_long(h,"tablesVersion",4),0); /* 0 = Local tables not used (grib2/tables/4/1.1.table) */ GRIB_CHECK(grib_set_long(h,"localTablesVersion",0),0); /* 1 = Start of forecast (grib2/tables/4/1.2.table) */ GRIB_CHECK(grib_set_long(h,"significanceOfReferenceTime",1),0); GRIB_CHECK(grib_set_long(h,"year",2007),0); GRIB_CHECK(grib_set_long(h,"month",3),0); GRIB_CHECK(grib_set_long(h,"day",23),0); GRIB_CHECK(grib_set_long(h,"hour",12),0); GRIB_CHECK(grib_set_long(h,"minute",0),0); GRIB_CHECK(grib_set_long(h,"second",0),0); GRIB_CHECK(grib_set_long(h,"dataDate",20070323),0); GRIB_CHECK(grib_set_long(h,"dataTime",1200),0); /* 0 = Operational products (grib2/tables/4/1.3.table) */ GRIB_CHECK(grib_set_long(h,"productionStatusOfProcessedData",0),0); /* 2 = Analysis and forecast products (grib2/tables/4/1.4.table) */ GRIB_CHECK(grib_set_long(h,"typeOfProcessedData",2),0); GRIB_CHECK(grib_set_long(h,"selectStepTemplateInterval",1),0); GRIB_CHECK(grib_set_long(h,"selectStepTemplateInstant",1),0); GRIB_CHECK(grib_set_long(h,"grib2LocalSectionPresent",0),0); /* 0 = Specified in Code table 3.1 (grib2/tables/4/3.0.table) */ GRIB_CHECK(grib_set_long(h,"sourceOfGridDefinition",0),0); GRIB_CHECK(grib_set_long(h,"numberOfDataPoints",496),0); GRIB_CHECK(grib_set_long(h,"numberOfOctectsForNumberOfPoints",0),0); /* 0 = There is no appended list (grib2/tables/4/3.11.table) */ GRIB_CHECK(grib_set_long(h,"interpretationOfNumberOfPoints",0),0); GRIB_CHECK(grib_set_long(h,"PLPresent",0),0); /* 0 = Latitude/longitude. Also called equidistant cylindrical, or Plate Carree (grib2/tables/4/3.1.table) */ GRIB_CHECK(grib_set_long(h,"gridDefinitionTemplateNumber",0),0); /* 0 = Earth assumed spherical with radius = 6,367,470.0 m (grib2/tables/4/3.2.table) */ GRIB_CHECK(grib_set_long(h,"shapeOfTheEarth",0),0); GRIB_CHECK(grib_set_missing(h,"scaleFactorOfRadiusOfSphericalEarth"),0); GRIB_CHECK(grib_set_missing(h,"scaledValueOfRadiusOfSphericalEarth"),0); GRIB_CHECK(grib_set_missing(h,"scaleFactorOfEarthMajorAxis"),0); GRIB_CHECK(grib_set_missing(h,"scaledValueOfEarthMajorAxis"),0); GRIB_CHECK(grib_set_missing(h,"scaleFactorOfEarthMinorAxis"),0); GRIB_CHECK(grib_set_missing(h,"scaledValueOfEarthMinorAxis"),0); GRIB_CHECK(grib_set_long(h,"radius",6367470),0); GRIB_CHECK(grib_set_long(h,"Ni",16),0); GRIB_CHECK(grib_set_long(h,"Nj",31),0); GRIB_CHECK(grib_set_long(h,"basicAngleOfTheInitialProductionDomain",0),0); GRIB_CHECK(grib_set_long(h,"mBasicAngle",0),0); GRIB_CHECK(grib_set_long(h,"angleMultiplier",1),0); GRIB_CHECK(grib_set_long(h,"mAngleMultiplier",1000000),0); GRIB_CHECK(grib_set_missing(h,"subdivisionsOfBasicAngle"),0); GRIB_CHECK(grib_set_long(h,"angleDivisor",1000000),0); GRIB_CHECK(grib_set_long(h,"latitudeOfFirstGridPoint",60000000),0); GRIB_CHECK(grib_set_long(h,"longitudeOfFirstGridPoint",0),0); /* 48 = 00110000 (3=1) i direction increments given (4=1) j direction increments given (5=0) Resolved u- and v- components of vector quantities relative to easterly and northerly directions See grib2/tables/[tablesVersion]/3.3.table */ GRIB_CHECK(grib_set_long(h,"resolutionAndComponentFlags",48),0); GRIB_CHECK(grib_set_long(h,"iDirectionIncrementGiven",1),0); GRIB_CHECK(grib_set_long(h,"jDirectionIncrementGiven",1),0); GRIB_CHECK(grib_set_long(h,"uvRelativeToGrid",0),0); GRIB_CHECK(grib_set_long(h,"latitudeOfLastGridPoint",0),0); GRIB_CHECK(grib_set_long(h,"longitudeOfLastGridPoint",30000000),0); GRIB_CHECK(grib_set_long(h,"iDirectionIncrement",2000000),0); GRIB_CHECK(grib_set_long(h,"jDirectionIncrement",2000000),0); /* 0 = 00000000 (1=0) Points of first row or column scan in the +i (+x) direction (2=0) Points of first row or column scan in the -j (-y) direction (3=0) Adjacent points in i (x) direction are consecutive (4=0) All rows scan in the same direction See grib2/tables/[tablesVersion]/3.4.table */ GRIB_CHECK(grib_set_long(h,"scanningMode",0),0); GRIB_CHECK(grib_set_long(h,"iScansNegatively",0),0); GRIB_CHECK(grib_set_long(h,"jScansPositively",0),0); GRIB_CHECK(grib_set_long(h,"jPointsAreConsecutive",0),0); GRIB_CHECK(grib_set_long(h,"alternativeRowScanning",0),0); GRIB_CHECK(grib_set_long(h,"iScansPositively",1),0); /* ITERATOR */ /* NEAREST */ GRIB_CHECK(grib_set_long(h,"timeRangeIndicator",0),0); GRIB_CHECK(grib_set_long(h,"NV",0),0); GRIB_CHECK(grib_set_long(h,"neitherPresent",0),0); /* 0 = Analysis or forecast at a horizontal level or in a horizontal layer at a point in time (grib2/tables/4/4.0.table) */ GRIB_CHECK(grib_set_long(h,"productDefinitionTemplateNumber",0),0); /* Parameter information */ /* 0 = Temperature (grib2/tables/4/4.1.0.table) */ GRIB_CHECK(grib_set_long(h,"parameterCategory",0),0); /* 0 = Temperature (K) (grib2/tables/4/4.2.0.0.table) */ GRIB_CHECK(grib_set_long(h,"parameterNumber",0),0); /* 0 = Analysis (grib2/tables/4/4.3.table) */ GRIB_CHECK(grib_set_long(h,"typeOfGeneratingProcess",0),0); GRIB_CHECK(grib_set_long(h,"backgroundProcess",255),0); GRIB_CHECK(grib_set_long(h,"generatingProcessIdentifier",128),0); GRIB_CHECK(grib_set_long(h,"hoursAfterDataCutoff",0),0); GRIB_CHECK(grib_set_long(h,"minutesAfterDataCutoff",0),0); /* 1 = Hour (grib2/tables/4/4.4.table) */ GRIB_CHECK(grib_set_long(h,"indicatorOfUnitOfTimeRange",1),0); /* 1 = Hour (stepUnits.table) */ GRIB_CHECK(grib_set_long(h,"stepUnits",1),0); GRIB_CHECK(grib_set_long(h,"forecastTime",0),0); /* 1 = Ground or water surface (grib2/tables/4/4.5.table) */ GRIB_CHECK(grib_set_long(h,"typeOfFirstFixedSurface",1),0); GRIB_CHECK(grib_set_missing(h,"scaleFactorOfFirstFixedSurface"),0); GRIB_CHECK(grib_set_missing(h,"scaledValueOfFirstFixedSurface"),0); /* 255 = Missing (grib2/tables/4/4.5.table) */ GRIB_CHECK(grib_set_long(h,"typeOfSecondFixedSurface",255),0); GRIB_CHECK(grib_set_missing(h,"scaleFactorOfSecondFixedSurface"),0); GRIB_CHECK(grib_set_missing(h,"scaledValueOfSecondFixedSurface"),0); GRIB_CHECK(grib_set_long(h,"level",0),0); GRIB_CHECK(grib_set_long(h,"bottomLevel",0),0); GRIB_CHECK(grib_set_long(h,"topLevel",0),0); GRIB_CHECK(grib_set_long(h,"dummyc",0),0); GRIB_CHECK(grib_set_long(h,"PVPresent",0),0); /* grib 2 Section 5 DATA REPRESENTATION SECTION */ GRIB_CHECK(grib_set_long(h,"numberOfValues",496),0); /* 0 = Grid point data - simple packing (grib2/tables/4/5.0.table) */ GRIB_CHECK(grib_set_long(h,"dataRepresentationTemplateNumber",0),0); GRIB_CHECK(grib_set_long(h,"decimalScaleFactor",0),0); GRIB_CHECK(grib_set_long(h,"bitsPerValue",0),0); /* 0 = Floating point (grib2/tables/4/5.1.table) */ GRIB_CHECK(grib_set_long(h,"typeOfOriginalFieldValues",0),0); GRIB_CHECK(grib_set_long(h,"representationMode",0),0); /* grib 2 Section 6 BIT-MAP SECTION */ /* 255 = A bit map does not apply to this product (grib2/tables/4/6.0.table) */ GRIB_CHECK(grib_set_long(h,"bitMapIndicator",255),0); GRIB_CHECK(grib_set_long(h,"bitmapPresent",0),0); /* grib 2 Section 7 data */ size = 496; vdouble = (double*)calloc(size,sizeof(double)); if(!vdouble) { fprintf(stderr,"failed to allocate %lu bytes\n",size*sizeof(double)); exit(1); } vdouble[ 0] = 1; vdouble[ 1] = 1; vdouble[ 2] = 1; vdouble[ 3] = 1; vdouble[ 4] = 1; vdouble[ 5] = 1; vdouble[ 6] = 1; vdouble[ 7] = 1; vdouble[ 8] = 1; vdouble[ 9] = 1; vdouble[ 10] = 1; vdouble[ 11] = 1; vdouble[ 12] = 1; vdouble[ 13] = 1; vdouble[ 14] = 1; vdouble[ 15] = 1; vdouble[ 16] = 1; vdouble[ 17] = 1; vdouble[ 18] = 1; vdouble[ 19] = 1; vdouble[ 20] = 1; vdouble[ 21] = 1; vdouble[ 22] = 1; vdouble[ 23] = 1; vdouble[ 24] = 1; vdouble[ 25] = 1; vdouble[ 26] = 1; vdouble[ 27] = 1; vdouble[ 28] = 1; vdouble[ 29] = 1; vdouble[ 30] = 1; vdouble[ 31] = 1; vdouble[ 32] = 1; vdouble[ 33] = 1; vdouble[ 34] = 1; vdouble[ 35] = 1; vdouble[ 36] = 1; vdouble[ 37] = 1; vdouble[ 38] = 1; vdouble[ 39] = 1; vdouble[ 40] = 1; vdouble[ 41] = 1; vdouble[ 42] = 1; vdouble[ 43] = 1; vdouble[ 44] = 1; vdouble[ 45] = 1; vdouble[ 46] = 1; vdouble[ 47] = 1; vdouble[ 48] = 1; vdouble[ 49] = 1; vdouble[ 50] = 1; vdouble[ 51] = 1; vdouble[ 52] = 1; vdouble[ 53] = 1; vdouble[ 54] = 1; vdouble[ 55] = 1; vdouble[ 56] = 1; vdouble[ 57] = 1; vdouble[ 58] = 1; vdouble[ 59] = 1; vdouble[ 60] = 1; vdouble[ 61] = 1; vdouble[ 62] = 1; vdouble[ 63] = 1; vdouble[ 64] = 1; vdouble[ 65] = 1; vdouble[ 66] = 1; vdouble[ 67] = 1; vdouble[ 68] = 1; vdouble[ 69] = 1; vdouble[ 70] = 1; vdouble[ 71] = 1; vdouble[ 72] = 1; vdouble[ 73] = 1; vdouble[ 74] = 1; vdouble[ 75] = 1; vdouble[ 76] = 1; vdouble[ 77] = 1; vdouble[ 78] = 1; vdouble[ 79] = 1; vdouble[ 80] = 1; vdouble[ 81] = 1; vdouble[ 82] = 1; vdouble[ 83] = 1; vdouble[ 84] = 1; vdouble[ 85] = 1; vdouble[ 86] = 1; vdouble[ 87] = 1; vdouble[ 88] = 1; vdouble[ 89] = 1; vdouble[ 90] = 1; vdouble[ 91] = 1; vdouble[ 92] = 1; vdouble[ 93] = 1; vdouble[ 94] = 1; vdouble[ 95] = 1; vdouble[ 96] = 1; vdouble[ 97] = 1; vdouble[ 98] = 1; vdouble[ 99] = 1; vdouble[ 100] = 1; vdouble[ 101] = 1; vdouble[ 102] = 1; vdouble[ 103] = 1; vdouble[ 104] = 1; vdouble[ 105] = 1; vdouble[ 106] = 1; vdouble[ 107] = 1; vdouble[ 108] = 1; vdouble[ 109] = 1; vdouble[ 110] = 1; vdouble[ 111] = 1; vdouble[ 112] = 1; vdouble[ 113] = 1; vdouble[ 114] = 1; vdouble[ 115] = 1; vdouble[ 116] = 1; vdouble[ 117] = 1; vdouble[ 118] = 1; vdouble[ 119] = 1; vdouble[ 120] = 1; vdouble[ 121] = 1; vdouble[ 122] = 1; vdouble[ 123] = 1; vdouble[ 124] = 1; vdouble[ 125] = 1; vdouble[ 126] = 1; vdouble[ 127] = 1; vdouble[ 128] = 1; vdouble[ 129] = 1; vdouble[ 130] = 1; vdouble[ 131] = 1; vdouble[ 132] = 1; vdouble[ 133] = 1; vdouble[ 134] = 1; vdouble[ 135] = 1; vdouble[ 136] = 1; vdouble[ 137] = 1; vdouble[ 138] = 1; vdouble[ 139] = 1; vdouble[ 140] = 1; vdouble[ 141] = 1; vdouble[ 142] = 1; vdouble[ 143] = 1; vdouble[ 144] = 1; vdouble[ 145] = 1; vdouble[ 146] = 1; vdouble[ 147] = 1; vdouble[ 148] = 1; vdouble[ 149] = 1; vdouble[ 150] = 1; vdouble[ 151] = 1; vdouble[ 152] = 1; vdouble[ 153] = 1; vdouble[ 154] = 1; vdouble[ 155] = 1; vdouble[ 156] = 1; vdouble[ 157] = 1; vdouble[ 158] = 1; vdouble[ 159] = 1; vdouble[ 160] = 1; vdouble[ 161] = 1; vdouble[ 162] = 1; vdouble[ 163] = 1; vdouble[ 164] = 1; vdouble[ 165] = 1; vdouble[ 166] = 1; vdouble[ 167] = 1; vdouble[ 168] = 1; vdouble[ 169] = 1; vdouble[ 170] = 1; vdouble[ 171] = 1; vdouble[ 172] = 1; vdouble[ 173] = 1; vdouble[ 174] = 1; vdouble[ 175] = 1; vdouble[ 176] = 1; vdouble[ 177] = 1; vdouble[ 178] = 1; vdouble[ 179] = 1; vdouble[ 180] = 1; vdouble[ 181] = 1; vdouble[ 182] = 1; vdouble[ 183] = 1; vdouble[ 184] = 1; vdouble[ 185] = 1; vdouble[ 186] = 1; vdouble[ 187] = 1; vdouble[ 188] = 1; vdouble[ 189] = 1; vdouble[ 190] = 1; vdouble[ 191] = 1; vdouble[ 192] = 1; vdouble[ 193] = 1; vdouble[ 194] = 1; vdouble[ 195] = 1; vdouble[ 196] = 1; vdouble[ 197] = 1; vdouble[ 198] = 1; vdouble[ 199] = 1; vdouble[ 200] = 1; vdouble[ 201] = 1; vdouble[ 202] = 1; vdouble[ 203] = 1; vdouble[ 204] = 1; vdouble[ 205] = 1; vdouble[ 206] = 1; vdouble[ 207] = 1; vdouble[ 208] = 1; vdouble[ 209] = 1; vdouble[ 210] = 1; vdouble[ 211] = 1; vdouble[ 212] = 1; vdouble[ 213] = 1; vdouble[ 214] = 1; vdouble[ 215] = 1; vdouble[ 216] = 1; vdouble[ 217] = 1; vdouble[ 218] = 1; vdouble[ 219] = 1; vdouble[ 220] = 1; vdouble[ 221] = 1; vdouble[ 222] = 1; vdouble[ 223] = 1; vdouble[ 224] = 1; vdouble[ 225] = 1; vdouble[ 226] = 1; vdouble[ 227] = 1; vdouble[ 228] = 1; vdouble[ 229] = 1; vdouble[ 230] = 1; vdouble[ 231] = 1; vdouble[ 232] = 1; vdouble[ 233] = 1; vdouble[ 234] = 1; vdouble[ 235] = 1; vdouble[ 236] = 1; vdouble[ 237] = 1; vdouble[ 238] = 1; vdouble[ 239] = 1; vdouble[ 240] = 1; vdouble[ 241] = 1; vdouble[ 242] = 1; vdouble[ 243] = 1; vdouble[ 244] = 1; vdouble[ 245] = 1; vdouble[ 246] = 1; vdouble[ 247] = 1; vdouble[ 248] = 1; vdouble[ 249] = 1; vdouble[ 250] = 1; vdouble[ 251] = 1; vdouble[ 252] = 1; vdouble[ 253] = 1; vdouble[ 254] = 1; vdouble[ 255] = 1; vdouble[ 256] = 1; vdouble[ 257] = 1; vdouble[ 258] = 1; vdouble[ 259] = 1; vdouble[ 260] = 1; vdouble[ 261] = 1; vdouble[ 262] = 1; vdouble[ 263] = 1; vdouble[ 264] = 1; vdouble[ 265] = 1; vdouble[ 266] = 1; vdouble[ 267] = 1; vdouble[ 268] = 1; vdouble[ 269] = 1; vdouble[ 270] = 1; vdouble[ 271] = 1; vdouble[ 272] = 1; vdouble[ 273] = 1; vdouble[ 274] = 1; vdouble[ 275] = 1; vdouble[ 276] = 1; vdouble[ 277] = 1; vdouble[ 278] = 1; vdouble[ 279] = 1; vdouble[ 280] = 1; vdouble[ 281] = 1; vdouble[ 282] = 1; vdouble[ 283] = 1; vdouble[ 284] = 1; vdouble[ 285] = 1; vdouble[ 286] = 1; vdouble[ 287] = 1; vdouble[ 288] = 1; vdouble[ 289] = 1; vdouble[ 290] = 1; vdouble[ 291] = 1; vdouble[ 292] = 1; vdouble[ 293] = 1; vdouble[ 294] = 1; vdouble[ 295] = 1; vdouble[ 296] = 1; vdouble[ 297] = 1; vdouble[ 298] = 1; vdouble[ 299] = 1; vdouble[ 300] = 1; vdouble[ 301] = 1; vdouble[ 302] = 1; vdouble[ 303] = 1; vdouble[ 304] = 1; vdouble[ 305] = 1; vdouble[ 306] = 1; vdouble[ 307] = 1; vdouble[ 308] = 1; vdouble[ 309] = 1; vdouble[ 310] = 1; vdouble[ 311] = 1; vdouble[ 312] = 1; vdouble[ 313] = 1; vdouble[ 314] = 1; vdouble[ 315] = 1; vdouble[ 316] = 1; vdouble[ 317] = 1; vdouble[ 318] = 1; vdouble[ 319] = 1; vdouble[ 320] = 1; vdouble[ 321] = 1; vdouble[ 322] = 1; vdouble[ 323] = 1; vdouble[ 324] = 1; vdouble[ 325] = 1; vdouble[ 326] = 1; vdouble[ 327] = 1; vdouble[ 328] = 1; vdouble[ 329] = 1; vdouble[ 330] = 1; vdouble[ 331] = 1; vdouble[ 332] = 1; vdouble[ 333] = 1; vdouble[ 334] = 1; vdouble[ 335] = 1; vdouble[ 336] = 1; vdouble[ 337] = 1; vdouble[ 338] = 1; vdouble[ 339] = 1; vdouble[ 340] = 1; vdouble[ 341] = 1; vdouble[ 342] = 1; vdouble[ 343] = 1; vdouble[ 344] = 1; vdouble[ 345] = 1; vdouble[ 346] = 1; vdouble[ 347] = 1; vdouble[ 348] = 1; vdouble[ 349] = 1; vdouble[ 350] = 1; vdouble[ 351] = 1; vdouble[ 352] = 1; vdouble[ 353] = 1; vdouble[ 354] = 1; vdouble[ 355] = 1; vdouble[ 356] = 1; vdouble[ 357] = 1; vdouble[ 358] = 1; vdouble[ 359] = 1; vdouble[ 360] = 1; vdouble[ 361] = 1; vdouble[ 362] = 1; vdouble[ 363] = 1; vdouble[ 364] = 1; vdouble[ 365] = 1; vdouble[ 366] = 1; vdouble[ 367] = 1; vdouble[ 368] = 1; vdouble[ 369] = 1; vdouble[ 370] = 1; vdouble[ 371] = 1; vdouble[ 372] = 1; vdouble[ 373] = 1; vdouble[ 374] = 1; vdouble[ 375] = 1; vdouble[ 376] = 1; vdouble[ 377] = 1; vdouble[ 378] = 1; vdouble[ 379] = 1; vdouble[ 380] = 1; vdouble[ 381] = 1; vdouble[ 382] = 1; vdouble[ 383] = 1; vdouble[ 384] = 1; vdouble[ 385] = 1; vdouble[ 386] = 1; vdouble[ 387] = 1; vdouble[ 388] = 1; vdouble[ 389] = 1; vdouble[ 390] = 1; vdouble[ 391] = 1; vdouble[ 392] = 1; vdouble[ 393] = 1; vdouble[ 394] = 1; vdouble[ 395] = 1; vdouble[ 396] = 1; vdouble[ 397] = 1; vdouble[ 398] = 1; vdouble[ 399] = 1; vdouble[ 400] = 1; vdouble[ 401] = 1; vdouble[ 402] = 1; vdouble[ 403] = 1; vdouble[ 404] = 1; vdouble[ 405] = 1; vdouble[ 406] = 1; vdouble[ 407] = 1; vdouble[ 408] = 1; vdouble[ 409] = 1; vdouble[ 410] = 1; vdouble[ 411] = 1; vdouble[ 412] = 1; vdouble[ 413] = 1; vdouble[ 414] = 1; vdouble[ 415] = 1; vdouble[ 416] = 1; vdouble[ 417] = 1; vdouble[ 418] = 1; vdouble[ 419] = 1; vdouble[ 420] = 1; vdouble[ 421] = 1; vdouble[ 422] = 1; vdouble[ 423] = 1; vdouble[ 424] = 1; vdouble[ 425] = 1; vdouble[ 426] = 1; vdouble[ 427] = 1; vdouble[ 428] = 1; vdouble[ 429] = 1; vdouble[ 430] = 1; vdouble[ 431] = 1; vdouble[ 432] = 1; vdouble[ 433] = 1; vdouble[ 434] = 1; vdouble[ 435] = 1; vdouble[ 436] = 1; vdouble[ 437] = 1; vdouble[ 438] = 1; vdouble[ 439] = 1; vdouble[ 440] = 1; vdouble[ 441] = 1; vdouble[ 442] = 1; vdouble[ 443] = 1; vdouble[ 444] = 1; vdouble[ 445] = 1; vdouble[ 446] = 1; vdouble[ 447] = 1; vdouble[ 448] = 1; vdouble[ 449] = 1; vdouble[ 450] = 1; vdouble[ 451] = 1; vdouble[ 452] = 1; vdouble[ 453] = 1; vdouble[ 454] = 1; vdouble[ 455] = 1; vdouble[ 456] = 1; vdouble[ 457] = 1; vdouble[ 458] = 1; vdouble[ 459] = 1; vdouble[ 460] = 1; vdouble[ 461] = 1; vdouble[ 462] = 1; vdouble[ 463] = 1; vdouble[ 464] = 1; vdouble[ 465] = 1; vdouble[ 466] = 1; vdouble[ 467] = 1; vdouble[ 468] = 1; vdouble[ 469] = 1; vdouble[ 470] = 1; vdouble[ 471] = 1; vdouble[ 472] = 1; vdouble[ 473] = 1; vdouble[ 474] = 1; vdouble[ 475] = 1; vdouble[ 476] = 1; vdouble[ 477] = 1; vdouble[ 478] = 1; vdouble[ 479] = 1; vdouble[ 480] = 1; vdouble[ 481] = 1; vdouble[ 482] = 1; vdouble[ 483] = 1; vdouble[ 484] = 1; vdouble[ 485] = 1; vdouble[ 486] = 1; vdouble[ 487] = 1; vdouble[ 488] = 1; vdouble[ 489] = 1; vdouble[ 490] = 1; vdouble[ 491] = 1; vdouble[ 492] = 1; vdouble[ 493] = 1; vdouble[ 494] = 1; vdouble[ 495] = 1; GRIB_CHECK(grib_set_double_array(h,"values",vdouble,size),0); free(vdouble); GRIB_CHECK(grib_set_long(h,"dirty_statistics",1),0); GRIB_CHECK(grib_set_long(h,"changeDecimalPrecision",0),0); GRIB_CHECK(grib_set_long(h,"decimalPrecision",0),0); GRIB_CHECK(grib_set_long(h,"setBitsPerValue",0),0); /* Save the message */ f = fopen(argv[1],"w"); if(!f) { perror(argv[1]); exit(1); } GRIB_CHECK(grib_get_message(h,&buffer,&size),0); if(fwrite(buffer,1,size,f) != size) { perror(argv[1]); exit(1); } if(fclose(f)) { perror(argv[1]); exit(1); } grib_handle_delete(h); return 0; }