PageRenderTime 44ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/wrfv2_fire/external/io_grib1/gribmap.c

http://github.com/jbeezley/wrf-fire
C | 499 lines | 340 code | 78 blank | 81 comment | 45 complexity | e919157c3df6acd86c7bc571f824b997 MD5 | raw file
Possible License(s): AGPL-1.0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "gribmap.h"
  4. /******************************************************************************
  5. *
  6. * The functions in this file are used for opening/reading, and searching for
  7. * information in a grib table.
  8. *
  9. * All functions return 0 for success and 1 for failure, unless otherwise
  10. * noted.
  11. *****************************************************************************/
  12. int findchar(char *line, char thechar);
  13. #ifdef TEST
  14. int main()
  15. {
  16. Grib1_Tables grib_tables;
  17. char filename[300];
  18. int parm_id;
  19. int ret;
  20. int tablenum;
  21. int center,subcenter,parmtbl;
  22. strcpy(filename,"gribmap.txt");
  23. LOAD_GRIB1_TABLES(filename, &grib_tables, &ret);
  24. GET_GRIB_PARAM (&grib_tables, "TSK", &center,&subcenter,&parmtbl,
  25. &tablenum, &parm_id);
  26. fprintf(stderr,"got parm_id: %d center: %d subcenter: %d parmtbl: %d\n",
  27. parm_id,center,subcenter,parmtbl);
  28. }
  29. #endif
  30. /******************************************************************************
  31. *
  32. * read_gribmap - reads a gribmap file and puts the information into the
  33. * grib_table_info structure.
  34. *
  35. ******************************************************************************/
  36. int READ_GRIBMAP (char *filename, Grib1_Tables *grib_tables, int *ret)
  37. {
  38. FILE *mapptr;
  39. char line[MAX_LINE_CHARS];
  40. int dummy;
  41. int parmidx;
  42. int nxtidx, elemidx, charidx;
  43. char elems[6][MAX_LINE_CHARS];
  44. int tablenum;
  45. /* Open parameter table file */
  46. mapptr = fopen(filename, "r");
  47. if (mapptr == NULL)
  48. {
  49. fprintf(stderr,"Could not open %s\n",filename);
  50. *ret=1;
  51. return 1;
  52. }
  53. /* Skip over comments at begining of gribmap file */
  54. while (fgets(line,500,mapptr))
  55. {
  56. if (line[0] != '#') break;
  57. }
  58. tablenum = 0;
  59. grib_tables->num_tables = 1;
  60. grib_tables->grib_table_info =
  61. (Grib1_Table_Info *)calloc(1,sizeof(Grib1_Table_Info));
  62. if (grib_tables->grib_table_info == NULL)
  63. {
  64. fprintf(stderr,"Could not allocate space for grib_table_info\n");
  65. *ret = 1;
  66. return 1;
  67. }
  68. grib_tables->grib_table_info[tablenum].num_entries = 0;
  69. sscanf(line,"%d:%d:%d:%d",&dummy,
  70. &(grib_tables->grib_table_info[tablenum].center),
  71. &(grib_tables->grib_table_info[tablenum].subcenter),
  72. &(grib_tables->grib_table_info[tablenum].parmtbl));
  73. /*
  74. * Read each line of parameter table, and store information in the
  75. * structure.
  76. */
  77. while (fgets(line,MAX_LINE_CHARS,mapptr) != NULL)
  78. {
  79. /* Split up the elements that are seperated by : */
  80. nxtidx = 0;
  81. elemidx = 0;
  82. while ((charidx = findchar(line + nxtidx,':')) >= 0)
  83. {
  84. strncpy(elems[elemidx],line + nxtidx,charidx);
  85. elems[elemidx][charidx] = '\0';
  86. elemidx++;
  87. nxtidx += (charidx + 1);
  88. }
  89. parmidx = atoi(elems[0]);
  90. /*
  91. * Check to see if this line specifies the next grib table. If so,
  92. * break out
  93. */
  94. if (parmidx == -1) {
  95. grib_tables->num_tables++;
  96. tablenum++;
  97. grib_tables->grib_table_info =
  98. (Grib1_Table_Info *)
  99. realloc(grib_tables->grib_table_info,
  100. grib_tables->num_tables*sizeof(Grib1_Table_Info));
  101. if (grib_tables->grib_table_info == NULL)
  102. {
  103. fprintf(stderr,
  104. "Could not re-allocate space for grib_table_info\n");
  105. *ret = 1;
  106. return 1;
  107. }
  108. grib_tables->grib_table_info[tablenum].num_entries = 0;
  109. sscanf(line,"%d:%d:%d:%d",&dummy,
  110. &(grib_tables->grib_table_info[tablenum].center),
  111. &(grib_tables->grib_table_info[tablenum].subcenter),
  112. &(grib_tables->grib_table_info[tablenum].parmtbl));
  113. continue;
  114. }
  115. /* Assure that we have not gone beyond 256 entries! */
  116. if (grib_tables->grib_table_info[tablenum].num_entries >= 256)
  117. {
  118. fprintf(stderr,
  119. "Error: Invalid number of lines in table %d in, \n skipping line: %s \n",
  120. tablenum,line);
  121. break;
  122. }
  123. /* Grab the last field */
  124. strcpy(elems[elemidx],line + nxtidx);
  125. /* Split up comma-seperated field of wrf varnames */
  126. nxtidx = 0;
  127. elemidx = 0;
  128. /* Allocate number of elements in wrf_param */
  129. grib_tables->grib_table_info[tablenum].wrf_param[parmidx] =
  130. (char **)malloc(1*sizeof(char *));
  131. if (grib_tables->grib_table_info[tablenum].wrf_param[parmidx] == NULL)
  132. {
  133. fprintf(stderr, "Error allocating space for wrf_param[%d], exiting\n",
  134. parmidx);
  135. *ret = 1;
  136. return 1;
  137. }
  138. while ((charidx = findchar(elems[3]+nxtidx,',')) >= 0)
  139. {
  140. /* Allocate number of elements in wrf_param */
  141. grib_tables->grib_table_info[tablenum].wrf_param[parmidx] =
  142. (char **)
  143. realloc(grib_tables->grib_table_info[tablenum].wrf_param[parmidx],
  144. (elemidx+2)*sizeof(char *));
  145. if (grib_tables->grib_table_info[tablenum].wrf_param[parmidx]
  146. == NULL)
  147. {
  148. perror("");
  149. fprintf(stderr,
  150. "Error allocating space for wrf_param[%d], exiting\n",
  151. parmidx);
  152. *ret = 1;
  153. return 1;
  154. }
  155. grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx] =
  156. (char *)malloc((charidx+2)*sizeof(char));
  157. if (grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx]
  158. == NULL)
  159. {
  160. perror("");
  161. fprintf(stderr,
  162. "Error allocating space for wrf_param[%d][%d], exiting\n",
  163. parmidx,elemidx);
  164. *ret = 1;
  165. return 1;
  166. }
  167. strncpy(grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx],
  168. elems[3]+nxtidx,charidx);
  169. grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx][charidx] = '\0';
  170. elemidx++;
  171. nxtidx += (charidx + 1);
  172. }
  173. /* Grab the last field */
  174. if (strlen(elems[3] + nxtidx) <= 0)
  175. {
  176. /* Case for no specified WRF fields */
  177. grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx] =
  178. (char *)malloc(1*sizeof(char));
  179. if (grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx]
  180. == NULL)
  181. {
  182. perror("");
  183. fprintf(stderr,
  184. "Error allocating space for wrf_param[%d][%d], exiting\n",
  185. parmidx,elemidx);
  186. *ret = 1;
  187. return 1;
  188. }
  189. grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx][0]
  190. = '\0';
  191. grib_tables->grib_table_info[tablenum].num_wrf_params[parmidx] = 0;
  192. }
  193. else
  194. {
  195. /* Allocate space for last element */
  196. grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx] =
  197. (char *)malloc((strlen(elems[3] + nxtidx)+1)*sizeof(char));
  198. if (grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx]
  199. == NULL)
  200. {
  201. perror("");
  202. fprintf(stderr,
  203. "Error allocating space for wrf_param[%d][%d], exiting\n",
  204. parmidx,elemidx);
  205. *ret = 1;
  206. return 1;
  207. }
  208. strcpy(grib_tables->grib_table_info[tablenum].wrf_param[parmidx][elemidx],
  209. elems[3] + nxtidx);
  210. grib_tables->grib_table_info[tablenum].num_wrf_params[parmidx] =
  211. elemidx + 1;
  212. }
  213. grib_tables->grib_table_info[tablenum].parm_id[parmidx]=atoi(elems[0]);
  214. grib_tables->grib_table_info[tablenum].dec_sc_factor[parmidx]=atoi(elems[4]);
  215. grib_tables->grib_table_info[tablenum].num_entries++;
  216. }
  217. *ret=0;
  218. return 0;
  219. }
  220. /******************************************************************************
  221. *
  222. * get_grib_param - searches through a grib_table_info structure and returns
  223. * the index for the input "varname".
  224. *
  225. * returns index number, or, -1 for failure.
  226. *****************************************************************************/
  227. int GET_GRIB_PARAM (Grib1_Tables *grib_tables, char *varname, int *center,
  228. int *subcenter, int *parmtbl, int *tablenum, int *index,
  229. int strlen1, int strlen2)
  230. {
  231. int idx;
  232. int prm_idx;
  233. int tableidx;
  234. char varnametmp[200];
  235. *index = -1;
  236. strncpy(varnametmp,varname,strlen2);
  237. varnametmp[strlen2] = '\0';
  238. trim(varnametmp);
  239. for (tableidx = 0; tableidx < grib_tables->num_tables ;tableidx++)
  240. {
  241. for (idx = 0;
  242. idx < grib_tables->grib_table_info[tableidx].num_entries;
  243. idx++)
  244. {
  245. for (prm_idx = 0;
  246. prm_idx <
  247. grib_tables->grib_table_info[tableidx].num_wrf_params[idx];
  248. prm_idx++)
  249. {
  250. if (strcmp(varnametmp,
  251. grib_tables->grib_table_info[tableidx].wrf_param[idx][prm_idx])
  252. == 0)
  253. {
  254. *center =
  255. grib_tables->grib_table_info[tableidx].center;
  256. *subcenter = grib_tables->grib_table_info[tableidx].subcenter;
  257. *parmtbl = grib_tables->grib_table_info[tableidx].parmtbl;
  258. *tablenum = tableidx;
  259. *index = idx;
  260. break;
  261. }
  262. }
  263. }
  264. }
  265. return *index;
  266. }
  267. /******************************************************************************
  268. *
  269. * free_gribmap_ - returns the size (in bytes) of a grib_table_info
  270. * structure.
  271. *
  272. *****************************************************************************/
  273. int FREE_GRIBMAP(Grib1_Tables *grib_tables)
  274. {
  275. int idx, idx2;
  276. int tablenum;
  277. for (tablenum = 0; tablenum < grib_tables->num_tables; tablenum++)
  278. {
  279. for (idx = 0; idx < grib_tables->grib_table_info[tablenum].num_entries;
  280. idx++)
  281. {
  282. for (idx2 = 0;
  283. idx2 < grib_tables->grib_table_info[tablenum].num_wrf_params[idx];
  284. idx2++)
  285. {
  286. free(grib_tables->grib_table_info[tablenum].wrf_param[idx][idx2]);
  287. }
  288. if (grib_tables->grib_table_info[tablenum].num_wrf_params[idx] > 0)
  289. {
  290. free(grib_tables->grib_table_info[tablenum].wrf_param[idx]);
  291. }
  292. }
  293. }
  294. free(grib_tables->grib_table_info);
  295. return 0;
  296. }
  297. /******************************************************************************
  298. *
  299. * Return the character index of the first instance of "thechar" in a string.
  300. *
  301. ******************************************************************************/
  302. int findchar(char *line, char thechar)
  303. {
  304. int returnidx, charnum;
  305. returnidx = -1;
  306. for (charnum = 0; charnum < strlen(line); charnum++)
  307. {
  308. if (line[charnum] == thechar)
  309. {
  310. returnidx = charnum;
  311. break;
  312. }
  313. }
  314. return returnidx;
  315. }
  316. /******************************************************************************
  317. *
  318. * get_grib1_table_info_size - returns the size (in bytes) of a grib_table_info
  319. * structure.
  320. *
  321. *****************************************************************************/
  322. int GET_GRIB1_TABLE_INFO_SIZE (int *size)
  323. {
  324. *size = sizeof(Grib1_Table_Info);
  325. return *size;
  326. }
  327. /******************************************************************************
  328. *
  329. * get_grib1_tables_size - returns the size (in bytes) of a grib_tables
  330. * structure.
  331. *
  332. *****************************************************************************/
  333. int GET_GRIB1_TABLES_SIZE (int *size)
  334. {
  335. *size = sizeof(Grib1_Tables);
  336. return *size;
  337. }
  338. /******************************************************************************
  339. *
  340. * load_grib1_table_info - reads a gribmap file and puts the information into
  341. * the grib_table_info structure.
  342. *
  343. ******************************************************************************/
  344. int LOAD_GRIB1_TABLES (char filename[],
  345. Grib1_Tables *grib_tables, int *ret, int strlen1)
  346. {
  347. char tmpfilename[300];
  348. strncpy(tmpfilename,filename,strlen1);
  349. tmpfilename[strlen1] = '\0';
  350. READ_GRIBMAP(tmpfilename, grib_tables, ret);
  351. return *ret;
  352. }
  353. /******************************************************************************
  354. *
  355. * get_grid_info_size_ - returns the size (in bytes) of a grib_tables
  356. * structure.
  357. *
  358. *****************************************************************************/
  359. int GET_GRID_INFO_SIZE (int *size)
  360. {
  361. *size = sizeof(Grib1_Tables);
  362. return *size;
  363. }
  364. /******************************************************************************
  365. *
  366. * copy_grib_tables - allocates and fills a grib_tables structure
  367. *
  368. *****************************************************************************/
  369. Grib1_Tables *copy_grib_tables(Grib1_Tables *grib_tables)
  370. {
  371. int tblidx,prmidx,elmidx;
  372. int strsiz;
  373. Grib1_Tables *tmp;
  374. tmp = (Grib1_Tables *)malloc(sizeof(Grib1_Tables));
  375. memcpy(tmp,grib_tables,sizeof(Grib1_Tables));
  376. /* Now do the grib_table_info elements within grib_tables */
  377. tmp->grib_table_info =
  378. (Grib1_Table_Info *)
  379. malloc(grib_tables->num_tables*sizeof(Grib1_Table_Info));
  380. if (tmp->grib_table_info == NULL)
  381. {
  382. fprintf(stderr,
  383. "copy_grib_tables: Could not allocate space for grib_table_info. num_tables: %d\n",
  384. grib_tables->num_tables);
  385. exit(1);
  386. }
  387. memcpy(tmp->grib_table_info,
  388. grib_tables->grib_table_info,
  389. grib_tables->num_tables*sizeof(Grib1_Table_Info));
  390. for (tblidx = 0; tblidx < grib_tables->num_tables; tblidx++)
  391. {
  392. for (prmidx = 0; prmidx < MAX_PARAMS; prmidx++)
  393. {
  394. if (grib_tables->grib_table_info[tblidx].num_wrf_params[prmidx] <= 0)
  395. {
  396. continue;
  397. }
  398. tmp->grib_table_info[tblidx].wrf_param[prmidx] = (char **)
  399. malloc(grib_tables->grib_table_info[tblidx].num_wrf_params[prmidx]
  400. * sizeof(char *));
  401. memcpy(tmp->grib_table_info[tblidx].wrf_param[prmidx],
  402. grib_tables->grib_table_info[tblidx].wrf_param[prmidx],
  403. grib_tables->grib_table_info[tblidx].num_wrf_params[prmidx]
  404. * sizeof(char *));
  405. for (elmidx = 0;
  406. elmidx < grib_tables->grib_table_info[tblidx].num_wrf_params[prmidx];
  407. elmidx++)
  408. {
  409. strsiz =
  410. strlen(grib_tables->grib_table_info[tblidx].wrf_param[prmidx][elmidx]) + 1;
  411. tmp->grib_table_info[tblidx].wrf_param[prmidx][elmidx] =
  412. (char *)
  413. malloc(strsiz * sizeof(char));
  414. memcpy(tmp->grib_table_info[tblidx].wrf_param[prmidx][elmidx],
  415. grib_tables->grib_table_info[tblidx].wrf_param[prmidx][elmidx],
  416. strsiz * sizeof(char));
  417. }
  418. }
  419. }
  420. return tmp;
  421. }