/wrfv2_fire/external/io_grib1/gribmap.c
C | 499 lines | 340 code | 78 blank | 81 comment | 45 complexity | e919157c3df6acd86c7bc571f824b997 MD5 | raw file
Possible License(s): AGPL-1.0
- #include <stdio.h>
- #include <stdlib.h>
- #include "gribmap.h"
- /******************************************************************************
- *
- * The functions in this file are used for opening/reading, and searching for
- * information in a grib table.
- *
- * All functions return 0 for success and 1 for failure, unless otherwise
- * noted.
- *****************************************************************************/
- int findchar(char *line, char thechar);
- #ifdef TEST
- int main()
- {
- Grib1_Tables grib_tables;
- char filename[300];
- int parm_id;
- int ret;
- int tablenum;
- int center,subcenter,parmtbl;
-
- strcpy(filename,"gribmap.txt");
- LOAD_GRIB1_TABLES(filename, &grib_tables, &ret);
- GET_GRIB_PARAM (&grib_tables, "TSK", ¢er,&subcenter,&parmtbl,
- &tablenum, &parm_id);
- fprintf(stderr,"got parm_id: %d center: %d subcenter: %d parmtbl: %d\n",
- parm_id,center,subcenter,parmtbl);
- }
- #endif
- /******************************************************************************
- *
- * read_gribmap - reads a gribmap file and puts the information into the
- * grib_table_info structure.
- *
- ******************************************************************************/
- int READ_GRIBMAP (char *filename, Grib1_Tables *grib_tables, int *ret)
- {
- FILE *mapptr;
- char line[MAX_LINE_CHARS];
- int dummy;
- int parmidx;
- int nxtidx, elemidx, charidx;
- char elems[6][MAX_LINE_CHARS];
- int tablenum;
- /* Open parameter table file */
- mapptr = fopen(filename, "r");
- if (mapptr == NULL)
- {
- fprintf(stderr,"Could not open %s\n",filename);
- *ret=1;
- return 1;
- }
- /* Skip over comments at begining of gribmap file */
- while (fgets(line,500,mapptr))
- {
- if (line[0] != '#') break;
- }
- tablenum = 0;
- grib_tables->num_tables = 1;
- grib_tables->grib_table_info =
- (Grib1_Table_Info *)calloc(1,sizeof(Grib1_Table_Info));
- if (grib_tables->grib_table_info == NULL)
- {
- fprintf(stderr,"Could not allocate space for grib_table_info\n");
- *ret = 1;
- return 1;
- }
- grib_tables->grib_table_info[tablenum].num_entries = 0;
- sscanf(line,"%d:%d:%d:%d",&dummy,
- &(grib_tables->grib_table_info[tablenum].center),
- &(grib_tables->grib_table_info[tablenum].subcenter),
- &(grib_tables->grib_table_info[tablenum].parmtbl));
- /*
- * Read each line of parameter table, and store information in the
- * structure.
- */
- while (fgets(line,MAX_LINE_CHARS,mapptr) != NULL)
- {
- /* Split up the elements that are seperated by : */
- nxtidx = 0;
- elemidx = 0;
- while ((charidx = findchar(line + nxtidx,':')) >= 0)
- {
- strncpy(elems[elemidx],line + nxtidx,charidx);
- elems[elemidx][charidx] = '\0';
- elemidx++;
- nxtidx += (charidx + 1);
- }
- parmidx = atoi(elems[0]);
- /*
- * Check to see if this line specifies the next grib table. If so,
- * break out
- */
- if (parmidx == -1) {
- grib_tables->num_tables++;
- tablenum++;
- grib_tables->grib_table_info =
- (Grib1_Table_Info *)
- realloc(grib_tables->grib_table_info,
- grib_tables->num_tables*sizeof(Grib1_Table_Info));
-
- if (grib_tables->grib_table_info == NULL)
- {
- fprintf(stderr,
- "Could not re-allocate space for grib_table_info\n");
- *ret = 1;
- return 1;
- }
- grib_tables->grib_table_info[tablenum].num_entries = 0;
- sscanf(line,"%d:%d:%d:%d",&dummy,
- &(grib_tables->grib_table_info[tablenum].center),
- &(grib_tables->grib_table_info[tablenum].subcenter),
- &(grib_tables->grib_table_info[tablenum].parmtbl));
- continue;
- }
- /* Assure that we have not gone beyond 256 entries! */
- if (grib_tables->grib_table_info[tablenum].num_entries >= 256)
- {
- fprintf(stderr,
- "Error: Invalid number of lines in table %d in, \n skipping line: %s \n",
- tablenum,line);
- break;
- }
- /* Grab the last field */
- strcpy(elems[elemidx],line + nxtidx);
- /* Split up comma-seperated field of wrf varnames */
- nxtidx = 0;
- elemidx = 0;
- /* Allocate number of elements in wrf_param */
- grib_tables->grib_table_info[tablenum].wrf_param[parmidx] =
- (char **)malloc(1*sizeof(char *));
- if (grib_tables->grib_table_info[tablenum].wrf_param[parmidx] == NULL)
- {
- fprintf(stderr, "Error allocating space for wrf_param[%d], exiting\n",
- parmidx);
- *ret = 1;
- return 1;
- }
- while ((charidx = findchar(elems[3]+nxtidx,',')) >= 0)
- {
- /* Allocate number of elements in wrf_param */
- grib_tables->grib_table_info[tablenum].wrf_param[parmidx] =
- (char **)
- realloc(grib_tables->grib_table_info[tablenum].wrf_param[parmidx],
- (elemidx+2)*sizeof(char *));
- if (grib_tables->grib_table_info[tablenum].wrf_param[parmidx]
- == NULL)
- {
- perror("");
- fprintf(stderr,
- "Error allocating space for wrf_param[%d], exiting\n",
- parmidx);
- *ret = 1;
- return 1;
- }
- grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx] =
- (char *)malloc((charidx+2)*sizeof(char));
- if (grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx]
- == NULL)
- {
- perror("");
- fprintf(stderr,
- "Error allocating space for wrf_param[%d][%d], exiting\n",
- parmidx,elemidx);
- *ret = 1;
- return 1;
- }
-
- strncpy(grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx],
- elems[3]+nxtidx,charidx);
- grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx][charidx] = '\0';
- elemidx++;
- nxtidx += (charidx + 1);
- }
- /* Grab the last field */
- if (strlen(elems[3] + nxtidx) <= 0)
- {
- /* Case for no specified WRF fields */
- grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx] =
- (char *)malloc(1*sizeof(char));
- if (grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx]
- == NULL)
- {
- perror("");
- fprintf(stderr,
- "Error allocating space for wrf_param[%d][%d], exiting\n",
- parmidx,elemidx);
- *ret = 1;
- return 1;
- }
- grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx][0]
- = '\0';
- grib_tables->grib_table_info[tablenum].num_wrf_params[parmidx] = 0;
- }
- else
- {
- /* Allocate space for last element */
- grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx] =
- (char *)malloc((strlen(elems[3] + nxtidx)+1)*sizeof(char));
- if (grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx]
- == NULL)
- {
- perror("");
- fprintf(stderr,
- "Error allocating space for wrf_param[%d][%d], exiting\n",
- parmidx,elemidx);
- *ret = 1;
- return 1;
- }
-
- strcpy(grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx],
- elems[3] + nxtidx);
- grib_tables->grib_table_info[tablenum].num_wrf_params[parmidx] =
- elemidx + 1;
- }
-
- grib_tables->grib_table_info[tablenum].parm_id[parmidx]=atoi(elems[0]);
- grib_tables->grib_table_info[tablenum].dec_sc_factor[parmidx]=atoi(elems[4]);
- grib_tables->grib_table_info[tablenum].num_entries++;
- }
- *ret=0;
- return 0;
- }
- /******************************************************************************
- *
- * get_grib_param - searches through a grib_table_info structure and returns
- * the index for the input "varname".
- *
- * returns index number, or, -1 for failure.
- *****************************************************************************/
- int GET_GRIB_PARAM (Grib1_Tables *grib_tables, char *varname, int *center,
- int *subcenter, int *parmtbl, int *tablenum, int *index,
- int strlen1, int strlen2)
- {
- int idx;
- int prm_idx;
- int tableidx;
- char varnametmp[200];
-
- *index = -1;
- strncpy(varnametmp,varname,strlen2);
- varnametmp[strlen2] = '\0';
- trim(varnametmp);
- for (tableidx = 0; tableidx < grib_tables->num_tables ;tableidx++)
- {
- for (idx = 0;
- idx < grib_tables->grib_table_info[tableidx].num_entries;
- idx++)
- {
- for (prm_idx = 0;
- prm_idx <
- grib_tables->grib_table_info[tableidx].num_wrf_params[idx];
- prm_idx++)
- {
- if (strcmp(varnametmp,
- grib_tables->grib_table_info[tableidx].wrf_param[idx][prm_idx])
- == 0)
- {
- *center =
- grib_tables->grib_table_info[tableidx].center;
- *subcenter = grib_tables->grib_table_info[tableidx].subcenter;
- *parmtbl = grib_tables->grib_table_info[tableidx].parmtbl;
- *tablenum = tableidx;
- *index = idx;
- break;
- }
- }
- }
-
- }
- return *index;
- }
- /******************************************************************************
- *
- * free_gribmap_ - returns the size (in bytes) of a grib_table_info
- * structure.
- *
- *****************************************************************************/
- int FREE_GRIBMAP(Grib1_Tables *grib_tables)
- {
- int idx, idx2;
- int tablenum;
-
- for (tablenum = 0; tablenum < grib_tables->num_tables; tablenum++)
- {
- for (idx = 0; idx < grib_tables->grib_table_info[tablenum].num_entries;
- idx++)
- {
- for (idx2 = 0;
- idx2 < grib_tables->grib_table_info[tablenum].num_wrf_params[idx];
- idx2++)
- {
- free(grib_tables->grib_table_info[tablenum].wrf_param[idx][idx2]);
- }
- if (grib_tables->grib_table_info[tablenum].num_wrf_params[idx] > 0)
- {
- free(grib_tables->grib_table_info[tablenum].wrf_param[idx]);
- }
- }
- }
- free(grib_tables->grib_table_info);
- return 0;
- }
- /******************************************************************************
- *
- * Return the character index of the first instance of "thechar" in a string.
- *
- ******************************************************************************/
- int findchar(char *line, char thechar)
- {
- int returnidx, charnum;
- returnidx = -1;
- for (charnum = 0; charnum < strlen(line); charnum++)
- {
- if (line[charnum] == thechar)
- {
- returnidx = charnum;
- break;
- }
- }
- return returnidx;
- }
- /******************************************************************************
- *
- * get_grib1_table_info_size - returns the size (in bytes) of a grib_table_info
- * structure.
- *
- *****************************************************************************/
- int GET_GRIB1_TABLE_INFO_SIZE (int *size)
- {
- *size = sizeof(Grib1_Table_Info);
- return *size;
- }
- /******************************************************************************
- *
- * get_grib1_tables_size - returns the size (in bytes) of a grib_tables
- * structure.
- *
- *****************************************************************************/
- int GET_GRIB1_TABLES_SIZE (int *size)
- {
- *size = sizeof(Grib1_Tables);
- return *size;
- }
- /******************************************************************************
- *
- * load_grib1_table_info - reads a gribmap file and puts the information into
- * the grib_table_info structure.
- *
- ******************************************************************************/
- int LOAD_GRIB1_TABLES (char filename[],
- Grib1_Tables *grib_tables, int *ret, int strlen1)
- {
- char tmpfilename[300];
- strncpy(tmpfilename,filename,strlen1);
- tmpfilename[strlen1] = '\0';
- READ_GRIBMAP(tmpfilename, grib_tables, ret);
- return *ret;
- }
- /******************************************************************************
- *
- * get_grid_info_size_ - returns the size (in bytes) of a grib_tables
- * structure.
- *
- *****************************************************************************/
- int GET_GRID_INFO_SIZE (int *size)
- {
- *size = sizeof(Grib1_Tables);
- return *size;
- }
- /******************************************************************************
- *
- * copy_grib_tables - allocates and fills a grib_tables structure
- *
- *****************************************************************************/
- Grib1_Tables *copy_grib_tables(Grib1_Tables *grib_tables)
- {
- int tblidx,prmidx,elmidx;
- int strsiz;
- Grib1_Tables *tmp;
- tmp = (Grib1_Tables *)malloc(sizeof(Grib1_Tables));
- memcpy(tmp,grib_tables,sizeof(Grib1_Tables));
- /* Now do the grib_table_info elements within grib_tables */
- tmp->grib_table_info =
- (Grib1_Table_Info *)
- malloc(grib_tables->num_tables*sizeof(Grib1_Table_Info));
- if (tmp->grib_table_info == NULL)
- {
- fprintf(stderr,
- "copy_grib_tables: Could not allocate space for grib_table_info. num_tables: %d\n",
- grib_tables->num_tables);
- exit(1);
- }
- memcpy(tmp->grib_table_info,
- grib_tables->grib_table_info,
- grib_tables->num_tables*sizeof(Grib1_Table_Info));
- for (tblidx = 0; tblidx < grib_tables->num_tables; tblidx++)
- {
- for (prmidx = 0; prmidx < MAX_PARAMS; prmidx++)
- {
- if (grib_tables->grib_table_info[tblidx].num_wrf_params[prmidx] <= 0)
- {
- continue;
- }
- tmp->grib_table_info[tblidx].wrf_param[prmidx] = (char **)
- malloc(grib_tables->grib_table_info[tblidx].num_wrf_params[prmidx]
- * sizeof(char *));
- memcpy(tmp->grib_table_info[tblidx].wrf_param[prmidx],
- grib_tables->grib_table_info[tblidx].wrf_param[prmidx],
- grib_tables->grib_table_info[tblidx].num_wrf_params[prmidx]
- * sizeof(char *));
- for (elmidx = 0;
- elmidx < grib_tables->grib_table_info[tblidx].num_wrf_params[prmidx];
- elmidx++)
- {
-
- strsiz =
- strlen(grib_tables->grib_table_info[tblidx].wrf_param[prmidx][elmidx]) + 1;
- tmp->grib_table_info[tblidx].wrf_param[prmidx][elmidx] =
- (char *)
- malloc(strsiz * sizeof(char));
- memcpy(tmp->grib_table_info[tblidx].wrf_param[prmidx][elmidx],
- grib_tables->grib_table_info[tblidx].wrf_param[prmidx][elmidx],
- strsiz * sizeof(char));
- }
- }
- }
- return tmp;
- }