static struct gribtab_s *search_gribtab(struct gribtab_s *p, unsigned char **sec){ int discipline, center, mastertab, localtab, parmcat, parmnum; discipline = GB2_Discipline(sec); center = GB2_Center(sec); mastertab = GB2_MasterTable(sec); localtab = GB2_LocalTable(sec); parmcat = GB2_ParmCat(sec); parmnum = GB2_ParmNum(sec); if (mastertab == 0) mastertab = 1; for (; p->disc >= 0; p++) { if (parmnum < 192) { if (discipline == p->disc && (mastertab == p->mtab || p->mtab == -1) && parmcat == p->pcat && parmnum == p->pnum) { return p; } } else { if (discipline == p->disc && center == p->cntr && localtab == p->ltab && parmcat == p->pcat && parmnum == p->pnum) { return p; break; } } } return NULL; }
static struct gribtable_s *search_gribtable(struct gribtable_s *p, unsigned char **sec){ int discipline, center, mastertab, localtab, parmcat, parmnum; int use_local_table; static int count = 0; if (p == NULL) return NULL; discipline = GB2_Discipline(sec); center = GB2_Center(sec); mastertab = GB2_MasterTable(sec); localtab = GB2_LocalTable(sec); parmcat = GB2_ParmCat(sec); parmnum = GB2_ParmNum(sec); // // if (mastertab == 0) mastertab = 1; // if (mastertab >= 0 && mastertab <= 10) mastertab = 1; use_local_table = (mastertab == 255) ? 1 : 0; if (parmnum >= 192 || parmcat >= 192) use_local_table = 1; if (use_local_table == 1 && localtab == 0) { if (count++ < 6 ) fprintf(stderr,"**** ERROR: local table = 0 is not allowed, set to 1 ***\n"); localtab = 1; } if (use_local_table == 1 && localtab == 255) { fatal_error("local gribtable is undefined (255)",""); } if (! use_local_table) { for (; p->disc >= 0; p++) { if (discipline == p->disc && (mastertab >= p->mtab_low) && (mastertab <= p->mtab_high) && parmcat == p->pcat && parmnum == p->pnum) { return p; } } } else { // printf(">> cname local find: disc %d center %d localtab %d pcat %d pnum %d\n", discipline, center, localtab, parmcat, parmnum); for (; p->disc >= 0; p++) { if (discipline == p->disc && center == p->cntr && localtab == p->ltab && parmcat == p->pcat && parmnum == p->pnum) { return p; } } } return NULL; }
int getName(unsigned char **sec, int mode, char *inv_out, char *name, char *desc, char *unit) { int discipline, center, mastertab, localtab, parmcat, parmnum; struct gribtab_s *p; p = NULL; #ifdef USE_TIGGE if (tigge) p = search_gribtab(tigge_gribtab, sec); #endif if (p == NULL) p = search_gribtab(gribtab, sec); if (p) { if (name) strcpy(name, p->name); if (desc) strcpy(desc, p->desc); if (unit) strcpy(unit, p->unit); if (inv_out) { sprintf(inv_out, "%s", p->name); inv_out += strlen(inv_out); if (mode) sprintf(inv_out," %s [%s]", p->desc, p->unit); } } else { if (name) *name = 0; if (desc) *desc = 0; if (unit) *unit = 0; discipline = GB2_Discipline(sec); center = GB2_Center(sec); mastertab = GB2_MasterTable(sec); localtab = GB2_LocalTable(sec); parmcat = GB2_ParmCat(sec); parmnum = GB2_ParmNum(sec); if (parmnum < 192) { sprintf(inv_out,"var discipline=%d master_table=%d parmcat=%d parm=%d", discipline, mastertab, parmcat, parmnum); } else { sprintf(inv_out,"var discipline=%d center=%d local_table=%d parmcat=%d parm=%d", discipline, center, localtab, parmcat, parmnum); } } return 0; }
int getName(unsigned char **sec, int mode, char *inv_out, char *name, char *desc, char *unit) { int discipline, center, mastertab, localtab, parmcat, parmnum; int pdt; struct gribtable_s *p; const char *p_unit; p = NULL; if (user_gribtable != NULL) p = search_gribtable(user_gribtable, sec); #ifdef USE_TIGGE if (tigge && p == NULL) p = search_gribtable(tigge_gribtable, sec); /* tigge is default table */ #endif if (p == NULL) p = search_gribtable(gribtable, sec); #ifdef USE_TIGGE /* if undefined and a tigge file */ if (p == NULL && !tigge && (code_table_1_3(sec) == 4 || code_table_1_3(sec) == 5)) p = search_gribtable(tigge_gribtable, sec); #endif p_unit = "unit"; if (p) { p_unit = p->unit; pdt = code_table_4_0(sec); if (pdt == 5 || pdt == 9) p_unit = "prob"; } if (p) { if (name) strcpy(name, p->name); if (desc) strcpy(desc, p->desc); if (unit) strcpy(unit, p_unit); if (inv_out) { sprintf(inv_out, "%s", p->name); inv_out += strlen(inv_out); if (mode) sprintf(inv_out," %s [%s]", p->desc, p_unit); } } else { discipline = GB2_Discipline(sec); center = GB2_Center(sec); mastertab = GB2_MasterTable(sec); localtab = GB2_LocalTable(sec); parmcat = GB2_ParmCat(sec); parmnum = GB2_ParmNum(sec); if (name) sprintf(name,"var%d_%d_%d",discipline,parmcat,parmnum); if (desc) strcpy(desc,"desc"); if (unit) strcpy(unit,p_unit); if (inv_out) { if (parmnum < 192 && parmcat < 192) { sprintf(inv_out,"var discipline=%d master_table=%d parmcat=%d parm=%d", discipline, mastertab, parmcat, parmnum); } else { sprintf(inv_out,"var discipline=%d center=%d local_table=%d parmcat=%d parm=%d", discipline, center, localtab, parmcat, parmnum); } } } return 0; }
int f_wind_speed(ARG1) { struct local_struct { float *val; int has_u; unsigned char *clone_sec[9]; FILE *output; }; struct local_struct *save; unsigned int i; int is_u; float *d1, *data_tmp; int discipline, mastertab, parmcat, parmnum; if (mode == -1) { // initialization save_translation = decode = 1; // allocate static variables *local = save = (struct local_struct *) malloc( sizeof(struct local_struct)); if (save == NULL) fatal_error("memory allocation -wind_speed",""); if ((save->output = (void *) ffopen(arg1, file_append ? "ab" : "wb")) == NULL) { fatal_error("-wind_speed: could not open file %s", arg1); } save->has_u = 0; init_sec(save->clone_sec); return 0; } save = *local; if (mode == -2) { // cleanup if (save->has_u == 1) { free(save->val); free_sec(save->clone_sec); } return 0; } if (mode >= 0) { // processing // get variable name parameters discipline = GB2_Discipline(sec); mastertab = GB2_MasterTable(sec); parmcat = GB2_ParmCat(sec); parmnum = GB2_ParmNum(sec); if (mode == 99) fprintf(stderr,"-wind_speed %d %d %d %d\n",mastertab,discipline,parmcat,parmnum); is_u = (mastertab <= 6) && (discipline == 0) && (parmcat == 2) && (parmnum == 2); if (mode == 99 && is_u) fprintf(stderr,"\n-wind_speed: is u\n"); if (is_u) { // save data if (save->has_u) { free(save->val); free_sec(save->clone_sec); } copy_sec(sec, save->clone_sec); copy_data(data,ndata,&(save->val)); GB2_ParmNum(save->clone_sec) = 3; // set id to V save->has_u = 1; return 0; } // check for V if (same_sec0(sec,save->clone_sec) == 1 && same_sec1(sec,save->clone_sec) == 1 && same_sec3(sec,save->clone_sec) == 1 && same_sec4(sec,save->clone_sec) == 1) { // calculate wind speed if (mode == 99) fprintf(stderr,"\n-wind_speed: calc wind speed\n"); d1= save->val; for (i = 0; i < ndata; i++) { if (!UNDEFINED_VAL(data[i]) && !UNDEFINED_VAL(*d1)) { *d1 = sqrt(data[i]*data[i] + *d1 * *d1); } else *d1 = UNDEFINED; d1++; } GB2_ParmNum(save->clone_sec) = 1; // set id to wind speed // copy data to temp space if ((data_tmp = (float *) malloc(ndata * sizeof(float))) == NULL) fatal_error("memory allocation - data_tmp",""); undo_output_order(save->val, data_tmp, ndata); grib_wrt(save->clone_sec, data_tmp, ndata, nx, ny, use_scale, dec_scale, bin_scale, wanted_bits, max_bits, grib_type, save->output); if (flush_mode) fflush(save->output); free(data_tmp); // cleanup free(save->val); free_sec(save->clone_sec); save->has_u = 0; } } return 0; }
int f_submsg_uv(ARG1) { struct local_struct { unsigned char *sec[9]; const char *vname; FILE *output; }; struct local_struct *save; int i, j, is_v; unsigned long int size; char name[NAMELEN]; unsigned char s[8]; if (mode == -1) { // initialization // allocate static structure *local = save = (struct local_struct *) malloc( sizeof(struct local_struct) ); if (save == NULL) fatal_error("submsg_uv: memory allocation",""); if ((save->output = ffopen(arg1, file_append ? "ab" : "wb")) == NULL) { fatal_error("submsg_uv: could not open file %s", arg1); } save->vname = NULL; init_sec(save->sec); return 0; } save = (struct local_struct *) *local; if (mode == -2) { // cleanup if (save->vname != NULL) { // write out cached field i = wrt_sec(save->sec[0], save->sec[1], save->sec[2], save->sec[3], save->sec[4], save->sec[5], save->sec[6], save->sec[7], save->output); if (i) fatal_error_i("submsg_uv: last record problem %i",i); free_sec(save->sec); } ffclose(save->output); free(save); return 0; } if (mode >= 0 ) { // processing i = getName(sec, mode, NULL, name, NULL, NULL); /* see if name == expected vname */ is_v = 0; if (save->vname != NULL && strcmp(name, save->vname) == 0) { is_v = 1; if (same_sec0(sec,save->sec) == 0) is_v = 0; if (same_sec1(sec,save->sec) == 0) is_v = 0; if (same_sec2(sec,save->sec) == 0) is_v = 0; if (same_sec3(sec,save->sec) == 0) is_v = 0; i = GB2_ParmNum(sec); j = GB2_ParmCat(sec); GB2_ParmNum(sec) = GB2_ParmNum(save->sec); GB2_ParmCat(sec) = GB2_ParmCat(save->sec); if (same_sec4(sec,save->sec) == 0) is_v = 0; GB2_ParmNum(sec) = i; GB2_ParmCat(sec) = j; } /* finished tests for U/V sequence */ /* is U/V sequence */ if (is_v) { size = (unsigned long int) GB2_Sec0_size + GB2_Sec8_size + (sec[1] ? uint4(sec[1]) : 0) + (sec[2] ? uint4(sec[2]) : 0) + (sec[3] ? uint4(sec[3]) : 0) + (sec[4] ? uint4(sec[4]) : 0) + (sec[5] ? uint4(sec[5]) : 0) + (sec[6] ? uint4(sec[6]) : 0) + (sec[7] ? uint4(sec[7]) : 0) + (save->sec[4] ? uint4(save->sec[4]) : 0) + (save->sec[5] ? uint4(save->sec[5]) : 0) + (save->sec[6] ? uint4(save->sec[6]) : 0) + (save->sec[7] ? uint4(save->sec[7]) : 0); fwrite((void *) sec[0], sizeof(char), 8, save->output); uint8_char(size, s); fwrite((void *) s, sizeof(char), 8, save->output); if (sec[1]) { i = uint4(sec[1]); if (fwrite((void *)sec[1], sizeof(char), i, save->output) != i) return 1; } if (sec[2]) { i = uint4(sec[2]); if (fwrite((void *)sec[2], sizeof(char), i, save->output) != i) return 1; } if (sec[3]) { i = uint4(sec[3]); if (fwrite((void *)sec[3], sizeof(char), i, save->output) != i) return 1; } if (save->sec[4]) { i = uint4(save->sec[4]); if (fwrite((void *)save->sec[4], sizeof(char), i, save->output) != i) return 1; } if (save->sec[5]) { i = uint4(save->sec[5]); if (fwrite((void *)save->sec[5],sizeof(char), i, save->output) != i) return 1; } if (save->sec[6]) { i = uint4(save->sec[6]); if (fwrite((void *)save->sec[6],sizeof(char), i, save->output) != i) return 1; } if (save->sec[7]) { i = uint4(save->sec[7]); if (fwrite((void *)save->sec[7],sizeof(char), i, save->output) != i) return 1; } if (sec[4]) { i = uint4(sec[4]); if (fwrite((void *)sec[4], sizeof(char), i, save->output) != i) return 1; } if (sec[5]) { i = uint4(sec[5]); if (fwrite((void *)sec[5], sizeof(char), i, save->output) != i) return 1; } if (sec[6]) { i = uint4(sec[6]); if (fwrite((void *)sec[6], sizeof(char), i, save->output) != i) return 1; } if (sec[7]) { i = uint4(sec[7]); if (fwrite((void *)sec[7], sizeof(char), i, save->output) != i) return 1; } s[0] = s[1] = s[2] = s[3] = 55; /* s = "7777" */ if (fwrite((void *) s, sizeof(char), 4, save->output) != 4) fatal_error("submsg_uv: write record problem",""); save->vname = NULL; free_sec(save->sec); return 0; } /* has U but not V, write U */ if (save->vname != NULL) { i = wrt_sec(save->sec[0], save->sec[1], save->sec[2], save->sec[3], save->sec[4], save->sec[5], save->sec[6], save->sec[7], save->output); if (i) fatal_error_i("submsg_uv: write record problem %i",i); free_sec(save->sec); save->vname = NULL; } /* check to see if new field is a U */ save->vname = is_u(name); /* if U, cache it */ if (save->vname != NULL) { copy_sec(sec,save->sec); return 0; } /* not U, write it out */ i = wrt_sec(sec[0], sec[1], sec[2], sec[3], sec[4], sec[5], sec[6], sec[7], save->output); if (i) fatal_error_i("submsg_uv: write problem %i",i); return 0; } return 0; }