/cgnslib_2.5/tests/test_partial.c

# · C · 797 lines · 671 code · 105 blank · 21 comment · 208 complexity · 6f60bebd0d6a18b18d40c32dff8c55e7 MD5 · raw file

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #ifndef _WIN32
  5. # include <unistd.h>
  6. #endif
  7. #include "cgnslib.h"
  8. #define NUM_SIDE 5
  9. #define NUM_RANDOM 10
  10. float *xcoord;
  11. float *ycoord;
  12. float *zcoord;
  13. float *fbuf;
  14. int *elements;
  15. int *faces;
  16. int *parent;
  17. int *ptmp;
  18. int *ibuf, *pbuf;
  19. #define NODE_INDEX(I,J,K) ((I)+NUM_SIDE*(((J)-1)+NUM_SIDE*((K)-1)))
  20. #define CELL_INDEX(I,J,K) ((I)+(NUM_SIDE-1)*(((J)-1)+(NUM_SIDE-1)*((K)-1)))
  21. int irandom(int imin, int imax) {
  22. float r = (float)rand() / (float)RAND_MAX;
  23. int i = imin + (int)(r * (float)(imax - imin));
  24. if (i < imin) return imin;
  25. if (i > imax) return imax;
  26. return i;
  27. }
  28. void get_parent(int rmin, int rmax, int nelems, int nfaces) {
  29. int i, j, k, n, nn, np;
  30. np = rmax - rmin + 1;
  31. nn = rmin - nelems - 1;
  32. for (n = 0, j = 0; j < 4; j++) {
  33. k = j * nfaces + nn;
  34. for (i = 0; i < np; i++)
  35. ptmp[n++] = parent[k++];
  36. }
  37. }
  38. int mixed_offset(int num, int nelems) {
  39. int offset;
  40. int nmixed = nelems << 1;
  41. if (--num < nmixed) {
  42. int i = num >> 1;
  43. offset = 14 * i;
  44. if (num != (i << 1)) offset += 5;
  45. }
  46. else
  47. offset = 14 * nelems + 5 * (num - nmixed);
  48. return offset;
  49. }
  50. int main (int argc, char **argv)
  51. {
  52. int n, i, j, k, nn, nf, np;
  53. int nnodes, nelems, nfaces;
  54. int cgfile, cgbase, cgzone, cgcoord, cgsect, cgsol, cgfld;
  55. int size[3], rmin, rmax;
  56. char name[33];
  57. ElementType_t type;
  58. static char *fname = "partial.cgns";
  59. nnodes = NUM_SIDE * NUM_SIDE * NUM_SIDE;
  60. xcoord = (float *) malloc (4 * nnodes * sizeof(float));
  61. ycoord = xcoord + nnodes;
  62. zcoord = ycoord + nnodes;
  63. fbuf = zcoord + nnodes;
  64. for (n = 0, k = 1; k <= NUM_SIDE; k++) {
  65. for (j = 1; j <= NUM_SIDE; j++) {
  66. for (i = 1; i <= NUM_SIDE; i++) {
  67. xcoord[n] = (float)i;
  68. ycoord[n] = (float)j;
  69. zcoord[n] = (float)k;
  70. n++;
  71. }
  72. }
  73. }
  74. nelems = (NUM_SIDE - 1) * (NUM_SIDE - 1) * (NUM_SIDE - 1);
  75. elements = (int *) malloc (16 * nelems * sizeof(int));
  76. ibuf = elements + 8 * nelems;
  77. for (n = 0, k = 1; k < NUM_SIDE; k++) {
  78. for (j = 1; j < NUM_SIDE; j++) {
  79. for (i = 1; i < NUM_SIDE; i++) {
  80. nn = NODE_INDEX(i, j, k);
  81. elements[n++] = nn;
  82. elements[n++] = nn + 1;
  83. elements[n++] = nn + 1 + NUM_SIDE;
  84. elements[n++] = nn + NUM_SIDE;
  85. nn += NUM_SIDE * NUM_SIDE;
  86. elements[n++] = nn;
  87. elements[n++] = nn + 1;
  88. elements[n++] = nn + 1 + NUM_SIDE;
  89. elements[n++] = nn + NUM_SIDE;
  90. }
  91. }
  92. }
  93. nfaces = 6 * (NUM_SIDE - 1) * (NUM_SIDE - 1);
  94. faces = (int *) malloc (18 * nfaces * sizeof(int));
  95. parent = faces + 4 * nfaces;
  96. ptmp = parent + 4 * nfaces;
  97. pbuf = ptmp + 4 * nfaces;
  98. for (n = 0; n < 4 * nfaces; n++)
  99. parent[n] = 0;
  100. np = nf = 0;
  101. n = 2 * nfaces;
  102. i = 1;
  103. for (k = 1; k < NUM_SIDE; k++) {
  104. for (j = 1; j < NUM_SIDE; j++) {
  105. nn = NODE_INDEX(i, j, k);
  106. faces[nf++] = nn;
  107. faces[nf++] = nn + NUM_SIDE * NUM_SIDE;
  108. faces[nf++] = nn + NUM_SIDE * (NUM_SIDE + 1);
  109. faces[nf++] = nn + NUM_SIDE;
  110. parent[np] = CELL_INDEX(i, j, k);
  111. parent[np+n] = 5;
  112. np++;
  113. }
  114. }
  115. i = NUM_SIDE;
  116. for (k = 1; k < NUM_SIDE; k++) {
  117. for (j = 1; j < NUM_SIDE; j++) {
  118. nn = NODE_INDEX(i, j, k);
  119. faces[nf++] = nn;
  120. faces[nf++] = nn + NUM_SIDE;
  121. faces[nf++] = nn + NUM_SIDE * (NUM_SIDE + 1);
  122. faces[nf++] = nn + NUM_SIDE * NUM_SIDE;
  123. parent[np] = CELL_INDEX(i-1, j, k);
  124. parent[np+n] = 3;
  125. np++;
  126. }
  127. }
  128. j = 1;
  129. for (k = 1; k < NUM_SIDE; k++) {
  130. for (i = 1; i < NUM_SIDE; i++) {
  131. nn = NODE_INDEX(i, j, k);
  132. faces[nf++] = nn;
  133. faces[nf++] = nn + 1;
  134. faces[nf++] = nn + 1 + NUM_SIDE * NUM_SIDE;
  135. faces[nf++] = nn + NUM_SIDE * NUM_SIDE;
  136. parent[np] = CELL_INDEX(i, j, k);
  137. parent[np+n] = 2;
  138. np++;
  139. }
  140. }
  141. j = NUM_SIDE;
  142. for (k = 1; k < NUM_SIDE; k++) {
  143. for (i = 1; i < NUM_SIDE; i++) {
  144. nn = NODE_INDEX(i, j, k);
  145. faces[nf++] = nn;
  146. faces[nf++] = nn + NUM_SIDE * NUM_SIDE;
  147. faces[nf++] = nn + 1 + NUM_SIDE * NUM_SIDE;
  148. faces[nf++] = nn + 1;
  149. parent[np] = CELL_INDEX(i, j-1, k);
  150. parent[np+n] = 4;
  151. np++;
  152. }
  153. }
  154. k = 1;
  155. for (j = 1; j < NUM_SIDE; j++) {
  156. for (i = 1; i < NUM_SIDE; i++) {
  157. nn = NODE_INDEX(i, j, k);
  158. faces[nf++] = nn;
  159. faces[nf++] = nn + NUM_SIDE;
  160. faces[nf++] = nn + NUM_SIDE + 1;
  161. faces[nf++] = nn + 1;
  162. parent[np] = CELL_INDEX(i, j, k);
  163. parent[np+n] = 1;
  164. np++;
  165. }
  166. }
  167. k = NUM_SIDE;
  168. for (j = 1; j < NUM_SIDE; j++) {
  169. for (i = 1; i < NUM_SIDE; i++) {
  170. nn = NODE_INDEX(i, j, k);
  171. faces[nf++] = nn;
  172. faces[nf++] = nn + 1;
  173. faces[nf++] = nn + NUM_SIDE + 1;
  174. faces[nf++] = nn + NUM_SIDE;
  175. parent[np] = CELL_INDEX(i, j, k-1);
  176. parent[np+n] = 6;
  177. np++;
  178. }
  179. }
  180. unlink (fname);
  181. printf ("creating CGNS file %s\n", fname);
  182. if (cg_open (fname, CG_MODE_WRITE, &cgfile) ||
  183. cg_base_write (cgfile, "Base", 3, 3, &cgbase))
  184. cg_error_exit ();
  185. /* write zone with partial write */
  186. puts("\nwriting zone with partial write");
  187. size[0] = nnodes;
  188. size[1] = nelems;
  189. size[2] = 0;
  190. if (cg_zone_write (cgfile, cgbase, "Zone", size, Unstructured, &cgzone))
  191. cg_error_exit();
  192. /* write every other coordinate plane */
  193. np = NUM_SIDE * NUM_SIDE;
  194. for (k = 0; k < NUM_SIDE; k += 2) {
  195. n = k * np;
  196. rmin = n + 1;
  197. rmax = n + np;
  198. printf("coordinates %d -> %d\n", rmin, rmax);
  199. if (cg_coord_partial_write(cgfile, cgbase, cgzone, RealSingle,
  200. "CoordinateX", &rmin, &rmax, &xcoord[n], &cgcoord) ||
  201. cg_coord_partial_write(cgfile, cgbase, cgzone, RealSingle,
  202. "CoordinateY", &rmin, &rmax, &ycoord[n], &cgcoord) ||
  203. cg_coord_partial_write(cgfile, cgbase, cgzone, RealSingle,
  204. "CoordinateZ", &rmin, &rmax, &zcoord[n], &cgcoord))
  205. cg_error_exit();
  206. }
  207. /* write every other cell plane */
  208. np = (NUM_SIDE - 1) * (NUM_SIDE - 1);
  209. for (k = 1; k < NUM_SIDE; k += 2) {
  210. nn = (k - 1) * np;
  211. n = nn << 3;
  212. rmin = nn + 1;
  213. rmax = nn + np;
  214. printf("elements %d -> %d\n", rmin, rmax);
  215. if (cg_section_partial_write(cgfile, cgbase, cgzone, "Elements",
  216. HEXA_8, rmin, rmax, 0, &elements[n], &cgsect))
  217. cg_error_exit();
  218. }
  219. /* write every other face */
  220. for (k = 0; k < 6; k += 2) {
  221. nn = k * np;
  222. n = nn << 2;
  223. rmin = nn + 1 + nelems;
  224. rmax = nn + np + nelems;
  225. get_parent(rmin, rmax, nelems, nfaces);
  226. printf("faces %d -> %d\n", rmin, rmax);
  227. if (cg_section_partial_write(cgfile, cgbase, cgzone, "Faces",
  228. QUAD_4, rmin, rmax, 0, &faces[n], &cgsect) ||
  229. cg_parent_data_partial_write(cgfile, cgbase, cgzone, cgsect,
  230. rmin, rmax, ptmp))
  231. cg_error_exit();
  232. }
  233. /* write every other solution value */
  234. if (cg_sol_write(cgfile, cgbase, cgzone, "Solution", Vertex, &cgsol))
  235. cg_error_exit();
  236. puts("field -> 1,3,5,7 ...");
  237. for (n = 0; n < nnodes; n += 2) {
  238. rmin = n + 1;
  239. rmax = n + 1;
  240. if (cg_field_partial_write(cgfile, cgbase, cgzone, cgsol,
  241. RealSingle, "Field", &rmin, &rmax, &xcoord[n], &cgfld))
  242. cg_error_exit();
  243. }
  244. puts ("closing and reopening in modify mode");
  245. cg_close (cgfile);
  246. if (cg_open (fname, CG_MODE_MODIFY, &cgfile))
  247. cg_error_exit ();
  248. /* fill in missing coordinate planes */
  249. np = NUM_SIDE * NUM_SIDE;
  250. for (k = 1; k < NUM_SIDE; k += 2) {
  251. n = k * np;
  252. rmin = n + 1;
  253. rmax = n + np;
  254. printf("coordinates %d -> %d\n", rmin, rmax);
  255. if (cg_coord_partial_write(cgfile, cgbase, cgzone, RealSingle,
  256. "CoordinateX", &rmin, &rmax, &xcoord[n], &cgcoord) ||
  257. cg_coord_partial_write(cgfile, cgbase, cgzone, RealSingle,
  258. "CoordinateY", &rmin, &rmax, &ycoord[n], &cgcoord) ||
  259. cg_coord_partial_write(cgfile, cgbase, cgzone, RealSingle,
  260. "CoordinateZ", &rmin, &rmax, &zcoord[n], &cgcoord))
  261. cg_error_exit();
  262. }
  263. /* fill in missing cell planes */
  264. np = (NUM_SIDE - 1) * (NUM_SIDE - 1);
  265. for (k = 2; k < NUM_SIDE; k += 2) {
  266. nn = (k - 1) * np;
  267. n = nn << 3;
  268. rmin = nn + 1;
  269. rmax = nn + np;
  270. printf("elements %d -> %d\n", rmin, rmax);
  271. if (cg_section_partial_write(cgfile, cgbase, cgzone, "Elements",
  272. HEXA_8, rmin, rmax, 0, &elements[n], &cgsect))
  273. cg_error_exit();
  274. }
  275. /* fill in missing faces */
  276. for (k = 1; k < 6; k += 2) {
  277. nn = k * np;
  278. n = nn << 2;
  279. rmin = nn + 1 + nelems;
  280. rmax = nn + np + nelems;
  281. get_parent(rmin, rmax, nelems, nfaces);
  282. printf("faces %d -> %d\n", rmin, rmax);
  283. if (cg_section_partial_write(cgfile, cgbase, cgzone, "Faces",
  284. QUAD_4, rmin, rmax, 0, &faces[n], &cgsect) ||
  285. cg_parent_data_partial_write(cgfile, cgbase, cgzone, cgsect,
  286. rmin, rmax, ptmp))
  287. cg_error_exit();
  288. }
  289. /* fill in missing solution values */
  290. puts("field -> 2,4,6,8 ...");
  291. for (n = 1; n < nnodes; n += 2) {
  292. rmin = n + 1;
  293. rmax = n + 1;
  294. if (cg_field_partial_write(cgfile, cgbase, cgzone, cgsol,
  295. RealSingle, "Field", &rmin, &rmax, &xcoord[n], &cgfld))
  296. cg_error_exit();
  297. }
  298. #if NUM_RANDOM > 0
  299. /* do random insertion */
  300. printf("doing random modification\n");
  301. for (k = 0; k < NUM_RANDOM; k++) {
  302. rmin = irandom(1, nnodes);
  303. rmax = irandom(1, nnodes);
  304. if (rmin > rmax) {
  305. n = rmin;
  306. rmin = rmax;
  307. rmax = n;
  308. }
  309. n = rmin - 1;
  310. printf("coordinates %d -> %d\n", rmin, rmax);
  311. if (cg_coord_partial_write(cgfile, cgbase, cgzone, RealSingle,
  312. "CoordinateX", &rmin, &rmax, &xcoord[n], &cgcoord) ||
  313. cg_coord_partial_write(cgfile, cgbase, cgzone, RealSingle,
  314. "CoordinateY", &rmin, &rmax, &ycoord[n], &cgcoord) ||
  315. cg_coord_partial_write(cgfile, cgbase, cgzone, RealSingle,
  316. "CoordinateZ", &rmin, &rmax, &zcoord[n], &cgcoord))
  317. cg_error_exit();
  318. }
  319. for (k = 0; k < NUM_RANDOM; k++) {
  320. rmin = irandom(1, nelems);
  321. rmax = irandom(1, nelems);
  322. if (rmin > rmax) {
  323. n = rmin;
  324. rmin = rmax;
  325. rmax = n;
  326. }
  327. n = (rmin - 1) << 3;
  328. printf("elements %d -> %d\n", rmin, rmax);
  329. if (cg_section_partial_write(cgfile, cgbase, cgzone, "Elements",
  330. HEXA_8, rmin, rmax, 0, &elements[n], &cgsect))
  331. cg_error_exit();
  332. }
  333. for (k = 0; k < NUM_RANDOM; k++) {
  334. rmin = irandom(1, nfaces);
  335. rmax = irandom(1, nfaces);
  336. if (rmin > rmax) {
  337. n = rmin;
  338. rmin = rmax;
  339. rmax = n;
  340. }
  341. nn = rmin - 1;
  342. n = nn << 2;
  343. rmin += nelems;
  344. rmax += nelems;
  345. get_parent(rmin, rmax, nelems, nfaces);
  346. printf("faces %d -> %d\n", rmin, rmax);
  347. if (cg_section_partial_write(cgfile, cgbase, cgzone, "Faces",
  348. QUAD_4, rmin, rmax, 0, &faces[n], &cgsect) ||
  349. cg_parent_data_partial_write(cgfile, cgbase, cgzone, cgsect,
  350. rmin, rmax, ptmp))
  351. cg_error_exit();
  352. }
  353. for (k = 0; k < NUM_RANDOM; k++) {
  354. rmin = irandom(1, nnodes);
  355. rmax = irandom(1, nnodes);
  356. if (rmin > rmax) {
  357. n = rmin;
  358. rmin = rmax;
  359. rmax = n;
  360. }
  361. n = rmin - 1;
  362. printf("field %d -> %d\n", rmin, rmax);
  363. if (cg_field_partial_write(cgfile, cgbase, cgzone, cgsol,
  364. RealSingle, "Field", &rmin, &rmax, &xcoord[n], &cgfld))
  365. cg_error_exit();
  366. }
  367. #endif
  368. /* check the data */
  369. puts("checking the data");
  370. nn = 0;
  371. /* check coordinates */
  372. rmin = 1;
  373. rmax = nnodes;
  374. if (cg_coord_read(cgfile, cgbase, cgzone, "CoordinateX",
  375. RealSingle, &rmin, &rmax, fbuf))
  376. cg_error_exit();
  377. for (np = 0, n = 0; n < nnodes; n++) {
  378. if (fbuf[n] != xcoord[n]) np++;
  379. }
  380. nn += np;
  381. if (np) printf("%d differences in CoordinateX\n", np);
  382. if (cg_coord_read(cgfile, cgbase, cgzone, "CoordinateY",
  383. RealSingle, &rmin, &rmax, fbuf))
  384. cg_error_exit();
  385. for (np = 0, n = 0; n < nnodes; n++) {
  386. if (fbuf[n] != ycoord[n]) np++;
  387. }
  388. nn += np;
  389. if (np) printf("%d differences in CoordinateY\n", np);
  390. if (cg_coord_read(cgfile, cgbase, cgzone, "CoordinateZ",
  391. RealSingle, &rmin, &rmax, fbuf))
  392. cg_error_exit();
  393. for (np = 0, n = 0; n < nnodes; n++) {
  394. if (fbuf[n] != zcoord[n]) np++;
  395. }
  396. nn += np;
  397. if (np) printf("%d differences in CoordinateZ\n", np);
  398. /* check elements */
  399. if (cg_section_read(cgfile, cgbase, cgzone, 1, name,
  400. &type, &i, &j, &k, &n) ||
  401. cg_elements_read(cgfile, cgbase, cgzone, 1, ibuf, NULL))
  402. cg_error_exit();
  403. if (strcmp(name, "Elements") || type != HEXA_8 || i != 1 ||
  404. j != nelems || k != 0 || n != 0) {
  405. nn++;
  406. puts("differences in Elements");
  407. }
  408. for (np = 0, n = 0; n < 8*nelems; n++) {
  409. if (elements[n] != ibuf[n]) np++;
  410. }
  411. nn += np;
  412. if (np) printf("%d differences in Elements connectivity\n", np);
  413. /* check faces */
  414. if (cg_section_read(cgfile, cgbase, cgzone, 2, name,
  415. &type, &i, &j, &k, &n) ||
  416. cg_elements_read(cgfile, cgbase, cgzone, 2, ibuf, pbuf))
  417. cg_error_exit();
  418. if (strcmp(name, "Faces") || type != QUAD_4 || i != (nelems+1) ||
  419. j != (nelems+nfaces) || k != 0 || n != 1) {
  420. nn++;
  421. puts("differences in Faces");
  422. }
  423. for (np = 0, n = 0; n < 4*nfaces; n++) {
  424. if (faces[n] != ibuf[n]) np++;
  425. }
  426. nn += np;
  427. if (np) printf("%d differences in Faces connectivity\n", np);
  428. for (np = 0, n = 0; n < 4*nfaces; n++) {
  429. if (parent[n] != pbuf[n]) np++;
  430. }
  431. nn += np;
  432. if (np) printf("%d differences in Faces parent data\n", np);
  433. /* check field */
  434. if (cg_field_read(cgfile, cgbase, cgzone, 1, "Field",
  435. RealSingle, &rmin, &rmax, fbuf))
  436. cg_error_exit();
  437. for (np = 0, n = 0; n < nnodes; n++) {
  438. if (fbuf[n] != xcoord[n]) np++;
  439. }
  440. nn += np;
  441. if (np) printf("%d differences in Field\n", np);
  442. if (nn == 0) puts("no diferences");
  443. #if NUM_RANDOM > 0
  444. /* do random checks */
  445. puts("doing random reads/checks");
  446. for (k = 0; k < NUM_RANDOM; k++) {
  447. rmin = irandom(1, nnodes);
  448. rmax = irandom(1, nnodes);
  449. if (rmin > rmax) {
  450. n = rmin;
  451. rmin = rmax;
  452. rmax = n;
  453. }
  454. printf("coordinates %d -> %d\n", rmin, rmax);
  455. n = rmin - 1;
  456. np = 0;
  457. nn = rmax - rmin + 1;
  458. if (cg_coord_read(cgfile, cgbase, cgzone, "CoordinateX",
  459. RealSingle, &rmin, &rmax, fbuf))
  460. cg_error_exit();
  461. for (i = 0; i < nn; i++) {
  462. if (fbuf[i] != xcoord[n+i]) np++;
  463. }
  464. if (cg_coord_read(cgfile, cgbase, cgzone, "CoordinateY",
  465. RealSingle, &rmin, &rmax, fbuf))
  466. cg_error_exit();
  467. for (i = 0; i < nn; i++) {
  468. if (fbuf[i] != ycoord[n+i]) np++;
  469. }
  470. if (cg_coord_read(cgfile, cgbase, cgzone, "CoordinateZ",
  471. RealSingle, &rmin, &rmax, fbuf))
  472. cg_error_exit();
  473. for (i = 0; i < nn; i++) {
  474. if (fbuf[i] != zcoord[n+i]) np++;
  475. }
  476. if (np) printf("%d differences in Coordinates\n", np);
  477. }
  478. for (k = 0; k < NUM_RANDOM; k++) {
  479. rmin = irandom(1, nelems);
  480. rmax = irandom(1, nelems);
  481. if (rmin > rmax) {
  482. n = rmin;
  483. rmin = rmax;
  484. rmax = n;
  485. }
  486. n = (rmin - 1) << 3;
  487. nn = (rmax - rmin + 1) << 3;
  488. printf("elements %d -> %d\n", rmin, rmax);
  489. if (cg_ElementPartialSize(cgfile, cgbase, cgzone, 1,
  490. rmin, rmax, &np) ||
  491. cg_elements_partial_read(cgfile, cgbase, cgzone, 1,
  492. rmin, rmax, ibuf, NULL))
  493. cg_error_exit();
  494. if (np != nn) puts("diference in element data size");
  495. for (np = 0, i = 0; i < nn; i++) {
  496. if (ibuf[i] != elements[n+i]) np++;
  497. }
  498. if (np) printf("%d differences in element connectivity\n", np);
  499. }
  500. for (k = 0; k < NUM_RANDOM; k++) {
  501. rmin = irandom(1, nfaces);
  502. rmax = irandom(1, nfaces);
  503. if (rmin > rmax) {
  504. n = rmin;
  505. rmin = rmax;
  506. rmax = n;
  507. }
  508. n = (rmin - 1) << 2;
  509. nn = (rmax - rmin + 1) << 2;
  510. rmin += nelems;
  511. rmax += nelems;
  512. get_parent(rmin, rmax, nelems, nfaces);
  513. printf("faces %d -> %d\n", rmin, rmax);
  514. if (cg_ElementPartialSize(cgfile, cgbase, cgzone, 2,
  515. rmin, rmax, &np) ||
  516. cg_elements_partial_read(cgfile, cgbase, cgzone, 2,
  517. rmin, rmax, ibuf, pbuf))
  518. cg_error_exit();
  519. if (np != nn) puts("diference in face data size");
  520. for (np = 0, i = 0; i < nn; i++) {
  521. if (ibuf[i] != faces[n+i]) np++;
  522. }
  523. if (np) printf("%d differences in face connectivity\n", np);
  524. for (np = 0, i = 0; i < nn; i++) {
  525. if (pbuf[i] != ptmp[i]) np++;
  526. }
  527. if (np) printf("%d differences in face parent data\n", np);
  528. }
  529. for (k = 0; k < NUM_RANDOM; k++) {
  530. rmin = irandom(1, nnodes);
  531. rmax = irandom(1, nnodes);
  532. if (rmin > rmax) {
  533. n = rmin;
  534. rmin = rmax;
  535. rmax = n;
  536. }
  537. n = rmin - 1;
  538. nn = rmax - rmin + 1;
  539. printf("field %d -> %d\n", rmin, rmax);
  540. if (cg_field_read(cgfile, cgbase, cgzone, 1, "Field",
  541. RealSingle, &rmin, &rmax, fbuf))
  542. cg_error_exit();
  543. for (np = 0, i = 0; i < nn; i++) {
  544. if (fbuf[i] != xcoord[n+i]) np++;
  545. }
  546. if (np) printf("%d differences in field data\n", np);
  547. }
  548. #endif
  549. puts("deleting Elements and Faces and creating Mixed");
  550. /* delete sections and create as mixed */
  551. if (cg_goto(cgfile, cgbase, "Zone_t", 1, NULL) ||
  552. cg_delete_node("Elements") || cg_delete_node("Faces"))
  553. cg_error_exit();
  554. /* create mixed element connectivity */
  555. nn = (nelems << 3) + nelems + (nfaces << 2) + nfaces;
  556. ptmp = (int *) malloc (2 * nn * sizeof(int));
  557. i = j = n = 0;
  558. for (nf = 0; nf < nelems; nf++) {
  559. ptmp[n++] = QUAD_4;
  560. for (k = 0; k < 4; k++)
  561. ptmp[n++] = faces[j++];
  562. ptmp[n++] = HEXA_8;
  563. for (k = 0; k < 8; k++)
  564. ptmp[n++] = elements[i++];
  565. }
  566. while (nf++ < nfaces) {
  567. ptmp[n++] = QUAD_4;
  568. for (k = 0; k < 4; k++)
  569. ptmp[n++] = faces[j++];
  570. }
  571. free (elements);
  572. elements = ptmp;
  573. ibuf = elements + nn;
  574. /* create parent data */
  575. np = nelems + nfaces;
  576. nn = np << 2;
  577. ptmp = (int *) malloc (3 * nn * sizeof(int));
  578. for (n = 0; n < nfaces; n++)
  579. parent[n] <<= 1;
  580. for (n = 0; n < nn; n++)
  581. ptmp[n] = 0;
  582. for (n = 0, j = 0; j < 4; j++) {
  583. k = j * np;
  584. for (i = 0; i < nelems; i++) {
  585. ptmp[k] = parent[n++];
  586. k += 2;
  587. }
  588. while (i++ < nfaces)
  589. ptmp[k++] = parent[n++];
  590. }
  591. free(faces);
  592. parent = ptmp;
  593. ptmp = parent + nn;
  594. pbuf = ptmp + nn;
  595. rmin = 2 * nelems + 1;
  596. rmax = np;
  597. n = mixed_offset(rmin, nelems);
  598. get_parent(rmin, rmax, 0, np);
  599. printf("mixed %d -> %d\n", rmin, rmax);
  600. if (cg_section_partial_write(cgfile, cgbase, cgzone, "Mixed",
  601. MIXED, rmin, rmax, 0, &elements[n], &cgsect) ||
  602. cg_parent_data_partial_write(cgfile, cgbase, cgzone, cgsect,
  603. rmin, rmax, ptmp))
  604. cg_error_exit();
  605. printf("mixed %d -> %d (2 at a time)\n", 1, nelems << 1);
  606. for (i = 0; i < nelems; i++) {
  607. rmin = (i << 1) + 1;
  608. rmax = rmin + 1;
  609. n = mixed_offset(rmin, nelems);
  610. get_parent(rmin, rmax, 0, np);
  611. if (cg_section_partial_write(cgfile, cgbase, cgzone, "Mixed",
  612. MIXED, rmin, rmax, 0, &elements[n], &cgsect) ||
  613. cg_parent_data_partial_write(cgfile, cgbase, cgzone, cgsect,
  614. rmin, rmax, ptmp))
  615. cg_error_exit();
  616. }
  617. #if NUM_RANDOM > 0
  618. /* do random writes */
  619. puts("doing random writes");
  620. for (k = 0; k < NUM_RANDOM; k++) {
  621. rmin = irandom(1, np);
  622. rmax = irandom(1, np);
  623. if (rmin > rmax) {
  624. n = rmin;
  625. rmin = rmax;
  626. rmax = n;
  627. }
  628. n = mixed_offset(rmin, nelems);
  629. get_parent(rmin, rmax, 0, np);
  630. printf("mixed %d -> %d\n", rmin, rmax);
  631. if (cg_section_partial_write(cgfile, cgbase, cgzone, "Mixed",
  632. MIXED, rmin, rmax, 0, &elements[n], &cgsect) ||
  633. cg_parent_data_partial_write(cgfile, cgbase, cgzone, cgsect,
  634. rmin, rmax, ptmp))
  635. cg_error_exit();
  636. }
  637. #endif
  638. puts("checking the data");
  639. if (cg_section_read(cgfile, cgbase, cgzone, cgsect, name,
  640. &type, &i, &j, &k, &n) ||
  641. cg_elements_read(cgfile, cgbase, cgzone, cgsect, ibuf, pbuf))
  642. cg_error_exit();
  643. if (strcmp(name, "Mixed") || type != MIXED || i != 1 ||
  644. j != np || k != 0 || n != 1) {
  645. puts("differences in Mixed");
  646. }
  647. nn = mixed_offset(np, nelems);
  648. for (i = 0, n = 0; n < nn; n++) {
  649. if (elements[n] != ibuf[n]) i++;
  650. }
  651. if (i) printf("%d differences in Mixed connectivity\n", i);
  652. nn = (nelems + nfaces) << 2;
  653. for (i = 0, n = 0; n < nn; n++) {
  654. if (parent[n] != pbuf[n]) i++;
  655. }
  656. if (i) printf("%d differences in Mixed parent data\n", i);
  657. #if NUM_RANDOM > 0
  658. /* do random checks */
  659. puts("doing random reads/checks");
  660. for (k = 0; k < NUM_RANDOM; k++) {
  661. rmin = irandom(1, np);
  662. rmax = irandom(1, np);
  663. if (rmin > rmax) {
  664. n = rmin;
  665. rmin = rmax;
  666. rmax = n;
  667. }
  668. n = mixed_offset(rmin, nelems);
  669. nn = mixed_offset(rmax + 1, nelems) - n;
  670. get_parent(rmin, rmax, 0, np);
  671. printf("mixed %d -> %d\n", rmin, rmax);
  672. if (cg_ElementPartialSize(cgfile, cgbase, cgzone, cgsect,
  673. rmin, rmax, &nf) ||
  674. cg_elements_partial_read(cgfile, cgbase, cgzone, cgsect,
  675. rmin, rmax, ibuf, pbuf))
  676. cg_error_exit();
  677. if (nf != nn) puts("diference in mixed data size");
  678. for (nf = 0, i = 0; i < nn; i++) {
  679. if (ibuf[i] != elements[n+i]) nf++;
  680. }
  681. if (nf) printf("%d differences in mixed connectivity\n", nf);
  682. nn = (rmax - rmin + 1) << 2;
  683. for (nf = 0, i = 0; i < nn; i++) {
  684. if (pbuf[i] != ptmp[i]) nf++;
  685. }
  686. if (nf) printf("%d differences in mixed parent data\n", nf);
  687. }
  688. #endif
  689. puts ("closing file");
  690. cg_close (cgfile);
  691. return 0;
  692. }