/* * (C) Copyright 2005- ECMWF. * * This software is licensed under the terms of the Apache Licence Version 2.0 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. * * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. */ #include "grib_api_internal.h" #if GRIB_TIMER void usage(char* prog) { printf("usage: %s [-a outfile | -w outfile ] grib_file repetitions bitsPerValue\n",prog); exit(1); } size_t grib_handle_write(grib_handle* h,char* filename) { FILE* of=NULL; const void *buffer; size_t size; of = fopen(filename,"wb"); 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; } static void print_timer(grib_timer* t,int repeat) { printf("%s : %g cpu\n",t->name_,t->timer_/repeat); } int main(int argc, char* argv[]) { grib_handle *h=NULL; grib_context* c=NULL; FILE* fin=NULL; FILE* fout=NULL; char* finname; char* ofilename; char defofilename[]="png_perf.out"; double *values=NULL; int append=0; size_t nvalues=0; int count,e=0; int repeatpng=1; int repeatsimple=1; grib_timer *tes,*tds,*tej,*tdj; char grid_png[]="grid_png"; size_t grid_png_l=strlen(grid_png); char grid_simple[]="grid_simple"; size_t grid_simple_l=strlen(grid_simple); char packingType[50]={0,}; size_t len=50; char param[50]={0,}; char gridType[50]={0,}; char outfilename[255]={0,}; size_t filesize_png=0; size_t filesize_simple=0; double perc=0; long bitsPerValue=0; int iarg=1; char grid[40]={0,}; char shortName[20]={0,}; long level; char levelType[20]={0,}; tes=grib_get_timer(0,"encoding simple", 0, 0); tds=grib_get_timer(0,"decoding simple", 0, 0); tej=grib_get_timer(0,"encoding png", 0, 0); tdj=grib_get_timer(0,"decoding png", 0, 0); if (argc != 4 && argc != 6 ) usage(argv[0]); if (!strcmp(argv[iarg],"-w")) { append=0; iarg++; ofilename=argv[iarg]; iarg++; } else if (!strcmp(argv[iarg],"-a")) { append=1; iarg++; ofilename=argv[iarg]; iarg++; } else { append=0; ofilename=defofilename; } finname=argv[iarg++]; repeatsimple=atoi(argv[iarg++]); bitsPerValue=atoi(argv[iarg++]); fin = fopen(finname,"rb"); if(!fin) {perror(finname);exit(1);} if (append) fout = fopen(ofilename,"ab"); else fout = fopen(ofilename,"wb"); if(!fout) {perror(ofilename);exit(1);} c=grib_context_get_default(); e=0; h=grib_handle_new_from_file(c,fin,&e); fclose(fin); GRIB_CHECK(e,0); len=50; grib_get_string(h,"shortName",param,&len); len=20; grib_get_string(h,"levelType",levelType,&len); if (!strcmp(levelType,"pl")) { GRIB_CHECK(grib_get_long(h,"level",&level),0); sprintf(shortName,"%s%ld",param,level); } else { sprintf(shortName,"%s",param); } grib_set_long(h,"editionNumber",2); GRIB_CHECK(grib_get_size(h,"values",&nvalues),0); values=(double*)grib_context_malloc(c,sizeof(double)*nvalues); if (!values) { printf("%s: memory allocation error\n",argv[0]); exit(1); } len=50; grib_get_string(h,"gridType",gridType,&len); len=50; grib_get_string(h,"packingType",packingType,&len); GRIB_CHECK(grib_get_double_array(h,"values",values,&nvalues),0); grib_set_long(h,"bitsPerValue",bitsPerValue); GRIB_CHECK(grib_set_double_array(h,"values",values,nvalues),0); printf("--------------------------------\n"); printf("- %s - gridType=%s packingType=%s numberOfValues=%ld bitsPerValue=%ld\n", param,gridType,packingType,(long)nvalues,bitsPerValue); if (!strcmp(packingType,"spectral_complex") || !strcmp(packingType,"spectral_simple")) { printf("unable to process spectral data\n"); exit(1); } if (!strcmp(gridType,"reduced_gg") || !strcmp(gridType,"regular_gg")) { long N; grib_get_long(h,"N",&N); printf(" N=%ld\n",N); sprintf(grid,"%ld",N); } if (!strcmp(gridType,"regular_ll")) { double Di,Dj; grib_get_double(h,"DiInDegrees",&Di); grib_get_double(h,"DjInDegrees",&Dj); printf(" Di=%g Dj=%g\n",Di,Dj); sprintf(grid,"%g/%g",Di,Dj); } if (!append) fprintf(fout, "shortName gridType numberOfValues bitsPerValue grid sizeSimple sizepng encodepng encodeSimple decodepng decodeSimple\n"); /* decode values grid_simple */ if (strcmp(packingType,grid_simple)) grib_set_string(h,"packingType",grid_simple,&grid_simple_l); /* printf("decoding simple\n"); */ grib_timer_start(tds); for (count=0;counttimer_/repeatpng,tes->timer_/repeatsimple,tdj->timer_/repeatpng,tds->timer_/repeatsimple); return 0; } #else int main(int argc,char* argv[]) { return 0; } #endif