PageRenderTime 41ms CodeModel.GetById 6ms RepoModel.GetById 0ms app.codeStats 0ms

/other/netcdf_write_matrix/src/nf_test/test_get.m4

https://github.com/jbeezley/wrf-fire
m4 | 1073 lines | 1000 code | 43 blank | 30 comment | 0 complexity | 85680063b6e89c8df3c9ef0aa40f5494 MD5 | raw file
Possible License(s): AGPL-1.0
  1. divert(-1)
  2. dnl This is m4 source.
  3. dnl Process using m4 to produce FORTRAN language file.
  4. changequote([,])
  5. undefine([index])dnl
  6. dnl Macros
  7. dnl Upcase(str)
  8. dnl
  9. define([Upcase],[dnl
  10. translit($1, abcdefghijklmnopqrstuvwxyz, ABCDEFGHIJKLMNOPQRSTUVWXYZ)])
  11. dnl NFT_ITYPE(type)
  12. dnl
  13. define([NFT_ITYPE], [NFT_[]Upcase($1)])
  14. dnl ARITH(itype, value)
  15. dnl
  16. define([ARITH], [ifelse($1, text, ichar($2), $2)])
  17. dnl DATATYPE(funf_suffix)
  18. dnl
  19. define([DATATYPE], [dnl
  20. ifelse($1, text, character,
  21. ifelse($1, int1, NF_INT1_T,
  22. ifelse($1, int2, NF_INT2_T,
  23. ifelse($1, int, integer,
  24. ifelse($1, real, real,
  25. ifelse($1, double, doubleprecision)[]dnl
  26. )[]dnl
  27. )[]dnl
  28. )[]dnl
  29. )[]dnl
  30. )[]dnl
  31. ])
  32. dnl TEST_NF_GET_VAR1(TYPE)
  33. dnl
  34. define([TEST_NF_GET_VAR1],[dnl
  35. subroutine test_nf_get_var1_$1()
  36. implicit none
  37. #include "tests.inc"
  38. integer ncid
  39. integer i
  40. integer j
  41. integer err
  42. integer nok
  43. integer index(MAX_RANK)
  44. doubleprecision expect
  45. logical canConvert
  46. DATATYPE($1) value
  47. doubleprecision val
  48. nok = 0
  49. err = nf_open(testfile, NF_NOWRITE, ncid)
  50. if (err .ne. 0)
  51. + call errore('nf_open: ', err)
  52. do 1, i = 1, NVARS
  53. canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
  54. + (NFT_ITYPE($1) .eq. NFT_TEXT)
  55. do 2, j = 1, var_rank(i)
  56. index(j) = 1
  57. 2 continue
  58. err = nf_get_var1_$1(BAD_ID, i, index, value)
  59. if (err .ne. NF_EBADID)
  60. + call errore('bad ncid: ', err)
  61. err = nf_get_var1_$1(ncid, BAD_VARID,
  62. + index, value)
  63. if (err .ne. NF_ENOTVAR)
  64. + call errore('bad var id: ', err)
  65. do 3, j = 1, var_rank(i)
  66. index(j) = var_shape(j,i) + 1
  67. err = nf_get_var1_$1(ncid, i, index, value)
  68. if (.not. canConvert) then
  69. if (err .ne. NF_ECHAR)
  70. + call errore('conversion: ', err)
  71. else
  72. if (err .ne. NF_EINVALCOORDS)
  73. + call errore('bad index: ', err)
  74. endif
  75. index(j) = 1
  76. 3 continue
  77. do 4, j = 1, var_nels(i)
  78. err = index2indexes(j, var_rank(i), var_shape(1,i),
  79. + index)
  80. if (err .ne. 0)
  81. + call error('error in index2indexes 1')
  82. expect = hash4( var_type(i), var_rank(i), index,
  83. + NFT_ITYPE($1) )
  84. err = nf_get_var1_$1(ncid, i, index,
  85. + value)
  86. if (canConvert) then
  87. if (inRange3(expect,var_type(i),
  88. + NFT_ITYPE($1))) then
  89. if (in_internal_range(NFT_ITYPE($1),
  90. + expect)) then
  91. if (err .ne. 0) then
  92. call errore('nf_get_var: ', err)
  93. else
  94. val = ARITH($1, value)
  95. if (.not. equal(val, expect,
  96. + var_type(i),
  97. + NFT_ITYPE($1))) then
  98. call errord('unexpected: ', val)
  99. else
  100. nok = nok + 1
  101. end if
  102. end if
  103. else
  104. if (err .ne. NF_ERANGE)
  105. + call errore('Range error: ', err)
  106. end if
  107. else
  108. if (err .ne. 0 .and. err .ne. NF_ERANGE)
  109. + call errore('OK or Range error: ', err)
  110. end if
  111. else
  112. if (err .ne. NF_ECHAR)
  113. + call errore('wrong type: ', err)
  114. end if
  115. 4 continue
  116. 1 continue
  117. err = nf_close(ncid)
  118. if (err .ne. 0)
  119. + call errore('nf_close: ', err)
  120. call print_nok(nok)
  121. end
  122. ])
  123. dnl TEST_NF_GET_VAR(TYPE)
  124. dnl
  125. define([TEST_NF_GET_VAR],[dnl
  126. subroutine test_nf_get_var_$1()
  127. implicit none
  128. #include "tests.inc"
  129. integer ncid
  130. integer i
  131. integer j
  132. integer err
  133. logical allInExtRange
  134. logical allInIntRange
  135. integer nels
  136. integer nok
  137. integer index(MAX_RANK)
  138. doubleprecision expect(MAX_NELS)
  139. logical canConvert
  140. DATATYPE($1) value(MAX_NELS)
  141. doubleprecision val
  142. nok = 0
  143. err = nf_open(testfile, NF_NOWRITE, ncid)
  144. if (err .ne. 0)
  145. + call errore('nf_open: ', err)
  146. do 1, i = 1, NVARS
  147. canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
  148. + (NFT_ITYPE($1) .eq. NFT_TEXT)
  149. err = nf_get_var_$1(BAD_ID, i, value)
  150. if (err .ne. NF_EBADID)
  151. + call errore('bad ncid: ', err)
  152. err = nf_get_var_$1(ncid, BAD_VARID, value)
  153. if (err .ne. NF_ENOTVAR)
  154. + call errore('bad var id: ', err)
  155. nels = 1
  156. do 3, j = 1, var_rank(i)
  157. nels = nels * var_shape(j,i)
  158. 3 continue
  159. allInExtRange = .true.
  160. allInIntRange = .true.
  161. do 4, j = 1, var_nels(i)
  162. err = index2indexes(j, var_rank(i), var_shape(1,i),
  163. + index)
  164. if (err .ne. 0)
  165. + call error('error in index2indexes 1')
  166. expect(j) = hash4( var_type(i), var_rank(i), index,
  167. + NFT_ITYPE($1) )
  168. if (inRange3(expect(j),var_type(i), NFT_ITYPE($1))) then
  169. allInIntRange = allInIntRange .and.
  170. + in_internal_range(NFT_ITYPE($1), expect(j))
  171. else
  172. allInExtRange = .false.
  173. end if
  174. 4 continue
  175. err = nf_get_var_$1(ncid, i, value)
  176. if (canConvert) then
  177. if (allInExtRange) then
  178. if (allInIntRange) then
  179. if (err .ne. 0)
  180. + call errore('nf_get_var: ', err)
  181. else
  182. if (err .ne. NF_ERANGE)
  183. + call errore('Range error: ', err)
  184. endif
  185. else
  186. if (err .ne. 0 .and. err .ne. NF_ERANGE)
  187. + call errore('Range error: ', err)
  188. endif
  189. do 5, j = 1, var_nels(i)
  190. if (inRange3(expect(j),var_type(i),
  191. + NFT_ITYPE($1)) .and.
  192. + in_internal_range(NFT_ITYPE($1),
  193. + expect(j))) then
  194. val = ARITH($1, value(j))
  195. if (.not. equal(val, expect(j),
  196. + var_type(i),
  197. + NFT_ITYPE($1))) then
  198. call errord('unexpected: ', val)
  199. else
  200. nok = nok + 1
  201. end if
  202. endif
  203. 5 continue
  204. else
  205. if (err .ne. NF_ECHAR)
  206. + call errore('wrong type: ', err)
  207. end if
  208. 1 continue
  209. err = nf_close(ncid)
  210. if (err .ne. 0)
  211. + call errore('nf_close: ', err)
  212. call print_nok(nok)
  213. end
  214. ])
  215. dnl TEST_NF_GET_VARA(TYPE)
  216. dnl
  217. define([TEST_NF_GET_VARA],[dnl
  218. subroutine test_nf_get_vara_$1()
  219. implicit none
  220. #include "tests.inc"
  221. integer ncid
  222. integer d
  223. integer i
  224. integer j
  225. integer k
  226. integer err
  227. logical allInExtRange
  228. logical allInIntRange
  229. integer nels
  230. integer nslabs
  231. integer nok
  232. integer start(MAX_RANK)
  233. integer edge(MAX_RANK)
  234. integer index(MAX_RANK)
  235. integer mid(MAX_RANK)
  236. logical canConvert
  237. DATATYPE($1) value(MAX_NELS)
  238. doubleprecision expect(MAX_NELS)
  239. doubleprecision val
  240. integer udshift
  241. nok = 0
  242. err = nf_open(testfile, NF_NOWRITE, ncid)
  243. if (err .ne. 0)
  244. + call errore('nf_open: ', err)
  245. do 1, i = 1, NVARS
  246. canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
  247. + (NFT_ITYPE($1) .eq. NFT_TEXT)
  248. if (.not.(var_rank(i) .le. MAX_RANK)) stop 'assert'
  249. if (.not.(var_nels(i) .le. MAX_NELS)) stop 'assert'
  250. do 2, j = 1, var_rank(i)
  251. start(j) = 1
  252. edge(j) = 1
  253. 2 continue
  254. err = nf_get_vara_$1(BAD_ID, i, start,
  255. + edge, value)
  256. if (err .ne. NF_EBADID)
  257. + call errore('bad ncid: ', err)
  258. err = nf_get_vara_$1(ncid, BAD_VARID, start,
  259. + edge, value)
  260. if (err .ne. NF_ENOTVAR)
  261. + call errore('bad var id: ', err)
  262. do 3, j = 1, var_rank(i)
  263. start(j) = var_shape(j,i) + 1
  264. err = nf_get_vara_$1(ncid, i, start,
  265. + edge, value)
  266. if (canConvert .and. err .ne. NF_EINVALCOORDS)
  267. + call errore('bad index: ', err)
  268. start(j) = 1
  269. edge(j) = var_shape(j,i) + 1
  270. err = nf_get_vara_$1(ncid, i, start,
  271. + edge, value)
  272. if (canConvert .and. err .ne. NF_EEDGE)
  273. + call errore('bad edge: ', err)
  274. edge(j) = 1
  275. 3 continue
  276. C /* Check non-scalars for correct error returned even when */
  277. C /* there is nothing to get (edge(j).eq.0) */
  278. if (var_rank(i) .gt. 0) then
  279. do 10, j = 1, var_rank(i)
  280. edge(j) = 0
  281. 10 continue
  282. err = nf_get_vara_$1(BAD_ID, i, start,
  283. + edge, value)
  284. if (err .ne. NF_EBADID)
  285. + call errore('bad ncid: ', err)
  286. err = nf_get_vara_$1(ncid, BAD_VARID,
  287. + start, edge, value)
  288. if (err .ne. NF_ENOTVAR)
  289. + call errore('bad var id: ', err)
  290. do 11, j = 1, var_rank(i)
  291. if (var_dimid(j,i) .gt. 1) then !/* skip record dim */
  292. start(j) = var_shape(j,i) + 1
  293. err = nf_get_vara_$1(ncid, i,
  294. + start, edge, value)
  295. if (canConvert .and. err .ne. NF_EINVALCOORDS)
  296. + call errore('bad start: ', err)
  297. start(j) = 1
  298. endif
  299. 11 continue
  300. err = nf_get_vara_$1(ncid, i, start,
  301. + edge, value)
  302. if (canConvert) then
  303. if (err .ne. 0)
  304. + call error(nf_strerror(err))
  305. else
  306. if (err .ne. NF_ECHAR)
  307. + call errore('wrong type: ', err)
  308. endif
  309. do 12, j = 1, var_rank(i)
  310. edge(j) = 1
  311. 12 continue
  312. endif
  313. C Choose a random point dividing each dim into 2 parts
  314. C get 2^rank (nslabs) slabs so defined
  315. nslabs = 1
  316. do 4, j = 1, var_rank(i)
  317. mid(j) = roll( var_shape(j,i) )
  318. nslabs = nslabs * 2
  319. 4 continue
  320. C bits of k determine whether to get lower or upper part of dim
  321. do 5, k = 1, nslabs
  322. nels = 1
  323. do 6, j = 1, var_rank(i)
  324. if (mod(udshift((k-1), -(j-1)), 2) .eq. 1) then
  325. start(j) = 1
  326. edge(j) = mid(j)
  327. else
  328. start(j) = 1 + mid(j)
  329. edge(j) = var_shape(j,i) - mid(j)
  330. end if
  331. nels = nels * edge(j)
  332. 6 continue
  333. allInIntRange = .true.
  334. allInExtRange = .true.
  335. do 7, j = 1, nels
  336. err = index2indexes(j, var_rank(i), edge, index)
  337. if (err .ne. 0)
  338. + call error('error in index2indexes 1')
  339. do 8, d = 1, var_rank(i)
  340. index(d) = index(d) + start(d) - 1
  341. 8 continue
  342. expect(j) = hash4(var_type(i), var_rank(i), index,
  343. + NFT_ITYPE($1))
  344. if (inRange3(expect(j),var_type(i),
  345. + NFT_ITYPE($1))) then
  346. allInIntRange =
  347. + allInIntRange .and.
  348. + in_internal_range(NFT_ITYPE($1), expect(j))
  349. else
  350. allInExtRange = .false.
  351. end if
  352. 7 continue
  353. err = nf_get_vara_$1(ncid, i, start,
  354. + edge, value)
  355. if (canConvert) then
  356. if (allInExtRange) then
  357. if (allInIntRange) then
  358. if (err .ne. 0)
  359. + call errore('nf_get_vara_$1:', err)
  360. else
  361. if (err .ne. NF_ERANGE)
  362. + call errore('Range error: ', err)
  363. end if
  364. else
  365. if (err .ne. 0 .and. err .ne. NF_ERANGE)
  366. + call errore('OK or Range error: ', err)
  367. end if
  368. do 9, j = 1, nels
  369. if (inRange3(expect(j),var_type(i),
  370. + NFT_ITYPE($1)) .and.
  371. + in_internal_range(NFT_ITYPE($1), expect(j)))
  372. + then
  373. val = ARITH($1, value(j))
  374. if (.not.equal(val,expect(j),
  375. + var_type(i),NFT_ITYPE($1)))
  376. + then
  377. call error(
  378. + 'value read not that expected')
  379. if (verbose) then
  380. call error(' ')
  381. call errori('varid: ', i)
  382. call errorc('var_name: ',
  383. + var_name(i))
  384. call errori('element number: %d ',
  385. + j)
  386. call errord('expect: ', expect(j))
  387. call errord('got: ', val)
  388. end if
  389. else
  390. nok = nok + 1
  391. end if
  392. end if
  393. 9 continue
  394. else
  395. if (nels .gt. 0 .and. err .ne. NF_ECHAR)
  396. + call errore('wrong type: ', err)
  397. end if
  398. 5 continue
  399. 1 continue
  400. err = nf_close(ncid)
  401. if (err .ne. 0)
  402. + call errorc('nf_close: ', nf_strerror(err))
  403. call print_nok(nok)
  404. end
  405. ])dnl
  406. dnl TEST_NF_GET_VARS(TYPE)
  407. dnl
  408. define([TEST_NF_GET_VARS],dnl
  409. [dnl
  410. subroutine test_nf_get_vars_$1()
  411. implicit none
  412. #include "tests.inc"
  413. integer ncid
  414. integer d
  415. integer i
  416. integer j
  417. integer k
  418. integer m
  419. integer err
  420. logical allInExtRange
  421. logical allInIntRange
  422. integer nels
  423. integer nslabs
  424. integer nstarts
  425. integer nok
  426. integer start(MAX_RANK)
  427. integer edge(MAX_RANK)
  428. integer index(MAX_RANK)
  429. integer index2(MAX_RANK)
  430. integer mid(MAX_RANK)
  431. integer count(MAX_RANK)
  432. integer sstride(MAX_RANK)
  433. integer stride(MAX_RANK)
  434. logical canConvert
  435. DATATYPE($1) value(MAX_NELS)
  436. doubleprecision expect(MAX_NELS)
  437. doubleprecision val
  438. integer udshift
  439. nok = 0
  440. err = nf_open(testfile, NF_NOWRITE, ncid)
  441. if (err .ne. 0)
  442. + call errore('nf_open: ', err)
  443. do 1, i = 1, NVARS
  444. canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
  445. + (NFT_ITYPE($1) .eq. NFT_TEXT)
  446. if (.not.(var_rank(i) .le. MAX_RANK)) stop 'assert'
  447. if (.not.(var_nels(i) .le. MAX_NELS)) stop 'assert'
  448. do 2, j = 1, var_rank(i)
  449. start(j) = 1
  450. edge(j) = 1
  451. stride(j) = 1
  452. 2 continue
  453. err = nf_get_vars_$1(BAD_ID, i, start,
  454. + edge, stride, value)
  455. if (err .ne. NF_EBADID)
  456. + call errore('bad ncid: ', err)
  457. err = nf_get_vars_$1(ncid, BAD_VARID,
  458. + start, edge, stride,
  459. + value)
  460. if (err .ne. NF_ENOTVAR)
  461. + call errore('bad var id: ', err)
  462. do 3, j = 1, var_rank(i)
  463. start(j) = var_shape(j,i) + 1
  464. err = nf_get_vars_$1(ncid, i, start,
  465. + edge, stride,
  466. + value)
  467. if (.not. canConvert) then
  468. if (err .ne. NF_ECHAR)
  469. + call errore('conversion: ', err)
  470. else
  471. if (err .ne. NF_EINVALCOORDS)
  472. + call errore('bad index: ', err)
  473. endif
  474. start(j) = 1
  475. edge(j) = var_shape(j,i) + 1
  476. err = nf_get_vars_$1(ncid, i, start,
  477. + edge, stride,
  478. + value)
  479. if (.not. canConvert) then
  480. if (err .ne. NF_ECHAR)
  481. + call errore('conversion: ', err)
  482. else
  483. if (err .ne. NF_EEDGE)
  484. + call errore('bad edge: ', err)
  485. endif
  486. edge(j) = 1
  487. stride(j) = 0
  488. err = nf_get_vars_$1(ncid, i, start,
  489. + edge, stride,
  490. + value)
  491. if (.not. canConvert) then
  492. if (err .ne. NF_ECHAR)
  493. + call errore('conversion: ', err)
  494. else
  495. if (err .ne. NF_ESTRIDE)
  496. + call errore('bad stride: ', err)
  497. endif
  498. stride(j) = 1
  499. 3 continue
  500. C Choose a random point dividing each dim into 2 parts
  501. C get 2^rank (nslabs) slabs so defined
  502. nslabs = 1
  503. do 4, j = 1, var_rank(i)
  504. mid(j) = roll( var_shape(j,i) )
  505. nslabs = nslabs * 2
  506. 4 continue
  507. C bits of k determine whether to get lower or upper part of dim
  508. C choose random stride from 1 to edge
  509. do 5, k = 1, nslabs
  510. nstarts = 1
  511. do 6, j = 1, var_rank(i)
  512. if (mod(udshift(k-1, j-1), 2) .eq. 1) then
  513. start(j) = 1
  514. edge(j) = mid(j)
  515. else
  516. start(j) = 1 + mid(j)
  517. edge(j) = var_shape(j,i) - mid(j)
  518. end if
  519. if (edge(j) .gt. 0) then
  520. sstride(j) = 1 + roll(edge(j))
  521. else
  522. sstride(j) = 1
  523. end if
  524. nstarts = nstarts * stride(j)
  525. 6 continue
  526. do 7, m = 1, nstarts
  527. err = index2indexes(m, var_rank(i), sstride,
  528. + index)
  529. if (err .ne. 0)
  530. + call error('error in index2indexes')
  531. nels = 1
  532. do 8, j = 1, var_rank(i)
  533. count(j) = 1 + (edge(j) - index(j)) /
  534. + stride(j)
  535. nels = nels * count(j)
  536. index(j) = index(j) + start(j) - 1
  537. 8 continue
  538. C Random choice of forward or backward
  539. C /* TODO
  540. C if ( roll(2) ) then
  541. C for (j = 0 j < var_rank(i) j++) {
  542. C index(j) += (count(j) - 1) * stride(j)
  543. C stride(j) = -stride(j)
  544. C }
  545. C end if
  546. C */
  547. allInIntRange = .true.
  548. allInExtRange = .true.
  549. do 9, j = 1, nels
  550. err = index2indexes(j, var_rank(i), count,
  551. + index2)
  552. if (err .ne. 0)
  553. + call error('error in index2indexes() 1')
  554. do 10, d = 1, var_rank(i)
  555. index2(d) = index(d) + (index2(d)-1) *
  556. + stride(d)
  557. 10 continue
  558. expect(j) = hash4(var_type(i), var_rank(i),
  559. + index2, NFT_ITYPE($1))
  560. if (inRange3(expect(j),var_type(i),
  561. + NFT_ITYPE($1))) then
  562. allInIntRange =
  563. + allInIntRange .and.
  564. + in_internal_range(NFT_ITYPE($1),
  565. + expect(j))
  566. else
  567. allInExtRange = .false.
  568. end if
  569. 9 continue
  570. err = nf_get_vars_$1(ncid, i, index,
  571. + count, stride,
  572. + value)
  573. if (canConvert) then
  574. if (allInExtRange) then
  575. if (allInIntRange) then
  576. if (err .ne. 0)
  577. + call error(nf_strerror(err))
  578. else
  579. if (err .ne. NF_ERANGE)
  580. + call errore('Range error: ', err)
  581. end if
  582. else
  583. if (err .ne. 0 .and. err .ne. NF_ERANGE)
  584. + call errore('OK or Range error: ', err)
  585. end if
  586. do 11, j = 1, nels
  587. if (inRange3(expect(j),var_type(i),
  588. + NFT_ITYPE($1)) .and.
  589. + in_internal_range(NFT_ITYPE($1),
  590. + expect(j))) then
  591. val = ARITH($1, value(j))
  592. if (.not.equal(val, expect(j),
  593. + var_type(i), NFT_ITYPE($1))) then
  594. call error(
  595. + 'value read not that expected')
  596. if (verbose) then
  597. call error(' ')
  598. call errori('varid: ', i)
  599. call errorc('var_name: ',
  600. + var_name(i))
  601. call errori('element number: ',
  602. + j)
  603. call errord('expect: ',
  604. + expect(j))
  605. call errord('got: ', val)
  606. end if
  607. else
  608. nok = nok + 1
  609. end if
  610. end if
  611. 11 continue
  612. else
  613. if (nels .gt. 0 .and. err .ne. NF_ECHAR)
  614. + call errore('wrong type: ', err)
  615. end if
  616. 7 continue
  617. 5 continue
  618. 1 continue
  619. err = nf_close(ncid)
  620. if (err .ne. 0)
  621. + call errore('nf_close: ', err)
  622. call print_nok(nok)
  623. end
  624. ])dnl
  625. dnl TEST_NF_GET_VARM(TYPE)
  626. dnl
  627. define([TEST_NF_GET_VARM],dnl
  628. [dnl
  629. subroutine test_nf_get_varm_$1()
  630. implicit none
  631. #include "tests.inc"
  632. integer ncid
  633. integer d
  634. integer i
  635. integer j
  636. integer k
  637. integer m
  638. integer err
  639. logical allInExtRange
  640. logical allInIntRange
  641. integer nels
  642. integer nslabs
  643. integer nstarts
  644. integer nok
  645. integer start(MAX_RANK)
  646. integer edge(MAX_RANK)
  647. integer index(MAX_RANK)
  648. integer index2(MAX_RANK)
  649. integer mid(MAX_RANK)
  650. integer count(MAX_RANK)
  651. integer sstride(MAX_RANK)
  652. integer stride(MAX_RANK)
  653. integer imap(MAX_RANK)
  654. logical canConvert
  655. DATATYPE($1) value(MAX_NELS)
  656. doubleprecision expect(MAX_NELS)
  657. doubleprecision val
  658. integer udshift
  659. nok = 0
  660. err = nf_open(testfile, NF_NOWRITE, ncid)
  661. if (err .ne. 0)
  662. + call errore('nf_open: ', err)
  663. do 1, i = 1, NVARS
  664. canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
  665. + (NFT_ITYPE($1) .eq. NFT_TEXT)
  666. if (.not.(var_rank(i) .le. MAX_RANK)) stop 'assertion'
  667. if (.not.(var_nels(i) .le. MAX_NELS)) stop 'assertion'
  668. do 2, j = 1, var_rank(i)
  669. start(j) = 1
  670. edge(j) = 1
  671. stride(j) = 1
  672. imap(j) = 1
  673. 2 continue
  674. err = nf_get_varm_$1(BAD_ID, i, start, edge,
  675. + stride, imap,
  676. + value)
  677. if (err .ne. NF_EBADID)
  678. + call errore('bad ncid: ', err)
  679. err = nf_get_varm_$1(ncid, BAD_VARID, start,
  680. + edge, stride,
  681. + imap, value)
  682. if (err .ne. NF_ENOTVAR)
  683. + call errore('bad var id: ', err)
  684. do 3, j = 1, var_rank(i)
  685. start(j) = var_shape(j,i) + 1
  686. err = nf_get_varm_$1(ncid, i, start,
  687. + edge, stride,
  688. + imap, value)
  689. if (.not. canConvert) then
  690. if (err .ne. NF_ECHAR)
  691. + call errore('conversion: ', err)
  692. else
  693. if (err .ne. NF_EINVALCOORDS)
  694. + call errore('bad index: ', err)
  695. endif
  696. start(j) = 1
  697. edge(j) = var_shape(j,i) + 1
  698. err = nf_get_varm_$1(ncid, i, start,
  699. + edge, stride,
  700. + imap, value)
  701. if (.not. canConvert) then
  702. if (err .ne. NF_ECHAR)
  703. + call errore('conversion: ', err)
  704. else
  705. if (err .ne. NF_EEDGE)
  706. + call errore('bad edge: ', err)
  707. endif
  708. edge(j) = 1
  709. stride(j) = 0
  710. err = nf_get_varm_$1(ncid, i, start,
  711. + edge, stride,
  712. + imap, value)
  713. if (.not. canConvert) then
  714. if (err .ne. NF_ECHAR)
  715. + call errore('conversion: ', err)
  716. else
  717. if (err .ne. NF_ESTRIDE)
  718. + call errore('bad stride: ', err)
  719. endif
  720. stride(j) = 1
  721. 3 continue
  722. C Choose a random point dividing each dim into 2 parts
  723. C get 2^rank (nslabs) slabs so defined
  724. nslabs = 1
  725. do 4, j = 1, var_rank(i)
  726. mid(j) = roll( var_shape(j,i) )
  727. nslabs = nslabs * 2
  728. 4 continue
  729. C /* bits of k determine whether to get lower or upper part
  730. C * of dim
  731. C * choose random stride from 1 to edge */
  732. do 5, k = 1, nslabs
  733. nstarts = 1
  734. do 6, j = 1, var_rank(i)
  735. if (mod(udshift((k-1), -(j-1)), 2) .ne. 0) then
  736. start(j) = 1
  737. edge(j) = mid(j)
  738. else
  739. start(j) = 1 + mid(j)
  740. edge(j) = var_shape(j,i) - mid(j)
  741. end if
  742. if (edge(j) .gt. 0) then
  743. stride(j) = 1+roll(edge(j))
  744. else
  745. stride(j) = 1
  746. end if
  747. sstride(j) = stride(j)
  748. nstarts = nstarts * stride(j)
  749. 6 continue
  750. do 7, m = 1, nstarts
  751. err = index2indexes(m, var_rank(i), sstride, index)
  752. if (err .ne. 0)
  753. + call error('error in index2indexes')
  754. nels = 1
  755. do 8, j = 1, var_rank(i)
  756. count(j) = 1 + (edge(j) - index(j)) /
  757. + stride(j)
  758. nels = nels * count(j)
  759. index(j) = index(j) + start(j) - 1
  760. 8 continue
  761. C Random choice of forward or backward
  762. C /* TODO
  763. C if ( roll(2) ) then
  764. C for (j = 0 j < var_rank(i) j++) {
  765. C index(j) += (count(j) - 1) * stride(j)
  766. C stride(j) = -stride(j)
  767. C }
  768. C end if
  769. C */
  770. if (var_rank(i) .gt. 0) then
  771. imap(1) = 1
  772. do 9, j = 2, var_rank(i)
  773. imap(j) = imap(j-1) * count(j-1)
  774. 9 continue
  775. end if
  776. allInIntRange = .true.
  777. allInExtRange = .true.
  778. do 10, j = 1, nels
  779. err = index2indexes(j, var_rank(i), count,
  780. + index2)
  781. if (err .ne. 0)
  782. + call error('error in index2indexes 1')
  783. do 11, d = 1, var_rank(i)
  784. index2(d) = index(d) + (index2(d)-1) *
  785. + stride(d)
  786. 11 continue
  787. expect(j) = hash4(var_type(i), var_rank(i),
  788. + index2, NFT_ITYPE($1))
  789. if (inRange3(expect(j),var_type(i),
  790. + NFT_ITYPE($1))) then
  791. allInIntRange =
  792. + allInIntRange .and.
  793. + in_internal_range(NFT_ITYPE($1),
  794. + expect(j))
  795. else
  796. allInExtRange = .false.
  797. end if
  798. 10 continue
  799. err = nf_get_varm_$1(ncid,i,index,count,
  800. + stride,imap,
  801. + value)
  802. if (canConvert) then
  803. if (allInExtRange) then
  804. if (allInIntRange) then
  805. if (err .ne. 0)
  806. + call error(nf_strerror(err))
  807. else
  808. if (err .ne. NF_ERANGE)
  809. + call errore('Range error: ', err)
  810. end if
  811. else
  812. if (err .ne. 0 .and. err .ne. NF_ERANGE)
  813. + call errore('OK or Range error: ', err)
  814. end if
  815. do 12, j = 1, nels
  816. if (inRange3(expect(j),var_type(i),
  817. + NFT_ITYPE($1)) .and.
  818. + in_internal_range(NFT_ITYPE($1),
  819. + expect(j))) then
  820. val = ARITH($1, value(j))
  821. if (.not.equal(val, expect(j),
  822. + var_type(i),
  823. + NFT_ITYPE($1))) then
  824. call error(
  825. + 'value read not that expected')
  826. if (verbose) then
  827. call error(' ')
  828. call errori('varid: ', i)
  829. call errorc('var_name: ',
  830. + var_name(i))
  831. call errori('element number: ',
  832. + j)
  833. call errord('expect: ',
  834. + expect(j))
  835. call errord('got: ', val)
  836. end if
  837. else
  838. nok = nok + 1
  839. end if
  840. end if
  841. 12 continue
  842. else
  843. if (nels .gt. 0 .and. err .ne. NF_ECHAR)
  844. + call errore('wrong type: ', err)
  845. end if
  846. 7 continue
  847. 5 continue
  848. 1 continue
  849. err = nf_close(ncid)
  850. if (err .ne. 0)
  851. + call errore('nf_close: ', err)
  852. call print_nok(nok)
  853. end
  854. ])dnl
  855. dnl TEST_NF_GET_ATT(TYPE)
  856. dnl
  857. define([TEST_NF_GET_ATT],dnl
  858. [dnl
  859. subroutine test_nf_get_att_$1()
  860. implicit none
  861. #include "tests.inc"
  862. integer ncid
  863. integer i
  864. integer j
  865. integer k
  866. integer err
  867. integer ndx(1)
  868. logical allInExtRange
  869. logical allInIntRange
  870. logical canConvert
  871. DATATYPE($1) value(MAX_NELS)
  872. doubleprecision expect(MAX_NELS)
  873. integer nok
  874. doubleprecision val
  875. nok = 0
  876. err = nf_open(testfile, NF_NOWRITE, ncid)
  877. if (err .ne. 0)
  878. + call errore('nf_open: ', err)
  879. do 1, i = 0, NVARS
  880. do 2, j = 1, NATTS(i)
  881. canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
  882. + (NFT_ITYPE($1) .eq. NFT_TEXT)
  883. err = nf_get_att_$1(BAD_ID, i,
  884. + ATT_NAME(j,i),
  885. + value)
  886. if (err .ne. NF_EBADID)
  887. + call errore('bad ncid: ', err)
  888. err = nf_get_att_$1(ncid, BAD_VARID,
  889. + ATT_NAME(j,i),
  890. + value)
  891. if (err .ne. NF_ENOTVAR)
  892. + call errore('bad var id: ', err)
  893. err = nf_get_att_$1(ncid, i, 'noSuch', value)
  894. if (err .ne. NF_ENOTATT)
  895. + call errore('Bad attribute name: ', err)
  896. allInIntRange = .true.
  897. allInExtRange = .true.
  898. do 3, k = 1, ATT_LEN(j,i)
  899. ndx(1) = k
  900. expect(k) = hash4(ATT_TYPE(j,i), -1, ndx,
  901. + NFT_ITYPE($1))
  902. if (inRange3(expect(k),ATT_TYPE(j,i),
  903. + NFT_ITYPE($1))) then
  904. allInIntRange =
  905. + allInIntRange .and.
  906. + in_internal_range(NFT_ITYPE($1), expect(k))
  907. else
  908. allInExtRange = .false.
  909. end if
  910. 3 continue
  911. err = nf_get_att_$1(ncid, i, ATT_NAME(j,i), value)
  912. if (canConvert .or. ATT_LEN(j,i) .eq. 0) then
  913. if (allInExtRange) then
  914. if (allInIntRange) then
  915. if (err .ne. 0)
  916. + call errore('nf_get_att_$1: ', err)
  917. else
  918. if (err .ne. NF_ERANGE)
  919. + call errore('Range error: ', err)
  920. end if
  921. else
  922. if (err .ne. 0 .and. err .ne. NF_ERANGE)
  923. + call errore('OK or Range error: ',
  924. + err)
  925. end if
  926. do 4, k = 1, ATT_LEN(j,i)
  927. if (inRange3(expect(k),ATT_TYPE(j,i),
  928. + NFT_ITYPE($1)) .and.
  929. + in_internal_range(NFT_ITYPE($1),
  930. + expect(k))) then
  931. val = ARITH($1, value(k))
  932. if (.not.equal(val, expect(k),
  933. + ATT_TYPE(j,i),
  934. + NFT_ITYPE($1)))then
  935. call error(
  936. + 'value read not that expected')
  937. if (verbose) then
  938. call error(' ')
  939. call errori('varid: ', i)
  940. call errorc('att_name: ',
  941. + ATT_NAME(j,i))
  942. call errori('element number: ', k)
  943. call errord('expect: ', expect(k))
  944. call errord('got: ', val)
  945. end if
  946. else
  947. nok = nok + 1
  948. end if
  949. end if
  950. 4 continue
  951. else
  952. if (err .ne. NF_ECHAR)
  953. + call errore('wrong type: ', err)
  954. end if
  955. 2 continue
  956. 1 continue
  957. err = nf_close(ncid)
  958. if (err .ne. 0)
  959. + call errore('nf_close: ', err)
  960. call print_nok(nok)
  961. end
  962. ])dnl
  963. divert(0)dnl
  964. dnl If you see this line, you can ignore the next one.
  965. C Do not edit this file. It is produced from the corresponding .m4 source */
  966. C*********************************************************************
  967. C Copyright 1996, UCAR/Unidata
  968. C See netcdf/COPYRIGHT file for copying and redistribution conditions.
  969. C $Id: test_get.m4,v 1.10 1997/06/06 21:54:38 steve Exp $
  970. C*********************************************************************
  971. TEST_NF_GET_VAR1(text)
  972. #ifdef NF_INT1_T
  973. TEST_NF_GET_VAR1(int1)
  974. #endif
  975. #ifdef NF_INT2_T
  976. TEST_NF_GET_VAR1(int2)
  977. #endif
  978. TEST_NF_GET_VAR1(int)
  979. TEST_NF_GET_VAR1(real)
  980. TEST_NF_GET_VAR1(double)
  981. TEST_NF_GET_VAR(text)
  982. #ifdef NF_INT1_T
  983. TEST_NF_GET_VAR(int1)
  984. #endif
  985. #ifdef NF_INT2_T
  986. TEST_NF_GET_VAR(int2)
  987. #endif
  988. TEST_NF_GET_VAR(int)
  989. TEST_NF_GET_VAR(real)
  990. TEST_NF_GET_VAR(double)
  991. TEST_NF_GET_VARA(text)
  992. #ifdef NF_INT1_T
  993. TEST_NF_GET_VARA(int1)
  994. #endif
  995. #ifdef NF_INT2_T
  996. TEST_NF_GET_VARA(int2)
  997. #endif
  998. TEST_NF_GET_VARA(int)
  999. TEST_NF_GET_VARA(real)
  1000. TEST_NF_GET_VARA(double)
  1001. TEST_NF_GET_VARS(text)
  1002. #ifdef NF_INT1_T
  1003. TEST_NF_GET_VARS(int1)
  1004. #endif
  1005. #ifdef NF_INT2_T
  1006. TEST_NF_GET_VARS(int2)
  1007. #endif
  1008. TEST_NF_GET_VARS(int)
  1009. TEST_NF_GET_VARS(real)
  1010. TEST_NF_GET_VARS(double)
  1011. TEST_NF_GET_VARM(text)
  1012. #ifdef NF_INT1_T
  1013. TEST_NF_GET_VARM(int1)
  1014. #endif
  1015. #ifdef NF_INT2_T
  1016. TEST_NF_GET_VARM(int2)
  1017. #endif
  1018. TEST_NF_GET_VARM(int)
  1019. TEST_NF_GET_VARM(real)
  1020. TEST_NF_GET_VARM(double)
  1021. TEST_NF_GET_ATT(text)
  1022. #ifdef NF_INT1_T
  1023. TEST_NF_GET_ATT(int1)
  1024. #endif
  1025. #ifdef NF_INT2_T
  1026. TEST_NF_GET_ATT(int2)
  1027. #endif
  1028. TEST_NF_GET_ATT(int)
  1029. TEST_NF_GET_ATT(real)
  1030. TEST_NF_GET_ATT(double)