PageRenderTime 1616ms CodeModel.GetById 29ms RepoModel.GetById 8ms app.codeStats 2ms

/other/netcdf_write_matrix/src/nc_test/test_get.c

https://github.com/jbeezley/wrf-fire
C | 6251 lines | 5857 code | 148 blank | 246 comment | 1944 complexity | 22a84c44940594b76318a681103f5c92 MD5 | raw file
Possible License(s): AGPL-1.0
  1. /* Do not edit this file. It is produced from the corresponding .m4 source */
  2. /*********************************************************************
  3. * Copyright 1996, UCAR/Unidata
  4. * See netcdf/COPYRIGHT file for copying and redistribution conditions.
  5. * $Id: test_get.m4,v 1.16 2005/03/08 03:04:19 ed Exp $
  6. *********************************************************************/
  7. #include "tests.h"
  8. void
  9. test_nc_get_var1_text(void)
  10. {
  11. int ncid;
  12. int i;
  13. int j;
  14. int err;
  15. int nok = 0; /* count of valid comparisons */
  16. size_t index[MAX_RANK];
  17. double expect;
  18. int canConvert; /* Both text or both numeric */
  19. text value;
  20. err = nc_open(testfile, NC_NOWRITE, &ncid);
  21. IF (err)
  22. error("nc_open: %s", nc_strerror(err));
  23. for (i = 0; i < NVARS; i++) {
  24. canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
  25. for (j = 0; j < var_rank[i]; j++)
  26. index[j] = 0;
  27. err = nc_get_var1_text(BAD_ID, i, index, &value);
  28. IF (err != NC_EBADID)
  29. error("bad ncid: status = %d", err);
  30. err = nc_get_var1_text(ncid, BAD_VARID, index, &value);
  31. IF (err != NC_ENOTVAR)
  32. error("bad var id: status = %d", err);
  33. for (j = 0; j < var_rank[i]; j++) {
  34. index[j] = var_shape[i][j];
  35. err = nc_get_var1_text(ncid, i, index, &value);
  36. if(!canConvert) {
  37. IF(err != NC_ECHAR)
  38. error("conversion: status = %d", err);
  39. } else IF (err != NC_EINVALCOORDS)
  40. error("bad index: status = %d", err);
  41. index[j] = 0;
  42. }
  43. for (j = 0; j < var_nels[i]; j++) {
  44. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  45. IF (err)
  46. error("error in toMixedBase 1");
  47. expect = hash4( var_type[i], var_rank[i], index, NCT_TEXT );
  48. if (var_rank[i] == 0 && i%2 )
  49. err = nc_get_var1_text(ncid, i, NULL, &value);
  50. else
  51. err = nc_get_var1_text(ncid, i, index, &value);
  52. if (canConvert) {
  53. if (inRange3(expect,var_type[i], NCT_TEXT)) {
  54. if (expect >= text_min && expect <= text_max) {
  55. IF (err) {
  56. error("%s", nc_strerror(err));
  57. } else {
  58. IF (!equal(value,expect,var_type[i],NCT_TEXT)) {
  59. error("expected: %G, got: %G", expect,
  60. (double) value);
  61. } else {
  62. nok++;
  63. }
  64. }
  65. } else {
  66. IF (err != NC_ERANGE)
  67. error("Range error: status = %d", err);
  68. }
  69. } else {
  70. IF (err != 0 && err != NC_ERANGE)
  71. error("OK or Range error: status = %d", err);
  72. }
  73. } else {
  74. IF (err != NC_ECHAR)
  75. error("wrong type: status = %d", err);
  76. }
  77. }
  78. }
  79. err = nc_close(ncid);
  80. IF (err)
  81. error("nc_close: %s", nc_strerror(err));
  82. print_nok(nok);
  83. }
  84. void
  85. test_nc_get_var1_uchar(void)
  86. {
  87. int ncid;
  88. int i;
  89. int j;
  90. int err;
  91. int nok = 0; /* count of valid comparisons */
  92. size_t index[MAX_RANK];
  93. double expect;
  94. int canConvert; /* Both text or both numeric */
  95. uchar value;
  96. err = nc_open(testfile, NC_NOWRITE, &ncid);
  97. IF (err)
  98. error("nc_open: %s", nc_strerror(err));
  99. for (i = 0; i < NVARS; i++) {
  100. canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
  101. for (j = 0; j < var_rank[i]; j++)
  102. index[j] = 0;
  103. err = nc_get_var1_uchar(BAD_ID, i, index, &value);
  104. IF (err != NC_EBADID)
  105. error("bad ncid: status = %d", err);
  106. err = nc_get_var1_uchar(ncid, BAD_VARID, index, &value);
  107. IF (err != NC_ENOTVAR)
  108. error("bad var id: status = %d", err);
  109. for (j = 0; j < var_rank[i]; j++) {
  110. index[j] = var_shape[i][j];
  111. err = nc_get_var1_uchar(ncid, i, index, &value);
  112. if(!canConvert) {
  113. IF(err != NC_ECHAR)
  114. error("conversion: status = %d", err);
  115. } else IF (err != NC_EINVALCOORDS)
  116. error("bad index: status = %d", err);
  117. index[j] = 0;
  118. }
  119. for (j = 0; j < var_nels[i]; j++) {
  120. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  121. IF (err)
  122. error("error in toMixedBase 1");
  123. expect = hash4( var_type[i], var_rank[i], index, NCT_UCHAR );
  124. if (var_rank[i] == 0 && i%2 )
  125. err = nc_get_var1_uchar(ncid, i, NULL, &value);
  126. else
  127. err = nc_get_var1_uchar(ncid, i, index, &value);
  128. if (canConvert) {
  129. if (inRange3(expect,var_type[i], NCT_UCHAR)) {
  130. if (expect >= uchar_min && expect <= uchar_max) {
  131. IF (err) {
  132. error("%s", nc_strerror(err));
  133. } else {
  134. IF (!equal(value,expect,var_type[i],NCT_UCHAR)) {
  135. error("expected: %G, got: %G", expect,
  136. (double) value);
  137. } else {
  138. nok++;
  139. }
  140. }
  141. } else {
  142. IF (err != NC_ERANGE)
  143. error("Range error: status = %d", err);
  144. }
  145. } else {
  146. IF (err != 0 && err != NC_ERANGE)
  147. error("OK or Range error: status = %d", err);
  148. }
  149. } else {
  150. IF (err != NC_ECHAR)
  151. error("wrong type: status = %d", err);
  152. }
  153. }
  154. }
  155. err = nc_close(ncid);
  156. IF (err)
  157. error("nc_close: %s", nc_strerror(err));
  158. print_nok(nok);
  159. }
  160. void
  161. test_nc_get_var1_schar(void)
  162. {
  163. int ncid;
  164. int i;
  165. int j;
  166. int err;
  167. int nok = 0; /* count of valid comparisons */
  168. size_t index[MAX_RANK];
  169. double expect;
  170. int canConvert; /* Both text or both numeric */
  171. schar value;
  172. err = nc_open(testfile, NC_NOWRITE, &ncid);
  173. IF (err)
  174. error("nc_open: %s", nc_strerror(err));
  175. for (i = 0; i < NVARS; i++) {
  176. canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
  177. for (j = 0; j < var_rank[i]; j++)
  178. index[j] = 0;
  179. err = nc_get_var1_schar(BAD_ID, i, index, &value);
  180. IF (err != NC_EBADID)
  181. error("bad ncid: status = %d", err);
  182. err = nc_get_var1_schar(ncid, BAD_VARID, index, &value);
  183. IF (err != NC_ENOTVAR)
  184. error("bad var id: status = %d", err);
  185. for (j = 0; j < var_rank[i]; j++) {
  186. index[j] = var_shape[i][j];
  187. err = nc_get_var1_schar(ncid, i, index, &value);
  188. if(!canConvert) {
  189. IF(err != NC_ECHAR)
  190. error("conversion: status = %d", err);
  191. } else IF (err != NC_EINVALCOORDS)
  192. error("bad index: status = %d", err);
  193. index[j] = 0;
  194. }
  195. for (j = 0; j < var_nels[i]; j++) {
  196. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  197. IF (err)
  198. error("error in toMixedBase 1");
  199. expect = hash4( var_type[i], var_rank[i], index, NCT_SCHAR );
  200. if (var_rank[i] == 0 && i%2 )
  201. err = nc_get_var1_schar(ncid, i, NULL, &value);
  202. else
  203. err = nc_get_var1_schar(ncid, i, index, &value);
  204. if (canConvert) {
  205. if (inRange3(expect,var_type[i], NCT_SCHAR)) {
  206. if (expect >= schar_min && expect <= schar_max) {
  207. IF (err) {
  208. error("%s", nc_strerror(err));
  209. } else {
  210. IF (!equal(value,expect,var_type[i],NCT_SCHAR)) {
  211. error("expected: %G, got: %G", expect,
  212. (double) value);
  213. } else {
  214. nok++;
  215. }
  216. }
  217. } else {
  218. IF (err != NC_ERANGE)
  219. error("Range error: status = %d", err);
  220. }
  221. } else {
  222. IF (err != 0 && err != NC_ERANGE)
  223. error("OK or Range error: status = %d", err);
  224. }
  225. } else {
  226. IF (err != NC_ECHAR)
  227. error("wrong type: status = %d", err);
  228. }
  229. }
  230. }
  231. err = nc_close(ncid);
  232. IF (err)
  233. error("nc_close: %s", nc_strerror(err));
  234. print_nok(nok);
  235. }
  236. void
  237. test_nc_get_var1_short(void)
  238. {
  239. int ncid;
  240. int i;
  241. int j;
  242. int err;
  243. int nok = 0; /* count of valid comparisons */
  244. size_t index[MAX_RANK];
  245. double expect;
  246. int canConvert; /* Both text or both numeric */
  247. short value;
  248. err = nc_open(testfile, NC_NOWRITE, &ncid);
  249. IF (err)
  250. error("nc_open: %s", nc_strerror(err));
  251. for (i = 0; i < NVARS; i++) {
  252. canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
  253. for (j = 0; j < var_rank[i]; j++)
  254. index[j] = 0;
  255. err = nc_get_var1_short(BAD_ID, i, index, &value);
  256. IF (err != NC_EBADID)
  257. error("bad ncid: status = %d", err);
  258. err = nc_get_var1_short(ncid, BAD_VARID, index, &value);
  259. IF (err != NC_ENOTVAR)
  260. error("bad var id: status = %d", err);
  261. for (j = 0; j < var_rank[i]; j++) {
  262. index[j] = var_shape[i][j];
  263. err = nc_get_var1_short(ncid, i, index, &value);
  264. if(!canConvert) {
  265. IF(err != NC_ECHAR)
  266. error("conversion: status = %d", err);
  267. } else IF (err != NC_EINVALCOORDS)
  268. error("bad index: status = %d", err);
  269. index[j] = 0;
  270. }
  271. for (j = 0; j < var_nels[i]; j++) {
  272. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  273. IF (err)
  274. error("error in toMixedBase 1");
  275. expect = hash4( var_type[i], var_rank[i], index, NCT_SHORT );
  276. if (var_rank[i] == 0 && i%2 )
  277. err = nc_get_var1_short(ncid, i, NULL, &value);
  278. else
  279. err = nc_get_var1_short(ncid, i, index, &value);
  280. if (canConvert) {
  281. if (inRange3(expect,var_type[i], NCT_SHORT)) {
  282. if (expect >= short_min && expect <= short_max) {
  283. IF (err) {
  284. error("%s", nc_strerror(err));
  285. } else {
  286. IF (!equal(value,expect,var_type[i],NCT_SHORT)) {
  287. error("expected: %G, got: %G", expect,
  288. (double) value);
  289. } else {
  290. nok++;
  291. }
  292. }
  293. } else {
  294. IF (err != NC_ERANGE)
  295. error("Range error: status = %d", err);
  296. }
  297. } else {
  298. IF (err != 0 && err != NC_ERANGE)
  299. error("OK or Range error: status = %d", err);
  300. }
  301. } else {
  302. IF (err != NC_ECHAR)
  303. error("wrong type: status = %d", err);
  304. }
  305. }
  306. }
  307. err = nc_close(ncid);
  308. IF (err)
  309. error("nc_close: %s", nc_strerror(err));
  310. print_nok(nok);
  311. }
  312. void
  313. test_nc_get_var1_int(void)
  314. {
  315. int ncid;
  316. int i;
  317. int j;
  318. int err;
  319. int nok = 0; /* count of valid comparisons */
  320. size_t index[MAX_RANK];
  321. double expect;
  322. int canConvert; /* Both text or both numeric */
  323. int value;
  324. err = nc_open(testfile, NC_NOWRITE, &ncid);
  325. IF (err)
  326. error("nc_open: %s", nc_strerror(err));
  327. for (i = 0; i < NVARS; i++) {
  328. canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
  329. for (j = 0; j < var_rank[i]; j++)
  330. index[j] = 0;
  331. err = nc_get_var1_int(BAD_ID, i, index, &value);
  332. IF (err != NC_EBADID)
  333. error("bad ncid: status = %d", err);
  334. err = nc_get_var1_int(ncid, BAD_VARID, index, &value);
  335. IF (err != NC_ENOTVAR)
  336. error("bad var id: status = %d", err);
  337. for (j = 0; j < var_rank[i]; j++) {
  338. index[j] = var_shape[i][j];
  339. err = nc_get_var1_int(ncid, i, index, &value);
  340. if(!canConvert) {
  341. IF(err != NC_ECHAR)
  342. error("conversion: status = %d", err);
  343. } else IF (err != NC_EINVALCOORDS)
  344. error("bad index: status = %d", err);
  345. index[j] = 0;
  346. }
  347. for (j = 0; j < var_nels[i]; j++) {
  348. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  349. IF (err)
  350. error("error in toMixedBase 1");
  351. expect = hash4( var_type[i], var_rank[i], index, NCT_INT );
  352. if (var_rank[i] == 0 && i%2 )
  353. err = nc_get_var1_int(ncid, i, NULL, &value);
  354. else
  355. err = nc_get_var1_int(ncid, i, index, &value);
  356. if (canConvert) {
  357. if (inRange3(expect,var_type[i], NCT_INT)) {
  358. if (expect >= int_min && expect <= int_max) {
  359. IF (err) {
  360. error("%s", nc_strerror(err));
  361. } else {
  362. IF (!equal(value,expect,var_type[i],NCT_INT)) {
  363. error("expected: %G, got: %G", expect,
  364. (double) value);
  365. } else {
  366. nok++;
  367. }
  368. }
  369. } else {
  370. IF (err != NC_ERANGE)
  371. error("Range error: status = %d", err);
  372. }
  373. } else {
  374. IF (err != 0 && err != NC_ERANGE)
  375. error("OK or Range error: status = %d", err);
  376. }
  377. } else {
  378. IF (err != NC_ECHAR)
  379. error("wrong type: status = %d", err);
  380. }
  381. }
  382. }
  383. err = nc_close(ncid);
  384. IF (err)
  385. error("nc_close: %s", nc_strerror(err));
  386. print_nok(nok);
  387. }
  388. void
  389. test_nc_get_var1_long(void)
  390. {
  391. int ncid;
  392. int i;
  393. int j;
  394. int err;
  395. int nok = 0; /* count of valid comparisons */
  396. size_t index[MAX_RANK];
  397. double expect;
  398. int canConvert; /* Both text or both numeric */
  399. long value;
  400. err = nc_open(testfile, NC_NOWRITE, &ncid);
  401. IF (err)
  402. error("nc_open: %s", nc_strerror(err));
  403. for (i = 0; i < NVARS; i++) {
  404. canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
  405. for (j = 0; j < var_rank[i]; j++)
  406. index[j] = 0;
  407. err = nc_get_var1_long(BAD_ID, i, index, &value);
  408. IF (err != NC_EBADID)
  409. error("bad ncid: status = %d", err);
  410. err = nc_get_var1_long(ncid, BAD_VARID, index, &value);
  411. IF (err != NC_ENOTVAR)
  412. error("bad var id: status = %d", err);
  413. for (j = 0; j < var_rank[i]; j++) {
  414. index[j] = var_shape[i][j];
  415. err = nc_get_var1_long(ncid, i, index, &value);
  416. if(!canConvert) {
  417. IF(err != NC_ECHAR)
  418. error("conversion: status = %d", err);
  419. } else IF (err != NC_EINVALCOORDS)
  420. error("bad index: status = %d", err);
  421. index[j] = 0;
  422. }
  423. for (j = 0; j < var_nels[i]; j++) {
  424. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  425. IF (err)
  426. error("error in toMixedBase 1");
  427. expect = hash4( var_type[i], var_rank[i], index, NCT_LONG );
  428. if (var_rank[i] == 0 && i%2 )
  429. err = nc_get_var1_long(ncid, i, NULL, &value);
  430. else
  431. err = nc_get_var1_long(ncid, i, index, &value);
  432. if (canConvert) {
  433. if (inRange3(expect,var_type[i], NCT_LONG)) {
  434. if (expect >= long_min && expect <= long_max) {
  435. IF (err) {
  436. error("%s", nc_strerror(err));
  437. } else {
  438. IF (!equal(value,expect,var_type[i],NCT_LONG)) {
  439. error("expected: %G, got: %G", expect,
  440. (double) value);
  441. } else {
  442. nok++;
  443. }
  444. }
  445. } else {
  446. IF (err != NC_ERANGE)
  447. error("Range error: status = %d", err);
  448. }
  449. } else {
  450. IF (err != 0 && err != NC_ERANGE)
  451. error("OK or Range error: status = %d", err);
  452. }
  453. } else {
  454. IF (err != NC_ECHAR)
  455. error("wrong type: status = %d", err);
  456. }
  457. }
  458. }
  459. err = nc_close(ncid);
  460. IF (err)
  461. error("nc_close: %s", nc_strerror(err));
  462. print_nok(nok);
  463. }
  464. void
  465. test_nc_get_var1_float(void)
  466. {
  467. int ncid;
  468. int i;
  469. int j;
  470. int err;
  471. int nok = 0; /* count of valid comparisons */
  472. size_t index[MAX_RANK];
  473. double expect;
  474. int canConvert; /* Both text or both numeric */
  475. float value;
  476. err = nc_open(testfile, NC_NOWRITE, &ncid);
  477. IF (err)
  478. error("nc_open: %s", nc_strerror(err));
  479. for (i = 0; i < NVARS; i++) {
  480. canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
  481. for (j = 0; j < var_rank[i]; j++)
  482. index[j] = 0;
  483. err = nc_get_var1_float(BAD_ID, i, index, &value);
  484. IF (err != NC_EBADID)
  485. error("bad ncid: status = %d", err);
  486. err = nc_get_var1_float(ncid, BAD_VARID, index, &value);
  487. IF (err != NC_ENOTVAR)
  488. error("bad var id: status = %d", err);
  489. for (j = 0; j < var_rank[i]; j++) {
  490. index[j] = var_shape[i][j];
  491. err = nc_get_var1_float(ncid, i, index, &value);
  492. if(!canConvert) {
  493. IF(err != NC_ECHAR)
  494. error("conversion: status = %d", err);
  495. } else IF (err != NC_EINVALCOORDS)
  496. error("bad index: status = %d", err);
  497. index[j] = 0;
  498. }
  499. for (j = 0; j < var_nels[i]; j++) {
  500. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  501. IF (err)
  502. error("error in toMixedBase 1");
  503. expect = hash4( var_type[i], var_rank[i], index, NCT_FLOAT );
  504. if (var_rank[i] == 0 && i%2 )
  505. err = nc_get_var1_float(ncid, i, NULL, &value);
  506. else
  507. err = nc_get_var1_float(ncid, i, index, &value);
  508. if (canConvert) {
  509. if (inRange3(expect,var_type[i], NCT_FLOAT)) {
  510. if (expect >= float_min && expect <= float_max) {
  511. IF (err) {
  512. error("%s", nc_strerror(err));
  513. } else {
  514. IF (!equal(value,expect,var_type[i],NCT_FLOAT)) {
  515. error("expected: %G, got: %G", expect,
  516. (double) value);
  517. } else {
  518. nok++;
  519. }
  520. }
  521. } else {
  522. IF (err != NC_ERANGE)
  523. error("Range error: status = %d", err);
  524. }
  525. } else {
  526. IF (err != 0 && err != NC_ERANGE)
  527. error("OK or Range error: status = %d", err);
  528. }
  529. } else {
  530. IF (err != NC_ECHAR)
  531. error("wrong type: status = %d", err);
  532. }
  533. }
  534. }
  535. err = nc_close(ncid);
  536. IF (err)
  537. error("nc_close: %s", nc_strerror(err));
  538. print_nok(nok);
  539. }
  540. void
  541. test_nc_get_var1_double(void)
  542. {
  543. int ncid;
  544. int i;
  545. int j;
  546. int err;
  547. int nok = 0; /* count of valid comparisons */
  548. size_t index[MAX_RANK];
  549. double expect;
  550. int canConvert; /* Both text or both numeric */
  551. double value;
  552. err = nc_open(testfile, NC_NOWRITE, &ncid);
  553. IF (err)
  554. error("nc_open: %s", nc_strerror(err));
  555. for (i = 0; i < NVARS; i++) {
  556. canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
  557. for (j = 0; j < var_rank[i]; j++)
  558. index[j] = 0;
  559. err = nc_get_var1_double(BAD_ID, i, index, &value);
  560. IF (err != NC_EBADID)
  561. error("bad ncid: status = %d", err);
  562. err = nc_get_var1_double(ncid, BAD_VARID, index, &value);
  563. IF (err != NC_ENOTVAR)
  564. error("bad var id: status = %d", err);
  565. for (j = 0; j < var_rank[i]; j++) {
  566. index[j] = var_shape[i][j];
  567. err = nc_get_var1_double(ncid, i, index, &value);
  568. if(!canConvert) {
  569. IF(err != NC_ECHAR)
  570. error("conversion: status = %d", err);
  571. } else IF (err != NC_EINVALCOORDS)
  572. error("bad index: status = %d", err);
  573. index[j] = 0;
  574. }
  575. for (j = 0; j < var_nels[i]; j++) {
  576. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  577. IF (err)
  578. error("error in toMixedBase 1");
  579. expect = hash4( var_type[i], var_rank[i], index, NCT_DOUBLE );
  580. if (var_rank[i] == 0 && i%2 )
  581. err = nc_get_var1_double(ncid, i, NULL, &value);
  582. else
  583. err = nc_get_var1_double(ncid, i, index, &value);
  584. if (canConvert) {
  585. if (inRange3(expect,var_type[i], NCT_DOUBLE)) {
  586. if (expect >= double_min && expect <= double_max) {
  587. IF (err) {
  588. error("%s", nc_strerror(err));
  589. } else {
  590. IF (!equal(value,expect,var_type[i],NCT_DOUBLE)) {
  591. error("expected: %G, got: %G", expect,
  592. (double) value);
  593. } else {
  594. nok++;
  595. }
  596. }
  597. } else {
  598. IF (err != NC_ERANGE)
  599. error("Range error: status = %d", err);
  600. }
  601. } else {
  602. IF (err != 0 && err != NC_ERANGE)
  603. error("OK or Range error: status = %d", err);
  604. }
  605. } else {
  606. IF (err != NC_ECHAR)
  607. error("wrong type: status = %d", err);
  608. }
  609. }
  610. }
  611. err = nc_close(ncid);
  612. IF (err)
  613. error("nc_close: %s", nc_strerror(err));
  614. print_nok(nok);
  615. }
  616. void
  617. test_nc_get_var_text(void)
  618. {
  619. int ncid;
  620. int i;
  621. int j;
  622. int err;
  623. int allInExtRange; /* all values within external range? */
  624. int allInIntRange; /* all values within internal range? */
  625. int nels;
  626. int nok = 0; /* count of valid comparisons */
  627. size_t index[MAX_RANK];
  628. int canConvert; /* Both text or both numeric */
  629. text value[MAX_NELS];
  630. double expect[MAX_NELS];
  631. err = nc_open(testfile, NC_NOWRITE, &ncid);
  632. IF (err)
  633. error("nc_open: %s", nc_strerror(err));
  634. for (i = 0; i < NVARS; i++) {
  635. canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
  636. assert(var_rank[i] <= MAX_RANK);
  637. assert(var_nels[i] <= MAX_NELS);
  638. err = nc_get_var_text(BAD_ID, i, value);
  639. IF (err != NC_EBADID)
  640. error("bad ncid: status = %d", err);
  641. err = nc_get_var_text(ncid, BAD_VARID, value);
  642. IF (err != NC_ENOTVAR)
  643. error("bad var id: status = %d", err);
  644. nels = 1;
  645. for (j = 0; j < var_rank[i]; j++) {
  646. nels *= var_shape[i][j];
  647. }
  648. allInExtRange = allInIntRange = 1;
  649. for (j = 0; j < nels; j++) {
  650. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  651. IF (err)
  652. error("error in toMixedBase 1");
  653. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_TEXT);
  654. if (inRange3(expect[j],var_type[i], NCT_TEXT)) {
  655. allInIntRange = allInIntRange && expect[j] >= text_min
  656. && expect[j] <= text_max;
  657. } else {
  658. allInExtRange = 0;
  659. }
  660. }
  661. err = nc_get_var_text(ncid, i, value);
  662. if (canConvert) {
  663. if (allInExtRange) {
  664. if (allInIntRange) {
  665. IF (err)
  666. error("%s", nc_strerror(err));
  667. } else {
  668. IF (err != NC_ERANGE)
  669. error("Range error: status = %d", err);
  670. }
  671. } else {
  672. IF (err != 0 && err != NC_ERANGE)
  673. error("OK or Range error: status = %d", err);
  674. }
  675. for (j = 0; j < nels; j++) {
  676. if (inRange3(expect[j],var_type[i],NCT_TEXT)
  677. && expect[j] >= text_min && expect[j] <= text_max) {
  678. IF (!equal(value[j],expect[j],var_type[i],NCT_TEXT)){
  679. error("value read not that expected");
  680. if (verbose) {
  681. error("\n");
  682. error("varid: %d, ", i);
  683. error("var_name: %s, ", var_name[i]);
  684. error("element number: %d ", j);
  685. error("expect: %g", expect[j]);
  686. error("got: %g", (double) value[j]);
  687. }
  688. } else {
  689. nok++;
  690. }
  691. }
  692. }
  693. } else {
  694. IF (nels > 0 && err != NC_ECHAR)
  695. error("wrong type: status = %d", err);
  696. }
  697. }
  698. err = nc_close(ncid);
  699. IF (err)
  700. error("nc_close: %s", nc_strerror(err));
  701. print_nok(nok);
  702. }
  703. void
  704. test_nc_get_var_uchar(void)
  705. {
  706. int ncid;
  707. int i;
  708. int j;
  709. int err;
  710. int allInExtRange; /* all values within external range? */
  711. int allInIntRange; /* all values within internal range? */
  712. int nels;
  713. int nok = 0; /* count of valid comparisons */
  714. size_t index[MAX_RANK];
  715. int canConvert; /* Both text or both numeric */
  716. uchar value[MAX_NELS];
  717. double expect[MAX_NELS];
  718. err = nc_open(testfile, NC_NOWRITE, &ncid);
  719. IF (err)
  720. error("nc_open: %s", nc_strerror(err));
  721. for (i = 0; i < NVARS; i++) {
  722. canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
  723. assert(var_rank[i] <= MAX_RANK);
  724. assert(var_nels[i] <= MAX_NELS);
  725. err = nc_get_var_uchar(BAD_ID, i, value);
  726. IF (err != NC_EBADID)
  727. error("bad ncid: status = %d", err);
  728. err = nc_get_var_uchar(ncid, BAD_VARID, value);
  729. IF (err != NC_ENOTVAR)
  730. error("bad var id: status = %d", err);
  731. nels = 1;
  732. for (j = 0; j < var_rank[i]; j++) {
  733. nels *= var_shape[i][j];
  734. }
  735. allInExtRange = allInIntRange = 1;
  736. for (j = 0; j < nels; j++) {
  737. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  738. IF (err)
  739. error("error in toMixedBase 1");
  740. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_UCHAR);
  741. if (inRange3(expect[j],var_type[i], NCT_UCHAR)) {
  742. allInIntRange = allInIntRange && expect[j] >= uchar_min
  743. && expect[j] <= uchar_max;
  744. } else {
  745. allInExtRange = 0;
  746. }
  747. }
  748. err = nc_get_var_uchar(ncid, i, value);
  749. if (canConvert) {
  750. if (allInExtRange) {
  751. if (allInIntRange) {
  752. IF (err)
  753. error("%s", nc_strerror(err));
  754. } else {
  755. IF (err != NC_ERANGE)
  756. error("Range error: status = %d", err);
  757. }
  758. } else {
  759. IF (err != 0 && err != NC_ERANGE)
  760. error("OK or Range error: status = %d", err);
  761. }
  762. for (j = 0; j < nels; j++) {
  763. if (inRange3(expect[j],var_type[i],NCT_UCHAR)
  764. && expect[j] >= uchar_min && expect[j] <= uchar_max) {
  765. IF (!equal(value[j],expect[j],var_type[i],NCT_UCHAR)){
  766. error("value read not that expected");
  767. if (verbose) {
  768. error("\n");
  769. error("varid: %d, ", i);
  770. error("var_name: %s, ", var_name[i]);
  771. error("element number: %d ", j);
  772. error("expect: %g", expect[j]);
  773. error("got: %g", (double) value[j]);
  774. }
  775. } else {
  776. nok++;
  777. }
  778. }
  779. }
  780. } else {
  781. IF (nels > 0 && err != NC_ECHAR)
  782. error("wrong type: status = %d", err);
  783. }
  784. }
  785. err = nc_close(ncid);
  786. IF (err)
  787. error("nc_close: %s", nc_strerror(err));
  788. print_nok(nok);
  789. }
  790. void
  791. test_nc_get_var_schar(void)
  792. {
  793. int ncid;
  794. int i;
  795. int j;
  796. int err;
  797. int allInExtRange; /* all values within external range? */
  798. int allInIntRange; /* all values within internal range? */
  799. int nels;
  800. int nok = 0; /* count of valid comparisons */
  801. size_t index[MAX_RANK];
  802. int canConvert; /* Both text or both numeric */
  803. schar value[MAX_NELS];
  804. double expect[MAX_NELS];
  805. err = nc_open(testfile, NC_NOWRITE, &ncid);
  806. IF (err)
  807. error("nc_open: %s", nc_strerror(err));
  808. for (i = 0; i < NVARS; i++) {
  809. canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
  810. assert(var_rank[i] <= MAX_RANK);
  811. assert(var_nels[i] <= MAX_NELS);
  812. err = nc_get_var_schar(BAD_ID, i, value);
  813. IF (err != NC_EBADID)
  814. error("bad ncid: status = %d", err);
  815. err = nc_get_var_schar(ncid, BAD_VARID, value);
  816. IF (err != NC_ENOTVAR)
  817. error("bad var id: status = %d", err);
  818. nels = 1;
  819. for (j = 0; j < var_rank[i]; j++) {
  820. nels *= var_shape[i][j];
  821. }
  822. allInExtRange = allInIntRange = 1;
  823. for (j = 0; j < nels; j++) {
  824. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  825. IF (err)
  826. error("error in toMixedBase 1");
  827. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_SCHAR);
  828. if (inRange3(expect[j],var_type[i], NCT_SCHAR)) {
  829. allInIntRange = allInIntRange && expect[j] >= schar_min
  830. && expect[j] <= schar_max;
  831. } else {
  832. allInExtRange = 0;
  833. }
  834. }
  835. err = nc_get_var_schar(ncid, i, value);
  836. if (canConvert) {
  837. if (allInExtRange) {
  838. if (allInIntRange) {
  839. IF (err)
  840. error("%s", nc_strerror(err));
  841. } else {
  842. IF (err != NC_ERANGE)
  843. error("Range error: status = %d", err);
  844. }
  845. } else {
  846. IF (err != 0 && err != NC_ERANGE)
  847. error("OK or Range error: status = %d", err);
  848. }
  849. for (j = 0; j < nels; j++) {
  850. if (inRange3(expect[j],var_type[i],NCT_SCHAR)
  851. && expect[j] >= schar_min && expect[j] <= schar_max) {
  852. IF (!equal(value[j],expect[j],var_type[i],NCT_SCHAR)){
  853. error("value read not that expected");
  854. if (verbose) {
  855. error("\n");
  856. error("varid: %d, ", i);
  857. error("var_name: %s, ", var_name[i]);
  858. error("element number: %d ", j);
  859. error("expect: %g", expect[j]);
  860. error("got: %g", (double) value[j]);
  861. }
  862. } else {
  863. nok++;
  864. }
  865. }
  866. }
  867. } else {
  868. IF (nels > 0 && err != NC_ECHAR)
  869. error("wrong type: status = %d", err);
  870. }
  871. }
  872. err = nc_close(ncid);
  873. IF (err)
  874. error("nc_close: %s", nc_strerror(err));
  875. print_nok(nok);
  876. }
  877. void
  878. test_nc_get_var_short(void)
  879. {
  880. int ncid;
  881. int i;
  882. int j;
  883. int err;
  884. int allInExtRange; /* all values within external range? */
  885. int allInIntRange; /* all values within internal range? */
  886. int nels;
  887. int nok = 0; /* count of valid comparisons */
  888. size_t index[MAX_RANK];
  889. int canConvert; /* Both text or both numeric */
  890. short value[MAX_NELS];
  891. double expect[MAX_NELS];
  892. err = nc_open(testfile, NC_NOWRITE, &ncid);
  893. IF (err)
  894. error("nc_open: %s", nc_strerror(err));
  895. for (i = 0; i < NVARS; i++) {
  896. canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
  897. assert(var_rank[i] <= MAX_RANK);
  898. assert(var_nels[i] <= MAX_NELS);
  899. err = nc_get_var_short(BAD_ID, i, value);
  900. IF (err != NC_EBADID)
  901. error("bad ncid: status = %d", err);
  902. err = nc_get_var_short(ncid, BAD_VARID, value);
  903. IF (err != NC_ENOTVAR)
  904. error("bad var id: status = %d", err);
  905. nels = 1;
  906. for (j = 0; j < var_rank[i]; j++) {
  907. nels *= var_shape[i][j];
  908. }
  909. allInExtRange = allInIntRange = 1;
  910. for (j = 0; j < nels; j++) {
  911. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  912. IF (err)
  913. error("error in toMixedBase 1");
  914. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_SHORT);
  915. if (inRange3(expect[j],var_type[i], NCT_SHORT)) {
  916. allInIntRange = allInIntRange && expect[j] >= short_min
  917. && expect[j] <= short_max;
  918. } else {
  919. allInExtRange = 0;
  920. }
  921. }
  922. err = nc_get_var_short(ncid, i, value);
  923. if (canConvert) {
  924. if (allInExtRange) {
  925. if (allInIntRange) {
  926. IF (err)
  927. error("%s", nc_strerror(err));
  928. } else {
  929. IF (err != NC_ERANGE)
  930. error("Range error: status = %d", err);
  931. }
  932. } else {
  933. IF (err != 0 && err != NC_ERANGE)
  934. error("OK or Range error: status = %d", err);
  935. }
  936. for (j = 0; j < nels; j++) {
  937. if (inRange3(expect[j],var_type[i],NCT_SHORT)
  938. && expect[j] >= short_min && expect[j] <= short_max) {
  939. IF (!equal(value[j],expect[j],var_type[i],NCT_SHORT)){
  940. error("value read not that expected");
  941. if (verbose) {
  942. error("\n");
  943. error("varid: %d, ", i);
  944. error("var_name: %s, ", var_name[i]);
  945. error("element number: %d ", j);
  946. error("expect: %g", expect[j]);
  947. error("got: %g", (double) value[j]);
  948. }
  949. } else {
  950. nok++;
  951. }
  952. }
  953. }
  954. } else {
  955. IF (nels > 0 && err != NC_ECHAR)
  956. error("wrong type: status = %d", err);
  957. }
  958. }
  959. err = nc_close(ncid);
  960. IF (err)
  961. error("nc_close: %s", nc_strerror(err));
  962. print_nok(nok);
  963. }
  964. void
  965. test_nc_get_var_int(void)
  966. {
  967. int ncid;
  968. int i;
  969. int j;
  970. int err;
  971. int allInExtRange; /* all values within external range? */
  972. int allInIntRange; /* all values within internal range? */
  973. int nels;
  974. int nok = 0; /* count of valid comparisons */
  975. size_t index[MAX_RANK];
  976. int canConvert; /* Both text or both numeric */
  977. int value[MAX_NELS];
  978. double expect[MAX_NELS];
  979. err = nc_open(testfile, NC_NOWRITE, &ncid);
  980. IF (err)
  981. error("nc_open: %s", nc_strerror(err));
  982. for (i = 0; i < NVARS; i++) {
  983. canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
  984. assert(var_rank[i] <= MAX_RANK);
  985. assert(var_nels[i] <= MAX_NELS);
  986. err = nc_get_var_int(BAD_ID, i, value);
  987. IF (err != NC_EBADID)
  988. error("bad ncid: status = %d", err);
  989. err = nc_get_var_int(ncid, BAD_VARID, value);
  990. IF (err != NC_ENOTVAR)
  991. error("bad var id: status = %d", err);
  992. nels = 1;
  993. for (j = 0; j < var_rank[i]; j++) {
  994. nels *= var_shape[i][j];
  995. }
  996. allInExtRange = allInIntRange = 1;
  997. for (j = 0; j < nels; j++) {
  998. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  999. IF (err)
  1000. error("error in toMixedBase 1");
  1001. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_INT);
  1002. if (inRange3(expect[j],var_type[i], NCT_INT)) {
  1003. allInIntRange = allInIntRange && expect[j] >= int_min
  1004. && expect[j] <= int_max;
  1005. } else {
  1006. allInExtRange = 0;
  1007. }
  1008. }
  1009. err = nc_get_var_int(ncid, i, value);
  1010. if (canConvert) {
  1011. if (allInExtRange) {
  1012. if (allInIntRange) {
  1013. IF (err)
  1014. error("%s", nc_strerror(err));
  1015. } else {
  1016. IF (err != NC_ERANGE)
  1017. error("Range error: status = %d", err);
  1018. }
  1019. } else {
  1020. IF (err != 0 && err != NC_ERANGE)
  1021. error("OK or Range error: status = %d", err);
  1022. }
  1023. for (j = 0; j < nels; j++) {
  1024. if (inRange3(expect[j],var_type[i],NCT_INT)
  1025. && expect[j] >= int_min && expect[j] <= int_max) {
  1026. IF (!equal(value[j],expect[j],var_type[i],NCT_INT)){
  1027. error("value read not that expected");
  1028. if (verbose) {
  1029. error("\n");
  1030. error("varid: %d, ", i);
  1031. error("var_name: %s, ", var_name[i]);
  1032. error("element number: %d ", j);
  1033. error("expect: %g", expect[j]);
  1034. error("got: %g", (double) value[j]);
  1035. }
  1036. } else {
  1037. nok++;
  1038. }
  1039. }
  1040. }
  1041. } else {
  1042. IF (nels > 0 && err != NC_ECHAR)
  1043. error("wrong type: status = %d", err);
  1044. }
  1045. }
  1046. err = nc_close(ncid);
  1047. IF (err)
  1048. error("nc_close: %s", nc_strerror(err));
  1049. print_nok(nok);
  1050. }
  1051. void
  1052. test_nc_get_var_long(void)
  1053. {
  1054. int ncid;
  1055. int i;
  1056. int j;
  1057. int err;
  1058. int allInExtRange; /* all values within external range? */
  1059. int allInIntRange; /* all values within internal range? */
  1060. int nels;
  1061. int nok = 0; /* count of valid comparisons */
  1062. size_t index[MAX_RANK];
  1063. int canConvert; /* Both text or both numeric */
  1064. long value[MAX_NELS];
  1065. double expect[MAX_NELS];
  1066. err = nc_open(testfile, NC_NOWRITE, &ncid);
  1067. IF (err)
  1068. error("nc_open: %s", nc_strerror(err));
  1069. for (i = 0; i < NVARS; i++) {
  1070. canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
  1071. assert(var_rank[i] <= MAX_RANK);
  1072. assert(var_nels[i] <= MAX_NELS);
  1073. err = nc_get_var_long(BAD_ID, i, value);
  1074. IF (err != NC_EBADID)
  1075. error("bad ncid: status = %d", err);
  1076. err = nc_get_var_long(ncid, BAD_VARID, value);
  1077. IF (err != NC_ENOTVAR)
  1078. error("bad var id: status = %d", err);
  1079. nels = 1;
  1080. for (j = 0; j < var_rank[i]; j++) {
  1081. nels *= var_shape[i][j];
  1082. }
  1083. allInExtRange = allInIntRange = 1;
  1084. for (j = 0; j < nels; j++) {
  1085. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  1086. IF (err)
  1087. error("error in toMixedBase 1");
  1088. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_LONG);
  1089. if (inRange3(expect[j],var_type[i], NCT_LONG)) {
  1090. allInIntRange = allInIntRange && expect[j] >= long_min
  1091. && expect[j] <= long_max;
  1092. } else {
  1093. allInExtRange = 0;
  1094. }
  1095. }
  1096. err = nc_get_var_long(ncid, i, value);
  1097. if (canConvert) {
  1098. if (allInExtRange) {
  1099. if (allInIntRange) {
  1100. IF (err)
  1101. error("%s", nc_strerror(err));
  1102. } else {
  1103. IF (err != NC_ERANGE)
  1104. error("Range error: status = %d", err);
  1105. }
  1106. } else {
  1107. IF (err != 0 && err != NC_ERANGE)
  1108. error("OK or Range error: status = %d", err);
  1109. }
  1110. for (j = 0; j < nels; j++) {
  1111. if (inRange3(expect[j],var_type[i],NCT_LONG)
  1112. && expect[j] >= long_min && expect[j] <= long_max) {
  1113. IF (!equal(value[j],expect[j],var_type[i],NCT_LONG)){
  1114. error("value read not that expected");
  1115. if (verbose) {
  1116. error("\n");
  1117. error("varid: %d, ", i);
  1118. error("var_name: %s, ", var_name[i]);
  1119. error("element number: %d ", j);
  1120. error("expect: %g", expect[j]);
  1121. error("got: %g", (double) value[j]);
  1122. }
  1123. } else {
  1124. nok++;
  1125. }
  1126. }
  1127. }
  1128. } else {
  1129. IF (nels > 0 && err != NC_ECHAR)
  1130. error("wrong type: status = %d", err);
  1131. }
  1132. }
  1133. err = nc_close(ncid);
  1134. IF (err)
  1135. error("nc_close: %s", nc_strerror(err));
  1136. print_nok(nok);
  1137. }
  1138. void
  1139. test_nc_get_var_float(void)
  1140. {
  1141. int ncid;
  1142. int i;
  1143. int j;
  1144. int err;
  1145. int allInExtRange; /* all values within external range? */
  1146. int allInIntRange; /* all values within internal range? */
  1147. int nels;
  1148. int nok = 0; /* count of valid comparisons */
  1149. size_t index[MAX_RANK];
  1150. int canConvert; /* Both text or both numeric */
  1151. float value[MAX_NELS];
  1152. double expect[MAX_NELS];
  1153. err = nc_open(testfile, NC_NOWRITE, &ncid);
  1154. IF (err)
  1155. error("nc_open: %s", nc_strerror(err));
  1156. for (i = 0; i < NVARS; i++) {
  1157. canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
  1158. assert(var_rank[i] <= MAX_RANK);
  1159. assert(var_nels[i] <= MAX_NELS);
  1160. err = nc_get_var_float(BAD_ID, i, value);
  1161. IF (err != NC_EBADID)
  1162. error("bad ncid: status = %d", err);
  1163. err = nc_get_var_float(ncid, BAD_VARID, value);
  1164. IF (err != NC_ENOTVAR)
  1165. error("bad var id: status = %d", err);
  1166. nels = 1;
  1167. for (j = 0; j < var_rank[i]; j++) {
  1168. nels *= var_shape[i][j];
  1169. }
  1170. allInExtRange = allInIntRange = 1;
  1171. for (j = 0; j < nels; j++) {
  1172. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  1173. IF (err)
  1174. error("error in toMixedBase 1");
  1175. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_FLOAT);
  1176. if (inRange3(expect[j],var_type[i], NCT_FLOAT)) {
  1177. allInIntRange = allInIntRange && expect[j] >= float_min
  1178. && expect[j] <= float_max;
  1179. } else {
  1180. allInExtRange = 0;
  1181. }
  1182. }
  1183. err = nc_get_var_float(ncid, i, value);
  1184. if (canConvert) {
  1185. if (allInExtRange) {
  1186. if (allInIntRange) {
  1187. IF (err)
  1188. error("%s", nc_strerror(err));
  1189. } else {
  1190. IF (err != NC_ERANGE)
  1191. error("Range error: status = %d", err);
  1192. }
  1193. } else {
  1194. IF (err != 0 && err != NC_ERANGE)
  1195. error("OK or Range error: status = %d", err);
  1196. }
  1197. for (j = 0; j < nels; j++) {
  1198. if (inRange3(expect[j],var_type[i],NCT_FLOAT)
  1199. && expect[j] >= float_min && expect[j] <= float_max) {
  1200. IF (!equal(value[j],expect[j],var_type[i],NCT_FLOAT)){
  1201. error("value read not that expected");
  1202. if (verbose) {
  1203. error("\n");
  1204. error("varid: %d, ", i);
  1205. error("var_name: %s, ", var_name[i]);
  1206. error("element number: %d ", j);
  1207. error("expect: %g", expect[j]);
  1208. error("got: %g", (double) value[j]);
  1209. }
  1210. } else {
  1211. nok++;
  1212. }
  1213. }
  1214. }
  1215. } else {
  1216. IF (nels > 0 && err != NC_ECHAR)
  1217. error("wrong type: status = %d", err);
  1218. }
  1219. }
  1220. err = nc_close(ncid);
  1221. IF (err)
  1222. error("nc_close: %s", nc_strerror(err));
  1223. print_nok(nok);
  1224. }
  1225. void
  1226. test_nc_get_var_double(void)
  1227. {
  1228. int ncid;
  1229. int i;
  1230. int j;
  1231. int err;
  1232. int allInExtRange; /* all values within external range? */
  1233. int allInIntRange; /* all values within internal range? */
  1234. int nels;
  1235. int nok = 0; /* count of valid comparisons */
  1236. size_t index[MAX_RANK];
  1237. int canConvert; /* Both text or both numeric */
  1238. double value[MAX_NELS];
  1239. double expect[MAX_NELS];
  1240. err = nc_open(testfile, NC_NOWRITE, &ncid);
  1241. IF (err)
  1242. error("nc_open: %s", nc_strerror(err));
  1243. for (i = 0; i < NVARS; i++) {
  1244. canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
  1245. assert(var_rank[i] <= MAX_RANK);
  1246. assert(var_nels[i] <= MAX_NELS);
  1247. err = nc_get_var_double(BAD_ID, i, value);
  1248. IF (err != NC_EBADID)
  1249. error("bad ncid: status = %d", err);
  1250. err = nc_get_var_double(ncid, BAD_VARID, value);
  1251. IF (err != NC_ENOTVAR)
  1252. error("bad var id: status = %d", err);
  1253. nels = 1;
  1254. for (j = 0; j < var_rank[i]; j++) {
  1255. nels *= var_shape[i][j];
  1256. }
  1257. allInExtRange = allInIntRange = 1;
  1258. for (j = 0; j < nels; j++) {
  1259. err = toMixedBase(j, var_rank[i], var_shape[i], index);
  1260. IF (err)
  1261. error("error in toMixedBase 1");
  1262. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_DOUBLE);
  1263. if (inRange3(expect[j],var_type[i], NCT_DOUBLE)) {
  1264. allInIntRange = allInIntRange && expect[j] >= double_min
  1265. && expect[j] <= double_max;
  1266. } else {
  1267. allInExtRange = 0;
  1268. }
  1269. }
  1270. err = nc_get_var_double(ncid, i, value);
  1271. if (canConvert) {
  1272. if (allInExtRange) {
  1273. if (allInIntRange) {
  1274. IF (err)
  1275. error("%s", nc_strerror(err));
  1276. } else {
  1277. IF (err != NC_ERANGE)
  1278. error("Range error: status = %d", err);
  1279. }
  1280. } else {
  1281. IF (err != 0 && err != NC_ERANGE)
  1282. error("OK or Range error: status = %d", err);
  1283. }
  1284. for (j = 0; j < nels; j++) {
  1285. if (inRange3(expect[j],var_type[i],NCT_DOUBLE)
  1286. && expect[j] >= double_min && expect[j] <= double_max) {
  1287. IF (!equal(value[j],expect[j],var_type[i],NCT_DOUBLE)){
  1288. error("value read not that expected");
  1289. if (verbose) {
  1290. error("\n");
  1291. error("varid: %d, ", i);
  1292. error("var_name: %s, ", var_name[i]);
  1293. error("element number: %d ", j);
  1294. error("expect: %g", expect[j]);
  1295. error("got: %g", (double) value[j]);
  1296. }
  1297. } else {
  1298. nok++;
  1299. }
  1300. }
  1301. }
  1302. } else {
  1303. IF (nels > 0 && err != NC_ECHAR)
  1304. error("wrong type: status = %d", err);
  1305. }
  1306. }
  1307. err = nc_close(ncid);
  1308. IF (err)
  1309. error("nc_close: %s", nc_strerror(err));
  1310. print_nok(nok);
  1311. }
  1312. void
  1313. test_nc_get_vara_text(void)
  1314. {
  1315. int ncid;
  1316. int d;
  1317. int i;
  1318. int j;
  1319. int k;
  1320. int err;
  1321. int allInExtRange; /* all values within external range? */
  1322. int allInIntRange; /* all values within internal range? */
  1323. int nels;
  1324. int nslabs;
  1325. int nok = 0; /* count of valid comparisons */
  1326. size_t start[MAX_RANK];
  1327. size_t edge[MAX_RANK];
  1328. size_t index[MAX_RANK];
  1329. size_t mid[MAX_RANK];
  1330. int canConvert; /* Both text or both numeric */
  1331. text value[MAX_NELS];
  1332. double expect[MAX_NELS];
  1333. err = nc_open(testfile, NC_NOWRITE, &ncid);
  1334. IF (err)
  1335. error("nc_open: %s", nc_strerror(err));
  1336. for (i = 0; i < NVARS; i++) {
  1337. canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
  1338. assert(var_rank[i] <= MAX_RANK);
  1339. assert(var_nels[i] <= MAX_NELS);
  1340. for (j = 0; j < var_rank[i]; j++) {
  1341. start[j] = 0;
  1342. edge[j] = 1;
  1343. }
  1344. err = nc_get_vara_text(BAD_ID, i, start, edge, value);
  1345. IF (err != NC_EBADID)
  1346. error("bad ncid: status = %d", err);
  1347. err = nc_get_vara_text(ncid, BAD_VARID, start, edge, value);
  1348. IF (err != NC_ENOTVAR)
  1349. error("bad var id: status = %d", err);
  1350. for (j = 0; j < var_rank[i]; j++) {
  1351. start[j] = var_shape[i][j];
  1352. err = nc_get_vara_text(ncid, i, start, edge, value);
  1353. IF (canConvert && err != NC_EINVALCOORDS)
  1354. error("bad index: status = %d", err);
  1355. start[j] = 0;
  1356. edge[j] = var_shape[i][j] + 1;
  1357. err = nc_get_vara_text(ncid, i, start, edge, value);
  1358. IF (canConvert && err != NC_EEDGE)
  1359. error("bad edge: status = %d", err);
  1360. edge[j] = 1;
  1361. }
  1362. /* Check non-scalars for correct error returned even when */
  1363. /* there is nothing to get (edge[j]==0) */
  1364. if(var_rank[i] > 0) {
  1365. for (j = 0; j < var_rank[i]; j++) {
  1366. edge[j] = 0;
  1367. }
  1368. err = nc_get_vara_text(BAD_ID, i, start, edge, value);
  1369. IF (err != NC_EBADID)
  1370. error("bad ncid: status = %d", err);
  1371. err = nc_get_vara_text(ncid, BAD_VARID, start, edge, value);
  1372. IF (err != NC_ENOTVAR)
  1373. error("bad var id: status = %d", err);
  1374. for (j = 0; j < var_rank[i]; j++) {
  1375. if (var_dimid[i][j] > 0) { /* skip record dim */
  1376. start[j] = var_shape[i][j];
  1377. err = nc_get_vara_text(ncid, i, start, edge, value);
  1378. IF (canConvert && err != NC_EINVALCOORDS)
  1379. error("bad start: status = %d", err);
  1380. start[j] = 0;
  1381. }
  1382. }
  1383. err = nc_get_vara_text(ncid, i, start, edge, value);
  1384. if (canConvert) {
  1385. IF (err)
  1386. error("%s", nc_strerror(err));
  1387. } else {
  1388. IF (err != NC_ECHAR)
  1389. error("wrong type: status = %d", err);
  1390. }
  1391. for (j = 0; j < var_rank[i]; j++) {
  1392. edge[j] = 1;
  1393. }
  1394. } /* Choose a random point dividing each dim into 2 parts */
  1395. /* get 2^rank (nslabs) slabs so defined */
  1396. nslabs = 1;
  1397. for (j = 0; j < var_rank[i]; j++) {
  1398. mid[j] = roll( var_shape[i][j] );
  1399. nslabs *= 2;
  1400. }
  1401. /* bits of k determine whether to get lower or upper part of dim */
  1402. for (k = 0; k < nslabs; k++) {
  1403. nels = 1;
  1404. for (j = 0; j < var_rank[i]; j++) {
  1405. if ((k >> j) & 1) {
  1406. start[j] = 0;
  1407. edge[j] = mid[j];
  1408. }else{
  1409. start[j] = mid[j];
  1410. edge[j] = var_shape[i][j] - mid[j];
  1411. }
  1412. nels *= edge[j];
  1413. }
  1414. allInExtRange = allInIntRange = 1;
  1415. for (j = 0; j < nels; j++) {
  1416. err = toMixedBase(j, var_rank[i], edge, index);
  1417. IF (err)
  1418. error("error in toMixedBase 1");
  1419. for (d = 0; d < var_rank[i]; d++)
  1420. index[d] += start[d];
  1421. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_TEXT);
  1422. if (inRange3(expect[j],var_type[i], NCT_TEXT)) {
  1423. allInIntRange = allInIntRange && expect[j] >= text_min
  1424. && expect[j] <= text_max;
  1425. } else {
  1426. allInExtRange = 0;
  1427. }
  1428. }
  1429. if (var_rank[i] == 0 && i%2)
  1430. err = nc_get_vara_text(ncid, i, NULL, NULL, value);
  1431. else
  1432. err = nc_get_vara_text(ncid, i, start, edge, value);
  1433. if (canConvert) {
  1434. if (allInExtRange) {
  1435. if (allInIntRange) {
  1436. IF (err)
  1437. error("%s", nc_strerror(err));
  1438. } else {
  1439. IF (err != NC_ERANGE)
  1440. error("Range error: status = %d", err);
  1441. }
  1442. } else {
  1443. IF (err != 0 && err != NC_ERANGE)
  1444. error("OK or Range error: status = %d", err);
  1445. }
  1446. for (j = 0; j < nels; j++) {
  1447. if (inRange3(expect[j],var_type[i],NCT_TEXT)
  1448. && expect[j] >= text_min && expect[j] <= text_max) {
  1449. IF (!equal(value[j],expect[j],var_type[i],NCT_TEXT)){
  1450. error("value read not that expected");
  1451. if (verbose) {
  1452. error("\n");
  1453. error("varid: %d, ", i);
  1454. error("var_name: %s, ", var_name[i]);
  1455. error("element number: %d ", j);
  1456. error("expect: %g", expect[j]);
  1457. error("got: %g", (double) value[j]);
  1458. }
  1459. } else {
  1460. nok++;
  1461. }
  1462. }
  1463. }
  1464. } else {
  1465. IF (nels > 0 && err != NC_ECHAR)
  1466. error("wrong type: status = %d", err);
  1467. }
  1468. }
  1469. }
  1470. err = nc_close(ncid);
  1471. IF (err)
  1472. error("nc_close: %s", nc_strerror(err));
  1473. print_nok(nok);
  1474. }
  1475. void
  1476. test_nc_get_vara_uchar(void)
  1477. {
  1478. int ncid;
  1479. int d;
  1480. int i;
  1481. int j;
  1482. int k;
  1483. int err;
  1484. int allInExtRange; /* all values within external range? */
  1485. int allInIntRange; /* all values within internal range? */
  1486. int nels;
  1487. int nslabs;
  1488. int nok = 0; /* count of valid comparisons */
  1489. size_t start[MAX_RANK];
  1490. size_t edge[MAX_RANK];
  1491. size_t index[MAX_RANK];
  1492. size_t mid[MAX_RANK];
  1493. int canConvert; /* Both text or both numeric */
  1494. uchar value[MAX_NELS];
  1495. double expect[MAX_NELS];
  1496. err = nc_open(testfile, NC_NOWRITE, &ncid);
  1497. IF (err)
  1498. error("nc_open: %s", nc_strerror(err));
  1499. for (i = 0; i < NVARS; i++) {
  1500. canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
  1501. assert(var_rank[i] <= MAX_RANK);
  1502. assert(var_nels[i] <= MAX_NELS);
  1503. for (j = 0; j < var_rank[i]; j++) {
  1504. start[j] = 0;
  1505. edge[j] = 1;
  1506. }
  1507. err = nc_get_vara_uchar(BAD_ID, i, start, edge, value);
  1508. IF (err != NC_EBADID)
  1509. error("bad ncid: status = %d", err);
  1510. err = nc_get_vara_uchar(ncid, BAD_VARID, start, edge, value);
  1511. IF (err != NC_ENOTVAR)
  1512. error("bad var id: status = %d", err);
  1513. for (j = 0; j < var_rank[i]; j++) {
  1514. start[j] = var_shape[i][j];
  1515. err = nc_get_vara_uchar(ncid, i, start, edge, value);
  1516. IF (canConvert && err != NC_EINVALCOORDS)
  1517. error("bad index: status = %d", err);
  1518. start[j] = 0;
  1519. edge[j] = var_shape[i][j] + 1;
  1520. err = nc_get_vara_uchar(ncid, i, start, edge, value);
  1521. IF (canConvert && err != NC_EEDGE)
  1522. error("bad edge: status = %d", err);
  1523. edge[j] = 1;
  1524. }
  1525. /* Check non-scalars for correct error returned even when */
  1526. /* there is nothing to get (edge[j]==0) */
  1527. if(var_rank[i] > 0) {
  1528. for (j = 0; j < var_rank[i]; j++) {
  1529. edge[j] = 0;
  1530. }
  1531. err = nc_get_vara_uchar(BAD_ID, i, start, edge, value);
  1532. IF (err != NC_EBADID)
  1533. error("bad ncid: status = %d", err);
  1534. err = nc_get_vara_uchar(ncid, BAD_VARID, start, edge, value);
  1535. IF (err != NC_ENOTVAR)
  1536. error("bad var id: status = %d", err);
  1537. for (j = 0; j < var_rank[i]; j++) {
  1538. if (var_dimid[i][j] > 0) { /* skip record dim */
  1539. start[j] = var_shape[i][j];
  1540. err = nc_get_vara_uchar(ncid, i, start, edge, value);
  1541. IF (canConvert && err != NC_EINVALCOORDS)
  1542. error("bad start: status = %d", err);
  1543. start[j] = 0;
  1544. }
  1545. }
  1546. err = nc_get_vara_uchar(ncid, i, start, edge, value);
  1547. if (canConvert) {
  1548. IF (err)
  1549. error("%s", nc_strerror(err));
  1550. } else {
  1551. IF (err != NC_ECHAR)
  1552. error("wrong type: status = %d", err);
  1553. }
  1554. for (j = 0; j < var_rank[i]; j++) {
  1555. edge[j] = 1;
  1556. }
  1557. } /* Choose a random point dividing each dim into 2 parts */
  1558. /* get 2^rank (nslabs) slabs so defined */
  1559. nslabs = 1;
  1560. for (j = 0; j < var_rank[i]; j++) {
  1561. mid[j] = roll( var_shape[i][j] );
  1562. nslabs *= 2;
  1563. }
  1564. /* bits of k determine whether to get lower or upper part of dim */
  1565. for (k = 0; k < nslabs; k++) {
  1566. nels = 1;
  1567. for (j = 0; j < var_rank[i]; j++) {
  1568. if ((k >> j) & 1) {
  1569. start[j] = 0;
  1570. edge[j] = mid[j];
  1571. }else{
  1572. start[j] = mid[j];
  1573. edge[j] = var_shape[i][j] - mid[j];
  1574. }
  1575. nels *= edge[j];
  1576. }
  1577. allInExtRange = allInIntRange = 1;
  1578. for (j = 0; j < nels; j++) {
  1579. err = toMixedBase(j, var_rank[i], edge, index);
  1580. IF (err)
  1581. error("error in toMixedBase 1");
  1582. for (d = 0; d < var_rank[i]; d++)
  1583. index[d] += start[d];
  1584. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_UCHAR);
  1585. if (inRange3(expect[j],var_type[i], NCT_UCHAR)) {
  1586. allInIntRange = allInIntRange && expect[j] >= uchar_min
  1587. && expect[j] <= uchar_max;
  1588. } else {
  1589. allInExtRange = 0;
  1590. }
  1591. }
  1592. if (var_rank[i] == 0 && i%2)
  1593. err = nc_get_vara_uchar(ncid, i, NULL, NULL, value);
  1594. else
  1595. err = nc_get_vara_uchar(ncid, i, start, edge, value);
  1596. if (canConvert) {
  1597. if (allInExtRange) {
  1598. if (allInIntRange) {
  1599. IF (err)
  1600. error("%s", nc_strerror(err));
  1601. } else {
  1602. IF (err != NC_ERANGE)
  1603. error("Range error: status = %d", err);
  1604. }
  1605. } else {
  1606. IF (err != 0 && err != NC_ERANGE)
  1607. error("OK or Range error: status = %d", err);
  1608. }
  1609. for (j = 0; j < nels; j++) {
  1610. if (inRange3(expect[j],var_type[i],NCT_UCHAR)
  1611. && expect[j] >= uchar_min && expect[j] <= uchar_max) {
  1612. IF (!equal(value[j],expect[j],var_type[i],NCT_UCHAR)){
  1613. error("value read not that expected");
  1614. if (verbose) {
  1615. error("\n");
  1616. error("varid: %d, ", i);
  1617. error("var_name: %s, ", var_name[i]);
  1618. error("element number: %d ", j);
  1619. error("expect: %g", expect[j]);
  1620. error("got: %g", (double) value[j]);
  1621. }
  1622. } else {
  1623. nok++;
  1624. }
  1625. }
  1626. }
  1627. } else {
  1628. IF (nels > 0 && err != NC_ECHAR)
  1629. error("wrong type: status = %d", err);
  1630. }
  1631. }
  1632. }
  1633. err = nc_close(ncid);
  1634. IF (err)
  1635. error("nc_close: %s", nc_strerror(err));
  1636. print_nok(nok);
  1637. }
  1638. void
  1639. test_nc_get_vara_schar(void)
  1640. {
  1641. int ncid;
  1642. int d;
  1643. int i;
  1644. int j;
  1645. int k;
  1646. int err;
  1647. int allInExtRange; /* all values within external range? */
  1648. int allInIntRange; /* all values within internal range? */
  1649. int nels;
  1650. int nslabs;
  1651. int nok = 0; /* count of valid comparisons */
  1652. size_t start[MAX_RANK];
  1653. size_t edge[MAX_RANK];
  1654. size_t index[MAX_RANK];
  1655. size_t mid[MAX_RANK];
  1656. int canConvert; /* Both text or both numeric */
  1657. schar value[MAX_NELS];
  1658. double expect[MAX_NELS];
  1659. err = nc_open(testfile, NC_NOWRITE, &ncid);
  1660. IF (err)
  1661. error("nc_open: %s", nc_strerror(err));
  1662. for (i = 0; i < NVARS; i++) {
  1663. canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
  1664. assert(var_rank[i] <= MAX_RANK);
  1665. assert(var_nels[i] <= MAX_NELS);
  1666. for (j = 0; j < var_rank[i]; j++) {
  1667. start[j] = 0;
  1668. edge[j] = 1;
  1669. }
  1670. err = nc_get_vara_schar(BAD_ID, i, start, edge, value);
  1671. IF (err != NC_EBADID)
  1672. error("bad ncid: status = %d", err);
  1673. err = nc_get_vara_schar(ncid, BAD_VARID, start, edge, value);
  1674. IF (err != NC_ENOTVAR)
  1675. error("bad var id: status = %d", err);
  1676. for (j = 0; j < var_rank[i]; j++) {
  1677. start[j] = var_shape[i][j];
  1678. err = nc_get_vara_schar(ncid, i, start, edge, value);
  1679. IF (canConvert && err != NC_EINVALCOORDS)
  1680. error("bad index: status = %d", err);
  1681. start[j] = 0;
  1682. edge[j] = var_shape[i][j] + 1;
  1683. err = nc_get_vara_schar(ncid, i, start, edge, value);
  1684. IF (canConvert && err != NC_EEDGE)
  1685. error("bad edge: status = %d", err);
  1686. edge[j] = 1;
  1687. }
  1688. /* Check non-scalars for correct error returned even when */
  1689. /* there is nothing to get (edge[j]==0) */
  1690. if(var_rank[i] > 0) {
  1691. for (j = 0; j < var_rank[i]; j++) {
  1692. edge[j] = 0;
  1693. }
  1694. err = nc_get_vara_schar(BAD_ID, i, start, edge, value);
  1695. IF (err != NC_EBADID)
  1696. error("bad ncid: status = %d", err);
  1697. err = nc_get_vara_schar(ncid, BAD_VARID, start, edge, value);
  1698. IF (err != NC_ENOTVAR)
  1699. error("bad var id: status = %d", err);
  1700. for (j = 0; j < var_rank[i]; j++) {
  1701. if (var_dimid[i][j] > 0) { /* skip record dim */
  1702. start[j] = var_shape[i][j];
  1703. err = nc_get_vara_schar(ncid, i, start, edge, value);
  1704. IF (canConvert && err != NC_EINVALCOORDS)
  1705. error("bad start: status = %d", err);
  1706. start[j] = 0;
  1707. }
  1708. }
  1709. err = nc_get_vara_schar(ncid, i, start, edge, value);
  1710. if (canConvert) {
  1711. IF (err)
  1712. error("%s", nc_strerror(err));
  1713. } else {
  1714. IF (err != NC_ECHAR)
  1715. error("wrong type: status = %d", err);
  1716. }
  1717. for (j = 0; j < var_rank[i]; j++) {
  1718. edge[j] = 1;
  1719. }
  1720. } /* Choose a random point dividing each dim into 2 parts */
  1721. /* get 2^rank (nslabs) slabs so defined */
  1722. nslabs = 1;
  1723. for (j = 0; j < var_rank[i]; j++) {
  1724. mid[j] = roll( var_shape[i][j] );
  1725. nslabs *= 2;
  1726. }
  1727. /* bits of k determine whether to get lower or upper part of dim */
  1728. for (k = 0; k < nslabs; k++) {
  1729. nels = 1;
  1730. for (j = 0; j < var_rank[i]; j++) {
  1731. if ((k >> j) & 1) {
  1732. start[j] = 0;
  1733. edge[j] = mid[j];
  1734. }else{
  1735. start[j] = mid[j];
  1736. edge[j] = var_shape[i][j] - mid[j];
  1737. }
  1738. nels *= edge[j];
  1739. }
  1740. allInExtRange = allInIntRange = 1;
  1741. for (j = 0; j < nels; j++) {
  1742. err = toMixedBase(j, var_rank[i], edge, index);
  1743. IF (err)
  1744. error("error in toMixedBase 1");
  1745. for (d = 0; d < var_rank[i]; d++)
  1746. index[d] += start[d];
  1747. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_SCHAR);
  1748. if (inRange3(expect[j],var_type[i], NCT_SCHAR)) {
  1749. allInIntRange = allInIntRange && expect[j] >= schar_min
  1750. && expect[j] <= schar_max;
  1751. } else {
  1752. allInExtRange = 0;
  1753. }
  1754. }
  1755. if (var_rank[i] == 0 && i%2)
  1756. err = nc_get_vara_schar(ncid, i, NULL, NULL, value);
  1757. else
  1758. err = nc_get_vara_schar(ncid, i, start, edge, value);
  1759. if (canConvert) {
  1760. if (allInExtRange) {
  1761. if (allInIntRange) {
  1762. IF (err)
  1763. error("%s", nc_strerror(err));
  1764. } else {
  1765. IF (err != NC_ERANGE)
  1766. error("Range error: status = %d", err);
  1767. }
  1768. } else {
  1769. IF (err != 0 && err != NC_ERANGE)
  1770. error("OK or Range error: status = %d", err);
  1771. }
  1772. for (j = 0; j < nels; j++) {
  1773. if (inRange3(expect[j],var_type[i],NCT_SCHAR)
  1774. && expect[j] >= schar_min && expect[j] <= schar_max) {
  1775. IF (!equal(value[j],expect[j],var_type[i],NCT_SCHAR)){
  1776. error("value read not that expected");
  1777. if (verbose) {
  1778. error("\n");
  1779. error("varid: %d, ", i);
  1780. error("var_name: %s, ", var_name[i]);
  1781. error("element number: %d ", j);
  1782. error("expect: %g", expect[j]);
  1783. error("got: %g", (double) value[j]);
  1784. }
  1785. } else {
  1786. nok++;
  1787. }
  1788. }
  1789. }
  1790. } else {
  1791. IF (nels > 0 && err != NC_ECHAR)
  1792. error("wrong type: status = %d", err);
  1793. }
  1794. }
  1795. }
  1796. err = nc_close(ncid);
  1797. IF (err)
  1798. error("nc_close: %s", nc_strerror(err));
  1799. print_nok(nok);
  1800. }
  1801. void
  1802. test_nc_get_vara_short(void)
  1803. {
  1804. int ncid;
  1805. int d;
  1806. int i;
  1807. int j;
  1808. int k;
  1809. int err;
  1810. int allInExtRange; /* all values within external range? */
  1811. int allInIntRange; /* all values within internal range? */
  1812. int nels;
  1813. int nslabs;
  1814. int nok = 0; /* count of valid comparisons */
  1815. size_t start[MAX_RANK];
  1816. size_t edge[MAX_RANK];
  1817. size_t index[MAX_RANK];
  1818. size_t mid[MAX_RANK];
  1819. int canConvert; /* Both text or both numeric */
  1820. short value[MAX_NELS];
  1821. double expect[MAX_NELS];
  1822. err = nc_open(testfile, NC_NOWRITE, &ncid);
  1823. IF (err)
  1824. error("nc_open: %s", nc_strerror(err));
  1825. for (i = 0; i < NVARS; i++) {
  1826. canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
  1827. assert(var_rank[i] <= MAX_RANK);
  1828. assert(var_nels[i] <= MAX_NELS);
  1829. for (j = 0; j < var_rank[i]; j++) {
  1830. start[j] = 0;
  1831. edge[j] = 1;
  1832. }
  1833. err = nc_get_vara_short(BAD_ID, i, start, edge, value);
  1834. IF (err != NC_EBADID)
  1835. error("bad ncid: status = %d", err);
  1836. err = nc_get_vara_short(ncid, BAD_VARID, start, edge, value);
  1837. IF (err != NC_ENOTVAR)
  1838. error("bad var id: status = %d", err);
  1839. for (j = 0; j < var_rank[i]; j++) {
  1840. start[j] = var_shape[i][j];
  1841. err = nc_get_vara_short(ncid, i, start, edge, value);
  1842. IF (canConvert && err != NC_EINVALCOORDS)
  1843. error("bad index: status = %d", err);
  1844. start[j] = 0;
  1845. edge[j] = var_shape[i][j] + 1;
  1846. err = nc_get_vara_short(ncid, i, start, edge, value);
  1847. IF (canConvert && err != NC_EEDGE)
  1848. error("bad edge: status = %d", err);
  1849. edge[j] = 1;
  1850. }
  1851. /* Check non-scalars for correct error returned even when */
  1852. /* there is nothing to get (edge[j]==0) */
  1853. if(var_rank[i] > 0) {
  1854. for (j = 0; j < var_rank[i]; j++) {
  1855. edge[j] = 0;
  1856. }
  1857. err = nc_get_vara_short(BAD_ID, i, start, edge, value);
  1858. IF (err != NC_EBADID)
  1859. error("bad ncid: status = %d", err);
  1860. err = nc_get_vara_short(ncid, BAD_VARID, start, edge, value);
  1861. IF (err != NC_ENOTVAR)
  1862. error("bad var id: status = %d", err);
  1863. for (j = 0; j < var_rank[i]; j++) {
  1864. if (var_dimid[i][j] > 0) { /* skip record dim */
  1865. start[j] = var_shape[i][j];
  1866. err = nc_get_vara_short(ncid, i, start, edge, value);
  1867. IF (canConvert && err != NC_EINVALCOORDS)
  1868. error("bad start: status = %d", err);
  1869. start[j] = 0;
  1870. }
  1871. }
  1872. err = nc_get_vara_short(ncid, i, start, edge, value);
  1873. if (canConvert) {
  1874. IF (err)
  1875. error("%s", nc_strerror(err));
  1876. } else {
  1877. IF (err != NC_ECHAR)
  1878. error("wrong type: status = %d", err);
  1879. }
  1880. for (j = 0; j < var_rank[i]; j++) {
  1881. edge[j] = 1;
  1882. }
  1883. } /* Choose a random point dividing each dim into 2 parts */
  1884. /* get 2^rank (nslabs) slabs so defined */
  1885. nslabs = 1;
  1886. for (j = 0; j < var_rank[i]; j++) {
  1887. mid[j] = roll( var_shape[i][j] );
  1888. nslabs *= 2;
  1889. }
  1890. /* bits of k determine whether to get lower or upper part of dim */
  1891. for (k = 0; k < nslabs; k++) {
  1892. nels = 1;
  1893. for (j = 0; j < var_rank[i]; j++) {
  1894. if ((k >> j) & 1) {
  1895. start[j] = 0;
  1896. edge[j] = mid[j];
  1897. }else{
  1898. start[j] = mid[j];
  1899. edge[j] = var_shape[i][j] - mid[j];
  1900. }
  1901. nels *= edge[j];
  1902. }
  1903. allInExtRange = allInIntRange = 1;
  1904. for (j = 0; j < nels; j++) {
  1905. err = toMixedBase(j, var_rank[i], edge, index);
  1906. IF (err)
  1907. error("error in toMixedBase 1");
  1908. for (d = 0; d < var_rank[i]; d++)
  1909. index[d] += start[d];
  1910. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_SHORT);
  1911. if (inRange3(expect[j],var_type[i], NCT_SHORT)) {
  1912. allInIntRange = allInIntRange && expect[j] >= short_min
  1913. && expect[j] <= short_max;
  1914. } else {
  1915. allInExtRange = 0;
  1916. }
  1917. }
  1918. if (var_rank[i] == 0 && i%2)
  1919. err = nc_get_vara_short(ncid, i, NULL, NULL, value);
  1920. else
  1921. err = nc_get_vara_short(ncid, i, start, edge, value);
  1922. if (canConvert) {
  1923. if (allInExtRange) {
  1924. if (allInIntRange) {
  1925. IF (err)
  1926. error("%s", nc_strerror(err));
  1927. } else {
  1928. IF (err != NC_ERANGE)
  1929. error("Range error: status = %d", err);
  1930. }
  1931. } else {
  1932. IF (err != 0 && err != NC_ERANGE)
  1933. error("OK or Range error: status = %d", err);
  1934. }
  1935. for (j = 0; j < nels; j++) {
  1936. if (inRange3(expect[j],var_type[i],NCT_SHORT)
  1937. && expect[j] >= short_min && expect[j] <= short_max) {
  1938. IF (!equal(value[j],expect[j],var_type[i],NCT_SHORT)){
  1939. error("value read not that expected");
  1940. if (verbose) {
  1941. error("\n");
  1942. error("varid: %d, ", i);
  1943. error("var_name: %s, ", var_name[i]);
  1944. error("element number: %d ", j);
  1945. error("expect: %g", expect[j]);
  1946. error("got: %g", (double) value[j]);
  1947. }
  1948. } else {
  1949. nok++;
  1950. }
  1951. }
  1952. }
  1953. } else {
  1954. IF (nels > 0 && err != NC_ECHAR)
  1955. error("wrong type: status = %d", err);
  1956. }
  1957. }
  1958. }
  1959. err = nc_close(ncid);
  1960. IF (err)
  1961. error("nc_close: %s", nc_strerror(err));
  1962. print_nok(nok);
  1963. }
  1964. void
  1965. test_nc_get_vara_int(void)
  1966. {
  1967. int ncid;
  1968. int d;
  1969. int i;
  1970. int j;
  1971. int k;
  1972. int err;
  1973. int allInExtRange; /* all values within external range? */
  1974. int allInIntRange; /* all values within internal range? */
  1975. int nels;
  1976. int nslabs;
  1977. int nok = 0; /* count of valid comparisons */
  1978. size_t start[MAX_RANK];
  1979. size_t edge[MAX_RANK];
  1980. size_t index[MAX_RANK];
  1981. size_t mid[MAX_RANK];
  1982. int canConvert; /* Both text or both numeric */
  1983. int value[MAX_NELS];
  1984. double expect[MAX_NELS];
  1985. err = nc_open(testfile, NC_NOWRITE, &ncid);
  1986. IF (err)
  1987. error("nc_open: %s", nc_strerror(err));
  1988. for (i = 0; i < NVARS; i++) {
  1989. canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
  1990. assert(var_rank[i] <= MAX_RANK);
  1991. assert(var_nels[i] <= MAX_NELS);
  1992. for (j = 0; j < var_rank[i]; j++) {
  1993. start[j] = 0;
  1994. edge[j] = 1;
  1995. }
  1996. err = nc_get_vara_int(BAD_ID, i, start, edge, value);
  1997. IF (err != NC_EBADID)
  1998. error("bad ncid: status = %d", err);
  1999. err = nc_get_vara_int(ncid, BAD_VARID, start, edge, value);
  2000. IF (err != NC_ENOTVAR)
  2001. error("bad var id: status = %d", err);
  2002. for (j = 0; j < var_rank[i]; j++) {
  2003. start[j] = var_shape[i][j];
  2004. err = nc_get_vara_int(ncid, i, start, edge, value);
  2005. IF (canConvert && err != NC_EINVALCOORDS)
  2006. error("bad index: status = %d", err);
  2007. start[j] = 0;
  2008. edge[j] = var_shape[i][j] + 1;
  2009. err = nc_get_vara_int(ncid, i, start, edge, value);
  2010. IF (canConvert && err != NC_EEDGE)
  2011. error("bad edge: status = %d", err);
  2012. edge[j] = 1;
  2013. }
  2014. /* Check non-scalars for correct error returned even when */
  2015. /* there is nothing to get (edge[j]==0) */
  2016. if(var_rank[i] > 0) {
  2017. for (j = 0; j < var_rank[i]; j++) {
  2018. edge[j] = 0;
  2019. }
  2020. err = nc_get_vara_int(BAD_ID, i, start, edge, value);
  2021. IF (err != NC_EBADID)
  2022. error("bad ncid: status = %d", err);
  2023. err = nc_get_vara_int(ncid, BAD_VARID, start, edge, value);
  2024. IF (err != NC_ENOTVAR)
  2025. error("bad var id: status = %d", err);
  2026. for (j = 0; j < var_rank[i]; j++) {
  2027. if (var_dimid[i][j] > 0) { /* skip record dim */
  2028. start[j] = var_shape[i][j];
  2029. err = nc_get_vara_int(ncid, i, start, edge, value);
  2030. IF (canConvert && err != NC_EINVALCOORDS)
  2031. error("bad start: status = %d", err);
  2032. start[j] = 0;
  2033. }
  2034. }
  2035. err = nc_get_vara_int(ncid, i, start, edge, value);
  2036. if (canConvert) {
  2037. IF (err)
  2038. error("%s", nc_strerror(err));
  2039. } else {
  2040. IF (err != NC_ECHAR)
  2041. error("wrong type: status = %d", err);
  2042. }
  2043. for (j = 0; j < var_rank[i]; j++) {
  2044. edge[j] = 1;
  2045. }
  2046. } /* Choose a random point dividing each dim into 2 parts */
  2047. /* get 2^rank (nslabs) slabs so defined */
  2048. nslabs = 1;
  2049. for (j = 0; j < var_rank[i]; j++) {
  2050. mid[j] = roll( var_shape[i][j] );
  2051. nslabs *= 2;
  2052. }
  2053. /* bits of k determine whether to get lower or upper part of dim */
  2054. for (k = 0; k < nslabs; k++) {
  2055. nels = 1;
  2056. for (j = 0; j < var_rank[i]; j++) {
  2057. if ((k >> j) & 1) {
  2058. start[j] = 0;
  2059. edge[j] = mid[j];
  2060. }else{
  2061. start[j] = mid[j];
  2062. edge[j] = var_shape[i][j] - mid[j];
  2063. }
  2064. nels *= edge[j];
  2065. }
  2066. allInExtRange = allInIntRange = 1;
  2067. for (j = 0; j < nels; j++) {
  2068. err = toMixedBase(j, var_rank[i], edge, index);
  2069. IF (err)
  2070. error("error in toMixedBase 1");
  2071. for (d = 0; d < var_rank[i]; d++)
  2072. index[d] += start[d];
  2073. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_INT);
  2074. if (inRange3(expect[j],var_type[i], NCT_INT)) {
  2075. allInIntRange = allInIntRange && expect[j] >= int_min
  2076. && expect[j] <= int_max;
  2077. } else {
  2078. allInExtRange = 0;
  2079. }
  2080. }
  2081. if (var_rank[i] == 0 && i%2)
  2082. err = nc_get_vara_int(ncid, i, NULL, NULL, value);
  2083. else
  2084. err = nc_get_vara_int(ncid, i, start, edge, value);
  2085. if (canConvert) {
  2086. if (allInExtRange) {
  2087. if (allInIntRange) {
  2088. IF (err)
  2089. error("%s", nc_strerror(err));
  2090. } else {
  2091. IF (err != NC_ERANGE)
  2092. error("Range error: status = %d", err);
  2093. }
  2094. } else {
  2095. IF (err != 0 && err != NC_ERANGE)
  2096. error("OK or Range error: status = %d", err);
  2097. }
  2098. for (j = 0; j < nels; j++) {
  2099. if (inRange3(expect[j],var_type[i],NCT_INT)
  2100. && expect[j] >= int_min && expect[j] <= int_max) {
  2101. IF (!equal(value[j],expect[j],var_type[i],NCT_INT)){
  2102. error("value read not that expected");
  2103. if (verbose) {
  2104. error("\n");
  2105. error("varid: %d, ", i);
  2106. error("var_name: %s, ", var_name[i]);
  2107. error("element number: %d ", j);
  2108. error("expect: %g", expect[j]);
  2109. error("got: %g", (double) value[j]);
  2110. }
  2111. } else {
  2112. nok++;
  2113. }
  2114. }
  2115. }
  2116. } else {
  2117. IF (nels > 0 && err != NC_ECHAR)
  2118. error("wrong type: status = %d", err);
  2119. }
  2120. }
  2121. }
  2122. err = nc_close(ncid);
  2123. IF (err)
  2124. error("nc_close: %s", nc_strerror(err));
  2125. print_nok(nok);
  2126. }
  2127. void
  2128. test_nc_get_vara_long(void)
  2129. {
  2130. int ncid;
  2131. int d;
  2132. int i;
  2133. int j;
  2134. int k;
  2135. int err;
  2136. int allInExtRange; /* all values within external range? */
  2137. int allInIntRange; /* all values within internal range? */
  2138. int nels;
  2139. int nslabs;
  2140. int nok = 0; /* count of valid comparisons */
  2141. size_t start[MAX_RANK];
  2142. size_t edge[MAX_RANK];
  2143. size_t index[MAX_RANK];
  2144. size_t mid[MAX_RANK];
  2145. int canConvert; /* Both text or both numeric */
  2146. long value[MAX_NELS];
  2147. double expect[MAX_NELS];
  2148. err = nc_open(testfile, NC_NOWRITE, &ncid);
  2149. IF (err)
  2150. error("nc_open: %s", nc_strerror(err));
  2151. for (i = 0; i < NVARS; i++) {
  2152. canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
  2153. assert(var_rank[i] <= MAX_RANK);
  2154. assert(var_nels[i] <= MAX_NELS);
  2155. for (j = 0; j < var_rank[i]; j++) {
  2156. start[j] = 0;
  2157. edge[j] = 1;
  2158. }
  2159. err = nc_get_vara_long(BAD_ID, i, start, edge, value);
  2160. IF (err != NC_EBADID)
  2161. error("bad ncid: status = %d", err);
  2162. err = nc_get_vara_long(ncid, BAD_VARID, start, edge, value);
  2163. IF (err != NC_ENOTVAR)
  2164. error("bad var id: status = %d", err);
  2165. for (j = 0; j < var_rank[i]; j++) {
  2166. start[j] = var_shape[i][j];
  2167. err = nc_get_vara_long(ncid, i, start, edge, value);
  2168. IF (canConvert && err != NC_EINVALCOORDS)
  2169. error("bad index: status = %d", err);
  2170. start[j] = 0;
  2171. edge[j] = var_shape[i][j] + 1;
  2172. err = nc_get_vara_long(ncid, i, start, edge, value);
  2173. IF (canConvert && err != NC_EEDGE)
  2174. error("bad edge: status = %d", err);
  2175. edge[j] = 1;
  2176. }
  2177. /* Check non-scalars for correct error returned even when */
  2178. /* there is nothing to get (edge[j]==0) */
  2179. if(var_rank[i] > 0) {
  2180. for (j = 0; j < var_rank[i]; j++) {
  2181. edge[j] = 0;
  2182. }
  2183. err = nc_get_vara_long(BAD_ID, i, start, edge, value);
  2184. IF (err != NC_EBADID)
  2185. error("bad ncid: status = %d", err);
  2186. err = nc_get_vara_long(ncid, BAD_VARID, start, edge, value);
  2187. IF (err != NC_ENOTVAR)
  2188. error("bad var id: status = %d", err);
  2189. for (j = 0; j < var_rank[i]; j++) {
  2190. if (var_dimid[i][j] > 0) { /* skip record dim */
  2191. start[j] = var_shape[i][j];
  2192. err = nc_get_vara_long(ncid, i, start, edge, value);
  2193. IF (canConvert && err != NC_EINVALCOORDS)
  2194. error("bad start: status = %d", err);
  2195. start[j] = 0;
  2196. }
  2197. }
  2198. err = nc_get_vara_long(ncid, i, start, edge, value);
  2199. if (canConvert) {
  2200. IF (err)
  2201. error("%s", nc_strerror(err));
  2202. } else {
  2203. IF (err != NC_ECHAR)
  2204. error("wrong type: status = %d", err);
  2205. }
  2206. for (j = 0; j < var_rank[i]; j++) {
  2207. edge[j] = 1;
  2208. }
  2209. } /* Choose a random point dividing each dim into 2 parts */
  2210. /* get 2^rank (nslabs) slabs so defined */
  2211. nslabs = 1;
  2212. for (j = 0; j < var_rank[i]; j++) {
  2213. mid[j] = roll( var_shape[i][j] );
  2214. nslabs *= 2;
  2215. }
  2216. /* bits of k determine whether to get lower or upper part of dim */
  2217. for (k = 0; k < nslabs; k++) {
  2218. nels = 1;
  2219. for (j = 0; j < var_rank[i]; j++) {
  2220. if ((k >> j) & 1) {
  2221. start[j] = 0;
  2222. edge[j] = mid[j];
  2223. }else{
  2224. start[j] = mid[j];
  2225. edge[j] = var_shape[i][j] - mid[j];
  2226. }
  2227. nels *= edge[j];
  2228. }
  2229. allInExtRange = allInIntRange = 1;
  2230. for (j = 0; j < nels; j++) {
  2231. err = toMixedBase(j, var_rank[i], edge, index);
  2232. IF (err)
  2233. error("error in toMixedBase 1");
  2234. for (d = 0; d < var_rank[i]; d++)
  2235. index[d] += start[d];
  2236. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_LONG);
  2237. if (inRange3(expect[j],var_type[i], NCT_LONG)) {
  2238. allInIntRange = allInIntRange && expect[j] >= long_min
  2239. && expect[j] <= long_max;
  2240. } else {
  2241. allInExtRange = 0;
  2242. }
  2243. }
  2244. if (var_rank[i] == 0 && i%2)
  2245. err = nc_get_vara_long(ncid, i, NULL, NULL, value);
  2246. else
  2247. err = nc_get_vara_long(ncid, i, start, edge, value);
  2248. if (canConvert) {
  2249. if (allInExtRange) {
  2250. if (allInIntRange) {
  2251. IF (err)
  2252. error("%s", nc_strerror(err));
  2253. } else {
  2254. IF (err != NC_ERANGE)
  2255. error("Range error: status = %d", err);
  2256. }
  2257. } else {
  2258. IF (err != 0 && err != NC_ERANGE)
  2259. error("OK or Range error: status = %d", err);
  2260. }
  2261. for (j = 0; j < nels; j++) {
  2262. if (inRange3(expect[j],var_type[i],NCT_LONG)
  2263. && expect[j] >= long_min && expect[j] <= long_max) {
  2264. IF (!equal(value[j],expect[j],var_type[i],NCT_LONG)){
  2265. error("value read not that expected");
  2266. if (verbose) {
  2267. error("\n");
  2268. error("varid: %d, ", i);
  2269. error("var_name: %s, ", var_name[i]);
  2270. error("element number: %d ", j);
  2271. error("expect: %g", expect[j]);
  2272. error("got: %g", (double) value[j]);
  2273. }
  2274. } else {
  2275. nok++;
  2276. }
  2277. }
  2278. }
  2279. } else {
  2280. IF (nels > 0 && err != NC_ECHAR)
  2281. error("wrong type: status = %d", err);
  2282. }
  2283. }
  2284. }
  2285. err = nc_close(ncid);
  2286. IF (err)
  2287. error("nc_close: %s", nc_strerror(err));
  2288. print_nok(nok);
  2289. }
  2290. void
  2291. test_nc_get_vara_float(void)
  2292. {
  2293. int ncid;
  2294. int d;
  2295. int i;
  2296. int j;
  2297. int k;
  2298. int err;
  2299. int allInExtRange; /* all values within external range? */
  2300. int allInIntRange; /* all values within internal range? */
  2301. int nels;
  2302. int nslabs;
  2303. int nok = 0; /* count of valid comparisons */
  2304. size_t start[MAX_RANK];
  2305. size_t edge[MAX_RANK];
  2306. size_t index[MAX_RANK];
  2307. size_t mid[MAX_RANK];
  2308. int canConvert; /* Both text or both numeric */
  2309. float value[MAX_NELS];
  2310. double expect[MAX_NELS];
  2311. err = nc_open(testfile, NC_NOWRITE, &ncid);
  2312. IF (err)
  2313. error("nc_open: %s", nc_strerror(err));
  2314. for (i = 0; i < NVARS; i++) {
  2315. canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
  2316. assert(var_rank[i] <= MAX_RANK);
  2317. assert(var_nels[i] <= MAX_NELS);
  2318. for (j = 0; j < var_rank[i]; j++) {
  2319. start[j] = 0;
  2320. edge[j] = 1;
  2321. }
  2322. err = nc_get_vara_float(BAD_ID, i, start, edge, value);
  2323. IF (err != NC_EBADID)
  2324. error("bad ncid: status = %d", err);
  2325. err = nc_get_vara_float(ncid, BAD_VARID, start, edge, value);
  2326. IF (err != NC_ENOTVAR)
  2327. error("bad var id: status = %d", err);
  2328. for (j = 0; j < var_rank[i]; j++) {
  2329. start[j] = var_shape[i][j];
  2330. err = nc_get_vara_float(ncid, i, start, edge, value);
  2331. IF (canConvert && err != NC_EINVALCOORDS)
  2332. error("bad index: status = %d", err);
  2333. start[j] = 0;
  2334. edge[j] = var_shape[i][j] + 1;
  2335. err = nc_get_vara_float(ncid, i, start, edge, value);
  2336. IF (canConvert && err != NC_EEDGE)
  2337. error("bad edge: status = %d", err);
  2338. edge[j] = 1;
  2339. }
  2340. /* Check non-scalars for correct error returned even when */
  2341. /* there is nothing to get (edge[j]==0) */
  2342. if(var_rank[i] > 0) {
  2343. for (j = 0; j < var_rank[i]; j++) {
  2344. edge[j] = 0;
  2345. }
  2346. err = nc_get_vara_float(BAD_ID, i, start, edge, value);
  2347. IF (err != NC_EBADID)
  2348. error("bad ncid: status = %d", err);
  2349. err = nc_get_vara_float(ncid, BAD_VARID, start, edge, value);
  2350. IF (err != NC_ENOTVAR)
  2351. error("bad var id: status = %d", err);
  2352. for (j = 0; j < var_rank[i]; j++) {
  2353. if (var_dimid[i][j] > 0) { /* skip record dim */
  2354. start[j] = var_shape[i][j];
  2355. err = nc_get_vara_float(ncid, i, start, edge, value);
  2356. IF (canConvert && err != NC_EINVALCOORDS)
  2357. error("bad start: status = %d", err);
  2358. start[j] = 0;
  2359. }
  2360. }
  2361. err = nc_get_vara_float(ncid, i, start, edge, value);
  2362. if (canConvert) {
  2363. IF (err)
  2364. error("%s", nc_strerror(err));
  2365. } else {
  2366. IF (err != NC_ECHAR)
  2367. error("wrong type: status = %d", err);
  2368. }
  2369. for (j = 0; j < var_rank[i]; j++) {
  2370. edge[j] = 1;
  2371. }
  2372. } /* Choose a random point dividing each dim into 2 parts */
  2373. /* get 2^rank (nslabs) slabs so defined */
  2374. nslabs = 1;
  2375. for (j = 0; j < var_rank[i]; j++) {
  2376. mid[j] = roll( var_shape[i][j] );
  2377. nslabs *= 2;
  2378. }
  2379. /* bits of k determine whether to get lower or upper part of dim */
  2380. for (k = 0; k < nslabs; k++) {
  2381. nels = 1;
  2382. for (j = 0; j < var_rank[i]; j++) {
  2383. if ((k >> j) & 1) {
  2384. start[j] = 0;
  2385. edge[j] = mid[j];
  2386. }else{
  2387. start[j] = mid[j];
  2388. edge[j] = var_shape[i][j] - mid[j];
  2389. }
  2390. nels *= edge[j];
  2391. }
  2392. allInExtRange = allInIntRange = 1;
  2393. for (j = 0; j < nels; j++) {
  2394. err = toMixedBase(j, var_rank[i], edge, index);
  2395. IF (err)
  2396. error("error in toMixedBase 1");
  2397. for (d = 0; d < var_rank[i]; d++)
  2398. index[d] += start[d];
  2399. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_FLOAT);
  2400. if (inRange3(expect[j],var_type[i], NCT_FLOAT)) {
  2401. allInIntRange = allInIntRange && expect[j] >= float_min
  2402. && expect[j] <= float_max;
  2403. } else {
  2404. allInExtRange = 0;
  2405. }
  2406. }
  2407. if (var_rank[i] == 0 && i%2)
  2408. err = nc_get_vara_float(ncid, i, NULL, NULL, value);
  2409. else
  2410. err = nc_get_vara_float(ncid, i, start, edge, value);
  2411. if (canConvert) {
  2412. if (allInExtRange) {
  2413. if (allInIntRange) {
  2414. IF (err)
  2415. error("%s", nc_strerror(err));
  2416. } else {
  2417. IF (err != NC_ERANGE)
  2418. error("Range error: status = %d", err);
  2419. }
  2420. } else {
  2421. IF (err != 0 && err != NC_ERANGE)
  2422. error("OK or Range error: status = %d", err);
  2423. }
  2424. for (j = 0; j < nels; j++) {
  2425. if (inRange3(expect[j],var_type[i],NCT_FLOAT)
  2426. && expect[j] >= float_min && expect[j] <= float_max) {
  2427. IF (!equal(value[j],expect[j],var_type[i],NCT_FLOAT)){
  2428. error("value read not that expected");
  2429. if (verbose) {
  2430. error("\n");
  2431. error("varid: %d, ", i);
  2432. error("var_name: %s, ", var_name[i]);
  2433. error("element number: %d ", j);
  2434. error("expect: %g", expect[j]);
  2435. error("got: %g", (double) value[j]);
  2436. }
  2437. } else {
  2438. nok++;
  2439. }
  2440. }
  2441. }
  2442. } else {
  2443. IF (nels > 0 && err != NC_ECHAR)
  2444. error("wrong type: status = %d", err);
  2445. }
  2446. }
  2447. }
  2448. err = nc_close(ncid);
  2449. IF (err)
  2450. error("nc_close: %s", nc_strerror(err));
  2451. print_nok(nok);
  2452. }
  2453. void
  2454. test_nc_get_vara_double(void)
  2455. {
  2456. int ncid;
  2457. int d;
  2458. int i;
  2459. int j;
  2460. int k;
  2461. int err;
  2462. int allInExtRange; /* all values within external range? */
  2463. int allInIntRange; /* all values within internal range? */
  2464. int nels;
  2465. int nslabs;
  2466. int nok = 0; /* count of valid comparisons */
  2467. size_t start[MAX_RANK];
  2468. size_t edge[MAX_RANK];
  2469. size_t index[MAX_RANK];
  2470. size_t mid[MAX_RANK];
  2471. int canConvert; /* Both text or both numeric */
  2472. double value[MAX_NELS];
  2473. double expect[MAX_NELS];
  2474. err = nc_open(testfile, NC_NOWRITE, &ncid);
  2475. IF (err)
  2476. error("nc_open: %s", nc_strerror(err));
  2477. for (i = 0; i < NVARS; i++) {
  2478. canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
  2479. assert(var_rank[i] <= MAX_RANK);
  2480. assert(var_nels[i] <= MAX_NELS);
  2481. for (j = 0; j < var_rank[i]; j++) {
  2482. start[j] = 0;
  2483. edge[j] = 1;
  2484. }
  2485. err = nc_get_vara_double(BAD_ID, i, start, edge, value);
  2486. IF (err != NC_EBADID)
  2487. error("bad ncid: status = %d", err);
  2488. err = nc_get_vara_double(ncid, BAD_VARID, start, edge, value);
  2489. IF (err != NC_ENOTVAR)
  2490. error("bad var id: status = %d", err);
  2491. for (j = 0; j < var_rank[i]; j++) {
  2492. start[j] = var_shape[i][j];
  2493. err = nc_get_vara_double(ncid, i, start, edge, value);
  2494. IF (canConvert && err != NC_EINVALCOORDS)
  2495. error("bad index: status = %d", err);
  2496. start[j] = 0;
  2497. edge[j] = var_shape[i][j] + 1;
  2498. err = nc_get_vara_double(ncid, i, start, edge, value);
  2499. IF (canConvert && err != NC_EEDGE)
  2500. error("bad edge: status = %d", err);
  2501. edge[j] = 1;
  2502. }
  2503. /* Check non-scalars for correct error returned even when */
  2504. /* there is nothing to get (edge[j]==0) */
  2505. if(var_rank[i] > 0) {
  2506. for (j = 0; j < var_rank[i]; j++) {
  2507. edge[j] = 0;
  2508. }
  2509. err = nc_get_vara_double(BAD_ID, i, start, edge, value);
  2510. IF (err != NC_EBADID)
  2511. error("bad ncid: status = %d", err);
  2512. err = nc_get_vara_double(ncid, BAD_VARID, start, edge, value);
  2513. IF (err != NC_ENOTVAR)
  2514. error("bad var id: status = %d", err);
  2515. for (j = 0; j < var_rank[i]; j++) {
  2516. if (var_dimid[i][j] > 0) { /* skip record dim */
  2517. start[j] = var_shape[i][j];
  2518. err = nc_get_vara_double(ncid, i, start, edge, value);
  2519. IF (canConvert && err != NC_EINVALCOORDS)
  2520. error("bad start: status = %d", err);
  2521. start[j] = 0;
  2522. }
  2523. }
  2524. err = nc_get_vara_double(ncid, i, start, edge, value);
  2525. if (canConvert) {
  2526. IF (err)
  2527. error("%s", nc_strerror(err));
  2528. } else {
  2529. IF (err != NC_ECHAR)
  2530. error("wrong type: status = %d", err);
  2531. }
  2532. for (j = 0; j < var_rank[i]; j++) {
  2533. edge[j] = 1;
  2534. }
  2535. } /* Choose a random point dividing each dim into 2 parts */
  2536. /* get 2^rank (nslabs) slabs so defined */
  2537. nslabs = 1;
  2538. for (j = 0; j < var_rank[i]; j++) {
  2539. mid[j] = roll( var_shape[i][j] );
  2540. nslabs *= 2;
  2541. }
  2542. /* bits of k determine whether to get lower or upper part of dim */
  2543. for (k = 0; k < nslabs; k++) {
  2544. nels = 1;
  2545. for (j = 0; j < var_rank[i]; j++) {
  2546. if ((k >> j) & 1) {
  2547. start[j] = 0;
  2548. edge[j] = mid[j];
  2549. }else{
  2550. start[j] = mid[j];
  2551. edge[j] = var_shape[i][j] - mid[j];
  2552. }
  2553. nels *= edge[j];
  2554. }
  2555. allInExtRange = allInIntRange = 1;
  2556. for (j = 0; j < nels; j++) {
  2557. err = toMixedBase(j, var_rank[i], edge, index);
  2558. IF (err)
  2559. error("error in toMixedBase 1");
  2560. for (d = 0; d < var_rank[i]; d++)
  2561. index[d] += start[d];
  2562. expect[j] = hash4(var_type[i], var_rank[i], index, NCT_DOUBLE);
  2563. if (inRange3(expect[j],var_type[i], NCT_DOUBLE)) {
  2564. allInIntRange = allInIntRange && expect[j] >= double_min
  2565. && expect[j] <= double_max;
  2566. } else {
  2567. allInExtRange = 0;
  2568. }
  2569. }
  2570. if (var_rank[i] == 0 && i%2)
  2571. err = nc_get_vara_double(ncid, i, NULL, NULL, value);
  2572. else
  2573. err = nc_get_vara_double(ncid, i, start, edge, value);
  2574. if (canConvert) {
  2575. if (allInExtRange) {
  2576. if (allInIntRange) {
  2577. IF (err)
  2578. error("%s", nc_strerror(err));
  2579. } else {
  2580. IF (err != NC_ERANGE)
  2581. error("Range error: status = %d", err);
  2582. }
  2583. } else {
  2584. IF (err != 0 && err != NC_ERANGE)
  2585. error("OK or Range error: status = %d", err);
  2586. }
  2587. for (j = 0; j < nels; j++) {
  2588. if (inRange3(expect[j],var_type[i],NCT_DOUBLE)
  2589. && expect[j] >= double_min && expect[j] <= double_max) {
  2590. IF (!equal(value[j],expect[j],var_type[i],NCT_DOUBLE)){
  2591. error("value read not that expected");
  2592. if (verbose) {
  2593. error("\n");
  2594. error("varid: %d, ", i);
  2595. error("var_name: %s, ", var_name[i]);
  2596. error("element number: %d ", j);
  2597. error("expect: %g", expect[j]);
  2598. error("got: %g", (double) value[j]);
  2599. }
  2600. } else {
  2601. nok++;
  2602. }
  2603. }
  2604. }
  2605. } else {
  2606. IF (nels > 0 && err != NC_ECHAR)
  2607. error("wrong type: status = %d", err);
  2608. }
  2609. }
  2610. }
  2611. err = nc_close(ncid);
  2612. IF (err)
  2613. error("nc_close: %s", nc_strerror(err));
  2614. print_nok(nok);
  2615. }
  2616. void
  2617. test_nc_get_vars_text(void)
  2618. {
  2619. int ncid;
  2620. int d;
  2621. int i;
  2622. int j;
  2623. int k;
  2624. int m;
  2625. int err;
  2626. int allInExtRange; /* all values within external range? */
  2627. int allInIntRange; /* all values within internal range? */
  2628. int nels;
  2629. int nslabs;
  2630. int nstarts; /* number of different starts */
  2631. int nok = 0; /* count of valid comparisons */
  2632. size_t start[MAX_RANK];
  2633. size_t edge[MAX_RANK];
  2634. size_t index[MAX_RANK];
  2635. size_t index2[MAX_RANK];
  2636. size_t mid[MAX_RANK];
  2637. size_t count[MAX_RANK];
  2638. size_t sstride[MAX_RANK];
  2639. ptrdiff_t stride[MAX_RANK];
  2640. int canConvert; /* Both text or both numeric */
  2641. text value[MAX_NELS];
  2642. double expect[MAX_NELS];
  2643. err = nc_open(testfile, NC_NOWRITE, &ncid);
  2644. IF (err)
  2645. error("nc_open: %s", nc_strerror(err));
  2646. for (i = 0; i < NVARS; i++) {
  2647. canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
  2648. assert(var_rank[i] <= MAX_RANK);
  2649. assert(var_nels[i] <= MAX_NELS);
  2650. for (j = 0; j < var_rank[i]; j++) {
  2651. start[j] = 0;
  2652. edge[j] = 1;
  2653. stride[j] = 1;
  2654. }
  2655. err = nc_get_vars_text(BAD_ID, i, start, edge, stride, value);
  2656. IF (err != NC_EBADID)
  2657. error("bad ncid: status = %d", err);
  2658. err = nc_get_vars_text(ncid, BAD_VARID, start, edge, stride, value);
  2659. IF (err != NC_ENOTVAR)
  2660. error("bad var id: status = %d", err);
  2661. for (j = 0; j < var_rank[i]; j++) {
  2662. start[j] = var_shape[i][j];
  2663. err = nc_get_vars_text(ncid, i, start, edge, stride, value);
  2664. if(!canConvert) {
  2665. IF (err != NC_ECHAR)
  2666. error("conversion: status = %d", err);
  2667. } else {
  2668. IF (err != NC_EINVALCOORDS)
  2669. error("bad index: status = %d", err);
  2670. start[j] = 0;
  2671. edge[j] = var_shape[i][j] + 1;
  2672. err = nc_get_vars_text(ncid, i, start, edge, stride, value);
  2673. IF (err != NC_EEDGE)
  2674. error("bad edge: status = %d", err);
  2675. edge[j] = 1;
  2676. stride[j] = 0;
  2677. err = nc_get_vars_text(ncid, i, start, edge, stride, value);
  2678. IF (err != NC_ESTRIDE)
  2679. error("bad stride: status = %d", err);
  2680. stride[j] = 1;
  2681. }
  2682. }
  2683. /* Choose a random point dividing each dim into 2 parts */
  2684. /* get 2^rank (nslabs) slabs so defined */
  2685. nslabs = 1;
  2686. for (j = 0; j < var_rank[i]; j++) {
  2687. mid[j] = roll( var_shape[i][j] );
  2688. nslabs *= 2;
  2689. }
  2690. /* bits of k determine whether to get lower or upper part of dim */
  2691. /* choose random stride from 1 to edge */
  2692. for (k = 0; k < nslabs; k++) {
  2693. nstarts = 1;
  2694. for (j = 0; j < var_rank[i]; j++) {
  2695. if ((k >> j) & 1) {
  2696. start[j] = 0;
  2697. edge[j] = mid[j];
  2698. }else{
  2699. start[j] = mid[j];
  2700. edge[j] = var_shape[i][j] - mid[j];
  2701. }
  2702. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  2703. nstarts *= stride[j];
  2704. }
  2705. for (m = 0; m < nstarts; m++) {
  2706. err = toMixedBase(m, var_rank[i], sstride, index);
  2707. IF (err)
  2708. error("error in toMixedBase");
  2709. nels = 1;
  2710. for (j = 0; j < var_rank[i]; j++) {
  2711. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  2712. nels *= count[j];
  2713. index[j] += start[j];
  2714. }
  2715. /* Random choice of forward or backward */
  2716. /* TODO
  2717. if ( roll(2) ) {
  2718. for (j = 0; j < var_rank[i]; j++) {
  2719. index[j] += (count[j] - 1) * stride[j];
  2720. stride[j] = -stride[j];
  2721. }
  2722. }
  2723. */
  2724. allInExtRange = allInIntRange = 1;
  2725. for (j = 0; j < nels; j++) {
  2726. err = toMixedBase(j, var_rank[i], count, index2);
  2727. IF (err)
  2728. error("error in toMixedBase 1");
  2729. for (d = 0; d < var_rank[i]; d++)
  2730. index2[d] = index[d] + index2[d] * stride[d];
  2731. expect[j] = hash4(var_type[i], var_rank[i], index2,
  2732. NCT_TEXT);
  2733. if (inRange3(expect[j],var_type[i],NCT_TEXT)) {
  2734. allInIntRange = allInIntRange && expect[j] >= text_min
  2735. && expect[j] <= text_max;
  2736. } else {
  2737. allInExtRange = 0;
  2738. }
  2739. }
  2740. if (var_rank[i] == 0 && i%2 )
  2741. err = nc_get_vars_text(ncid, i, NULL, NULL, NULL, value);
  2742. else
  2743. err = nc_get_vars_text(ncid, i, index, count, stride, value);
  2744. if (canConvert) {
  2745. if (allInExtRange) {
  2746. if (allInIntRange) {
  2747. IF (err)
  2748. error("%s", nc_strerror(err));
  2749. } else {
  2750. IF (err != NC_ERANGE)
  2751. error("Range error: status = %d", err);
  2752. }
  2753. } else {
  2754. IF (err != 0 && err != NC_ERANGE)
  2755. error("OK or Range error: status = %d", err);
  2756. }
  2757. for (j = 0; j < nels; j++) {
  2758. if (inRange3(expect[j],var_type[i],NCT_TEXT)
  2759. && expect[j] >= text_min && expect[j] <= text_max) {
  2760. IF (!equal(value[j],expect[j],var_type[i],
  2761. NCT_TEXT)){
  2762. error("value read not that expected");
  2763. if (verbose) {
  2764. error("\n");
  2765. error("varid: %d, ", i);
  2766. error("var_name: %s, ", var_name[i]);
  2767. error("element number: %d ", j);
  2768. error("expect: %g, ", expect[j]);
  2769. error("got: %g", (double) value[j]);
  2770. }
  2771. } else {
  2772. nok++;
  2773. }
  2774. }
  2775. }
  2776. } else {
  2777. IF (nels > 0 && err != NC_ECHAR)
  2778. error("wrong type: status = %d", err);
  2779. }
  2780. }
  2781. }
  2782. }
  2783. err = nc_close(ncid);
  2784. IF (err)
  2785. error("nc_close: %s", nc_strerror(err));
  2786. print_nok(nok);
  2787. }
  2788. void
  2789. test_nc_get_vars_uchar(void)
  2790. {
  2791. int ncid;
  2792. int d;
  2793. int i;
  2794. int j;
  2795. int k;
  2796. int m;
  2797. int err;
  2798. int allInExtRange; /* all values within external range? */
  2799. int allInIntRange; /* all values within internal range? */
  2800. int nels;
  2801. int nslabs;
  2802. int nstarts; /* number of different starts */
  2803. int nok = 0; /* count of valid comparisons */
  2804. size_t start[MAX_RANK];
  2805. size_t edge[MAX_RANK];
  2806. size_t index[MAX_RANK];
  2807. size_t index2[MAX_RANK];
  2808. size_t mid[MAX_RANK];
  2809. size_t count[MAX_RANK];
  2810. size_t sstride[MAX_RANK];
  2811. ptrdiff_t stride[MAX_RANK];
  2812. int canConvert; /* Both text or both numeric */
  2813. uchar value[MAX_NELS];
  2814. double expect[MAX_NELS];
  2815. err = nc_open(testfile, NC_NOWRITE, &ncid);
  2816. IF (err)
  2817. error("nc_open: %s", nc_strerror(err));
  2818. for (i = 0; i < NVARS; i++) {
  2819. canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
  2820. assert(var_rank[i] <= MAX_RANK);
  2821. assert(var_nels[i] <= MAX_NELS);
  2822. for (j = 0; j < var_rank[i]; j++) {
  2823. start[j] = 0;
  2824. edge[j] = 1;
  2825. stride[j] = 1;
  2826. }
  2827. err = nc_get_vars_uchar(BAD_ID, i, start, edge, stride, value);
  2828. IF (err != NC_EBADID)
  2829. error("bad ncid: status = %d", err);
  2830. err = nc_get_vars_uchar(ncid, BAD_VARID, start, edge, stride, value);
  2831. IF (err != NC_ENOTVAR)
  2832. error("bad var id: status = %d", err);
  2833. for (j = 0; j < var_rank[i]; j++) {
  2834. start[j] = var_shape[i][j];
  2835. err = nc_get_vars_uchar(ncid, i, start, edge, stride, value);
  2836. if(!canConvert) {
  2837. IF (err != NC_ECHAR)
  2838. error("conversion: status = %d", err);
  2839. } else {
  2840. IF (err != NC_EINVALCOORDS)
  2841. error("bad index: status = %d", err);
  2842. start[j] = 0;
  2843. edge[j] = var_shape[i][j] + 1;
  2844. err = nc_get_vars_uchar(ncid, i, start, edge, stride, value);
  2845. IF (err != NC_EEDGE)
  2846. error("bad edge: status = %d", err);
  2847. edge[j] = 1;
  2848. stride[j] = 0;
  2849. err = nc_get_vars_uchar(ncid, i, start, edge, stride, value);
  2850. IF (err != NC_ESTRIDE)
  2851. error("bad stride: status = %d", err);
  2852. stride[j] = 1;
  2853. }
  2854. }
  2855. /* Choose a random point dividing each dim into 2 parts */
  2856. /* get 2^rank (nslabs) slabs so defined */
  2857. nslabs = 1;
  2858. for (j = 0; j < var_rank[i]; j++) {
  2859. mid[j] = roll( var_shape[i][j] );
  2860. nslabs *= 2;
  2861. }
  2862. /* bits of k determine whether to get lower or upper part of dim */
  2863. /* choose random stride from 1 to edge */
  2864. for (k = 0; k < nslabs; k++) {
  2865. nstarts = 1;
  2866. for (j = 0; j < var_rank[i]; j++) {
  2867. if ((k >> j) & 1) {
  2868. start[j] = 0;
  2869. edge[j] = mid[j];
  2870. }else{
  2871. start[j] = mid[j];
  2872. edge[j] = var_shape[i][j] - mid[j];
  2873. }
  2874. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  2875. nstarts *= stride[j];
  2876. }
  2877. for (m = 0; m < nstarts; m++) {
  2878. err = toMixedBase(m, var_rank[i], sstride, index);
  2879. IF (err)
  2880. error("error in toMixedBase");
  2881. nels = 1;
  2882. for (j = 0; j < var_rank[i]; j++) {
  2883. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  2884. nels *= count[j];
  2885. index[j] += start[j];
  2886. }
  2887. /* Random choice of forward or backward */
  2888. /* TODO
  2889. if ( roll(2) ) {
  2890. for (j = 0; j < var_rank[i]; j++) {
  2891. index[j] += (count[j] - 1) * stride[j];
  2892. stride[j] = -stride[j];
  2893. }
  2894. }
  2895. */
  2896. allInExtRange = allInIntRange = 1;
  2897. for (j = 0; j < nels; j++) {
  2898. err = toMixedBase(j, var_rank[i], count, index2);
  2899. IF (err)
  2900. error("error in toMixedBase 1");
  2901. for (d = 0; d < var_rank[i]; d++)
  2902. index2[d] = index[d] + index2[d] * stride[d];
  2903. expect[j] = hash4(var_type[i], var_rank[i], index2,
  2904. NCT_UCHAR);
  2905. if (inRange3(expect[j],var_type[i],NCT_UCHAR)) {
  2906. allInIntRange = allInIntRange && expect[j] >= uchar_min
  2907. && expect[j] <= uchar_max;
  2908. } else {
  2909. allInExtRange = 0;
  2910. }
  2911. }
  2912. if (var_rank[i] == 0 && i%2 )
  2913. err = nc_get_vars_uchar(ncid, i, NULL, NULL, NULL, value);
  2914. else
  2915. err = nc_get_vars_uchar(ncid, i, index, count, stride, value);
  2916. if (canConvert) {
  2917. if (allInExtRange) {
  2918. if (allInIntRange) {
  2919. IF (err)
  2920. error("%s", nc_strerror(err));
  2921. } else {
  2922. IF (err != NC_ERANGE)
  2923. error("Range error: status = %d", err);
  2924. }
  2925. } else {
  2926. IF (err != 0 && err != NC_ERANGE)
  2927. error("OK or Range error: status = %d", err);
  2928. }
  2929. for (j = 0; j < nels; j++) {
  2930. if (inRange3(expect[j],var_type[i],NCT_UCHAR)
  2931. && expect[j] >= uchar_min && expect[j] <= uchar_max) {
  2932. IF (!equal(value[j],expect[j],var_type[i],
  2933. NCT_UCHAR)){
  2934. error("value read not that expected");
  2935. if (verbose) {
  2936. error("\n");
  2937. error("varid: %d, ", i);
  2938. error("var_name: %s, ", var_name[i]);
  2939. error("element number: %d ", j);
  2940. error("expect: %g, ", expect[j]);
  2941. error("got: %g", (double) value[j]);
  2942. }
  2943. } else {
  2944. nok++;
  2945. }
  2946. }
  2947. }
  2948. } else {
  2949. IF (nels > 0 && err != NC_ECHAR)
  2950. error("wrong type: status = %d", err);
  2951. }
  2952. }
  2953. }
  2954. }
  2955. err = nc_close(ncid);
  2956. IF (err)
  2957. error("nc_close: %s", nc_strerror(err));
  2958. print_nok(nok);
  2959. }
  2960. void
  2961. test_nc_get_vars_schar(void)
  2962. {
  2963. int ncid;
  2964. int d;
  2965. int i;
  2966. int j;
  2967. int k;
  2968. int m;
  2969. int err;
  2970. int allInExtRange; /* all values within external range? */
  2971. int allInIntRange; /* all values within internal range? */
  2972. int nels;
  2973. int nslabs;
  2974. int nstarts; /* number of different starts */
  2975. int nok = 0; /* count of valid comparisons */
  2976. size_t start[MAX_RANK];
  2977. size_t edge[MAX_RANK];
  2978. size_t index[MAX_RANK];
  2979. size_t index2[MAX_RANK];
  2980. size_t mid[MAX_RANK];
  2981. size_t count[MAX_RANK];
  2982. size_t sstride[MAX_RANK];
  2983. ptrdiff_t stride[MAX_RANK];
  2984. int canConvert; /* Both text or both numeric */
  2985. schar value[MAX_NELS];
  2986. double expect[MAX_NELS];
  2987. err = nc_open(testfile, NC_NOWRITE, &ncid);
  2988. IF (err)
  2989. error("nc_open: %s", nc_strerror(err));
  2990. for (i = 0; i < NVARS; i++) {
  2991. canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
  2992. assert(var_rank[i] <= MAX_RANK);
  2993. assert(var_nels[i] <= MAX_NELS);
  2994. for (j = 0; j < var_rank[i]; j++) {
  2995. start[j] = 0;
  2996. edge[j] = 1;
  2997. stride[j] = 1;
  2998. }
  2999. err = nc_get_vars_schar(BAD_ID, i, start, edge, stride, value);
  3000. IF (err != NC_EBADID)
  3001. error("bad ncid: status = %d", err);
  3002. err = nc_get_vars_schar(ncid, BAD_VARID, start, edge, stride, value);
  3003. IF (err != NC_ENOTVAR)
  3004. error("bad var id: status = %d", err);
  3005. for (j = 0; j < var_rank[i]; j++) {
  3006. start[j] = var_shape[i][j];
  3007. err = nc_get_vars_schar(ncid, i, start, edge, stride, value);
  3008. if(!canConvert) {
  3009. IF (err != NC_ECHAR)
  3010. error("conversion: status = %d", err);
  3011. } else {
  3012. IF (err != NC_EINVALCOORDS)
  3013. error("bad index: status = %d", err);
  3014. start[j] = 0;
  3015. edge[j] = var_shape[i][j] + 1;
  3016. err = nc_get_vars_schar(ncid, i, start, edge, stride, value);
  3017. IF (err != NC_EEDGE)
  3018. error("bad edge: status = %d", err);
  3019. edge[j] = 1;
  3020. stride[j] = 0;
  3021. err = nc_get_vars_schar(ncid, i, start, edge, stride, value);
  3022. IF (err != NC_ESTRIDE)
  3023. error("bad stride: status = %d", err);
  3024. stride[j] = 1;
  3025. }
  3026. }
  3027. /* Choose a random point dividing each dim into 2 parts */
  3028. /* get 2^rank (nslabs) slabs so defined */
  3029. nslabs = 1;
  3030. for (j = 0; j < var_rank[i]; j++) {
  3031. mid[j] = roll( var_shape[i][j] );
  3032. nslabs *= 2;
  3033. }
  3034. /* bits of k determine whether to get lower or upper part of dim */
  3035. /* choose random stride from 1 to edge */
  3036. for (k = 0; k < nslabs; k++) {
  3037. nstarts = 1;
  3038. for (j = 0; j < var_rank[i]; j++) {
  3039. if ((k >> j) & 1) {
  3040. start[j] = 0;
  3041. edge[j] = mid[j];
  3042. }else{
  3043. start[j] = mid[j];
  3044. edge[j] = var_shape[i][j] - mid[j];
  3045. }
  3046. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  3047. nstarts *= stride[j];
  3048. }
  3049. for (m = 0; m < nstarts; m++) {
  3050. err = toMixedBase(m, var_rank[i], sstride, index);
  3051. IF (err)
  3052. error("error in toMixedBase");
  3053. nels = 1;
  3054. for (j = 0; j < var_rank[i]; j++) {
  3055. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  3056. nels *= count[j];
  3057. index[j] += start[j];
  3058. }
  3059. /* Random choice of forward or backward */
  3060. /* TODO
  3061. if ( roll(2) ) {
  3062. for (j = 0; j < var_rank[i]; j++) {
  3063. index[j] += (count[j] - 1) * stride[j];
  3064. stride[j] = -stride[j];
  3065. }
  3066. }
  3067. */
  3068. allInExtRange = allInIntRange = 1;
  3069. for (j = 0; j < nels; j++) {
  3070. err = toMixedBase(j, var_rank[i], count, index2);
  3071. IF (err)
  3072. error("error in toMixedBase 1");
  3073. for (d = 0; d < var_rank[i]; d++)
  3074. index2[d] = index[d] + index2[d] * stride[d];
  3075. expect[j] = hash4(var_type[i], var_rank[i], index2,
  3076. NCT_SCHAR);
  3077. if (inRange3(expect[j],var_type[i],NCT_SCHAR)) {
  3078. allInIntRange = allInIntRange && expect[j] >= schar_min
  3079. && expect[j] <= schar_max;
  3080. } else {
  3081. allInExtRange = 0;
  3082. }
  3083. }
  3084. if (var_rank[i] == 0 && i%2 )
  3085. err = nc_get_vars_schar(ncid, i, NULL, NULL, NULL, value);
  3086. else
  3087. err = nc_get_vars_schar(ncid, i, index, count, stride, value);
  3088. if (canConvert) {
  3089. if (allInExtRange) {
  3090. if (allInIntRange) {
  3091. IF (err)
  3092. error("%s", nc_strerror(err));
  3093. } else {
  3094. IF (err != NC_ERANGE)
  3095. error("Range error: status = %d", err);
  3096. }
  3097. } else {
  3098. IF (err != 0 && err != NC_ERANGE)
  3099. error("OK or Range error: status = %d", err);
  3100. }
  3101. for (j = 0; j < nels; j++) {
  3102. if (inRange3(expect[j],var_type[i],NCT_SCHAR)
  3103. && expect[j] >= schar_min && expect[j] <= schar_max) {
  3104. IF (!equal(value[j],expect[j],var_type[i],
  3105. NCT_SCHAR)){
  3106. error("value read not that expected");
  3107. if (verbose) {
  3108. error("\n");
  3109. error("varid: %d, ", i);
  3110. error("var_name: %s, ", var_name[i]);
  3111. error("element number: %d ", j);
  3112. error("expect: %g, ", expect[j]);
  3113. error("got: %g", (double) value[j]);
  3114. }
  3115. } else {
  3116. nok++;
  3117. }
  3118. }
  3119. }
  3120. } else {
  3121. IF (nels > 0 && err != NC_ECHAR)
  3122. error("wrong type: status = %d", err);
  3123. }
  3124. }
  3125. }
  3126. }
  3127. err = nc_close(ncid);
  3128. IF (err)
  3129. error("nc_close: %s", nc_strerror(err));
  3130. print_nok(nok);
  3131. }
  3132. void
  3133. test_nc_get_vars_short(void)
  3134. {
  3135. int ncid;
  3136. int d;
  3137. int i;
  3138. int j;
  3139. int k;
  3140. int m;
  3141. int err;
  3142. int allInExtRange; /* all values within external range? */
  3143. int allInIntRange; /* all values within internal range? */
  3144. int nels;
  3145. int nslabs;
  3146. int nstarts; /* number of different starts */
  3147. int nok = 0; /* count of valid comparisons */
  3148. size_t start[MAX_RANK];
  3149. size_t edge[MAX_RANK];
  3150. size_t index[MAX_RANK];
  3151. size_t index2[MAX_RANK];
  3152. size_t mid[MAX_RANK];
  3153. size_t count[MAX_RANK];
  3154. size_t sstride[MAX_RANK];
  3155. ptrdiff_t stride[MAX_RANK];
  3156. int canConvert; /* Both text or both numeric */
  3157. short value[MAX_NELS];
  3158. double expect[MAX_NELS];
  3159. err = nc_open(testfile, NC_NOWRITE, &ncid);
  3160. IF (err)
  3161. error("nc_open: %s", nc_strerror(err));
  3162. for (i = 0; i < NVARS; i++) {
  3163. canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
  3164. assert(var_rank[i] <= MAX_RANK);
  3165. assert(var_nels[i] <= MAX_NELS);
  3166. for (j = 0; j < var_rank[i]; j++) {
  3167. start[j] = 0;
  3168. edge[j] = 1;
  3169. stride[j] = 1;
  3170. }
  3171. err = nc_get_vars_short(BAD_ID, i, start, edge, stride, value);
  3172. IF (err != NC_EBADID)
  3173. error("bad ncid: status = %d", err);
  3174. err = nc_get_vars_short(ncid, BAD_VARID, start, edge, stride, value);
  3175. IF (err != NC_ENOTVAR)
  3176. error("bad var id: status = %d", err);
  3177. for (j = 0; j < var_rank[i]; j++) {
  3178. start[j] = var_shape[i][j];
  3179. err = nc_get_vars_short(ncid, i, start, edge, stride, value);
  3180. if(!canConvert) {
  3181. IF (err != NC_ECHAR)
  3182. error("conversion: status = %d", err);
  3183. } else {
  3184. IF (err != NC_EINVALCOORDS)
  3185. error("bad index: status = %d", err);
  3186. start[j] = 0;
  3187. edge[j] = var_shape[i][j] + 1;
  3188. err = nc_get_vars_short(ncid, i, start, edge, stride, value);
  3189. IF (err != NC_EEDGE)
  3190. error("bad edge: status = %d", err);
  3191. edge[j] = 1;
  3192. stride[j] = 0;
  3193. err = nc_get_vars_short(ncid, i, start, edge, stride, value);
  3194. IF (err != NC_ESTRIDE)
  3195. error("bad stride: status = %d", err);
  3196. stride[j] = 1;
  3197. }
  3198. }
  3199. /* Choose a random point dividing each dim into 2 parts */
  3200. /* get 2^rank (nslabs) slabs so defined */
  3201. nslabs = 1;
  3202. for (j = 0; j < var_rank[i]; j++) {
  3203. mid[j] = roll( var_shape[i][j] );
  3204. nslabs *= 2;
  3205. }
  3206. /* bits of k determine whether to get lower or upper part of dim */
  3207. /* choose random stride from 1 to edge */
  3208. for (k = 0; k < nslabs; k++) {
  3209. nstarts = 1;
  3210. for (j = 0; j < var_rank[i]; j++) {
  3211. if ((k >> j) & 1) {
  3212. start[j] = 0;
  3213. edge[j] = mid[j];
  3214. }else{
  3215. start[j] = mid[j];
  3216. edge[j] = var_shape[i][j] - mid[j];
  3217. }
  3218. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  3219. nstarts *= stride[j];
  3220. }
  3221. for (m = 0; m < nstarts; m++) {
  3222. err = toMixedBase(m, var_rank[i], sstride, index);
  3223. IF (err)
  3224. error("error in toMixedBase");
  3225. nels = 1;
  3226. for (j = 0; j < var_rank[i]; j++) {
  3227. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  3228. nels *= count[j];
  3229. index[j] += start[j];
  3230. }
  3231. /* Random choice of forward or backward */
  3232. /* TODO
  3233. if ( roll(2) ) {
  3234. for (j = 0; j < var_rank[i]; j++) {
  3235. index[j] += (count[j] - 1) * stride[j];
  3236. stride[j] = -stride[j];
  3237. }
  3238. }
  3239. */
  3240. allInExtRange = allInIntRange = 1;
  3241. for (j = 0; j < nels; j++) {
  3242. err = toMixedBase(j, var_rank[i], count, index2);
  3243. IF (err)
  3244. error("error in toMixedBase 1");
  3245. for (d = 0; d < var_rank[i]; d++)
  3246. index2[d] = index[d] + index2[d] * stride[d];
  3247. expect[j] = hash4(var_type[i], var_rank[i], index2,
  3248. NCT_SHORT);
  3249. if (inRange3(expect[j],var_type[i],NCT_SHORT)) {
  3250. allInIntRange = allInIntRange && expect[j] >= short_min
  3251. && expect[j] <= short_max;
  3252. } else {
  3253. allInExtRange = 0;
  3254. }
  3255. }
  3256. if (var_rank[i] == 0 && i%2 )
  3257. err = nc_get_vars_short(ncid, i, NULL, NULL, NULL, value);
  3258. else
  3259. err = nc_get_vars_short(ncid, i, index, count, stride, value);
  3260. if (canConvert) {
  3261. if (allInExtRange) {
  3262. if (allInIntRange) {
  3263. IF (err)
  3264. error("%s", nc_strerror(err));
  3265. } else {
  3266. IF (err != NC_ERANGE)
  3267. error("Range error: status = %d", err);
  3268. }
  3269. } else {
  3270. IF (err != 0 && err != NC_ERANGE)
  3271. error("OK or Range error: status = %d", err);
  3272. }
  3273. for (j = 0; j < nels; j++) {
  3274. if (inRange3(expect[j],var_type[i],NCT_SHORT)
  3275. && expect[j] >= short_min && expect[j] <= short_max) {
  3276. IF (!equal(value[j],expect[j],var_type[i],
  3277. NCT_SHORT)){
  3278. error("value read not that expected");
  3279. if (verbose) {
  3280. error("\n");
  3281. error("varid: %d, ", i);
  3282. error("var_name: %s, ", var_name[i]);
  3283. error("element number: %d ", j);
  3284. error("expect: %g, ", expect[j]);
  3285. error("got: %g", (double) value[j]);
  3286. }
  3287. } else {
  3288. nok++;
  3289. }
  3290. }
  3291. }
  3292. } else {
  3293. IF (nels > 0 && err != NC_ECHAR)
  3294. error("wrong type: status = %d", err);
  3295. }
  3296. }
  3297. }
  3298. }
  3299. err = nc_close(ncid);
  3300. IF (err)
  3301. error("nc_close: %s", nc_strerror(err));
  3302. print_nok(nok);
  3303. }
  3304. void
  3305. test_nc_get_vars_int(void)
  3306. {
  3307. int ncid;
  3308. int d;
  3309. int i;
  3310. int j;
  3311. int k;
  3312. int m;
  3313. int err;
  3314. int allInExtRange; /* all values within external range? */
  3315. int allInIntRange; /* all values within internal range? */
  3316. int nels;
  3317. int nslabs;
  3318. int nstarts; /* number of different starts */
  3319. int nok = 0; /* count of valid comparisons */
  3320. size_t start[MAX_RANK];
  3321. size_t edge[MAX_RANK];
  3322. size_t index[MAX_RANK];
  3323. size_t index2[MAX_RANK];
  3324. size_t mid[MAX_RANK];
  3325. size_t count[MAX_RANK];
  3326. size_t sstride[MAX_RANK];
  3327. ptrdiff_t stride[MAX_RANK];
  3328. int canConvert; /* Both text or both numeric */
  3329. int value[MAX_NELS];
  3330. double expect[MAX_NELS];
  3331. err = nc_open(testfile, NC_NOWRITE, &ncid);
  3332. IF (err)
  3333. error("nc_open: %s", nc_strerror(err));
  3334. for (i = 0; i < NVARS; i++) {
  3335. canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
  3336. assert(var_rank[i] <= MAX_RANK);
  3337. assert(var_nels[i] <= MAX_NELS);
  3338. for (j = 0; j < var_rank[i]; j++) {
  3339. start[j] = 0;
  3340. edge[j] = 1;
  3341. stride[j] = 1;
  3342. }
  3343. err = nc_get_vars_int(BAD_ID, i, start, edge, stride, value);
  3344. IF (err != NC_EBADID)
  3345. error("bad ncid: status = %d", err);
  3346. err = nc_get_vars_int(ncid, BAD_VARID, start, edge, stride, value);
  3347. IF (err != NC_ENOTVAR)
  3348. error("bad var id: status = %d", err);
  3349. for (j = 0; j < var_rank[i]; j++) {
  3350. start[j] = var_shape[i][j];
  3351. err = nc_get_vars_int(ncid, i, start, edge, stride, value);
  3352. if(!canConvert) {
  3353. IF (err != NC_ECHAR)
  3354. error("conversion: status = %d", err);
  3355. } else {
  3356. IF (err != NC_EINVALCOORDS)
  3357. error("bad index: status = %d", err);
  3358. start[j] = 0;
  3359. edge[j] = var_shape[i][j] + 1;
  3360. err = nc_get_vars_int(ncid, i, start, edge, stride, value);
  3361. IF (err != NC_EEDGE)
  3362. error("bad edge: status = %d", err);
  3363. edge[j] = 1;
  3364. stride[j] = 0;
  3365. err = nc_get_vars_int(ncid, i, start, edge, stride, value);
  3366. IF (err != NC_ESTRIDE)
  3367. error("bad stride: status = %d", err);
  3368. stride[j] = 1;
  3369. }
  3370. }
  3371. /* Choose a random point dividing each dim into 2 parts */
  3372. /* get 2^rank (nslabs) slabs so defined */
  3373. nslabs = 1;
  3374. for (j = 0; j < var_rank[i]; j++) {
  3375. mid[j] = roll( var_shape[i][j] );
  3376. nslabs *= 2;
  3377. }
  3378. /* bits of k determine whether to get lower or upper part of dim */
  3379. /* choose random stride from 1 to edge */
  3380. for (k = 0; k < nslabs; k++) {
  3381. nstarts = 1;
  3382. for (j = 0; j < var_rank[i]; j++) {
  3383. if ((k >> j) & 1) {
  3384. start[j] = 0;
  3385. edge[j] = mid[j];
  3386. }else{
  3387. start[j] = mid[j];
  3388. edge[j] = var_shape[i][j] - mid[j];
  3389. }
  3390. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  3391. nstarts *= stride[j];
  3392. }
  3393. for (m = 0; m < nstarts; m++) {
  3394. err = toMixedBase(m, var_rank[i], sstride, index);
  3395. IF (err)
  3396. error("error in toMixedBase");
  3397. nels = 1;
  3398. for (j = 0; j < var_rank[i]; j++) {
  3399. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  3400. nels *= count[j];
  3401. index[j] += start[j];
  3402. }
  3403. /* Random choice of forward or backward */
  3404. /* TODO
  3405. if ( roll(2) ) {
  3406. for (j = 0; j < var_rank[i]; j++) {
  3407. index[j] += (count[j] - 1) * stride[j];
  3408. stride[j] = -stride[j];
  3409. }
  3410. }
  3411. */
  3412. allInExtRange = allInIntRange = 1;
  3413. for (j = 0; j < nels; j++) {
  3414. err = toMixedBase(j, var_rank[i], count, index2);
  3415. IF (err)
  3416. error("error in toMixedBase 1");
  3417. for (d = 0; d < var_rank[i]; d++)
  3418. index2[d] = index[d] + index2[d] * stride[d];
  3419. expect[j] = hash4(var_type[i], var_rank[i], index2,
  3420. NCT_INT);
  3421. if (inRange3(expect[j],var_type[i],NCT_INT)) {
  3422. allInIntRange = allInIntRange && expect[j] >= int_min
  3423. && expect[j] <= int_max;
  3424. } else {
  3425. allInExtRange = 0;
  3426. }
  3427. }
  3428. if (var_rank[i] == 0 && i%2 )
  3429. err = nc_get_vars_int(ncid, i, NULL, NULL, NULL, value);
  3430. else
  3431. err = nc_get_vars_int(ncid, i, index, count, stride, value);
  3432. if (canConvert) {
  3433. if (allInExtRange) {
  3434. if (allInIntRange) {
  3435. IF (err)
  3436. error("%s", nc_strerror(err));
  3437. } else {
  3438. IF (err != NC_ERANGE)
  3439. error("Range error: status = %d", err);
  3440. }
  3441. } else {
  3442. IF (err != 0 && err != NC_ERANGE)
  3443. error("OK or Range error: status = %d", err);
  3444. }
  3445. for (j = 0; j < nels; j++) {
  3446. if (inRange3(expect[j],var_type[i],NCT_INT)
  3447. && expect[j] >= int_min && expect[j] <= int_max) {
  3448. IF (!equal(value[j],expect[j],var_type[i],
  3449. NCT_INT)){
  3450. error("value read not that expected");
  3451. if (verbose) {
  3452. error("\n");
  3453. error("varid: %d, ", i);
  3454. error("var_name: %s, ", var_name[i]);
  3455. error("element number: %d ", j);
  3456. error("expect: %g, ", expect[j]);
  3457. error("got: %g", (double) value[j]);
  3458. }
  3459. } else {
  3460. nok++;
  3461. }
  3462. }
  3463. }
  3464. } else {
  3465. IF (nels > 0 && err != NC_ECHAR)
  3466. error("wrong type: status = %d", err);
  3467. }
  3468. }
  3469. }
  3470. }
  3471. err = nc_close(ncid);
  3472. IF (err)
  3473. error("nc_close: %s", nc_strerror(err));
  3474. print_nok(nok);
  3475. }
  3476. void
  3477. test_nc_get_vars_long(void)
  3478. {
  3479. int ncid;
  3480. int d;
  3481. int i;
  3482. int j;
  3483. int k;
  3484. int m;
  3485. int err;
  3486. int allInExtRange; /* all values within external range? */
  3487. int allInIntRange; /* all values within internal range? */
  3488. int nels;
  3489. int nslabs;
  3490. int nstarts; /* number of different starts */
  3491. int nok = 0; /* count of valid comparisons */
  3492. size_t start[MAX_RANK];
  3493. size_t edge[MAX_RANK];
  3494. size_t index[MAX_RANK];
  3495. size_t index2[MAX_RANK];
  3496. size_t mid[MAX_RANK];
  3497. size_t count[MAX_RANK];
  3498. size_t sstride[MAX_RANK];
  3499. ptrdiff_t stride[MAX_RANK];
  3500. int canConvert; /* Both text or both numeric */
  3501. long value[MAX_NELS];
  3502. double expect[MAX_NELS];
  3503. err = nc_open(testfile, NC_NOWRITE, &ncid);
  3504. IF (err)
  3505. error("nc_open: %s", nc_strerror(err));
  3506. for (i = 0; i < NVARS; i++) {
  3507. canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
  3508. assert(var_rank[i] <= MAX_RANK);
  3509. assert(var_nels[i] <= MAX_NELS);
  3510. for (j = 0; j < var_rank[i]; j++) {
  3511. start[j] = 0;
  3512. edge[j] = 1;
  3513. stride[j] = 1;
  3514. }
  3515. err = nc_get_vars_long(BAD_ID, i, start, edge, stride, value);
  3516. IF (err != NC_EBADID)
  3517. error("bad ncid: status = %d", err);
  3518. err = nc_get_vars_long(ncid, BAD_VARID, start, edge, stride, value);
  3519. IF (err != NC_ENOTVAR)
  3520. error("bad var id: status = %d", err);
  3521. for (j = 0; j < var_rank[i]; j++) {
  3522. start[j] = var_shape[i][j];
  3523. err = nc_get_vars_long(ncid, i, start, edge, stride, value);
  3524. if(!canConvert) {
  3525. IF (err != NC_ECHAR)
  3526. error("conversion: status = %d", err);
  3527. } else {
  3528. IF (err != NC_EINVALCOORDS)
  3529. error("bad index: status = %d", err);
  3530. start[j] = 0;
  3531. edge[j] = var_shape[i][j] + 1;
  3532. err = nc_get_vars_long(ncid, i, start, edge, stride, value);
  3533. IF (err != NC_EEDGE)
  3534. error("bad edge: status = %d", err);
  3535. edge[j] = 1;
  3536. stride[j] = 0;
  3537. err = nc_get_vars_long(ncid, i, start, edge, stride, value);
  3538. IF (err != NC_ESTRIDE)
  3539. error("bad stride: status = %d", err);
  3540. stride[j] = 1;
  3541. }
  3542. }
  3543. /* Choose a random point dividing each dim into 2 parts */
  3544. /* get 2^rank (nslabs) slabs so defined */
  3545. nslabs = 1;
  3546. for (j = 0; j < var_rank[i]; j++) {
  3547. mid[j] = roll( var_shape[i][j] );
  3548. nslabs *= 2;
  3549. }
  3550. /* bits of k determine whether to get lower or upper part of dim */
  3551. /* choose random stride from 1 to edge */
  3552. for (k = 0; k < nslabs; k++) {
  3553. nstarts = 1;
  3554. for (j = 0; j < var_rank[i]; j++) {
  3555. if ((k >> j) & 1) {
  3556. start[j] = 0;
  3557. edge[j] = mid[j];
  3558. }else{
  3559. start[j] = mid[j];
  3560. edge[j] = var_shape[i][j] - mid[j];
  3561. }
  3562. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  3563. nstarts *= stride[j];
  3564. }
  3565. for (m = 0; m < nstarts; m++) {
  3566. err = toMixedBase(m, var_rank[i], sstride, index);
  3567. IF (err)
  3568. error("error in toMixedBase");
  3569. nels = 1;
  3570. for (j = 0; j < var_rank[i]; j++) {
  3571. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  3572. nels *= count[j];
  3573. index[j] += start[j];
  3574. }
  3575. /* Random choice of forward or backward */
  3576. /* TODO
  3577. if ( roll(2) ) {
  3578. for (j = 0; j < var_rank[i]; j++) {
  3579. index[j] += (count[j] - 1) * stride[j];
  3580. stride[j] = -stride[j];
  3581. }
  3582. }
  3583. */
  3584. allInExtRange = allInIntRange = 1;
  3585. for (j = 0; j < nels; j++) {
  3586. err = toMixedBase(j, var_rank[i], count, index2);
  3587. IF (err)
  3588. error("error in toMixedBase 1");
  3589. for (d = 0; d < var_rank[i]; d++)
  3590. index2[d] = index[d] + index2[d] * stride[d];
  3591. expect[j] = hash4(var_type[i], var_rank[i], index2,
  3592. NCT_LONG);
  3593. if (inRange3(expect[j],var_type[i],NCT_LONG)) {
  3594. allInIntRange = allInIntRange && expect[j] >= long_min
  3595. && expect[j] <= long_max;
  3596. } else {
  3597. allInExtRange = 0;
  3598. }
  3599. }
  3600. if (var_rank[i] == 0 && i%2 )
  3601. err = nc_get_vars_long(ncid, i, NULL, NULL, NULL, value);
  3602. else
  3603. err = nc_get_vars_long(ncid, i, index, count, stride, value);
  3604. if (canConvert) {
  3605. if (allInExtRange) {
  3606. if (allInIntRange) {
  3607. IF (err)
  3608. error("%s", nc_strerror(err));
  3609. } else {
  3610. IF (err != NC_ERANGE)
  3611. error("Range error: status = %d", err);
  3612. }
  3613. } else {
  3614. IF (err != 0 && err != NC_ERANGE)
  3615. error("OK or Range error: status = %d", err);
  3616. }
  3617. for (j = 0; j < nels; j++) {
  3618. if (inRange3(expect[j],var_type[i],NCT_LONG)
  3619. && expect[j] >= long_min && expect[j] <= long_max) {
  3620. IF (!equal(value[j],expect[j],var_type[i],
  3621. NCT_LONG)){
  3622. error("value read not that expected");
  3623. if (verbose) {
  3624. error("\n");
  3625. error("varid: %d, ", i);
  3626. error("var_name: %s, ", var_name[i]);
  3627. error("element number: %d ", j);
  3628. error("expect: %g, ", expect[j]);
  3629. error("got: %g", (double) value[j]);
  3630. }
  3631. } else {
  3632. nok++;
  3633. }
  3634. }
  3635. }
  3636. } else {
  3637. IF (nels > 0 && err != NC_ECHAR)
  3638. error("wrong type: status = %d", err);
  3639. }
  3640. }
  3641. }
  3642. }
  3643. err = nc_close(ncid);
  3644. IF (err)
  3645. error("nc_close: %s", nc_strerror(err));
  3646. print_nok(nok);
  3647. }
  3648. void
  3649. test_nc_get_vars_float(void)
  3650. {
  3651. int ncid;
  3652. int d;
  3653. int i;
  3654. int j;
  3655. int k;
  3656. int m;
  3657. int err;
  3658. int allInExtRange; /* all values within external range? */
  3659. int allInIntRange; /* all values within internal range? */
  3660. int nels;
  3661. int nslabs;
  3662. int nstarts; /* number of different starts */
  3663. int nok = 0; /* count of valid comparisons */
  3664. size_t start[MAX_RANK];
  3665. size_t edge[MAX_RANK];
  3666. size_t index[MAX_RANK];
  3667. size_t index2[MAX_RANK];
  3668. size_t mid[MAX_RANK];
  3669. size_t count[MAX_RANK];
  3670. size_t sstride[MAX_RANK];
  3671. ptrdiff_t stride[MAX_RANK];
  3672. int canConvert; /* Both text or both numeric */
  3673. float value[MAX_NELS];
  3674. double expect[MAX_NELS];
  3675. err = nc_open(testfile, NC_NOWRITE, &ncid);
  3676. IF (err)
  3677. error("nc_open: %s", nc_strerror(err));
  3678. for (i = 0; i < NVARS; i++) {
  3679. canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
  3680. assert(var_rank[i] <= MAX_RANK);
  3681. assert(var_nels[i] <= MAX_NELS);
  3682. for (j = 0; j < var_rank[i]; j++) {
  3683. start[j] = 0;
  3684. edge[j] = 1;
  3685. stride[j] = 1;
  3686. }
  3687. err = nc_get_vars_float(BAD_ID, i, start, edge, stride, value);
  3688. IF (err != NC_EBADID)
  3689. error("bad ncid: status = %d", err);
  3690. err = nc_get_vars_float(ncid, BAD_VARID, start, edge, stride, value);
  3691. IF (err != NC_ENOTVAR)
  3692. error("bad var id: status = %d", err);
  3693. for (j = 0; j < var_rank[i]; j++) {
  3694. start[j] = var_shape[i][j];
  3695. err = nc_get_vars_float(ncid, i, start, edge, stride, value);
  3696. if(!canConvert) {
  3697. IF (err != NC_ECHAR)
  3698. error("conversion: status = %d", err);
  3699. } else {
  3700. IF (err != NC_EINVALCOORDS)
  3701. error("bad index: status = %d", err);
  3702. start[j] = 0;
  3703. edge[j] = var_shape[i][j] + 1;
  3704. err = nc_get_vars_float(ncid, i, start, edge, stride, value);
  3705. IF (err != NC_EEDGE)
  3706. error("bad edge: status = %d", err);
  3707. edge[j] = 1;
  3708. stride[j] = 0;
  3709. err = nc_get_vars_float(ncid, i, start, edge, stride, value);
  3710. IF (err != NC_ESTRIDE)
  3711. error("bad stride: status = %d", err);
  3712. stride[j] = 1;
  3713. }
  3714. }
  3715. /* Choose a random point dividing each dim into 2 parts */
  3716. /* get 2^rank (nslabs) slabs so defined */
  3717. nslabs = 1;
  3718. for (j = 0; j < var_rank[i]; j++) {
  3719. mid[j] = roll( var_shape[i][j] );
  3720. nslabs *= 2;
  3721. }
  3722. /* bits of k determine whether to get lower or upper part of dim */
  3723. /* choose random stride from 1 to edge */
  3724. for (k = 0; k < nslabs; k++) {
  3725. nstarts = 1;
  3726. for (j = 0; j < var_rank[i]; j++) {
  3727. if ((k >> j) & 1) {
  3728. start[j] = 0;
  3729. edge[j] = mid[j];
  3730. }else{
  3731. start[j] = mid[j];
  3732. edge[j] = var_shape[i][j] - mid[j];
  3733. }
  3734. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  3735. nstarts *= stride[j];
  3736. }
  3737. for (m = 0; m < nstarts; m++) {
  3738. err = toMixedBase(m, var_rank[i], sstride, index);
  3739. IF (err)
  3740. error("error in toMixedBase");
  3741. nels = 1;
  3742. for (j = 0; j < var_rank[i]; j++) {
  3743. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  3744. nels *= count[j];
  3745. index[j] += start[j];
  3746. }
  3747. /* Random choice of forward or backward */
  3748. /* TODO
  3749. if ( roll(2) ) {
  3750. for (j = 0; j < var_rank[i]; j++) {
  3751. index[j] += (count[j] - 1) * stride[j];
  3752. stride[j] = -stride[j];
  3753. }
  3754. }
  3755. */
  3756. allInExtRange = allInIntRange = 1;
  3757. for (j = 0; j < nels; j++) {
  3758. err = toMixedBase(j, var_rank[i], count, index2);
  3759. IF (err)
  3760. error("error in toMixedBase 1");
  3761. for (d = 0; d < var_rank[i]; d++)
  3762. index2[d] = index[d] + index2[d] * stride[d];
  3763. expect[j] = hash4(var_type[i], var_rank[i], index2,
  3764. NCT_FLOAT);
  3765. if (inRange3(expect[j],var_type[i],NCT_FLOAT)) {
  3766. allInIntRange = allInIntRange && expect[j] >= float_min
  3767. && expect[j] <= float_max;
  3768. } else {
  3769. allInExtRange = 0;
  3770. }
  3771. }
  3772. if (var_rank[i] == 0 && i%2 )
  3773. err = nc_get_vars_float(ncid, i, NULL, NULL, NULL, value);
  3774. else
  3775. err = nc_get_vars_float(ncid, i, index, count, stride, value);
  3776. if (canConvert) {
  3777. if (allInExtRange) {
  3778. if (allInIntRange) {
  3779. IF (err)
  3780. error("%s", nc_strerror(err));
  3781. } else {
  3782. IF (err != NC_ERANGE)
  3783. error("Range error: status = %d", err);
  3784. }
  3785. } else {
  3786. IF (err != 0 && err != NC_ERANGE)
  3787. error("OK or Range error: status = %d", err);
  3788. }
  3789. for (j = 0; j < nels; j++) {
  3790. if (inRange3(expect[j],var_type[i],NCT_FLOAT)
  3791. && expect[j] >= float_min && expect[j] <= float_max) {
  3792. IF (!equal(value[j],expect[j],var_type[i],
  3793. NCT_FLOAT)){
  3794. error("value read not that expected");
  3795. if (verbose) {
  3796. error("\n");
  3797. error("varid: %d, ", i);
  3798. error("var_name: %s, ", var_name[i]);
  3799. error("element number: %d ", j);
  3800. error("expect: %g, ", expect[j]);
  3801. error("got: %g", (double) value[j]);
  3802. }
  3803. } else {
  3804. nok++;
  3805. }
  3806. }
  3807. }
  3808. } else {
  3809. IF (nels > 0 && err != NC_ECHAR)
  3810. error("wrong type: status = %d", err);
  3811. }
  3812. }
  3813. }
  3814. }
  3815. err = nc_close(ncid);
  3816. IF (err)
  3817. error("nc_close: %s", nc_strerror(err));
  3818. print_nok(nok);
  3819. }
  3820. void
  3821. test_nc_get_vars_double(void)
  3822. {
  3823. int ncid;
  3824. int d;
  3825. int i;
  3826. int j;
  3827. int k;
  3828. int m;
  3829. int err;
  3830. int allInExtRange; /* all values within external range? */
  3831. int allInIntRange; /* all values within internal range? */
  3832. int nels;
  3833. int nslabs;
  3834. int nstarts; /* number of different starts */
  3835. int nok = 0; /* count of valid comparisons */
  3836. size_t start[MAX_RANK];
  3837. size_t edge[MAX_RANK];
  3838. size_t index[MAX_RANK];
  3839. size_t index2[MAX_RANK];
  3840. size_t mid[MAX_RANK];
  3841. size_t count[MAX_RANK];
  3842. size_t sstride[MAX_RANK];
  3843. ptrdiff_t stride[MAX_RANK];
  3844. int canConvert; /* Both text or both numeric */
  3845. double value[MAX_NELS];
  3846. double expect[MAX_NELS];
  3847. err = nc_open(testfile, NC_NOWRITE, &ncid);
  3848. IF (err)
  3849. error("nc_open: %s", nc_strerror(err));
  3850. for (i = 0; i < NVARS; i++) {
  3851. canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
  3852. assert(var_rank[i] <= MAX_RANK);
  3853. assert(var_nels[i] <= MAX_NELS);
  3854. for (j = 0; j < var_rank[i]; j++) {
  3855. start[j] = 0;
  3856. edge[j] = 1;
  3857. stride[j] = 1;
  3858. }
  3859. err = nc_get_vars_double(BAD_ID, i, start, edge, stride, value);
  3860. IF (err != NC_EBADID)
  3861. error("bad ncid: status = %d", err);
  3862. err = nc_get_vars_double(ncid, BAD_VARID, start, edge, stride, value);
  3863. IF (err != NC_ENOTVAR)
  3864. error("bad var id: status = %d", err);
  3865. for (j = 0; j < var_rank[i]; j++) {
  3866. start[j] = var_shape[i][j];
  3867. err = nc_get_vars_double(ncid, i, start, edge, stride, value);
  3868. if(!canConvert) {
  3869. IF (err != NC_ECHAR)
  3870. error("conversion: status = %d", err);
  3871. } else {
  3872. IF (err != NC_EINVALCOORDS)
  3873. error("bad index: status = %d", err);
  3874. start[j] = 0;
  3875. edge[j] = var_shape[i][j] + 1;
  3876. err = nc_get_vars_double(ncid, i, start, edge, stride, value);
  3877. IF (err != NC_EEDGE)
  3878. error("bad edge: status = %d", err);
  3879. edge[j] = 1;
  3880. stride[j] = 0;
  3881. err = nc_get_vars_double(ncid, i, start, edge, stride, value);
  3882. IF (err != NC_ESTRIDE)
  3883. error("bad stride: status = %d", err);
  3884. stride[j] = 1;
  3885. }
  3886. }
  3887. /* Choose a random point dividing each dim into 2 parts */
  3888. /* get 2^rank (nslabs) slabs so defined */
  3889. nslabs = 1;
  3890. for (j = 0; j < var_rank[i]; j++) {
  3891. mid[j] = roll( var_shape[i][j] );
  3892. nslabs *= 2;
  3893. }
  3894. /* bits of k determine whether to get lower or upper part of dim */
  3895. /* choose random stride from 1 to edge */
  3896. for (k = 0; k < nslabs; k++) {
  3897. nstarts = 1;
  3898. for (j = 0; j < var_rank[i]; j++) {
  3899. if ((k >> j) & 1) {
  3900. start[j] = 0;
  3901. edge[j] = mid[j];
  3902. }else{
  3903. start[j] = mid[j];
  3904. edge[j] = var_shape[i][j] - mid[j];
  3905. }
  3906. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  3907. nstarts *= stride[j];
  3908. }
  3909. for (m = 0; m < nstarts; m++) {
  3910. err = toMixedBase(m, var_rank[i], sstride, index);
  3911. IF (err)
  3912. error("error in toMixedBase");
  3913. nels = 1;
  3914. for (j = 0; j < var_rank[i]; j++) {
  3915. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  3916. nels *= count[j];
  3917. index[j] += start[j];
  3918. }
  3919. /* Random choice of forward or backward */
  3920. /* TODO
  3921. if ( roll(2) ) {
  3922. for (j = 0; j < var_rank[i]; j++) {
  3923. index[j] += (count[j] - 1) * stride[j];
  3924. stride[j] = -stride[j];
  3925. }
  3926. }
  3927. */
  3928. allInExtRange = allInIntRange = 1;
  3929. for (j = 0; j < nels; j++) {
  3930. err = toMixedBase(j, var_rank[i], count, index2);
  3931. IF (err)
  3932. error("error in toMixedBase 1");
  3933. for (d = 0; d < var_rank[i]; d++)
  3934. index2[d] = index[d] + index2[d] * stride[d];
  3935. expect[j] = hash4(var_type[i], var_rank[i], index2,
  3936. NCT_DOUBLE);
  3937. if (inRange3(expect[j],var_type[i],NCT_DOUBLE)) {
  3938. allInIntRange = allInIntRange && expect[j] >= double_min
  3939. && expect[j] <= double_max;
  3940. } else {
  3941. allInExtRange = 0;
  3942. }
  3943. }
  3944. if (var_rank[i] == 0 && i%2 )
  3945. err = nc_get_vars_double(ncid, i, NULL, NULL, NULL, value);
  3946. else
  3947. err = nc_get_vars_double(ncid, i, index, count, stride, value);
  3948. if (canConvert) {
  3949. if (allInExtRange) {
  3950. if (allInIntRange) {
  3951. IF (err)
  3952. error("%s", nc_strerror(err));
  3953. } else {
  3954. IF (err != NC_ERANGE)
  3955. error("Range error: status = %d", err);
  3956. }
  3957. } else {
  3958. IF (err != 0 && err != NC_ERANGE)
  3959. error("OK or Range error: status = %d", err);
  3960. }
  3961. for (j = 0; j < nels; j++) {
  3962. if (inRange3(expect[j],var_type[i],NCT_DOUBLE)
  3963. && expect[j] >= double_min && expect[j] <= double_max) {
  3964. IF (!equal(value[j],expect[j],var_type[i],
  3965. NCT_DOUBLE)){
  3966. error("value read not that expected");
  3967. if (verbose) {
  3968. error("\n");
  3969. error("varid: %d, ", i);
  3970. error("var_name: %s, ", var_name[i]);
  3971. error("element number: %d ", j);
  3972. error("expect: %g, ", expect[j]);
  3973. error("got: %g", (double) value[j]);
  3974. }
  3975. } else {
  3976. nok++;
  3977. }
  3978. }
  3979. }
  3980. } else {
  3981. IF (nels > 0 && err != NC_ECHAR)
  3982. error("wrong type: status = %d", err);
  3983. }
  3984. }
  3985. }
  3986. }
  3987. err = nc_close(ncid);
  3988. IF (err)
  3989. error("nc_close: %s", nc_strerror(err));
  3990. print_nok(nok);
  3991. }
  3992. void
  3993. test_nc_get_varm_text(void)
  3994. {
  3995. int ncid;
  3996. int d;
  3997. int i;
  3998. int j;
  3999. int k;
  4000. int m;
  4001. int err;
  4002. int allInExtRange; /* all values within external range? */
  4003. int allInIntRange; /* all values within internal range? */
  4004. int nels;
  4005. int nslabs;
  4006. int nstarts; /* number of different starts */
  4007. int nok = 0; /* count of valid comparisons */
  4008. size_t start[MAX_RANK];
  4009. size_t edge[MAX_RANK];
  4010. size_t index[MAX_RANK];
  4011. size_t index2[MAX_RANK];
  4012. size_t mid[MAX_RANK];
  4013. size_t count[MAX_RANK];
  4014. size_t sstride[MAX_RANK];
  4015. ptrdiff_t stride[MAX_RANK];
  4016. ptrdiff_t imap[MAX_RANK];
  4017. int canConvert; /* Both text or both numeric */
  4018. text value[MAX_NELS];
  4019. double expect[MAX_NELS];
  4020. err = nc_open(testfile, NC_NOWRITE, &ncid);
  4021. IF (err)
  4022. error("nc_open: %s", nc_strerror(err));
  4023. for (i = 0; i < NVARS; i++) {
  4024. canConvert = (var_type[i] == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
  4025. assert(var_rank[i] <= MAX_RANK);
  4026. assert(var_nels[i] <= MAX_NELS);
  4027. for (j = 0; j < var_rank[i]; j++) {
  4028. start[j] = 0;
  4029. edge[j] = 1;
  4030. stride[j] = 1;
  4031. imap[j] = 1;
  4032. }
  4033. err = nc_get_varm_text(BAD_ID, i, start, edge, stride, imap, value);
  4034. IF (err != NC_EBADID)
  4035. error("bad ncid: status = %d", err);
  4036. err = nc_get_varm_text(ncid, BAD_VARID, start, edge, stride, imap, value);
  4037. IF (err != NC_ENOTVAR)
  4038. error("bad var id: status = %d", err);
  4039. for (j = 0; j < var_rank[i]; j++) {
  4040. start[j] = var_shape[i][j];
  4041. err = nc_get_varm_text(ncid, i, start, edge, stride, imap, value);
  4042. if(!canConvert) {
  4043. IF (err != NC_ECHAR)
  4044. error("conversion: status = %d", err);
  4045. } else {
  4046. IF (err != NC_EINVALCOORDS)
  4047. error("bad index: status = %d", err);
  4048. start[j] = 0;
  4049. edge[j] = var_shape[i][j] + 1;
  4050. err = nc_get_varm_text(ncid, i, start, edge, stride, imap, value);
  4051. IF (err != NC_EEDGE)
  4052. error("bad edge: status = %d", err);
  4053. edge[j] = 1;
  4054. stride[j] = 0;
  4055. err = nc_get_varm_text(ncid, i, start, edge, stride, imap, value);
  4056. IF (err != NC_ESTRIDE)
  4057. error("bad stride: status = %d", err);
  4058. stride[j] = 1;
  4059. }
  4060. }
  4061. /* Choose a random point dividing each dim into 2 parts */
  4062. /* get 2^rank (nslabs) slabs so defined */
  4063. nslabs = 1;
  4064. for (j = 0; j < var_rank[i]; j++) {
  4065. mid[j] = roll( var_shape[i][j] );
  4066. nslabs *= 2;
  4067. }
  4068. /* bits of k determine whether to get lower or upper part of dim */
  4069. /* choose random stride from 1 to edge */
  4070. for (k = 0; k < nslabs; k++) {
  4071. nstarts = 1;
  4072. for (j = 0; j < var_rank[i]; j++) {
  4073. if ((k >> j) & 1) {
  4074. start[j] = 0;
  4075. edge[j] = mid[j];
  4076. }else{
  4077. start[j] = mid[j];
  4078. edge[j] = var_shape[i][j] - mid[j];
  4079. }
  4080. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  4081. nstarts *= stride[j];
  4082. }
  4083. for (m = 0; m < nstarts; m++) {
  4084. err = toMixedBase(m, var_rank[i], sstride, index);
  4085. IF (err)
  4086. error("error in toMixedBase");
  4087. nels = 1;
  4088. for (j = 0; j < var_rank[i]; j++) {
  4089. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  4090. nels *= count[j];
  4091. index[j] += start[j];
  4092. }
  4093. /* Random choice of forward or backward */
  4094. /* TODO
  4095. if ( roll(2) ) {
  4096. for (j = 0; j < var_rank[i]; j++) {
  4097. index[j] += (count[j] - 1) * stride[j];
  4098. stride[j] = -stride[j];
  4099. }
  4100. }
  4101. */
  4102. if (var_rank[i] > 0) {
  4103. j = var_rank[i] - 1;
  4104. imap[j] = 1;
  4105. for (; j > 0; j--)
  4106. imap[j-1] = imap[j] * count[j];
  4107. }
  4108. allInExtRange = allInIntRange = 1;
  4109. for (j = 0; j < nels; j++) {
  4110. err = toMixedBase(j, var_rank[i], count, index2);
  4111. IF (err)
  4112. error("error in toMixedBase 1");
  4113. for (d = 0; d < var_rank[i]; d++)
  4114. index2[d] = index[d] + index2[d] * stride[d];
  4115. expect[j] = hash4(var_type[i], var_rank[i], index2,
  4116. NCT_TEXT);
  4117. if (inRange3(expect[j],var_type[i],NCT_TEXT)) {
  4118. allInIntRange = allInIntRange && expect[j] >= text_min
  4119. && expect[j] <= text_max;
  4120. } else {
  4121. allInExtRange = 0;
  4122. }
  4123. }
  4124. if (var_rank[i] == 0 && i%2 )
  4125. err = nc_get_varm_text(ncid,i,NULL,NULL,NULL,NULL,value);
  4126. else
  4127. err = nc_get_varm_text(ncid,i,index,count,stride,imap,value);
  4128. if (canConvert) {
  4129. if (allInExtRange) {
  4130. if (allInIntRange) {
  4131. IF (err)
  4132. error("%s", nc_strerror(err));
  4133. } else {
  4134. IF (err != NC_ERANGE)
  4135. error("Range error: status = %d", err);
  4136. }
  4137. } else {
  4138. IF (err != 0 && err != NC_ERANGE)
  4139. error("OK or Range error: status = %d", err);
  4140. }
  4141. for (j = 0; j < nels; j++) {
  4142. if (inRange3(expect[j],var_type[i],NCT_TEXT)
  4143. && expect[j] >= text_min
  4144. && expect[j] <= text_max) {
  4145. IF (!equal(value[j],expect[j],var_type[i],
  4146. NCT_TEXT)){
  4147. error("value read not that expected");
  4148. if (verbose) {
  4149. error("\n");
  4150. error("varid: %d, ", i);
  4151. error("var_name: %s, ", var_name[i]);
  4152. error("element number: %d ", j);
  4153. error("expect: %g, ", expect[j]);
  4154. error("got: %g", (double) value[j]);
  4155. }
  4156. } else {
  4157. nok++;
  4158. }
  4159. }
  4160. }
  4161. } else {
  4162. IF (nels > 0 && err != NC_ECHAR)
  4163. error("wrong type: status = %d", err);
  4164. }
  4165. }
  4166. }
  4167. }
  4168. err = nc_close(ncid);
  4169. IF (err)
  4170. error("nc_close: %s", nc_strerror(err));
  4171. print_nok(nok);
  4172. }
  4173. void
  4174. test_nc_get_varm_uchar(void)
  4175. {
  4176. int ncid;
  4177. int d;
  4178. int i;
  4179. int j;
  4180. int k;
  4181. int m;
  4182. int err;
  4183. int allInExtRange; /* all values within external range? */
  4184. int allInIntRange; /* all values within internal range? */
  4185. int nels;
  4186. int nslabs;
  4187. int nstarts; /* number of different starts */
  4188. int nok = 0; /* count of valid comparisons */
  4189. size_t start[MAX_RANK];
  4190. size_t edge[MAX_RANK];
  4191. size_t index[MAX_RANK];
  4192. size_t index2[MAX_RANK];
  4193. size_t mid[MAX_RANK];
  4194. size_t count[MAX_RANK];
  4195. size_t sstride[MAX_RANK];
  4196. ptrdiff_t stride[MAX_RANK];
  4197. ptrdiff_t imap[MAX_RANK];
  4198. int canConvert; /* Both text or both numeric */
  4199. uchar value[MAX_NELS];
  4200. double expect[MAX_NELS];
  4201. err = nc_open(testfile, NC_NOWRITE, &ncid);
  4202. IF (err)
  4203. error("nc_open: %s", nc_strerror(err));
  4204. for (i = 0; i < NVARS; i++) {
  4205. canConvert = (var_type[i] == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
  4206. assert(var_rank[i] <= MAX_RANK);
  4207. assert(var_nels[i] <= MAX_NELS);
  4208. for (j = 0; j < var_rank[i]; j++) {
  4209. start[j] = 0;
  4210. edge[j] = 1;
  4211. stride[j] = 1;
  4212. imap[j] = 1;
  4213. }
  4214. err = nc_get_varm_uchar(BAD_ID, i, start, edge, stride, imap, value);
  4215. IF (err != NC_EBADID)
  4216. error("bad ncid: status = %d", err);
  4217. err = nc_get_varm_uchar(ncid, BAD_VARID, start, edge, stride, imap, value);
  4218. IF (err != NC_ENOTVAR)
  4219. error("bad var id: status = %d", err);
  4220. for (j = 0; j < var_rank[i]; j++) {
  4221. start[j] = var_shape[i][j];
  4222. err = nc_get_varm_uchar(ncid, i, start, edge, stride, imap, value);
  4223. if(!canConvert) {
  4224. IF (err != NC_ECHAR)
  4225. error("conversion: status = %d", err);
  4226. } else {
  4227. IF (err != NC_EINVALCOORDS)
  4228. error("bad index: status = %d", err);
  4229. start[j] = 0;
  4230. edge[j] = var_shape[i][j] + 1;
  4231. err = nc_get_varm_uchar(ncid, i, start, edge, stride, imap, value);
  4232. IF (err != NC_EEDGE)
  4233. error("bad edge: status = %d", err);
  4234. edge[j] = 1;
  4235. stride[j] = 0;
  4236. err = nc_get_varm_uchar(ncid, i, start, edge, stride, imap, value);
  4237. IF (err != NC_ESTRIDE)
  4238. error("bad stride: status = %d", err);
  4239. stride[j] = 1;
  4240. }
  4241. }
  4242. /* Choose a random point dividing each dim into 2 parts */
  4243. /* get 2^rank (nslabs) slabs so defined */
  4244. nslabs = 1;
  4245. for (j = 0; j < var_rank[i]; j++) {
  4246. mid[j] = roll( var_shape[i][j] );
  4247. nslabs *= 2;
  4248. }
  4249. /* bits of k determine whether to get lower or upper part of dim */
  4250. /* choose random stride from 1 to edge */
  4251. for (k = 0; k < nslabs; k++) {
  4252. nstarts = 1;
  4253. for (j = 0; j < var_rank[i]; j++) {
  4254. if ((k >> j) & 1) {
  4255. start[j] = 0;
  4256. edge[j] = mid[j];
  4257. }else{
  4258. start[j] = mid[j];
  4259. edge[j] = var_shape[i][j] - mid[j];
  4260. }
  4261. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  4262. nstarts *= stride[j];
  4263. }
  4264. for (m = 0; m < nstarts; m++) {
  4265. err = toMixedBase(m, var_rank[i], sstride, index);
  4266. IF (err)
  4267. error("error in toMixedBase");
  4268. nels = 1;
  4269. for (j = 0; j < var_rank[i]; j++) {
  4270. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  4271. nels *= count[j];
  4272. index[j] += start[j];
  4273. }
  4274. /* Random choice of forward or backward */
  4275. /* TODO
  4276. if ( roll(2) ) {
  4277. for (j = 0; j < var_rank[i]; j++) {
  4278. index[j] += (count[j] - 1) * stride[j];
  4279. stride[j] = -stride[j];
  4280. }
  4281. }
  4282. */
  4283. if (var_rank[i] > 0) {
  4284. j = var_rank[i] - 1;
  4285. imap[j] = 1;
  4286. for (; j > 0; j--)
  4287. imap[j-1] = imap[j] * count[j];
  4288. }
  4289. allInExtRange = allInIntRange = 1;
  4290. for (j = 0; j < nels; j++) {
  4291. err = toMixedBase(j, var_rank[i], count, index2);
  4292. IF (err)
  4293. error("error in toMixedBase 1");
  4294. for (d = 0; d < var_rank[i]; d++)
  4295. index2[d] = index[d] + index2[d] * stride[d];
  4296. expect[j] = hash4(var_type[i], var_rank[i], index2,
  4297. NCT_UCHAR);
  4298. if (inRange3(expect[j],var_type[i],NCT_UCHAR)) {
  4299. allInIntRange = allInIntRange && expect[j] >= uchar_min
  4300. && expect[j] <= uchar_max;
  4301. } else {
  4302. allInExtRange = 0;
  4303. }
  4304. }
  4305. if (var_rank[i] == 0 && i%2 )
  4306. err = nc_get_varm_uchar(ncid,i,NULL,NULL,NULL,NULL,value);
  4307. else
  4308. err = nc_get_varm_uchar(ncid,i,index,count,stride,imap,value);
  4309. if (canConvert) {
  4310. if (allInExtRange) {
  4311. if (allInIntRange) {
  4312. IF (err)
  4313. error("%s", nc_strerror(err));
  4314. } else {
  4315. IF (err != NC_ERANGE)
  4316. error("Range error: status = %d", err);
  4317. }
  4318. } else {
  4319. IF (err != 0 && err != NC_ERANGE)
  4320. error("OK or Range error: status = %d", err);
  4321. }
  4322. for (j = 0; j < nels; j++) {
  4323. if (inRange3(expect[j],var_type[i],NCT_UCHAR)
  4324. && expect[j] >= uchar_min
  4325. && expect[j] <= uchar_max) {
  4326. IF (!equal(value[j],expect[j],var_type[i],
  4327. NCT_UCHAR)){
  4328. error("value read not that expected");
  4329. if (verbose) {
  4330. error("\n");
  4331. error("varid: %d, ", i);
  4332. error("var_name: %s, ", var_name[i]);
  4333. error("element number: %d ", j);
  4334. error("expect: %g, ", expect[j]);
  4335. error("got: %g", (double) value[j]);
  4336. }
  4337. } else {
  4338. nok++;
  4339. }
  4340. }
  4341. }
  4342. } else {
  4343. IF (nels > 0 && err != NC_ECHAR)
  4344. error("wrong type: status = %d", err);
  4345. }
  4346. }
  4347. }
  4348. }
  4349. err = nc_close(ncid);
  4350. IF (err)
  4351. error("nc_close: %s", nc_strerror(err));
  4352. print_nok(nok);
  4353. }
  4354. void
  4355. test_nc_get_varm_schar(void)
  4356. {
  4357. int ncid;
  4358. int d;
  4359. int i;
  4360. int j;
  4361. int k;
  4362. int m;
  4363. int err;
  4364. int allInExtRange; /* all values within external range? */
  4365. int allInIntRange; /* all values within internal range? */
  4366. int nels;
  4367. int nslabs;
  4368. int nstarts; /* number of different starts */
  4369. int nok = 0; /* count of valid comparisons */
  4370. size_t start[MAX_RANK];
  4371. size_t edge[MAX_RANK];
  4372. size_t index[MAX_RANK];
  4373. size_t index2[MAX_RANK];
  4374. size_t mid[MAX_RANK];
  4375. size_t count[MAX_RANK];
  4376. size_t sstride[MAX_RANK];
  4377. ptrdiff_t stride[MAX_RANK];
  4378. ptrdiff_t imap[MAX_RANK];
  4379. int canConvert; /* Both text or both numeric */
  4380. schar value[MAX_NELS];
  4381. double expect[MAX_NELS];
  4382. err = nc_open(testfile, NC_NOWRITE, &ncid);
  4383. IF (err)
  4384. error("nc_open: %s", nc_strerror(err));
  4385. for (i = 0; i < NVARS; i++) {
  4386. canConvert = (var_type[i] == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
  4387. assert(var_rank[i] <= MAX_RANK);
  4388. assert(var_nels[i] <= MAX_NELS);
  4389. for (j = 0; j < var_rank[i]; j++) {
  4390. start[j] = 0;
  4391. edge[j] = 1;
  4392. stride[j] = 1;
  4393. imap[j] = 1;
  4394. }
  4395. err = nc_get_varm_schar(BAD_ID, i, start, edge, stride, imap, value);
  4396. IF (err != NC_EBADID)
  4397. error("bad ncid: status = %d", err);
  4398. err = nc_get_varm_schar(ncid, BAD_VARID, start, edge, stride, imap, value);
  4399. IF (err != NC_ENOTVAR)
  4400. error("bad var id: status = %d", err);
  4401. for (j = 0; j < var_rank[i]; j++) {
  4402. start[j] = var_shape[i][j];
  4403. err = nc_get_varm_schar(ncid, i, start, edge, stride, imap, value);
  4404. if(!canConvert) {
  4405. IF (err != NC_ECHAR)
  4406. error("conversion: status = %d", err);
  4407. } else {
  4408. IF (err != NC_EINVALCOORDS)
  4409. error("bad index: status = %d", err);
  4410. start[j] = 0;
  4411. edge[j] = var_shape[i][j] + 1;
  4412. err = nc_get_varm_schar(ncid, i, start, edge, stride, imap, value);
  4413. IF (err != NC_EEDGE)
  4414. error("bad edge: status = %d", err);
  4415. edge[j] = 1;
  4416. stride[j] = 0;
  4417. err = nc_get_varm_schar(ncid, i, start, edge, stride, imap, value);
  4418. IF (err != NC_ESTRIDE)
  4419. error("bad stride: status = %d", err);
  4420. stride[j] = 1;
  4421. }
  4422. }
  4423. /* Choose a random point dividing each dim into 2 parts */
  4424. /* get 2^rank (nslabs) slabs so defined */
  4425. nslabs = 1;
  4426. for (j = 0; j < var_rank[i]; j++) {
  4427. mid[j] = roll( var_shape[i][j] );
  4428. nslabs *= 2;
  4429. }
  4430. /* bits of k determine whether to get lower or upper part of dim */
  4431. /* choose random stride from 1 to edge */
  4432. for (k = 0; k < nslabs; k++) {
  4433. nstarts = 1;
  4434. for (j = 0; j < var_rank[i]; j++) {
  4435. if ((k >> j) & 1) {
  4436. start[j] = 0;
  4437. edge[j] = mid[j];
  4438. }else{
  4439. start[j] = mid[j];
  4440. edge[j] = var_shape[i][j] - mid[j];
  4441. }
  4442. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  4443. nstarts *= stride[j];
  4444. }
  4445. for (m = 0; m < nstarts; m++) {
  4446. err = toMixedBase(m, var_rank[i], sstride, index);
  4447. IF (err)
  4448. error("error in toMixedBase");
  4449. nels = 1;
  4450. for (j = 0; j < var_rank[i]; j++) {
  4451. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  4452. nels *= count[j];
  4453. index[j] += start[j];
  4454. }
  4455. /* Random choice of forward or backward */
  4456. /* TODO
  4457. if ( roll(2) ) {
  4458. for (j = 0; j < var_rank[i]; j++) {
  4459. index[j] += (count[j] - 1) * stride[j];
  4460. stride[j] = -stride[j];
  4461. }
  4462. }
  4463. */
  4464. if (var_rank[i] > 0) {
  4465. j = var_rank[i] - 1;
  4466. imap[j] = 1;
  4467. for (; j > 0; j--)
  4468. imap[j-1] = imap[j] * count[j];
  4469. }
  4470. allInExtRange = allInIntRange = 1;
  4471. for (j = 0; j < nels; j++) {
  4472. err = toMixedBase(j, var_rank[i], count, index2);
  4473. IF (err)
  4474. error("error in toMixedBase 1");
  4475. for (d = 0; d < var_rank[i]; d++)
  4476. index2[d] = index[d] + index2[d] * stride[d];
  4477. expect[j] = hash4(var_type[i], var_rank[i], index2,
  4478. NCT_SCHAR);
  4479. if (inRange3(expect[j],var_type[i],NCT_SCHAR)) {
  4480. allInIntRange = allInIntRange && expect[j] >= schar_min
  4481. && expect[j] <= schar_max;
  4482. } else {
  4483. allInExtRange = 0;
  4484. }
  4485. }
  4486. if (var_rank[i] == 0 && i%2 )
  4487. err = nc_get_varm_schar(ncid,i,NULL,NULL,NULL,NULL,value);
  4488. else
  4489. err = nc_get_varm_schar(ncid,i,index,count,stride,imap,value);
  4490. if (canConvert) {
  4491. if (allInExtRange) {
  4492. if (allInIntRange) {
  4493. IF (err)
  4494. error("%s", nc_strerror(err));
  4495. } else {
  4496. IF (err != NC_ERANGE)
  4497. error("Range error: status = %d", err);
  4498. }
  4499. } else {
  4500. IF (err != 0 && err != NC_ERANGE)
  4501. error("OK or Range error: status = %d", err);
  4502. }
  4503. for (j = 0; j < nels; j++) {
  4504. if (inRange3(expect[j],var_type[i],NCT_SCHAR)
  4505. && expect[j] >= schar_min
  4506. && expect[j] <= schar_max) {
  4507. IF (!equal(value[j],expect[j],var_type[i],
  4508. NCT_SCHAR)){
  4509. error("value read not that expected");
  4510. if (verbose) {
  4511. error("\n");
  4512. error("varid: %d, ", i);
  4513. error("var_name: %s, ", var_name[i]);
  4514. error("element number: %d ", j);
  4515. error("expect: %g, ", expect[j]);
  4516. error("got: %g", (double) value[j]);
  4517. }
  4518. } else {
  4519. nok++;
  4520. }
  4521. }
  4522. }
  4523. } else {
  4524. IF (nels > 0 && err != NC_ECHAR)
  4525. error("wrong type: status = %d", err);
  4526. }
  4527. }
  4528. }
  4529. }
  4530. err = nc_close(ncid);
  4531. IF (err)
  4532. error("nc_close: %s", nc_strerror(err));
  4533. print_nok(nok);
  4534. }
  4535. void
  4536. test_nc_get_varm_short(void)
  4537. {
  4538. int ncid;
  4539. int d;
  4540. int i;
  4541. int j;
  4542. int k;
  4543. int m;
  4544. int err;
  4545. int allInExtRange; /* all values within external range? */
  4546. int allInIntRange; /* all values within internal range? */
  4547. int nels;
  4548. int nslabs;
  4549. int nstarts; /* number of different starts */
  4550. int nok = 0; /* count of valid comparisons */
  4551. size_t start[MAX_RANK];
  4552. size_t edge[MAX_RANK];
  4553. size_t index[MAX_RANK];
  4554. size_t index2[MAX_RANK];
  4555. size_t mid[MAX_RANK];
  4556. size_t count[MAX_RANK];
  4557. size_t sstride[MAX_RANK];
  4558. ptrdiff_t stride[MAX_RANK];
  4559. ptrdiff_t imap[MAX_RANK];
  4560. int canConvert; /* Both text or both numeric */
  4561. short value[MAX_NELS];
  4562. double expect[MAX_NELS];
  4563. err = nc_open(testfile, NC_NOWRITE, &ncid);
  4564. IF (err)
  4565. error("nc_open: %s", nc_strerror(err));
  4566. for (i = 0; i < NVARS; i++) {
  4567. canConvert = (var_type[i] == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
  4568. assert(var_rank[i] <= MAX_RANK);
  4569. assert(var_nels[i] <= MAX_NELS);
  4570. for (j = 0; j < var_rank[i]; j++) {
  4571. start[j] = 0;
  4572. edge[j] = 1;
  4573. stride[j] = 1;
  4574. imap[j] = 1;
  4575. }
  4576. err = nc_get_varm_short(BAD_ID, i, start, edge, stride, imap, value);
  4577. IF (err != NC_EBADID)
  4578. error("bad ncid: status = %d", err);
  4579. err = nc_get_varm_short(ncid, BAD_VARID, start, edge, stride, imap, value);
  4580. IF (err != NC_ENOTVAR)
  4581. error("bad var id: status = %d", err);
  4582. for (j = 0; j < var_rank[i]; j++) {
  4583. start[j] = var_shape[i][j];
  4584. err = nc_get_varm_short(ncid, i, start, edge, stride, imap, value);
  4585. if(!canConvert) {
  4586. IF (err != NC_ECHAR)
  4587. error("conversion: status = %d", err);
  4588. } else {
  4589. IF (err != NC_EINVALCOORDS)
  4590. error("bad index: status = %d", err);
  4591. start[j] = 0;
  4592. edge[j] = var_shape[i][j] + 1;
  4593. err = nc_get_varm_short(ncid, i, start, edge, stride, imap, value);
  4594. IF (err != NC_EEDGE)
  4595. error("bad edge: status = %d", err);
  4596. edge[j] = 1;
  4597. stride[j] = 0;
  4598. err = nc_get_varm_short(ncid, i, start, edge, stride, imap, value);
  4599. IF (err != NC_ESTRIDE)
  4600. error("bad stride: status = %d", err);
  4601. stride[j] = 1;
  4602. }
  4603. }
  4604. /* Choose a random point dividing each dim into 2 parts */
  4605. /* get 2^rank (nslabs) slabs so defined */
  4606. nslabs = 1;
  4607. for (j = 0; j < var_rank[i]; j++) {
  4608. mid[j] = roll( var_shape[i][j] );
  4609. nslabs *= 2;
  4610. }
  4611. /* bits of k determine whether to get lower or upper part of dim */
  4612. /* choose random stride from 1 to edge */
  4613. for (k = 0; k < nslabs; k++) {
  4614. nstarts = 1;
  4615. for (j = 0; j < var_rank[i]; j++) {
  4616. if ((k >> j) & 1) {
  4617. start[j] = 0;
  4618. edge[j] = mid[j];
  4619. }else{
  4620. start[j] = mid[j];
  4621. edge[j] = var_shape[i][j] - mid[j];
  4622. }
  4623. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  4624. nstarts *= stride[j];
  4625. }
  4626. for (m = 0; m < nstarts; m++) {
  4627. err = toMixedBase(m, var_rank[i], sstride, index);
  4628. IF (err)
  4629. error("error in toMixedBase");
  4630. nels = 1;
  4631. for (j = 0; j < var_rank[i]; j++) {
  4632. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  4633. nels *= count[j];
  4634. index[j] += start[j];
  4635. }
  4636. /* Random choice of forward or backward */
  4637. /* TODO
  4638. if ( roll(2) ) {
  4639. for (j = 0; j < var_rank[i]; j++) {
  4640. index[j] += (count[j] - 1) * stride[j];
  4641. stride[j] = -stride[j];
  4642. }
  4643. }
  4644. */
  4645. if (var_rank[i] > 0) {
  4646. j = var_rank[i] - 1;
  4647. imap[j] = 1;
  4648. for (; j > 0; j--)
  4649. imap[j-1] = imap[j] * count[j];
  4650. }
  4651. allInExtRange = allInIntRange = 1;
  4652. for (j = 0; j < nels; j++) {
  4653. err = toMixedBase(j, var_rank[i], count, index2);
  4654. IF (err)
  4655. error("error in toMixedBase 1");
  4656. for (d = 0; d < var_rank[i]; d++)
  4657. index2[d] = index[d] + index2[d] * stride[d];
  4658. expect[j] = hash4(var_type[i], var_rank[i], index2,
  4659. NCT_SHORT);
  4660. if (inRange3(expect[j],var_type[i],NCT_SHORT)) {
  4661. allInIntRange = allInIntRange && expect[j] >= short_min
  4662. && expect[j] <= short_max;
  4663. } else {
  4664. allInExtRange = 0;
  4665. }
  4666. }
  4667. if (var_rank[i] == 0 && i%2 )
  4668. err = nc_get_varm_short(ncid,i,NULL,NULL,NULL,NULL,value);
  4669. else
  4670. err = nc_get_varm_short(ncid,i,index,count,stride,imap,value);
  4671. if (canConvert) {
  4672. if (allInExtRange) {
  4673. if (allInIntRange) {
  4674. IF (err)
  4675. error("%s", nc_strerror(err));
  4676. } else {
  4677. IF (err != NC_ERANGE)
  4678. error("Range error: status = %d", err);
  4679. }
  4680. } else {
  4681. IF (err != 0 && err != NC_ERANGE)
  4682. error("OK or Range error: status = %d", err);
  4683. }
  4684. for (j = 0; j < nels; j++) {
  4685. if (inRange3(expect[j],var_type[i],NCT_SHORT)
  4686. && expect[j] >= short_min
  4687. && expect[j] <= short_max) {
  4688. IF (!equal(value[j],expect[j],var_type[i],
  4689. NCT_SHORT)){
  4690. error("value read not that expected");
  4691. if (verbose) {
  4692. error("\n");
  4693. error("varid: %d, ", i);
  4694. error("var_name: %s, ", var_name[i]);
  4695. error("element number: %d ", j);
  4696. error("expect: %g, ", expect[j]);
  4697. error("got: %g", (double) value[j]);
  4698. }
  4699. } else {
  4700. nok++;
  4701. }
  4702. }
  4703. }
  4704. } else {
  4705. IF (nels > 0 && err != NC_ECHAR)
  4706. error("wrong type: status = %d", err);
  4707. }
  4708. }
  4709. }
  4710. }
  4711. err = nc_close(ncid);
  4712. IF (err)
  4713. error("nc_close: %s", nc_strerror(err));
  4714. print_nok(nok);
  4715. }
  4716. void
  4717. test_nc_get_varm_int(void)
  4718. {
  4719. int ncid;
  4720. int d;
  4721. int i;
  4722. int j;
  4723. int k;
  4724. int m;
  4725. int err;
  4726. int allInExtRange; /* all values within external range? */
  4727. int allInIntRange; /* all values within internal range? */
  4728. int nels;
  4729. int nslabs;
  4730. int nstarts; /* number of different starts */
  4731. int nok = 0; /* count of valid comparisons */
  4732. size_t start[MAX_RANK];
  4733. size_t edge[MAX_RANK];
  4734. size_t index[MAX_RANK];
  4735. size_t index2[MAX_RANK];
  4736. size_t mid[MAX_RANK];
  4737. size_t count[MAX_RANK];
  4738. size_t sstride[MAX_RANK];
  4739. ptrdiff_t stride[MAX_RANK];
  4740. ptrdiff_t imap[MAX_RANK];
  4741. int canConvert; /* Both text or both numeric */
  4742. int value[MAX_NELS];
  4743. double expect[MAX_NELS];
  4744. err = nc_open(testfile, NC_NOWRITE, &ncid);
  4745. IF (err)
  4746. error("nc_open: %s", nc_strerror(err));
  4747. for (i = 0; i < NVARS; i++) {
  4748. canConvert = (var_type[i] == NC_CHAR) == (NCT_INT == NCT_TEXT);
  4749. assert(var_rank[i] <= MAX_RANK);
  4750. assert(var_nels[i] <= MAX_NELS);
  4751. for (j = 0; j < var_rank[i]; j++) {
  4752. start[j] = 0;
  4753. edge[j] = 1;
  4754. stride[j] = 1;
  4755. imap[j] = 1;
  4756. }
  4757. err = nc_get_varm_int(BAD_ID, i, start, edge, stride, imap, value);
  4758. IF (err != NC_EBADID)
  4759. error("bad ncid: status = %d", err);
  4760. err = nc_get_varm_int(ncid, BAD_VARID, start, edge, stride, imap, value);
  4761. IF (err != NC_ENOTVAR)
  4762. error("bad var id: status = %d", err);
  4763. for (j = 0; j < var_rank[i]; j++) {
  4764. start[j] = var_shape[i][j];
  4765. err = nc_get_varm_int(ncid, i, start, edge, stride, imap, value);
  4766. if(!canConvert) {
  4767. IF (err != NC_ECHAR)
  4768. error("conversion: status = %d", err);
  4769. } else {
  4770. IF (err != NC_EINVALCOORDS)
  4771. error("bad index: status = %d", err);
  4772. start[j] = 0;
  4773. edge[j] = var_shape[i][j] + 1;
  4774. err = nc_get_varm_int(ncid, i, start, edge, stride, imap, value);
  4775. IF (err != NC_EEDGE)
  4776. error("bad edge: status = %d", err);
  4777. edge[j] = 1;
  4778. stride[j] = 0;
  4779. err = nc_get_varm_int(ncid, i, start, edge, stride, imap, value);
  4780. IF (err != NC_ESTRIDE)
  4781. error("bad stride: status = %d", err);
  4782. stride[j] = 1;
  4783. }
  4784. }
  4785. /* Choose a random point dividing each dim into 2 parts */
  4786. /* get 2^rank (nslabs) slabs so defined */
  4787. nslabs = 1;
  4788. for (j = 0; j < var_rank[i]; j++) {
  4789. mid[j] = roll( var_shape[i][j] );
  4790. nslabs *= 2;
  4791. }
  4792. /* bits of k determine whether to get lower or upper part of dim */
  4793. /* choose random stride from 1 to edge */
  4794. for (k = 0; k < nslabs; k++) {
  4795. nstarts = 1;
  4796. for (j = 0; j < var_rank[i]; j++) {
  4797. if ((k >> j) & 1) {
  4798. start[j] = 0;
  4799. edge[j] = mid[j];
  4800. }else{
  4801. start[j] = mid[j];
  4802. edge[j] = var_shape[i][j] - mid[j];
  4803. }
  4804. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  4805. nstarts *= stride[j];
  4806. }
  4807. for (m = 0; m < nstarts; m++) {
  4808. err = toMixedBase(m, var_rank[i], sstride, index);
  4809. IF (err)
  4810. error("error in toMixedBase");
  4811. nels = 1;
  4812. for (j = 0; j < var_rank[i]; j++) {
  4813. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  4814. nels *= count[j];
  4815. index[j] += start[j];
  4816. }
  4817. /* Random choice of forward or backward */
  4818. /* TODO
  4819. if ( roll(2) ) {
  4820. for (j = 0; j < var_rank[i]; j++) {
  4821. index[j] += (count[j] - 1) * stride[j];
  4822. stride[j] = -stride[j];
  4823. }
  4824. }
  4825. */
  4826. if (var_rank[i] > 0) {
  4827. j = var_rank[i] - 1;
  4828. imap[j] = 1;
  4829. for (; j > 0; j--)
  4830. imap[j-1] = imap[j] * count[j];
  4831. }
  4832. allInExtRange = allInIntRange = 1;
  4833. for (j = 0; j < nels; j++) {
  4834. err = toMixedBase(j, var_rank[i], count, index2);
  4835. IF (err)
  4836. error("error in toMixedBase 1");
  4837. for (d = 0; d < var_rank[i]; d++)
  4838. index2[d] = index[d] + index2[d] * stride[d];
  4839. expect[j] = hash4(var_type[i], var_rank[i], index2,
  4840. NCT_INT);
  4841. if (inRange3(expect[j],var_type[i],NCT_INT)) {
  4842. allInIntRange = allInIntRange && expect[j] >= int_min
  4843. && expect[j] <= int_max;
  4844. } else {
  4845. allInExtRange = 0;
  4846. }
  4847. }
  4848. if (var_rank[i] == 0 && i%2 )
  4849. err = nc_get_varm_int(ncid,i,NULL,NULL,NULL,NULL,value);
  4850. else
  4851. err = nc_get_varm_int(ncid,i,index,count,stride,imap,value);
  4852. if (canConvert) {
  4853. if (allInExtRange) {
  4854. if (allInIntRange) {
  4855. IF (err)
  4856. error("%s", nc_strerror(err));
  4857. } else {
  4858. IF (err != NC_ERANGE)
  4859. error("Range error: status = %d", err);
  4860. }
  4861. } else {
  4862. IF (err != 0 && err != NC_ERANGE)
  4863. error("OK or Range error: status = %d", err);
  4864. }
  4865. for (j = 0; j < nels; j++) {
  4866. if (inRange3(expect[j],var_type[i],NCT_INT)
  4867. && expect[j] >= int_min
  4868. && expect[j] <= int_max) {
  4869. IF (!equal(value[j],expect[j],var_type[i],
  4870. NCT_INT)){
  4871. error("value read not that expected");
  4872. if (verbose) {
  4873. error("\n");
  4874. error("varid: %d, ", i);
  4875. error("var_name: %s, ", var_name[i]);
  4876. error("element number: %d ", j);
  4877. error("expect: %g, ", expect[j]);
  4878. error("got: %g", (double) value[j]);
  4879. }
  4880. } else {
  4881. nok++;
  4882. }
  4883. }
  4884. }
  4885. } else {
  4886. IF (nels > 0 && err != NC_ECHAR)
  4887. error("wrong type: status = %d", err);
  4888. }
  4889. }
  4890. }
  4891. }
  4892. err = nc_close(ncid);
  4893. IF (err)
  4894. error("nc_close: %s", nc_strerror(err));
  4895. print_nok(nok);
  4896. }
  4897. void
  4898. test_nc_get_varm_long(void)
  4899. {
  4900. int ncid;
  4901. int d;
  4902. int i;
  4903. int j;
  4904. int k;
  4905. int m;
  4906. int err;
  4907. int allInExtRange; /* all values within external range? */
  4908. int allInIntRange; /* all values within internal range? */
  4909. int nels;
  4910. int nslabs;
  4911. int nstarts; /* number of different starts */
  4912. int nok = 0; /* count of valid comparisons */
  4913. size_t start[MAX_RANK];
  4914. size_t edge[MAX_RANK];
  4915. size_t index[MAX_RANK];
  4916. size_t index2[MAX_RANK];
  4917. size_t mid[MAX_RANK];
  4918. size_t count[MAX_RANK];
  4919. size_t sstride[MAX_RANK];
  4920. ptrdiff_t stride[MAX_RANK];
  4921. ptrdiff_t imap[MAX_RANK];
  4922. int canConvert; /* Both text or both numeric */
  4923. long value[MAX_NELS];
  4924. double expect[MAX_NELS];
  4925. err = nc_open(testfile, NC_NOWRITE, &ncid);
  4926. IF (err)
  4927. error("nc_open: %s", nc_strerror(err));
  4928. for (i = 0; i < NVARS; i++) {
  4929. canConvert = (var_type[i] == NC_CHAR) == (NCT_LONG == NCT_TEXT);
  4930. assert(var_rank[i] <= MAX_RANK);
  4931. assert(var_nels[i] <= MAX_NELS);
  4932. for (j = 0; j < var_rank[i]; j++) {
  4933. start[j] = 0;
  4934. edge[j] = 1;
  4935. stride[j] = 1;
  4936. imap[j] = 1;
  4937. }
  4938. err = nc_get_varm_long(BAD_ID, i, start, edge, stride, imap, value);
  4939. IF (err != NC_EBADID)
  4940. error("bad ncid: status = %d", err);
  4941. err = nc_get_varm_long(ncid, BAD_VARID, start, edge, stride, imap, value);
  4942. IF (err != NC_ENOTVAR)
  4943. error("bad var id: status = %d", err);
  4944. for (j = 0; j < var_rank[i]; j++) {
  4945. start[j] = var_shape[i][j];
  4946. err = nc_get_varm_long(ncid, i, start, edge, stride, imap, value);
  4947. if(!canConvert) {
  4948. IF (err != NC_ECHAR)
  4949. error("conversion: status = %d", err);
  4950. } else {
  4951. IF (err != NC_EINVALCOORDS)
  4952. error("bad index: status = %d", err);
  4953. start[j] = 0;
  4954. edge[j] = var_shape[i][j] + 1;
  4955. err = nc_get_varm_long(ncid, i, start, edge, stride, imap, value);
  4956. IF (err != NC_EEDGE)
  4957. error("bad edge: status = %d", err);
  4958. edge[j] = 1;
  4959. stride[j] = 0;
  4960. err = nc_get_varm_long(ncid, i, start, edge, stride, imap, value);
  4961. IF (err != NC_ESTRIDE)
  4962. error("bad stride: status = %d", err);
  4963. stride[j] = 1;
  4964. }
  4965. }
  4966. /* Choose a random point dividing each dim into 2 parts */
  4967. /* get 2^rank (nslabs) slabs so defined */
  4968. nslabs = 1;
  4969. for (j = 0; j < var_rank[i]; j++) {
  4970. mid[j] = roll( var_shape[i][j] );
  4971. nslabs *= 2;
  4972. }
  4973. /* bits of k determine whether to get lower or upper part of dim */
  4974. /* choose random stride from 1 to edge */
  4975. for (k = 0; k < nslabs; k++) {
  4976. nstarts = 1;
  4977. for (j = 0; j < var_rank[i]; j++) {
  4978. if ((k >> j) & 1) {
  4979. start[j] = 0;
  4980. edge[j] = mid[j];
  4981. }else{
  4982. start[j] = mid[j];
  4983. edge[j] = var_shape[i][j] - mid[j];
  4984. }
  4985. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  4986. nstarts *= stride[j];
  4987. }
  4988. for (m = 0; m < nstarts; m++) {
  4989. err = toMixedBase(m, var_rank[i], sstride, index);
  4990. IF (err)
  4991. error("error in toMixedBase");
  4992. nels = 1;
  4993. for (j = 0; j < var_rank[i]; j++) {
  4994. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  4995. nels *= count[j];
  4996. index[j] += start[j];
  4997. }
  4998. /* Random choice of forward or backward */
  4999. /* TODO
  5000. if ( roll(2) ) {
  5001. for (j = 0; j < var_rank[i]; j++) {
  5002. index[j] += (count[j] - 1) * stride[j];
  5003. stride[j] = -stride[j];
  5004. }
  5005. }
  5006. */
  5007. if (var_rank[i] > 0) {
  5008. j = var_rank[i] - 1;
  5009. imap[j] = 1;
  5010. for (; j > 0; j--)
  5011. imap[j-1] = imap[j] * count[j];
  5012. }
  5013. allInExtRange = allInIntRange = 1;
  5014. for (j = 0; j < nels; j++) {
  5015. err = toMixedBase(j, var_rank[i], count, index2);
  5016. IF (err)
  5017. error("error in toMixedBase 1");
  5018. for (d = 0; d < var_rank[i]; d++)
  5019. index2[d] = index[d] + index2[d] * stride[d];
  5020. expect[j] = hash4(var_type[i], var_rank[i], index2,
  5021. NCT_LONG);
  5022. if (inRange3(expect[j],var_type[i],NCT_LONG)) {
  5023. allInIntRange = allInIntRange && expect[j] >= long_min
  5024. && expect[j] <= long_max;
  5025. } else {
  5026. allInExtRange = 0;
  5027. }
  5028. }
  5029. if (var_rank[i] == 0 && i%2 )
  5030. err = nc_get_varm_long(ncid,i,NULL,NULL,NULL,NULL,value);
  5031. else
  5032. err = nc_get_varm_long(ncid,i,index,count,stride,imap,value);
  5033. if (canConvert) {
  5034. if (allInExtRange) {
  5035. if (allInIntRange) {
  5036. IF (err)
  5037. error("%s", nc_strerror(err));
  5038. } else {
  5039. IF (err != NC_ERANGE)
  5040. error("Range error: status = %d", err);
  5041. }
  5042. } else {
  5043. IF (err != 0 && err != NC_ERANGE)
  5044. error("OK or Range error: status = %d", err);
  5045. }
  5046. for (j = 0; j < nels; j++) {
  5047. if (inRange3(expect[j],var_type[i],NCT_LONG)
  5048. && expect[j] >= long_min
  5049. && expect[j] <= long_max) {
  5050. IF (!equal(value[j],expect[j],var_type[i],
  5051. NCT_LONG)){
  5052. error("value read not that expected");
  5053. if (verbose) {
  5054. error("\n");
  5055. error("varid: %d, ", i);
  5056. error("var_name: %s, ", var_name[i]);
  5057. error("element number: %d ", j);
  5058. error("expect: %g, ", expect[j]);
  5059. error("got: %g", (double) value[j]);
  5060. }
  5061. } else {
  5062. nok++;
  5063. }
  5064. }
  5065. }
  5066. } else {
  5067. IF (nels > 0 && err != NC_ECHAR)
  5068. error("wrong type: status = %d", err);
  5069. }
  5070. }
  5071. }
  5072. }
  5073. err = nc_close(ncid);
  5074. IF (err)
  5075. error("nc_close: %s", nc_strerror(err));
  5076. print_nok(nok);
  5077. }
  5078. void
  5079. test_nc_get_varm_float(void)
  5080. {
  5081. int ncid;
  5082. int d;
  5083. int i;
  5084. int j;
  5085. int k;
  5086. int m;
  5087. int err;
  5088. int allInExtRange; /* all values within external range? */
  5089. int allInIntRange; /* all values within internal range? */
  5090. int nels;
  5091. int nslabs;
  5092. int nstarts; /* number of different starts */
  5093. int nok = 0; /* count of valid comparisons */
  5094. size_t start[MAX_RANK];
  5095. size_t edge[MAX_RANK];
  5096. size_t index[MAX_RANK];
  5097. size_t index2[MAX_RANK];
  5098. size_t mid[MAX_RANK];
  5099. size_t count[MAX_RANK];
  5100. size_t sstride[MAX_RANK];
  5101. ptrdiff_t stride[MAX_RANK];
  5102. ptrdiff_t imap[MAX_RANK];
  5103. int canConvert; /* Both text or both numeric */
  5104. float value[MAX_NELS];
  5105. double expect[MAX_NELS];
  5106. err = nc_open(testfile, NC_NOWRITE, &ncid);
  5107. IF (err)
  5108. error("nc_open: %s", nc_strerror(err));
  5109. for (i = 0; i < NVARS; i++) {
  5110. canConvert = (var_type[i] == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
  5111. assert(var_rank[i] <= MAX_RANK);
  5112. assert(var_nels[i] <= MAX_NELS);
  5113. for (j = 0; j < var_rank[i]; j++) {
  5114. start[j] = 0;
  5115. edge[j] = 1;
  5116. stride[j] = 1;
  5117. imap[j] = 1;
  5118. }
  5119. err = nc_get_varm_float(BAD_ID, i, start, edge, stride, imap, value);
  5120. IF (err != NC_EBADID)
  5121. error("bad ncid: status = %d", err);
  5122. err = nc_get_varm_float(ncid, BAD_VARID, start, edge, stride, imap, value);
  5123. IF (err != NC_ENOTVAR)
  5124. error("bad var id: status = %d", err);
  5125. for (j = 0; j < var_rank[i]; j++) {
  5126. start[j] = var_shape[i][j];
  5127. err = nc_get_varm_float(ncid, i, start, edge, stride, imap, value);
  5128. if(!canConvert) {
  5129. IF (err != NC_ECHAR)
  5130. error("conversion: status = %d", err);
  5131. } else {
  5132. IF (err != NC_EINVALCOORDS)
  5133. error("bad index: status = %d", err);
  5134. start[j] = 0;
  5135. edge[j] = var_shape[i][j] + 1;
  5136. err = nc_get_varm_float(ncid, i, start, edge, stride, imap, value);
  5137. IF (err != NC_EEDGE)
  5138. error("bad edge: status = %d", err);
  5139. edge[j] = 1;
  5140. stride[j] = 0;
  5141. err = nc_get_varm_float(ncid, i, start, edge, stride, imap, value);
  5142. IF (err != NC_ESTRIDE)
  5143. error("bad stride: status = %d", err);
  5144. stride[j] = 1;
  5145. }
  5146. }
  5147. /* Choose a random point dividing each dim into 2 parts */
  5148. /* get 2^rank (nslabs) slabs so defined */
  5149. nslabs = 1;
  5150. for (j = 0; j < var_rank[i]; j++) {
  5151. mid[j] = roll( var_shape[i][j] );
  5152. nslabs *= 2;
  5153. }
  5154. /* bits of k determine whether to get lower or upper part of dim */
  5155. /* choose random stride from 1 to edge */
  5156. for (k = 0; k < nslabs; k++) {
  5157. nstarts = 1;
  5158. for (j = 0; j < var_rank[i]; j++) {
  5159. if ((k >> j) & 1) {
  5160. start[j] = 0;
  5161. edge[j] = mid[j];
  5162. }else{
  5163. start[j] = mid[j];
  5164. edge[j] = var_shape[i][j] - mid[j];
  5165. }
  5166. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  5167. nstarts *= stride[j];
  5168. }
  5169. for (m = 0; m < nstarts; m++) {
  5170. err = toMixedBase(m, var_rank[i], sstride, index);
  5171. IF (err)
  5172. error("error in toMixedBase");
  5173. nels = 1;
  5174. for (j = 0; j < var_rank[i]; j++) {
  5175. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  5176. nels *= count[j];
  5177. index[j] += start[j];
  5178. }
  5179. /* Random choice of forward or backward */
  5180. /* TODO
  5181. if ( roll(2) ) {
  5182. for (j = 0; j < var_rank[i]; j++) {
  5183. index[j] += (count[j] - 1) * stride[j];
  5184. stride[j] = -stride[j];
  5185. }
  5186. }
  5187. */
  5188. if (var_rank[i] > 0) {
  5189. j = var_rank[i] - 1;
  5190. imap[j] = 1;
  5191. for (; j > 0; j--)
  5192. imap[j-1] = imap[j] * count[j];
  5193. }
  5194. allInExtRange = allInIntRange = 1;
  5195. for (j = 0; j < nels; j++) {
  5196. err = toMixedBase(j, var_rank[i], count, index2);
  5197. IF (err)
  5198. error("error in toMixedBase 1");
  5199. for (d = 0; d < var_rank[i]; d++)
  5200. index2[d] = index[d] + index2[d] * stride[d];
  5201. expect[j] = hash4(var_type[i], var_rank[i], index2,
  5202. NCT_FLOAT);
  5203. if (inRange3(expect[j],var_type[i],NCT_FLOAT)) {
  5204. allInIntRange = allInIntRange && expect[j] >= float_min
  5205. && expect[j] <= float_max;
  5206. } else {
  5207. allInExtRange = 0;
  5208. }
  5209. }
  5210. if (var_rank[i] == 0 && i%2 )
  5211. err = nc_get_varm_float(ncid,i,NULL,NULL,NULL,NULL,value);
  5212. else
  5213. err = nc_get_varm_float(ncid,i,index,count,stride,imap,value);
  5214. if (canConvert) {
  5215. if (allInExtRange) {
  5216. if (allInIntRange) {
  5217. IF (err)
  5218. error("%s", nc_strerror(err));
  5219. } else {
  5220. IF (err != NC_ERANGE)
  5221. error("Range error: status = %d", err);
  5222. }
  5223. } else {
  5224. IF (err != 0 && err != NC_ERANGE)
  5225. error("OK or Range error: status = %d", err);
  5226. }
  5227. for (j = 0; j < nels; j++) {
  5228. if (inRange3(expect[j],var_type[i],NCT_FLOAT)
  5229. && expect[j] >= float_min
  5230. && expect[j] <= float_max) {
  5231. IF (!equal(value[j],expect[j],var_type[i],
  5232. NCT_FLOAT)){
  5233. error("value read not that expected");
  5234. if (verbose) {
  5235. error("\n");
  5236. error("varid: %d, ", i);
  5237. error("var_name: %s, ", var_name[i]);
  5238. error("element number: %d ", j);
  5239. error("expect: %g, ", expect[j]);
  5240. error("got: %g", (double) value[j]);
  5241. }
  5242. } else {
  5243. nok++;
  5244. }
  5245. }
  5246. }
  5247. } else {
  5248. IF (nels > 0 && err != NC_ECHAR)
  5249. error("wrong type: status = %d", err);
  5250. }
  5251. }
  5252. }
  5253. }
  5254. err = nc_close(ncid);
  5255. IF (err)
  5256. error("nc_close: %s", nc_strerror(err));
  5257. print_nok(nok);
  5258. }
  5259. void
  5260. test_nc_get_varm_double(void)
  5261. {
  5262. int ncid;
  5263. int d;
  5264. int i;
  5265. int j;
  5266. int k;
  5267. int m;
  5268. int err;
  5269. int allInExtRange; /* all values within external range? */
  5270. int allInIntRange; /* all values within internal range? */
  5271. int nels;
  5272. int nslabs;
  5273. int nstarts; /* number of different starts */
  5274. int nok = 0; /* count of valid comparisons */
  5275. size_t start[MAX_RANK];
  5276. size_t edge[MAX_RANK];
  5277. size_t index[MAX_RANK];
  5278. size_t index2[MAX_RANK];
  5279. size_t mid[MAX_RANK];
  5280. size_t count[MAX_RANK];
  5281. size_t sstride[MAX_RANK];
  5282. ptrdiff_t stride[MAX_RANK];
  5283. ptrdiff_t imap[MAX_RANK];
  5284. int canConvert; /* Both text or both numeric */
  5285. double value[MAX_NELS];
  5286. double expect[MAX_NELS];
  5287. err = nc_open(testfile, NC_NOWRITE, &ncid);
  5288. IF (err)
  5289. error("nc_open: %s", nc_strerror(err));
  5290. for (i = 0; i < NVARS; i++) {
  5291. canConvert = (var_type[i] == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
  5292. assert(var_rank[i] <= MAX_RANK);
  5293. assert(var_nels[i] <= MAX_NELS);
  5294. for (j = 0; j < var_rank[i]; j++) {
  5295. start[j] = 0;
  5296. edge[j] = 1;
  5297. stride[j] = 1;
  5298. imap[j] = 1;
  5299. }
  5300. err = nc_get_varm_double(BAD_ID, i, start, edge, stride, imap, value);
  5301. IF (err != NC_EBADID)
  5302. error("bad ncid: status = %d", err);
  5303. err = nc_get_varm_double(ncid, BAD_VARID, start, edge, stride, imap, value);
  5304. IF (err != NC_ENOTVAR)
  5305. error("bad var id: status = %d", err);
  5306. for (j = 0; j < var_rank[i]; j++) {
  5307. start[j] = var_shape[i][j];
  5308. err = nc_get_varm_double(ncid, i, start, edge, stride, imap, value);
  5309. if(!canConvert) {
  5310. IF (err != NC_ECHAR)
  5311. error("conversion: status = %d", err);
  5312. } else {
  5313. IF (err != NC_EINVALCOORDS)
  5314. error("bad index: status = %d", err);
  5315. start[j] = 0;
  5316. edge[j] = var_shape[i][j] + 1;
  5317. err = nc_get_varm_double(ncid, i, start, edge, stride, imap, value);
  5318. IF (err != NC_EEDGE)
  5319. error("bad edge: status = %d", err);
  5320. edge[j] = 1;
  5321. stride[j] = 0;
  5322. err = nc_get_varm_double(ncid, i, start, edge, stride, imap, value);
  5323. IF (err != NC_ESTRIDE)
  5324. error("bad stride: status = %d", err);
  5325. stride[j] = 1;
  5326. }
  5327. }
  5328. /* Choose a random point dividing each dim into 2 parts */
  5329. /* get 2^rank (nslabs) slabs so defined */
  5330. nslabs = 1;
  5331. for (j = 0; j < var_rank[i]; j++) {
  5332. mid[j] = roll( var_shape[i][j] );
  5333. nslabs *= 2;
  5334. }
  5335. /* bits of k determine whether to get lower or upper part of dim */
  5336. /* choose random stride from 1 to edge */
  5337. for (k = 0; k < nslabs; k++) {
  5338. nstarts = 1;
  5339. for (j = 0; j < var_rank[i]; j++) {
  5340. if ((k >> j) & 1) {
  5341. start[j] = 0;
  5342. edge[j] = mid[j];
  5343. }else{
  5344. start[j] = mid[j];
  5345. edge[j] = var_shape[i][j] - mid[j];
  5346. }
  5347. sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
  5348. nstarts *= stride[j];
  5349. }
  5350. for (m = 0; m < nstarts; m++) {
  5351. err = toMixedBase(m, var_rank[i], sstride, index);
  5352. IF (err)
  5353. error("error in toMixedBase");
  5354. nels = 1;
  5355. for (j = 0; j < var_rank[i]; j++) {
  5356. count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
  5357. nels *= count[j];
  5358. index[j] += start[j];
  5359. }
  5360. /* Random choice of forward or backward */
  5361. /* TODO
  5362. if ( roll(2) ) {
  5363. for (j = 0; j < var_rank[i]; j++) {
  5364. index[j] += (count[j] - 1) * stride[j];
  5365. stride[j] = -stride[j];
  5366. }
  5367. }
  5368. */
  5369. if (var_rank[i] > 0) {
  5370. j = var_rank[i] - 1;
  5371. imap[j] = 1;
  5372. for (; j > 0; j--)
  5373. imap[j-1] = imap[j] * count[j];
  5374. }
  5375. allInExtRange = allInIntRange = 1;
  5376. for (j = 0; j < nels; j++) {
  5377. err = toMixedBase(j, var_rank[i], count, index2);
  5378. IF (err)
  5379. error("error in toMixedBase 1");
  5380. for (d = 0; d < var_rank[i]; d++)
  5381. index2[d] = index[d] + index2[d] * stride[d];
  5382. expect[j] = hash4(var_type[i], var_rank[i], index2,
  5383. NCT_DOUBLE);
  5384. if (inRange3(expect[j],var_type[i],NCT_DOUBLE)) {
  5385. allInIntRange = allInIntRange && expect[j] >= double_min
  5386. && expect[j] <= double_max;
  5387. } else {
  5388. allInExtRange = 0;
  5389. }
  5390. }
  5391. if (var_rank[i] == 0 && i%2 )
  5392. err = nc_get_varm_double(ncid,i,NULL,NULL,NULL,NULL,value);
  5393. else
  5394. err = nc_get_varm_double(ncid,i,index,count,stride,imap,value);
  5395. if (canConvert) {
  5396. if (allInExtRange) {
  5397. if (allInIntRange) {
  5398. IF (err)
  5399. error("%s", nc_strerror(err));
  5400. } else {
  5401. IF (err != NC_ERANGE)
  5402. error("Range error: status = %d", err);
  5403. }
  5404. } else {
  5405. IF (err != 0 && err != NC_ERANGE)
  5406. error("OK or Range error: status = %d", err);
  5407. }
  5408. for (j = 0; j < nels; j++) {
  5409. if (inRange3(expect[j],var_type[i],NCT_DOUBLE)
  5410. && expect[j] >= double_min
  5411. && expect[j] <= double_max) {
  5412. IF (!equal(value[j],expect[j],var_type[i],
  5413. NCT_DOUBLE)){
  5414. error("value read not that expected");
  5415. if (verbose) {
  5416. error("\n");
  5417. error("varid: %d, ", i);
  5418. error("var_name: %s, ", var_name[i]);
  5419. error("element number: %d ", j);
  5420. error("expect: %g, ", expect[j]);
  5421. error("got: %g", (double) value[j]);
  5422. }
  5423. } else {
  5424. nok++;
  5425. }
  5426. }
  5427. }
  5428. } else {
  5429. IF (nels > 0 && err != NC_ECHAR)
  5430. error("wrong type: status = %d", err);
  5431. }
  5432. }
  5433. }
  5434. }
  5435. err = nc_close(ncid);
  5436. IF (err)
  5437. error("nc_close: %s", nc_strerror(err));
  5438. print_nok(nok);
  5439. }
  5440. void
  5441. test_nc_get_att_text(void)
  5442. {
  5443. int ncid;
  5444. int i;
  5445. int j;
  5446. size_t k;
  5447. int err;
  5448. int allInExtRange;
  5449. int allInIntRange;
  5450. int canConvert; /* Both text or both numeric */
  5451. text value[MAX_NELS];
  5452. double expect[MAX_NELS];
  5453. int nok = 0; /* count of valid comparisons */
  5454. err = nc_open(testfile, NC_NOWRITE, &ncid);
  5455. IF (err)
  5456. error("nc_open: %s", nc_strerror(err));
  5457. for (i = -1; i < NVARS; i++) {
  5458. for (j = 0; j < NATTS(i); j++) {
  5459. canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_TEXT == NCT_TEXT);
  5460. err = nc_get_att_text(BAD_ID, i, ATT_NAME(i,j), value);
  5461. IF (err != NC_EBADID)
  5462. error("bad ncid: status = %d", err);
  5463. err = nc_get_att_text(ncid, BAD_VARID, ATT_NAME(i,j), value);
  5464. IF (err != NC_ENOTVAR)
  5465. error("bad var id: status = %d", err);
  5466. err = nc_get_att_text(ncid, i, "noSuch", value);
  5467. IF (err != NC_ENOTATT)
  5468. error("Bad attribute name: status = %d", err);
  5469. allInExtRange = allInIntRange = 1;
  5470. for (k = 0; k < ATT_LEN(i,j); k++) {
  5471. expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_TEXT);
  5472. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_TEXT)) {
  5473. allInIntRange = allInIntRange && expect[k] >= text_min
  5474. && expect[k] <= text_max;
  5475. } else {
  5476. allInExtRange = 0;
  5477. }
  5478. }
  5479. err = nc_get_att_text(ncid, i, ATT_NAME(i,j), value);
  5480. if (canConvert || ATT_LEN(i,j) == 0) {
  5481. if (allInExtRange) {
  5482. if (allInIntRange) {
  5483. IF (err)
  5484. error("%s", nc_strerror(err));
  5485. } else {
  5486. IF (err != NC_ERANGE)
  5487. error("Range error: status = %d", err);
  5488. }
  5489. } else {
  5490. IF (err != 0 && err != NC_ERANGE)
  5491. error("OK or Range error: status = %d", err);
  5492. }
  5493. for (k = 0; k < ATT_LEN(i,j); k++) {
  5494. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_TEXT)
  5495. && expect[k] >= text_min && expect[k] <= text_max) {
  5496. IF (!equal(value[k],expect[k],ATT_TYPE(i,j),
  5497. NCT_TEXT)){
  5498. error("value read not that expected");
  5499. if (verbose) {
  5500. error("\n");
  5501. error("varid: %d, ", i);
  5502. error("att_name: %s, ", ATT_NAME(i,j));
  5503. error("element number: %d ", k);
  5504. error("expect: %g", expect[k]);
  5505. error("got: %g", (double) value[k]);
  5506. }
  5507. } else {
  5508. nok++;
  5509. }
  5510. }
  5511. }
  5512. } else {
  5513. IF (err != NC_ECHAR)
  5514. error("wrong type: status = %d", err);
  5515. }
  5516. }
  5517. }
  5518. err = nc_close(ncid);
  5519. IF (err)
  5520. error("nc_close: %s", nc_strerror(err));
  5521. print_nok(nok);
  5522. }
  5523. void
  5524. test_nc_get_att_uchar(void)
  5525. {
  5526. int ncid;
  5527. int i;
  5528. int j;
  5529. size_t k;
  5530. int err;
  5531. int allInExtRange;
  5532. int allInIntRange;
  5533. int canConvert; /* Both text or both numeric */
  5534. uchar value[MAX_NELS];
  5535. double expect[MAX_NELS];
  5536. int nok = 0; /* count of valid comparisons */
  5537. err = nc_open(testfile, NC_NOWRITE, &ncid);
  5538. IF (err)
  5539. error("nc_open: %s", nc_strerror(err));
  5540. for (i = -1; i < NVARS; i++) {
  5541. for (j = 0; j < NATTS(i); j++) {
  5542. canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_UCHAR == NCT_TEXT);
  5543. err = nc_get_att_uchar(BAD_ID, i, ATT_NAME(i,j), value);
  5544. IF (err != NC_EBADID)
  5545. error("bad ncid: status = %d", err);
  5546. err = nc_get_att_uchar(ncid, BAD_VARID, ATT_NAME(i,j), value);
  5547. IF (err != NC_ENOTVAR)
  5548. error("bad var id: status = %d", err);
  5549. err = nc_get_att_uchar(ncid, i, "noSuch", value);
  5550. IF (err != NC_ENOTATT)
  5551. error("Bad attribute name: status = %d", err);
  5552. allInExtRange = allInIntRange = 1;
  5553. for (k = 0; k < ATT_LEN(i,j); k++) {
  5554. expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_UCHAR);
  5555. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_UCHAR)) {
  5556. allInIntRange = allInIntRange && expect[k] >= uchar_min
  5557. && expect[k] <= uchar_max;
  5558. } else {
  5559. allInExtRange = 0;
  5560. }
  5561. }
  5562. err = nc_get_att_uchar(ncid, i, ATT_NAME(i,j), value);
  5563. if (canConvert || ATT_LEN(i,j) == 0) {
  5564. if (allInExtRange) {
  5565. if (allInIntRange) {
  5566. IF (err)
  5567. error("%s", nc_strerror(err));
  5568. } else {
  5569. IF (err != NC_ERANGE)
  5570. error("Range error: status = %d", err);
  5571. }
  5572. } else {
  5573. IF (err != 0 && err != NC_ERANGE)
  5574. error("OK or Range error: status = %d", err);
  5575. }
  5576. for (k = 0; k < ATT_LEN(i,j); k++) {
  5577. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_UCHAR)
  5578. && expect[k] >= uchar_min && expect[k] <= uchar_max) {
  5579. IF (!equal(value[k],expect[k],ATT_TYPE(i,j),
  5580. NCT_UCHAR)){
  5581. error("value read not that expected");
  5582. if (verbose) {
  5583. error("\n");
  5584. error("varid: %d, ", i);
  5585. error("att_name: %s, ", ATT_NAME(i,j));
  5586. error("element number: %d ", k);
  5587. error("expect: %g", expect[k]);
  5588. error("got: %g", (double) value[k]);
  5589. }
  5590. } else {
  5591. nok++;
  5592. }
  5593. }
  5594. }
  5595. } else {
  5596. IF (err != NC_ECHAR)
  5597. error("wrong type: status = %d", err);
  5598. }
  5599. }
  5600. }
  5601. err = nc_close(ncid);
  5602. IF (err)
  5603. error("nc_close: %s", nc_strerror(err));
  5604. print_nok(nok);
  5605. }
  5606. void
  5607. test_nc_get_att_schar(void)
  5608. {
  5609. int ncid;
  5610. int i;
  5611. int j;
  5612. size_t k;
  5613. int err;
  5614. int allInExtRange;
  5615. int allInIntRange;
  5616. int canConvert; /* Both text or both numeric */
  5617. schar value[MAX_NELS];
  5618. double expect[MAX_NELS];
  5619. int nok = 0; /* count of valid comparisons */
  5620. err = nc_open(testfile, NC_NOWRITE, &ncid);
  5621. IF (err)
  5622. error("nc_open: %s", nc_strerror(err));
  5623. for (i = -1; i < NVARS; i++) {
  5624. for (j = 0; j < NATTS(i); j++) {
  5625. canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_SCHAR == NCT_TEXT);
  5626. err = nc_get_att_schar(BAD_ID, i, ATT_NAME(i,j), value);
  5627. IF (err != NC_EBADID)
  5628. error("bad ncid: status = %d", err);
  5629. err = nc_get_att_schar(ncid, BAD_VARID, ATT_NAME(i,j), value);
  5630. IF (err != NC_ENOTVAR)
  5631. error("bad var id: status = %d", err);
  5632. err = nc_get_att_schar(ncid, i, "noSuch", value);
  5633. IF (err != NC_ENOTATT)
  5634. error("Bad attribute name: status = %d", err);
  5635. allInExtRange = allInIntRange = 1;
  5636. for (k = 0; k < ATT_LEN(i,j); k++) {
  5637. expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_SCHAR);
  5638. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_SCHAR)) {
  5639. allInIntRange = allInIntRange && expect[k] >= schar_min
  5640. && expect[k] <= schar_max;
  5641. } else {
  5642. allInExtRange = 0;
  5643. }
  5644. }
  5645. err = nc_get_att_schar(ncid, i, ATT_NAME(i,j), value);
  5646. if (canConvert || ATT_LEN(i,j) == 0) {
  5647. if (allInExtRange) {
  5648. if (allInIntRange) {
  5649. IF (err)
  5650. error("%s", nc_strerror(err));
  5651. } else {
  5652. IF (err != NC_ERANGE)
  5653. error("Range error: status = %d", err);
  5654. }
  5655. } else {
  5656. IF (err != 0 && err != NC_ERANGE)
  5657. error("OK or Range error: status = %d", err);
  5658. }
  5659. for (k = 0; k < ATT_LEN(i,j); k++) {
  5660. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_SCHAR)
  5661. && expect[k] >= schar_min && expect[k] <= schar_max) {
  5662. IF (!equal(value[k],expect[k],ATT_TYPE(i,j),
  5663. NCT_SCHAR)){
  5664. error("value read not that expected");
  5665. if (verbose) {
  5666. error("\n");
  5667. error("varid: %d, ", i);
  5668. error("att_name: %s, ", ATT_NAME(i,j));
  5669. error("element number: %d ", k);
  5670. error("expect: %g", expect[k]);
  5671. error("got: %g", (double) value[k]);
  5672. }
  5673. } else {
  5674. nok++;
  5675. }
  5676. }
  5677. }
  5678. } else {
  5679. IF (err != NC_ECHAR)
  5680. error("wrong type: status = %d", err);
  5681. }
  5682. }
  5683. }
  5684. err = nc_close(ncid);
  5685. IF (err)
  5686. error("nc_close: %s", nc_strerror(err));
  5687. print_nok(nok);
  5688. }
  5689. void
  5690. test_nc_get_att_short(void)
  5691. {
  5692. int ncid;
  5693. int i;
  5694. int j;
  5695. size_t k;
  5696. int err;
  5697. int allInExtRange;
  5698. int allInIntRange;
  5699. int canConvert; /* Both text or both numeric */
  5700. short value[MAX_NELS];
  5701. double expect[MAX_NELS];
  5702. int nok = 0; /* count of valid comparisons */
  5703. err = nc_open(testfile, NC_NOWRITE, &ncid);
  5704. IF (err)
  5705. error("nc_open: %s", nc_strerror(err));
  5706. for (i = -1; i < NVARS; i++) {
  5707. for (j = 0; j < NATTS(i); j++) {
  5708. canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_SHORT == NCT_TEXT);
  5709. err = nc_get_att_short(BAD_ID, i, ATT_NAME(i,j), value);
  5710. IF (err != NC_EBADID)
  5711. error("bad ncid: status = %d", err);
  5712. err = nc_get_att_short(ncid, BAD_VARID, ATT_NAME(i,j), value);
  5713. IF (err != NC_ENOTVAR)
  5714. error("bad var id: status = %d", err);
  5715. err = nc_get_att_short(ncid, i, "noSuch", value);
  5716. IF (err != NC_ENOTATT)
  5717. error("Bad attribute name: status = %d", err);
  5718. allInExtRange = allInIntRange = 1;
  5719. for (k = 0; k < ATT_LEN(i,j); k++) {
  5720. expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_SHORT);
  5721. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_SHORT)) {
  5722. allInIntRange = allInIntRange && expect[k] >= short_min
  5723. && expect[k] <= short_max;
  5724. } else {
  5725. allInExtRange = 0;
  5726. }
  5727. }
  5728. err = nc_get_att_short(ncid, i, ATT_NAME(i,j), value);
  5729. if (canConvert || ATT_LEN(i,j) == 0) {
  5730. if (allInExtRange) {
  5731. if (allInIntRange) {
  5732. IF (err)
  5733. error("%s", nc_strerror(err));
  5734. } else {
  5735. IF (err != NC_ERANGE)
  5736. error("Range error: status = %d", err);
  5737. }
  5738. } else {
  5739. IF (err != 0 && err != NC_ERANGE)
  5740. error("OK or Range error: status = %d", err);
  5741. }
  5742. for (k = 0; k < ATT_LEN(i,j); k++) {
  5743. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_SHORT)
  5744. && expect[k] >= short_min && expect[k] <= short_max) {
  5745. IF (!equal(value[k],expect[k],ATT_TYPE(i,j),
  5746. NCT_SHORT)){
  5747. error("value read not that expected");
  5748. if (verbose) {
  5749. error("\n");
  5750. error("varid: %d, ", i);
  5751. error("att_name: %s, ", ATT_NAME(i,j));
  5752. error("element number: %d ", k);
  5753. error("expect: %g", expect[k]);
  5754. error("got: %g", (double) value[k]);
  5755. }
  5756. } else {
  5757. nok++;
  5758. }
  5759. }
  5760. }
  5761. } else {
  5762. IF (err != NC_ECHAR)
  5763. error("wrong type: status = %d", err);
  5764. }
  5765. }
  5766. }
  5767. err = nc_close(ncid);
  5768. IF (err)
  5769. error("nc_close: %s", nc_strerror(err));
  5770. print_nok(nok);
  5771. }
  5772. void
  5773. test_nc_get_att_int(void)
  5774. {
  5775. int ncid;
  5776. int i;
  5777. int j;
  5778. size_t k;
  5779. int err;
  5780. int allInExtRange;
  5781. int allInIntRange;
  5782. int canConvert; /* Both text or both numeric */
  5783. int value[MAX_NELS];
  5784. double expect[MAX_NELS];
  5785. int nok = 0; /* count of valid comparisons */
  5786. err = nc_open(testfile, NC_NOWRITE, &ncid);
  5787. IF (err)
  5788. error("nc_open: %s", nc_strerror(err));
  5789. for (i = -1; i < NVARS; i++) {
  5790. for (j = 0; j < NATTS(i); j++) {
  5791. canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_INT == NCT_TEXT);
  5792. err = nc_get_att_int(BAD_ID, i, ATT_NAME(i,j), value);
  5793. IF (err != NC_EBADID)
  5794. error("bad ncid: status = %d", err);
  5795. err = nc_get_att_int(ncid, BAD_VARID, ATT_NAME(i,j), value);
  5796. IF (err != NC_ENOTVAR)
  5797. error("bad var id: status = %d", err);
  5798. err = nc_get_att_int(ncid, i, "noSuch", value);
  5799. IF (err != NC_ENOTATT)
  5800. error("Bad attribute name: status = %d", err);
  5801. allInExtRange = allInIntRange = 1;
  5802. for (k = 0; k < ATT_LEN(i,j); k++) {
  5803. expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_INT);
  5804. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_INT)) {
  5805. allInIntRange = allInIntRange && expect[k] >= int_min
  5806. && expect[k] <= int_max;
  5807. } else {
  5808. allInExtRange = 0;
  5809. }
  5810. }
  5811. err = nc_get_att_int(ncid, i, ATT_NAME(i,j), value);
  5812. if (canConvert || ATT_LEN(i,j) == 0) {
  5813. if (allInExtRange) {
  5814. if (allInIntRange) {
  5815. IF (err)
  5816. error("%s", nc_strerror(err));
  5817. } else {
  5818. IF (err != NC_ERANGE)
  5819. error("Range error: status = %d", err);
  5820. }
  5821. } else {
  5822. IF (err != 0 && err != NC_ERANGE)
  5823. error("OK or Range error: status = %d", err);
  5824. }
  5825. for (k = 0; k < ATT_LEN(i,j); k++) {
  5826. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_INT)
  5827. && expect[k] >= int_min && expect[k] <= int_max) {
  5828. IF (!equal(value[k],expect[k],ATT_TYPE(i,j),
  5829. NCT_INT)){
  5830. error("value read not that expected");
  5831. if (verbose) {
  5832. error("\n");
  5833. error("varid: %d, ", i);
  5834. error("att_name: %s, ", ATT_NAME(i,j));
  5835. error("element number: %d ", k);
  5836. error("expect: %g", expect[k]);
  5837. error("got: %g", (double) value[k]);
  5838. }
  5839. } else {
  5840. nok++;
  5841. }
  5842. }
  5843. }
  5844. } else {
  5845. IF (err != NC_ECHAR)
  5846. error("wrong type: status = %d", err);
  5847. }
  5848. }
  5849. }
  5850. err = nc_close(ncid);
  5851. IF (err)
  5852. error("nc_close: %s", nc_strerror(err));
  5853. print_nok(nok);
  5854. }
  5855. void
  5856. test_nc_get_att_long(void)
  5857. {
  5858. int ncid;
  5859. int i;
  5860. int j;
  5861. size_t k;
  5862. int err;
  5863. int allInExtRange;
  5864. int allInIntRange;
  5865. int canConvert; /* Both text or both numeric */
  5866. long value[MAX_NELS];
  5867. double expect[MAX_NELS];
  5868. int nok = 0; /* count of valid comparisons */
  5869. err = nc_open(testfile, NC_NOWRITE, &ncid);
  5870. IF (err)
  5871. error("nc_open: %s", nc_strerror(err));
  5872. for (i = -1; i < NVARS; i++) {
  5873. for (j = 0; j < NATTS(i); j++) {
  5874. canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_LONG == NCT_TEXT);
  5875. err = nc_get_att_long(BAD_ID, i, ATT_NAME(i,j), value);
  5876. IF (err != NC_EBADID)
  5877. error("bad ncid: status = %d", err);
  5878. err = nc_get_att_long(ncid, BAD_VARID, ATT_NAME(i,j), value);
  5879. IF (err != NC_ENOTVAR)
  5880. error("bad var id: status = %d", err);
  5881. err = nc_get_att_long(ncid, i, "noSuch", value);
  5882. IF (err != NC_ENOTATT)
  5883. error("Bad attribute name: status = %d", err);
  5884. allInExtRange = allInIntRange = 1;
  5885. for (k = 0; k < ATT_LEN(i,j); k++) {
  5886. expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_LONG);
  5887. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_LONG)) {
  5888. allInIntRange = allInIntRange && expect[k] >= long_min
  5889. && expect[k] <= long_max;
  5890. } else {
  5891. allInExtRange = 0;
  5892. }
  5893. }
  5894. err = nc_get_att_long(ncid, i, ATT_NAME(i,j), value);
  5895. if (canConvert || ATT_LEN(i,j) == 0) {
  5896. if (allInExtRange) {
  5897. if (allInIntRange) {
  5898. IF (err)
  5899. error("%s", nc_strerror(err));
  5900. } else {
  5901. IF (err != NC_ERANGE)
  5902. error("Range error: status = %d", err);
  5903. }
  5904. } else {
  5905. IF (err != 0 && err != NC_ERANGE)
  5906. error("OK or Range error: status = %d", err);
  5907. }
  5908. for (k = 0; k < ATT_LEN(i,j); k++) {
  5909. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_LONG)
  5910. && expect[k] >= long_min && expect[k] <= long_max) {
  5911. IF (!equal(value[k],expect[k],ATT_TYPE(i,j),
  5912. NCT_LONG)){
  5913. error("value read not that expected");
  5914. if (verbose) {
  5915. error("\n");
  5916. error("varid: %d, ", i);
  5917. error("att_name: %s, ", ATT_NAME(i,j));
  5918. error("element number: %d ", k);
  5919. error("expect: %g", expect[k]);
  5920. error("got: %g", (double) value[k]);
  5921. }
  5922. } else {
  5923. nok++;
  5924. }
  5925. }
  5926. }
  5927. } else {
  5928. IF (err != NC_ECHAR)
  5929. error("wrong type: status = %d", err);
  5930. }
  5931. }
  5932. }
  5933. err = nc_close(ncid);
  5934. IF (err)
  5935. error("nc_close: %s", nc_strerror(err));
  5936. print_nok(nok);
  5937. }
  5938. void
  5939. test_nc_get_att_float(void)
  5940. {
  5941. int ncid;
  5942. int i;
  5943. int j;
  5944. size_t k;
  5945. int err;
  5946. int allInExtRange;
  5947. int allInIntRange;
  5948. int canConvert; /* Both text or both numeric */
  5949. float value[MAX_NELS];
  5950. double expect[MAX_NELS];
  5951. int nok = 0; /* count of valid comparisons */
  5952. err = nc_open(testfile, NC_NOWRITE, &ncid);
  5953. IF (err)
  5954. error("nc_open: %s", nc_strerror(err));
  5955. for (i = -1; i < NVARS; i++) {
  5956. for (j = 0; j < NATTS(i); j++) {
  5957. canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_FLOAT == NCT_TEXT);
  5958. err = nc_get_att_float(BAD_ID, i, ATT_NAME(i,j), value);
  5959. IF (err != NC_EBADID)
  5960. error("bad ncid: status = %d", err);
  5961. err = nc_get_att_float(ncid, BAD_VARID, ATT_NAME(i,j), value);
  5962. IF (err != NC_ENOTVAR)
  5963. error("bad var id: status = %d", err);
  5964. err = nc_get_att_float(ncid, i, "noSuch", value);
  5965. IF (err != NC_ENOTATT)
  5966. error("Bad attribute name: status = %d", err);
  5967. allInExtRange = allInIntRange = 1;
  5968. for (k = 0; k < ATT_LEN(i,j); k++) {
  5969. expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_FLOAT);
  5970. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_FLOAT)) {
  5971. allInIntRange = allInIntRange && expect[k] >= float_min
  5972. && expect[k] <= float_max;
  5973. } else {
  5974. allInExtRange = 0;
  5975. }
  5976. }
  5977. err = nc_get_att_float(ncid, i, ATT_NAME(i,j), value);
  5978. if (canConvert || ATT_LEN(i,j) == 0) {
  5979. if (allInExtRange) {
  5980. if (allInIntRange) {
  5981. IF (err)
  5982. error("%s", nc_strerror(err));
  5983. } else {
  5984. IF (err != NC_ERANGE)
  5985. error("Range error: status = %d", err);
  5986. }
  5987. } else {
  5988. IF (err != 0 && err != NC_ERANGE)
  5989. error("OK or Range error: status = %d", err);
  5990. }
  5991. for (k = 0; k < ATT_LEN(i,j); k++) {
  5992. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_FLOAT)
  5993. && expect[k] >= float_min && expect[k] <= float_max) {
  5994. IF (!equal(value[k],expect[k],ATT_TYPE(i,j),
  5995. NCT_FLOAT)){
  5996. error("value read not that expected");
  5997. if (verbose) {
  5998. error("\n");
  5999. error("varid: %d, ", i);
  6000. error("att_name: %s, ", ATT_NAME(i,j));
  6001. error("element number: %d ", k);
  6002. error("expect: %g", expect[k]);
  6003. error("got: %g", (double) value[k]);
  6004. }
  6005. } else {
  6006. nok++;
  6007. }
  6008. }
  6009. }
  6010. } else {
  6011. IF (err != NC_ECHAR)
  6012. error("wrong type: status = %d", err);
  6013. }
  6014. }
  6015. }
  6016. err = nc_close(ncid);
  6017. IF (err)
  6018. error("nc_close: %s", nc_strerror(err));
  6019. print_nok(nok);
  6020. }
  6021. void
  6022. test_nc_get_att_double(void)
  6023. {
  6024. int ncid;
  6025. int i;
  6026. int j;
  6027. size_t k;
  6028. int err;
  6029. int allInExtRange;
  6030. int allInIntRange;
  6031. int canConvert; /* Both text or both numeric */
  6032. double value[MAX_NELS];
  6033. double expect[MAX_NELS];
  6034. int nok = 0; /* count of valid comparisons */
  6035. err = nc_open(testfile, NC_NOWRITE, &ncid);
  6036. IF (err)
  6037. error("nc_open: %s", nc_strerror(err));
  6038. for (i = -1; i < NVARS; i++) {
  6039. for (j = 0; j < NATTS(i); j++) {
  6040. canConvert = (ATT_TYPE(i,j) == NC_CHAR) == (NCT_DOUBLE == NCT_TEXT);
  6041. err = nc_get_att_double(BAD_ID, i, ATT_NAME(i,j), value);
  6042. IF (err != NC_EBADID)
  6043. error("bad ncid: status = %d", err);
  6044. err = nc_get_att_double(ncid, BAD_VARID, ATT_NAME(i,j), value);
  6045. IF (err != NC_ENOTVAR)
  6046. error("bad var id: status = %d", err);
  6047. err = nc_get_att_double(ncid, i, "noSuch", value);
  6048. IF (err != NC_ENOTATT)
  6049. error("Bad attribute name: status = %d", err);
  6050. allInExtRange = allInIntRange = 1;
  6051. for (k = 0; k < ATT_LEN(i,j); k++) {
  6052. expect[k] = hash4(ATT_TYPE(i,j), -1, &k, NCT_DOUBLE);
  6053. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_DOUBLE)) {
  6054. allInIntRange = allInIntRange && expect[k] >= double_min
  6055. && expect[k] <= double_max;
  6056. } else {
  6057. allInExtRange = 0;
  6058. }
  6059. }
  6060. err = nc_get_att_double(ncid, i, ATT_NAME(i,j), value);
  6061. if (canConvert || ATT_LEN(i,j) == 0) {
  6062. if (allInExtRange) {
  6063. if (allInIntRange) {
  6064. IF (err)
  6065. error("%s", nc_strerror(err));
  6066. } else {
  6067. IF (err != NC_ERANGE)
  6068. error("Range error: status = %d", err);
  6069. }
  6070. } else {
  6071. IF (err != 0 && err != NC_ERANGE)
  6072. error("OK or Range error: status = %d", err);
  6073. }
  6074. for (k = 0; k < ATT_LEN(i,j); k++) {
  6075. if (inRange3(expect[k],ATT_TYPE(i,j),NCT_DOUBLE)
  6076. && expect[k] >= double_min && expect[k] <= double_max) {
  6077. IF (!equal(value[k],expect[k],ATT_TYPE(i,j),
  6078. NCT_DOUBLE)){
  6079. error("value read not that expected");
  6080. if (verbose) {
  6081. error("\n");
  6082. error("varid: %d, ", i);
  6083. error("att_name: %s, ", ATT_NAME(i,j));
  6084. error("element number: %d ", k);
  6085. error("expect: %g", expect[k]);
  6086. error("got: %g", (double) value[k]);
  6087. }
  6088. } else {
  6089. nok++;
  6090. }
  6091. }
  6092. }
  6093. } else {
  6094. IF (err != NC_ECHAR)
  6095. error("wrong type: status = %d", err);
  6096. }
  6097. }
  6098. }
  6099. err = nc_close(ncid);
  6100. IF (err)
  6101. error("nc_close: %s", nc_strerror(err));
  6102. print_nok(nok);
  6103. }