PageRenderTime 45ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

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

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