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

/WPS/geogrid/util/retile-cat.c

http://github.com/jbeezley/wrf-fire
C | 658 lines | 556 code | 62 blank | 40 comment | 138 complexity | 525e4474734189bd88bc9d24d69aa441 MD5 | raw file
Possible License(s): AGPL-1.0
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. #include <math.h>
  7. #include <string.h>
  8. #define MSG_FLAG 0x80000001
  9. #define N_BYTES 1
  10. #define IN_TILE_DEGREES_LON 10.0
  11. #define IN_TILE_DEGREES_LAT 10.0
  12. #define IN_TILE_PTS_X 1200
  13. #define IN_TILE_PTS_Y 1200
  14. #define OUT_TILE_DEGREES_LON 20.0
  15. #define OUT_TILE_DEGREES_LAT 20.0
  16. #define OUT_TILE_PTS_X 600
  17. #define OUT_TILE_PTS_Y 600
  18. #define HALO_WIDTH 0
  19. #define ZDIM 1
  20. #define NCATS 24
  21. #define CATMIN 1
  22. #define CACHESIZE 12
  23. int **** data_cache = NULL;
  24. char ** fname_cache = NULL;
  25. int * lru = NULL;
  26. int *** supertile = NULL;
  27. int supertile_min_x = 999999;
  28. int supertile_min_y = 999999;
  29. void free_newtile(int *** x)
  30. {
  31. int i, j, k;
  32. for(i=0; i<IN_TILE_PTS_X; i++)
  33. {
  34. for(j=0; j<IN_TILE_PTS_Y; j++)
  35. {
  36. free(x[i][j]);
  37. }
  38. free(x[i]);
  39. }
  40. free(x);
  41. }
  42. int *** read_tile(char * fname)
  43. {
  44. int *** retval;
  45. int i, j, k, b;
  46. unsigned char buf[IN_TILE_PTS_X*IN_TILE_PTS_Y*ZDIM*N_BYTES];
  47. int fd;
  48. retval = (int ***)malloc(sizeof(int **)*IN_TILE_PTS_X);
  49. for(i=0; i<IN_TILE_PTS_X; i++)
  50. {
  51. retval[i] = (int **)malloc(sizeof(int *)*IN_TILE_PTS_Y);
  52. for(j=0; j<IN_TILE_PTS_Y; j++)
  53. {
  54. retval[i][j] = (int *)malloc(sizeof(int)*ZDIM);
  55. }
  56. }
  57. if ((fd = open(fname,O_RDONLY)) == -1)
  58. {
  59. fprintf(stderr,"Error opening source file %s\n", fname);
  60. return 0;
  61. }
  62. read(fd, (void *)&buf, IN_TILE_PTS_X*IN_TILE_PTS_Y*ZDIM*N_BYTES);
  63. close(fd);
  64. /* Put buf into retval */
  65. for(i=0; i<IN_TILE_PTS_X; i++)
  66. {
  67. for(j=0; j<IN_TILE_PTS_Y; j++)
  68. {
  69. for(k=0; k<ZDIM; k++)
  70. {
  71. retval[i][j][k] = 0;
  72. for(b=0; b<N_BYTES; b++)
  73. {
  74. retval[i][j][k] |= buf[k*N_BYTES*IN_TILE_PTS_X*IN_TILE_PTS_Y+j*N_BYTES*IN_TILE_PTS_X+i*N_BYTES+b] << 8*(N_BYTES-b-1);
  75. }
  76. }
  77. }
  78. }
  79. return retval;
  80. }
  81. int *** get_tile_from_cache(int i, int j)
  82. {
  83. int ii, jj, kk, k, least, least_idx;
  84. int *** retval, *** localptr;
  85. char * fname;
  86. fname = (char *)malloc(256);
  87. i = (i/IN_TILE_PTS_X)*IN_TILE_PTS_X+1;
  88. j = (j/IN_TILE_PTS_Y)*IN_TILE_PTS_Y+1;
  89. snprintf(fname,256,"%5.5i-%5.5i.%5.5i-%5.5i",i,i+IN_TILE_PTS_X-1,j,j+IN_TILE_PTS_Y-1);
  90. /* Find out whether tile containing (i,j) is in cache */
  91. if (data_cache != NULL)
  92. {
  93. for(k=0; k<CACHESIZE; k++)
  94. {
  95. if (fname_cache[k] != NULL)
  96. {
  97. if (strncmp(fname_cache[k],fname,256) == 0)
  98. {
  99. free(fname);
  100. retval = data_cache[k];
  101. return retval;
  102. }
  103. }
  104. }
  105. }
  106. /* If not, read from file */
  107. localptr = read_tile(fname);
  108. /* Also store tile in the cache */
  109. if (data_cache == NULL)
  110. {
  111. data_cache = (int ****)malloc(sizeof(int ***)*CACHESIZE);
  112. fname_cache = (char **)malloc(sizeof(char *)*CACHESIZE);
  113. lru = (int *)malloc(sizeof(int)*CACHESIZE);
  114. for(k=0; k<CACHESIZE; k++)
  115. {
  116. data_cache[k] = NULL;
  117. fname_cache[k] = NULL;
  118. lru[k] = 0;
  119. }
  120. }
  121. least = 0;
  122. least_idx = 0;
  123. for(k=0; k<CACHESIZE; k++)
  124. {
  125. lru[k]++;
  126. if (lru[k] > least)
  127. {
  128. least = lru[k];
  129. least_idx = k;
  130. }
  131. }
  132. if (data_cache[least_idx] == NULL)
  133. {
  134. data_cache[least_idx] = localptr;
  135. fname_cache[least_idx] = fname;
  136. lru[least_idx] = 0;
  137. }
  138. else
  139. {
  140. free_newtile(data_cache[least_idx]);
  141. data_cache[least_idx] = localptr;
  142. free(fname_cache[least_idx]);
  143. fname_cache[least_idx] = fname;
  144. lru[least_idx] = 0;
  145. }
  146. retval = localptr;
  147. return retval;
  148. }
  149. void build_supertile(int i, int j)
  150. {
  151. int ii, jj, kk;
  152. int doflip;
  153. int *** newtile;
  154. if (i < 0)
  155. i = i + IN_TILE_PTS_X*(int)(360./IN_TILE_DEGREES_LON);
  156. if (i >= IN_TILE_PTS_X*(int)(360./IN_TILE_DEGREES_LON))
  157. i = i - IN_TILE_PTS_X*(int)(360./IN_TILE_DEGREES_LON);
  158. if (j < 0)
  159. j = j + IN_TILE_PTS_Y*(int)(180./IN_TILE_DEGREES_LAT);
  160. if (j >= IN_TILE_PTS_Y*(int)(180./IN_TILE_DEGREES_LAT))
  161. j = j - IN_TILE_PTS_Y*(int)(180./IN_TILE_DEGREES_LAT);
  162. if (supertile == NULL)
  163. {
  164. supertile = (int ***)malloc(sizeof(int **)*3*IN_TILE_PTS_X);
  165. for(ii=0; ii<3*IN_TILE_PTS_X; ii++)
  166. {
  167. supertile[ii] = (int **)malloc(sizeof(int *)*3*IN_TILE_PTS_Y);
  168. for(jj=0; jj<3*IN_TILE_PTS_Y; jj++)
  169. {
  170. supertile[ii][jj] = (int *)malloc(sizeof(int)*ZDIM);
  171. }
  172. }
  173. }
  174. supertile_min_x = (i / IN_TILE_PTS_X)*IN_TILE_PTS_X;
  175. supertile_min_y = (j / IN_TILE_PTS_Y)*IN_TILE_PTS_Y;
  176. /* Get tile containing (i,j) from cache*/
  177. /* Get surrounding tiles from cache */
  178. /* Lower-left */
  179. ii = i - IN_TILE_PTS_X;
  180. if (ii < 0) ii += (int)(360./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  181. doflip = 0;
  182. jj = j - IN_TILE_PTS_Y;
  183. if (jj < 0)
  184. {
  185. doflip = 1;
  186. jj = j;
  187. ii -= (int)(180./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  188. if (ii < 0) ii += (int)(360./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  189. }
  190. newtile = get_tile_from_cache(ii, jj);
  191. if (doflip)
  192. {
  193. for(ii=0; ii<IN_TILE_PTS_X; ii++)
  194. {
  195. for(jj=0; jj<IN_TILE_PTS_Y; jj++)
  196. {
  197. for(kk=0; kk<ZDIM; kk++)
  198. supertile[ii][jj][kk] = newtile[ii][IN_TILE_PTS_Y-1-jj][kk];
  199. }
  200. }
  201. }
  202. else
  203. {
  204. for(ii=0; ii<IN_TILE_PTS_X; ii++)
  205. {
  206. for(jj=0; jj<IN_TILE_PTS_Y; jj++)
  207. {
  208. for(kk=0; kk<ZDIM; kk++)
  209. supertile[ii][jj][kk] = newtile[ii][jj][kk];
  210. }
  211. }
  212. }
  213. /* Left */
  214. ii = i - IN_TILE_PTS_X;
  215. if (ii < 0) ii += (int)(360./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  216. jj = j;
  217. newtile = get_tile_from_cache(ii, jj);
  218. for(ii=0; ii<IN_TILE_PTS_X; ii++)
  219. {
  220. for(jj=0; jj<IN_TILE_PTS_Y; jj++)
  221. {
  222. for(kk=0; kk<ZDIM; kk++)
  223. supertile[ii][jj+IN_TILE_PTS_Y][kk] = newtile[ii][jj][kk];
  224. }
  225. }
  226. /* Upper-left */
  227. ii = i - IN_TILE_PTS_X;
  228. if (ii < 0) ii += (int)(360./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  229. doflip = 0;
  230. jj = j + IN_TILE_PTS_Y;
  231. if (jj >= (int)(180./IN_TILE_DEGREES_LAT)*IN_TILE_PTS_Y)
  232. {
  233. doflip = 1;
  234. jj = j;
  235. ii -= (int)(180./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  236. if (ii < 0) ii += (int)(360./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  237. }
  238. newtile = get_tile_from_cache(ii, jj);
  239. if (doflip)
  240. {
  241. for(ii=0; ii<IN_TILE_PTS_X; ii++)
  242. {
  243. for(jj=0; jj<IN_TILE_PTS_X; jj++)
  244. {
  245. for(kk=0; kk<ZDIM; kk++)
  246. supertile[ii][jj+2*IN_TILE_PTS_Y][kk] = newtile[ii][IN_TILE_PTS_Y-1-jj][kk];
  247. }
  248. }
  249. }
  250. else
  251. {
  252. for(ii=0; ii<IN_TILE_PTS_X; ii++)
  253. {
  254. for(jj=0; jj<IN_TILE_PTS_Y; jj++)
  255. {
  256. for(kk=0; kk<ZDIM; kk++)
  257. supertile[ii][jj+2*IN_TILE_PTS_Y][kk] = newtile[ii][jj][kk];
  258. }
  259. }
  260. }
  261. /* Below */
  262. ii = i;
  263. doflip = 0;
  264. jj = j - IN_TILE_PTS_Y;
  265. if (jj < 0)
  266. {
  267. doflip = 1;
  268. jj = j;
  269. ii -= (int)(180./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  270. if (ii < 0) ii += (int)(360./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  271. }
  272. newtile = get_tile_from_cache(ii, jj);
  273. if (doflip)
  274. {
  275. for(ii=0; ii<IN_TILE_PTS_X; ii++)
  276. {
  277. for(jj=0; jj<IN_TILE_PTS_Y; jj++)
  278. {
  279. for(kk=0; kk<ZDIM; kk++)
  280. supertile[ii+IN_TILE_PTS_X][jj][kk] = newtile[ii][IN_TILE_PTS_Y-1-jj][kk];
  281. }
  282. }
  283. }
  284. else
  285. {
  286. for(ii=0; ii<IN_TILE_PTS_X; ii++)
  287. {
  288. for(jj=0; jj<IN_TILE_PTS_Y; jj++)
  289. {
  290. for(kk=0; kk<ZDIM; kk++)
  291. supertile[ii+IN_TILE_PTS_X][jj][kk] = newtile[ii][jj][kk];
  292. }
  293. }
  294. }
  295. /* Center */
  296. newtile = get_tile_from_cache(i, j);
  297. for(ii=0; ii<IN_TILE_PTS_X; ii++)
  298. {
  299. for(jj=0; jj<IN_TILE_PTS_Y; jj++)
  300. {
  301. for(kk=0; kk<ZDIM; kk++)
  302. supertile[ii+IN_TILE_PTS_X][jj+IN_TILE_PTS_Y][kk] = newtile[ii][jj][kk];
  303. }
  304. }
  305. /* Above */
  306. ii = i;
  307. doflip = 0;
  308. jj = j + IN_TILE_PTS_Y;
  309. if (jj >= (int)(180./IN_TILE_DEGREES_LAT)*IN_TILE_PTS_Y)
  310. {
  311. doflip = 1;
  312. jj = j;
  313. ii -= (int)(180./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  314. if (ii < 0) ii += (int)(360./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  315. }
  316. newtile = get_tile_from_cache(ii, jj);
  317. if (doflip)
  318. {
  319. for(ii=0; ii<IN_TILE_PTS_X; ii++)
  320. {
  321. for(jj=0; jj<IN_TILE_PTS_Y; jj++)
  322. {
  323. for(kk=0; kk<ZDIM; kk++)
  324. supertile[ii+IN_TILE_PTS_X][jj+2*IN_TILE_PTS_Y][kk] = newtile[ii][IN_TILE_PTS_Y-1-jj][kk];
  325. }
  326. }
  327. }
  328. else
  329. {
  330. for(ii=0; ii<IN_TILE_PTS_X; ii++)
  331. {
  332. for(jj=0; jj<IN_TILE_PTS_Y; jj++)
  333. {
  334. for(kk=0; kk<ZDIM; kk++)
  335. supertile[ii+IN_TILE_PTS_X][jj+2*IN_TILE_PTS_Y][kk] = newtile[ii][jj][kk];
  336. }
  337. }
  338. }
  339. /* Lower-right */
  340. ii = i + IN_TILE_PTS_X;
  341. if (ii >= (int)(360./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X) ii -= (int)(360./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  342. doflip = 0;
  343. jj = j - IN_TILE_PTS_Y;
  344. if (jj < 0)
  345. {
  346. doflip = 1;
  347. jj = j;
  348. ii -= (int)(180./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  349. if (ii < 0) ii += (int)(360./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  350. }
  351. newtile = get_tile_from_cache(ii, jj);
  352. if (doflip)
  353. {
  354. for(ii=0; ii<IN_TILE_PTS_X; ii++)
  355. {
  356. for(jj=0; jj<IN_TILE_PTS_Y; jj++)
  357. {
  358. for(kk=0; kk<ZDIM; kk++)
  359. supertile[ii+2*IN_TILE_PTS_X][jj][kk] = newtile[ii][IN_TILE_PTS_Y-1-jj][kk];
  360. }
  361. }
  362. }
  363. else
  364. {
  365. for(ii=0; ii<IN_TILE_PTS_X; ii++)
  366. {
  367. for(jj=0; jj<IN_TILE_PTS_Y; jj++)
  368. {
  369. for(kk=0; kk<ZDIM; kk++)
  370. supertile[ii+2*IN_TILE_PTS_X][jj][kk] = newtile[ii][jj][kk];
  371. }
  372. }
  373. }
  374. /* Right */
  375. ii = i + IN_TILE_PTS_X;
  376. if (ii >= (int)(360./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X) ii -= (int)(360./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  377. jj = j;
  378. newtile = get_tile_from_cache(ii, jj);
  379. for(ii=0; ii<IN_TILE_PTS_X; ii++)
  380. {
  381. for(jj=0; jj<IN_TILE_PTS_Y; jj++)
  382. {
  383. for(kk=0; kk<ZDIM; kk++)
  384. supertile[ii+2*IN_TILE_PTS_X][jj+IN_TILE_PTS_Y][kk] = newtile[ii][jj][kk];
  385. }
  386. }
  387. /* Upper-right */
  388. ii = i + IN_TILE_PTS_X;
  389. if (ii >= (int)(360./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X) ii -= (int)(360./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  390. doflip = 0;
  391. jj = j + IN_TILE_PTS_Y;
  392. if (jj >= (int)(180./IN_TILE_DEGREES_LAT)*IN_TILE_PTS_Y)
  393. {
  394. doflip = 1;
  395. jj = j;
  396. ii -= (int)(180./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  397. if (ii < 0) ii += (int)(360./IN_TILE_DEGREES_LON)*IN_TILE_PTS_X;
  398. }
  399. newtile = get_tile_from_cache(ii, jj);
  400. if (doflip)
  401. {
  402. for(ii=0; ii<IN_TILE_PTS_X; ii++)
  403. {
  404. for(jj=0; jj<IN_TILE_PTS_Y; jj++)
  405. {
  406. for(kk=0; kk<ZDIM; kk++)
  407. supertile[ii+2*IN_TILE_PTS_X][jj+2*IN_TILE_PTS_Y][kk] = newtile[ii][IN_TILE_PTS_Y-1-jj][kk];
  408. }
  409. }
  410. }
  411. else
  412. {
  413. for(ii=0; ii<IN_TILE_PTS_X; ii++)
  414. {
  415. for(jj=0; jj<IN_TILE_PTS_Y; jj++)
  416. {
  417. for(kk=0; kk<ZDIM; kk++)
  418. supertile[ii+2*IN_TILE_PTS_X][jj+2*IN_TILE_PTS_Y][kk] = newtile[ii][jj][kk];
  419. }
  420. }
  421. }
  422. }
  423. void get_value(int * num_cats, int i, int j, int k, int irad)
  424. {
  425. int i_src, j_src;
  426. int ii, jj;
  427. int n, sum;
  428. float r_rel;
  429. if (i < 0)
  430. i = i + IN_TILE_PTS_X*(int)(360./IN_TILE_DEGREES_LON);
  431. if (i >= IN_TILE_PTS_X*(int)(360./IN_TILE_DEGREES_LON))
  432. i = i - IN_TILE_PTS_X*(int)(360./IN_TILE_DEGREES_LON);
  433. if (j < 0)
  434. j = j + IN_TILE_PTS_Y*(int)(180./IN_TILE_DEGREES_LAT);
  435. if (j >= IN_TILE_PTS_Y*(int)(180./IN_TILE_DEGREES_LAT))
  436. j = j - IN_TILE_PTS_Y*(int)(180./IN_TILE_DEGREES_LAT);
  437. i_src = i % IN_TILE_PTS_X + IN_TILE_PTS_X;
  438. j_src = j % IN_TILE_PTS_Y + IN_TILE_PTS_Y;
  439. /* Interpolate values from supertile */
  440. for(ii=0; ii<NCATS; ii++)
  441. num_cats[ii] = 0;
  442. for(ii=i_src-irad; ii<=i_src+irad; ii++)
  443. {
  444. for(jj=j_src-irad; jj<=j_src+irad; jj++)
  445. {
  446. num_cats[supertile[ii][jj][k]-CATMIN]++;
  447. }
  448. }
  449. /*
  450. sum = 0;
  451. n = 0;
  452. for(ii=i_src-irad; ii<=i_src+irad; ii++)
  453. {
  454. for(jj=j_src-irad; jj<=j_src+irad; jj++)
  455. {
  456. sum += supertile[i_src][j_src][k];
  457. n++;
  458. }
  459. }
  460. if (n > 0) return sum/n;
  461. else return 0;
  462. */
  463. }
  464. int is_in_supertile(int i, int j)
  465. {
  466. if (i < 0)
  467. i = i + IN_TILE_PTS_X*(int)(360./IN_TILE_DEGREES_LON);
  468. if (i >= IN_TILE_PTS_X*(int)(360./IN_TILE_DEGREES_LON))
  469. i = i - IN_TILE_PTS_X*(int)(360./IN_TILE_DEGREES_LON);
  470. if (j < 0)
  471. j = j + IN_TILE_PTS_Y*(int)(180./IN_TILE_DEGREES_LAT);
  472. if (j >= IN_TILE_PTS_Y*(int)(180./IN_TILE_DEGREES_LAT))
  473. j = j - IN_TILE_PTS_Y*(int)(180./IN_TILE_DEGREES_LAT);
  474. /* Check whether (i,j) is in the interior of supertile */
  475. if ((i >= supertile_min_x) && (i < supertile_min_x+IN_TILE_PTS_X) &&
  476. (j >= supertile_min_y) && (j < supertile_min_y+IN_TILE_PTS_Y))
  477. return 1;
  478. else
  479. return 0;
  480. }
  481. int main(int argc, char ** argv)
  482. {
  483. int tile_x, tile_y, input_x, input_y, temp_x, temp_y, temp;
  484. int i, j, k, z, ii, jj;
  485. int i_src, j_src;
  486. int *** intdata;
  487. int * num_cats;
  488. int out_fd;
  489. int ir_rel;
  490. float r_rel;
  491. unsigned char * outdata;
  492. char out_filename[256];
  493. r_rel = (float)IN_TILE_PTS_X/(float)OUT_TILE_PTS_X*OUT_TILE_DEGREES_LON/IN_TILE_DEGREES_LON;
  494. ir_rel = (int)rint(r_rel);
  495. /* Allocate memory to hold a single output tile */
  496. intdata = (int ***)malloc(sizeof(int **)*(OUT_TILE_PTS_X+2*HALO_WIDTH));
  497. for(i=0; i<(OUT_TILE_PTS_X+2*HALO_WIDTH); i++)
  498. {
  499. intdata[i] = (int **)malloc(sizeof(int *)*(OUT_TILE_PTS_Y+2*HALO_WIDTH));
  500. for(j=0; j<(OUT_TILE_PTS_Y+2*HALO_WIDTH); j++)
  501. {
  502. intdata[i][j] = (int *)malloc(sizeof(int)*ZDIM);
  503. }
  504. }
  505. num_cats = (int *)malloc(sizeof(int)*NCATS);
  506. /* Allocate output buffer */
  507. outdata = (unsigned char *)malloc((OUT_TILE_PTS_X+2*HALO_WIDTH)*(OUT_TILE_PTS_Y+2*HALO_WIDTH)*ZDIM*N_BYTES);
  508. for(tile_x=0; tile_x<OUT_TILE_PTS_X*(int)(360.0/OUT_TILE_DEGREES_LON); tile_x+=OUT_TILE_PTS_X)
  509. {
  510. for(tile_y=0; tile_y<OUT_TILE_PTS_Y*(int)(180.0/OUT_TILE_DEGREES_LAT); tile_y+=OUT_TILE_PTS_Y)
  511. {
  512. /* Build name of output file for current tile_x and tile_y */
  513. sprintf(out_filename,"retiled/%5.5i-%5.5i.%5.5i-%5.5i",tile_x+1,tile_x+OUT_TILE_PTS_X,tile_y+1,tile_y+OUT_TILE_PTS_Y);
  514. /* Initialize the output data for current tile */
  515. for(i=0; i<(OUT_TILE_PTS_X+2*HALO_WIDTH); i++)
  516. {
  517. for(j=0; j<(OUT_TILE_PTS_Y+2*HALO_WIDTH); j++)
  518. {
  519. intdata[i][j][0] = MSG_FLAG;
  520. }
  521. }
  522. /* Attempt to open output file */
  523. if ((out_fd = open(out_filename, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) == -1)
  524. {
  525. fprintf(stderr, "Error: Could not create or open file %s\n", out_filename);
  526. return 1;
  527. }
  528. /* Fill tile with data */
  529. for(i=-1*HALO_WIDTH; i<OUT_TILE_PTS_X+HALO_WIDTH; i++)
  530. {
  531. for(j=-1*HALO_WIDTH; j<OUT_TILE_PTS_Y+HALO_WIDTH; j++)
  532. {
  533. if (intdata[i+HALO_WIDTH][j+HALO_WIDTH][0] == MSG_FLAG)
  534. {
  535. i_src = ir_rel*(tile_x+i);
  536. j_src = ir_rel*(tile_y+j);
  537. build_supertile(i_src,j_src);
  538. for(ii=-1*HALO_WIDTH; ii<OUT_TILE_PTS_X+HALO_WIDTH; ii++)
  539. {
  540. for(jj=-1*HALO_WIDTH; jj<OUT_TILE_PTS_Y+HALO_WIDTH; jj++)
  541. {
  542. i_src = ir_rel*(tile_x+ii);
  543. j_src = ir_rel*(tile_y+jj);
  544. if (is_in_supertile(i_src,j_src))
  545. {
  546. get_value(num_cats, i_src, j_src, 0, ir_rel-1);
  547. intdata[ii+HALO_WIDTH][jj+HALO_WIDTH][0] = CATMIN-1;
  548. temp = 0;
  549. for(k=0; k<NCATS; k++)
  550. {
  551. if (num_cats[k] >= temp)
  552. {
  553. temp = num_cats[k];
  554. intdata[ii+HALO_WIDTH][jj+HALO_WIDTH][0] = k+CATMIN;
  555. }
  556. }
  557. }
  558. }
  559. }
  560. }
  561. }
  562. }
  563. /* Write out the data */
  564. for(i=0; i<(OUT_TILE_PTS_X+2*HALO_WIDTH); i++)
  565. {
  566. for(j=0; j<(OUT_TILE_PTS_Y+2*HALO_WIDTH); j++)
  567. {
  568. for(z=0; z<ZDIM; z++)
  569. {
  570. for(k=0; k<N_BYTES; k++)
  571. {
  572. outdata[z*N_BYTES*(OUT_TILE_PTS_Y+2*HALO_WIDTH)*(OUT_TILE_PTS_X+2*HALO_WIDTH)+j*N_BYTES*(OUT_TILE_PTS_X+2*HALO_WIDTH)+i*N_BYTES+k] =
  573. (intdata[i][j][z] & (0xff << 8*(N_BYTES-k-1))) >> (8*(N_BYTES-k-1));
  574. }
  575. }
  576. }
  577. }
  578. write(out_fd,(void *)outdata,(OUT_TILE_PTS_X+2*HALO_WIDTH)*(OUT_TILE_PTS_Y+2*HALO_WIDTH)*ZDIM*N_BYTES);
  579. close(out_fd);
  580. printf("Wrote file %s\n",out_filename);
  581. }
  582. }
  583. free(num_cats);
  584. /* Deallocate memory */
  585. for(i=0; i<(OUT_TILE_PTS_X+2*HALO_WIDTH); i++)
  586. {
  587. for(j=0; j<(OUT_TILE_PTS_Y+2*HALO_WIDTH); j++)
  588. {
  589. free(intdata[i][j]);
  590. }
  591. free(intdata[i]);
  592. }
  593. free(intdata);
  594. return 0;
  595. }