PageRenderTime 55ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/WPS/geogrid/util/retile.c

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