int main(int argc, char* argv[]) { flong ksec0[ISECTION_0]; flong ksec1[ISECTION_1]; flong ksec2[ISECTION_2]; flong ksec3[ISECTION_3]; flong ksec4[ISECTION_4]; double rsec2[RSECTION_2]; double rsec3[RSECTION_3]; flong sec4len; flong miss=0; const void *msg; flong gribex_msg_len=0; grib_handle *h=NULL; grib_context* c=NULL; FILE* fin=NULL; /*char finname[]="/marsdev/data/p4/grib_api/main/data/exp/performance/sh.grib";*/ char* finname; double *values=NULL; size_t nvalues=0; int count,e=0; int maxnvalues; unsigned char buffer[50000000]; size_t length = sizeof(buffer); int repeat=300; grib_timer *taen,*tade,*tgen,*tgde; taen=grib_get_timer(0,"grib_api encoding", 0, 0); tgen=grib_get_timer(0,"gribex encoding", 0, 0); tade=grib_get_timer(0,"grib_api decoding", 0, 0); tgde=grib_get_timer(0,"gribex decoding", 0, 0); if (argc != 2) usage(argv[0]); finname=argv[1]; fin = fopen(finname,"r"); if(!fin) {perror(finname);exit(1);} c=grib_context_get_default(); GRIB_CHECK(grib_read_any_from_file(c,fin,buffer,&length),0); fclose(fin); /* unpack all data with grib_api */ maxnvalues=0; h=grib_handle_new_from_message_copy(c,buffer,length); GRIB_CHECK(e,0); /* decode values with grib_api*/ 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); } if (maxnvalues<nvalues) maxnvalues=nvalues; printf("decoding with grib_api\n"); grib_timer_start(tade); for (count=0;count<repeat;count++) { GRIB_CHECK(grib_get_double_array(h,"values",values,&nvalues),0); } grib_timer_stop(tade,0); printf("%d messages decoded\n",count); /* encode values with grib_api*/ printf("encoding with grib_api\n"); grib_timer_start(taen); for (count=0;count<repeat;count++) { GRIB_CHECK(grib_set_double_array(h,"values",values,nvalues),0); } grib_timer_stop(taen,0); printf("%d messages encoded\n",count); grib_handle_delete(h); grib_context_free(c,values); /* decode with gribex */ msg=(char*)buffer; sec4len=maxnvalues+100000; values = (double*)grib_context_malloc(c,sizeof(double)*(sec4len)); printf("decoding with gribex\n"); grib_timer_start(tgde); for (count=0;count<repeat;count++) { gribex_msg_len=length; gribex_check(cgribex( miss, ksec0,ksec1,ksec2,rsec2,ksec3,rsec3, ksec4,values,sec4len, (char*)msg,&gribex_msg_len,"D")); } grib_timer_stop(tgde,0); printf("%d messages decoded\n",count); #if 0 printf("encoding with gribex\n"); buflen=nvalues+100000; buf=(char*)grib_context_malloc(c,buflen*sizeof(char)); grib_timer_start(tgen); for (count=0;count<repeat;count++) { gribex_msg_len=buflen; gribex_check(cgribex( miss, ksec0,ksec1,ksec2,rsec2,ksec3,rsec3, ksec4,values,nvalues, buf,&gribex_msg_len,"C")); } grib_timer_stop(tgen,0); printf("%d messages encoded\n",count); #endif grib_print_all_timers(); grib_context_free(c,values); return 0; }
int main(int argc, char* argv[]) { grib_handle *h=NULL; grib_context* c=NULL; FILE* fin=NULL; double *values=NULL; char buffer[BUFF_SIZE]={0,}; char buf[BUFF_SIZE]={0,}; size_t length; int sec4len; flong ksec0[ISECTION_0]; flong ksec1[ISECTION_1]; flong ksec2[ISECTION_2]; flong ksec3[ISECTION_3]; flong ksec4[ISECTION_4]; flong miss=0; const void *msg; flong gribex_msg_len=0; double rsec2[RSECTION_2]; double rsec3[RSECTION_3]; size_t nvalues=0; double* gvalues; FILE* fout; int one=1; char finname[]="sh.grib"; fin = fopen(finname,"r"); if(!fin) {perror(finname);exit(1);} c=grib_context_get_default(); length=BUFF_SIZE; GRIB_CHECK(grib_read_any_from_file(c,fin,buffer,&length),0); fclose(fin); h=grib_handle_new_from_message_copy(c,buffer,length); GRIB_CHECK(grib_get_size(h,"values",&nvalues),0); values=(double*)grib_context_malloc_clear(c,sizeof(double)*nvalues); gvalues=(double*)grib_context_malloc_clear(c,sizeof(double)*nvalues); if (!values) { printf("%s: memory allocation error\n",argv[0]); exit(1); } if (!gvalues) { printf("%s: memory allocation error\n",argv[0]); exit(1); } GRIB_CHECK(grib_get_double_array(h,"values",values,&nvalues),0); GRIB_CHECK(grib_set_long(h,"computeLaplacianOperator",1),0); GRIB_CHECK(grib_set_double_array(h,"values",values,nvalues),0); grib_write_message(h,"out_grib_api.grib","w"); sec4len=nvalues+100000; /* decode with gribex*/ msg=(char*)buffer; gribex_msg_len=length; sec4len=nvalues+100000; gribex_check(cgribex( miss, ksec0,ksec1,ksec2,rsec2,ksec3,rsec3, ksec4,gvalues,sec4len, (char*)msg,&gribex_msg_len,"D")); /* encode values with gribex*/ gribex_msg_len=BUFF_SIZE; grsmkp_(&one); gribex_check(cgribex( miss, ksec0,ksec1,ksec2,rsec2,ksec3,rsec3, ksec4,gvalues,nvalues, buf,&gribex_msg_len,"C")); fout=fopen("out_gribex.grib","w"); if (!fout) {perror("out_gribex.grib");exit(1);} if (fwrite(buf,1,gribex_msg_len,fout)!=gribex_msg_len) { perror("out_gribex.grib"); exit(1); } fclose(fout); return 0; }
int main(int argc, char* argv[]) { int i; grib_handle *h=NULL; grib_handle *hso=NULL; grib_context* c=NULL; FILE* fin=NULL; FILE* fout=NULL; char* finname; char* ofilename; char defofilename[]="so_perf.out"; double *values=NULL; double gvalues[1000000]={0,}; double sovalues[1000000]={0,}; int append=0; size_t nvalues=0; int count,e=0; int repeatso=1; int repeatsimple=1; grib_timer *tes,*tds,*teso,*tdso; 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_so=0; size_t filesize_simple=0; double perc=0; long bitsPerValue=0; int iarg=1; char grid[20]={0,}; char shortName[20]={0,}; long level; char levelType[20]={0,}; char buffer[BUFF_SIZE]={0,}; char buf[BUFF_SIZE]={0,}; size_t length; int sec4len; flong ksec0[ISECTION_0]; flong ksec1[ISECTION_1]; flong ksec2[ISECTION_2]; flong ksec3[ISECTION_3]; flong ksec4[ISECTION_4]; flong miss=0; const void *msg; flong gribex_msg_len=0; double packingError=0; double rsec2[RSECTION_2]; double rsec3[RSECTION_3]; tes=grib_get_timer(0,"encoding simple", 0, 0); tds=grib_get_timer(0,"decoding simple", 0, 0); teso=grib_get_timer(0,"encoding so", 0, 0); tdso=grib_get_timer(0,"decoding so", 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,"r"); if(!fin) {perror(finname);exit(1);} c=grib_context_get_default(); length=BUFF_SIZE; GRIB_CHECK(grib_read_any_from_file(c,fin,buffer,&length),0); fclose(fin); if (append) fout = fopen(ofilename,"a"); else fout = fopen(ofilename,"w"); if(!fout) {perror(ofilename);exit(1);} c=grib_context_get_default(); e=0; h=grib_handle_new_from_message_copy(c,buffer,length); 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_clear(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); GRIB_CHECK(grib_get_double(h,"packingError",&packingError),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 sizeso encodeso encodeSimple decodeso decodeSimple\n"); sec4len=nvalues+100000; /* decode values grid_simple */ if (strcmp(packingType,grid_simple)) grib_set_string(h,"packingType",grid_simple,&grid_simple_l); grib_timer_start(tds); for (count=0;count<repeatsimple;count++) GRIB_CHECK(grib_get_double_array(h,"values",values,&nvalues),0); grib_timer_stop(tds,0); *outfilename='\0'; sprintf(outfilename,"%s_%s_%ld_%ld_simple.grib1",param,gridType,bitsPerValue,(long)nvalues); filesize_simple=grib_handle_write(h,outfilename); printf("file size simple = %ld\n",(long)filesize_simple); /* encode values grid_simple*/ grib_timer_start(tes); for (count=0;count<repeatsimple;count++) GRIB_CHECK(grib_set_double_array(h,"values",values,nvalues),0); grib_timer_stop(tes,0); /* decode with gribex*/ msg=(char*)buffer; gribex_msg_len=BUFF_SIZE; sec4len=nvalues+100000; gribex_check(cgribex( miss, ksec0,ksec1,ksec2,rsec2,ksec3,rsec3, ksec4,gvalues,sec4len, (char*)msg,&gribex_msg_len,"D")); /* encode values second order with gribex*/ ksec4[1] = bitsPerValue; /* to indicate complex packing. */ ksec4[3] = 64; /* to indicate extended flags are present. */ ksec4[5] = 16; ksec4[9] = 16; ksec4[11] = 8; ksec4[12] = 4; ksec4[13] = 0; ksec4[14] = -1; gribex_msg_len=BUFF_SIZE; grib_timer_start(teso); gribex_check(cgribex( miss, ksec0,ksec1,ksec2,rsec2,ksec3,rsec3, ksec4,gvalues,nvalues, buf,&gribex_msg_len,"K")); grib_timer_stop(teso,0); hso=grib_handle_new_from_message_copy(c,buf,gribex_msg_len); GRIB_CHECK(grib_get_double_array(h,"values",sovalues,&nvalues),0); *outfilename='\0'; sprintf(outfilename,"%s_%s_%ld_%ld_so.grib1",param,gridType,bitsPerValue,(long)nvalues); filesize_so=grib_handle_write(hso,outfilename); printf("file size so = %ld\n",(long)filesize_so); perc=(double)filesize_simple/(double)filesize_so; printf("compression ratio = %g \n",perc); printf("space savings = %g \n",(1.0-1.0/perc)*100); grib_handle_delete(h); /* decode values second order */ /* decode with gribex*/ msg=(char*)buf; gribex_msg_len=BUFF_SIZE; sec4len=nvalues+100000; grib_timer_start(tdso); gribex_check(cgribex( miss, ksec0,ksec1,ksec2,rsec2,ksec3,rsec3, ksec4,gvalues,sec4len, (char*)msg,&gribex_msg_len,"D")); grib_timer_stop(tdso,0); for (i=0;i<nvalues;i++) { if (fabs(gvalues[i]-values[i])>packingError) { printf("++++++++ Wrong coding\n"); printf("packingError=%g gvalues[%d]=%.20e values[%d]=%.20e abs. err=%g \n",packingError,i, gvalues[i],i,values[i],gvalues[i]-values[i]); } } for (i=0;i<nvalues;i++) { if (fabs(gvalues[i]-sovalues[i])>packingError) { printf("++++++++ Wrong coding\n"); printf("packingError=%g gvalues[%d]=%.20e sovalues[%d]=%.20e abs. err=%g \n",packingError,i, gvalues[i],i,sovalues[i],gvalues[i]-sovalues[i]); } } grib_handle_delete(hso); grib_context_free(c,values); print_timer(teso,repeatso); print_timer(tdso,repeatso); print_timer(tes,repeatsimple); print_timer(tds,repeatsimple); fprintf(fout,"%s %s %ld %ld %s %ld %ld %g %g %g %g\n", shortName,gridType,(long)nvalues,bitsPerValue, grid,(long)filesize_simple,(long)filesize_so,teso->timer_/repeatso,tes->timer_/repeatsimple,tdso->timer_/repeatso,tds->timer_/repeatsimple); fclose(fout); return 0; }