PageRenderTime 68ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 1ms

/other/netcdf_write_matrix/src/nf_test/test_put.m4

http://github.com/jbeezley/wrf-fire
m4 | 1374 lines | 1238 code | 90 blank | 46 comment | 0 complexity | 851d944a9a4119d44be401a6115e8600 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([,]) dnl
  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 MAKE_ARITH(funf_suffix, var)
  33. dnl
  34. define([MAKE_ARITH], [dnl
  35. ifelse($1, text, ichar($2), $2)[]dnl
  36. ])
  37. dnl MAKE_DOUBLE(funf_suffix, var)
  38. dnl
  39. define([MAKE_DOUBLE], [dnl
  40. ifelse($1, text, dble(ichar($2)), dble($2))[]dnl
  41. ])
  42. dnl MAKE_TYPE(funf_suffix, var)
  43. dnl
  44. define([MAKE_TYPE], [dnl
  45. ifelse($1, text, char(int($2)), $2)[]dnl
  46. ])
  47. dnl HASH(TYPE)
  48. dnl
  49. define([HASH],
  50. [dnl
  51. C
  52. C ensure hash value within range for internal TYPE
  53. C
  54. function hash_$1(type, rank, index, itype)
  55. implicit none
  56. #include "tests.inc"
  57. integer type
  58. integer rank
  59. integer index(1)
  60. integer itype
  61. doubleprecision minimum
  62. doubleprecision maximum
  63. minimum = internal_min(itype)
  64. maximum = internal_max(itype)
  65. hash_$1 = max(minimum, min(maximum, hash4( type, rank,
  66. + index, itype)))
  67. end
  68. ])dnl
  69. dnl CHECK_VARS(TYPE)
  70. dnl
  71. define([CHECK_VARS],dnl
  72. [dnl
  73. C
  74. C check all vars in file which are (text/numeric) compatible with TYPE
  75. C
  76. subroutine check_vars_$1(filename)
  77. implicit none
  78. #include "tests.inc"
  79. character*(*) filename
  80. integer ncid !/* netCDF id */
  81. integer index(MAX_RANK)
  82. integer err !/* status */
  83. integer d
  84. integer i
  85. integer j
  86. DATATYPE($1) value
  87. integer datatype
  88. integer ndims
  89. integer dimids(MAX_RANK)
  90. integer ngatts
  91. doubleprecision expect
  92. character*(NF_MAX_NAME) name
  93. integer length
  94. logical canConvert !/* Both text or both numeric */
  95. integer nok !/* count of valid comparisons */
  96. doubleprecision val
  97. nok = 0
  98. err = nf_open(filename, NF_NOWRITE, ncid)
  99. if (err .ne. 0)
  100. + call errore('nf_open: ', err)
  101. do 1, i = 1, NVARS
  102. canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
  103. + (NFT_ITYPE($1) .eq. NFT_TEXT)
  104. if (canConvert) then
  105. err = nf_inq_var(ncid, i, name, datatype, ndims, dimids,
  106. + ngatts)
  107. if (err .ne. 0)
  108. + call errore('nf_inq_var: ', err)
  109. if (name .ne. var_name(i))
  110. + call error('Unexpected var_name')
  111. if (datatype .ne. var_type(i))
  112. + call error('Unexpected type')
  113. if (ndims .ne. var_rank(i))
  114. + call error('Unexpected rank')
  115. do 2, j = 1, ndims
  116. err = nf_inq_dim(ncid, dimids(j), name, length)
  117. if (err .ne. 0)
  118. + call errore('nf_inq_dim: ', err)
  119. if (length .ne. var_shape(j,i))
  120. + call error('Unexpected shape')
  121. 2 continue
  122. do 3, j = 1, var_nels(i)
  123. err = index2indexes(j, var_rank(i), var_shape(1,i),
  124. + index)
  125. if (err .ne. 0)
  126. + call error('error in index2indexes()')
  127. expect = hash4( var_type(i), var_rank(i), index,
  128. + NFT_ITYPE($1))
  129. err = nf_get_var1_$1(ncid, i, index, value)
  130. if (inRange3(expect,datatype,NFT_ITYPE($1))) then
  131. if (in_internal_range(NFT_ITYPE($1),
  132. + expect)) then
  133. if (err .ne. 0) then
  134. call errore('nf_get_var1_$1: ', err)
  135. else
  136. val = MAKE_ARITH($1,value)
  137. if (.not.equal(
  138. + val,
  139. + expect,var_type(i),
  140. + NFT_ITYPE($1))) then
  141. call error(
  142. + 'Var value read not that expected')
  143. if (verbose) then
  144. call error(' ')
  145. call errori('varid: %d', i)
  146. call errorc('var_name: ',
  147. + var_name(i))
  148. call error('index:')
  149. do 4, d = 1, var_rank(i)
  150. call errori(' ', index(d))
  151. 4 continue
  152. call errord('expect: ', expect)
  153. call errord('got: ', val)
  154. end if
  155. else
  156. nok = nok + 1
  157. end if
  158. end if
  159. end if
  160. end if
  161. 3 continue
  162. end if
  163. 1 continue
  164. err = nf_close (ncid)
  165. if (err .ne. 0)
  166. + call errore('nf_close: ', err)
  167. call print_nok(nok)
  168. end
  169. ])dnl
  170. dnl CHECK_ATTS(TYPE) numeric only
  171. dnl
  172. define([CHECK_ATTS],dnl
  173. [dnl
  174. C/*
  175. C * check all attributes in file which are (text/numeric) compatible with TYPE
  176. C * ignore any attributes containing values outside range of TYPE
  177. C */
  178. subroutine check_atts_$1(ncid)
  179. implicit none
  180. #include "tests.inc"
  181. integer ncid
  182. integer err !/* status */
  183. integer i
  184. integer j
  185. integer k
  186. integer ndx(1)
  187. DATATYPE($1) value(MAX_NELS)
  188. integer datatype
  189. doubleprecision expect(MAX_NELS)
  190. integer length
  191. integer nInExtRange !/* number values within external range */
  192. integer nInIntRange !/* number values within internal range */
  193. logical canConvert !/* Both text or both numeric */
  194. integer nok !/* count of valid comparisons */
  195. doubleprecision val
  196. nok = 0
  197. do 1, i = 0, NVARS
  198. do 2, j = 1, NATTS(i)
  199. canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
  200. + (NFT_ITYPE($1) .eq. NFT_TEXT)
  201. if (canConvert) then
  202. err = nf_inq_att(ncid, i, ATT_NAME(j,i), datatype,
  203. + length)
  204. if (err .ne. 0)
  205. + call errore('nf_inq_att: ', err)
  206. if (datatype .ne. ATT_TYPE(j,i))
  207. + call error('nf_inq_att: unexpected type')
  208. if (length .ne. ATT_LEN(j,i))
  209. + call error('nf_inq_att: unexpected length')
  210. if (.not.(length .le. MAX_NELS))
  211. + stop 'assert(length .le. MAX_NELS)'
  212. nInIntRange = 0
  213. nInExtRange = 0
  214. do 4, k = 1, length
  215. ndx(1) = k
  216. expect(k) = hash4( datatype, -1, ndx,
  217. + NFT_ITYPE($1))
  218. if (inRange3(expect(k), datatype,
  219. + NFT_ITYPE($1))) then
  220. nInExtRange = nInExtRange + 1
  221. if (in_internal_range(NFT_ITYPE($1),
  222. + expect(k)))
  223. + nInIntRange = nInIntRange + 1
  224. end if
  225. 4 continue
  226. err = nf_get_att_$1(ncid, i,
  227. + ATT_NAME(j,i), value)
  228. if (nInExtRange .eq. length .and.
  229. + nInIntRange .eq. length) then
  230. if (err .ne. 0)
  231. + call error(nf_strerror(err))
  232. else
  233. if (err .ne. 0 .and. err .ne. NF_ERANGE)
  234. + call errore('OK or Range error: ', err)
  235. end if
  236. do 3, k = 1, length
  237. if (inRange3(expect(k),datatype,NFT_ITYPE($1))
  238. + .and.
  239. + in_internal_range(NFT_ITYPE($1),
  240. + expect(k))) then
  241. val = MAKE_ARITH($1,value(k))
  242. if (.not.equal(
  243. + val,
  244. + expect(k),datatype,
  245. + NFT_ITYPE($1))) then
  246. call error(
  247. + 'att. value read not that expected')
  248. if (verbose) then
  249. call error(' ')
  250. call errori('varid: ', i)
  251. call errorc('att_name: ',
  252. + ATT_NAME(j,i))
  253. call errori('element number: ', k)
  254. call errord('expect: ', expect(k))
  255. call errord('got: ', val)
  256. end if
  257. else
  258. nok = nok + 1
  259. end if
  260. end if
  261. 3 continue
  262. end if
  263. 2 continue
  264. 1 continue
  265. call print_nok(nok)
  266. end
  267. ])dnl
  268. dnl TEST_NF_PUT_VAR1(TYPE)
  269. dnl
  270. define([TEST_NF_PUT_VAR1],dnl
  271. [dnl
  272. subroutine test_nf_put_var1_$1()
  273. implicit none
  274. #include "tests.inc"
  275. integer ncid
  276. integer i
  277. integer j
  278. integer err
  279. integer index(MAX_RANK)
  280. logical canConvert !/* Both text or both numeric */
  281. DATATYPE($1) value
  282. doubleprecision val
  283. value = MAKE_TYPE($1, 5)!/* any value would do - only for error cases */
  284. err = nf_create(scratch, NF_CLOBBER, ncid)
  285. if (err .ne. 0) then
  286. call errore('nf_create: ', err)
  287. return
  288. end if
  289. call def_dims(ncid)
  290. call def_vars(ncid)
  291. err = nf_enddef(ncid)
  292. if (err .ne. 0)
  293. + call errore('nf_enddef: ', err)
  294. do 1, i = 1, NVARS
  295. canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
  296. + (NFT_ITYPE($1) .eq. NFT_TEXT)
  297. do 2, j = 1, var_rank(i)
  298. index(j) = 1
  299. 2 continue
  300. err = nf_put_var1_$1(BAD_ID, i, index, value)
  301. if (err .ne. NF_EBADID)
  302. + call errore('bad ncid: ', err)
  303. err = nf_put_var1_$1(ncid, BAD_VARID,
  304. + index, value)
  305. if (err .ne. NF_ENOTVAR)
  306. + call errore('bad var id: ', err)
  307. do 3, j = 1, var_rank(i)
  308. if (var_dimid(j,i) .gt. 1) then !/* skip record dim */
  309. index(j) = var_shape(j,i) + 1
  310. err = nf_put_var1_$1(ncid, i,
  311. + index, value)
  312. if (.not. canConvert) then
  313. if (err .ne. NF_ECHAR)
  314. + call errore('conversion: ', err)
  315. else
  316. if (err .ne. NF_EINVALCOORDS)
  317. + call errore('bad index: ', err)
  318. endif
  319. index(j) = 0
  320. end if
  321. 3 continue
  322. do 4, j = 1, var_nels(i)
  323. err = index2indexes(j, var_rank(i), var_shape(1,i),
  324. + index)
  325. if (err .ne. 0)
  326. + call error('error in index2indexes 1')
  327. value = MAKE_TYPE($1, hash_$1(var_type(i),var_rank(i),
  328. + index, NFT_ITYPE($1)))
  329. err = nf_put_var1_$1(ncid, i, index, value)
  330. if (canConvert) then
  331. val = ARITH($1, value)
  332. if (inRange3(val, var_type(i), NFT_ITYPE($1))) then
  333. if (err .ne. 0)
  334. + call error(nf_strerror(err))
  335. else
  336. if (err .ne. NF_ERANGE)
  337. + call errore('Range error: ', err)
  338. end if
  339. else
  340. if (err .ne. NF_ECHAR)
  341. + call errore('wrong type: ', err)
  342. end if
  343. 4 continue
  344. 1 continue
  345. err = nf_close(ncid)
  346. if (err .ne. 0)
  347. + call errore('nf_close: ', err)
  348. call check_vars_$1(scratch)
  349. err = nf_delete(scratch)
  350. if (err .ne. 0)
  351. + call errorc('delete of scratch file failed: ',
  352. + scratch)
  353. end
  354. ])dnl
  355. dnl TEST_NF_PUT_VAR(TYPE)
  356. dnl
  357. define([TEST_NF_PUT_VAR],dnl
  358. [dnl
  359. subroutine test_nf_put_var_$1()
  360. implicit none
  361. #include "tests.inc"
  362. integer ncid
  363. integer vid
  364. integer i
  365. integer j
  366. integer err
  367. integer nels
  368. integer index(MAX_RANK)
  369. logical canConvert !/* Both text or both numeric */
  370. logical allInExtRange !/* All values within external range?*/
  371. DATATYPE($1) value(MAX_NELS)
  372. doubleprecision val
  373. err = nf_create(scratch, NF_CLOBBER, ncid)
  374. if (err .ne. 0) then
  375. call errore('nf_create: ', err)
  376. return
  377. end if
  378. call def_dims(ncid)
  379. call def_vars(ncid)
  380. err = nf_enddef(ncid)
  381. if (err .ne. 0)
  382. + call errore('nf_enddef: ', err)
  383. do 1, i = 1, NVARS
  384. canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
  385. + (NFT_ITYPE($1) .eq. NFT_TEXT)
  386. err = nf_put_var_$1(BAD_ID, i, value)
  387. if (err .ne. NF_EBADID)
  388. + call errore('bad ncid: ', err)
  389. err = nf_put_var_$1(ncid, BAD_VARID, value)
  390. if (err .ne. NF_ENOTVAR)
  391. + call errore('bad var id: ', err)
  392. nels = 1
  393. do 3, j = 1, var_rank(i)
  394. nels = nels * var_shape(j,i)
  395. 3 continue
  396. allInExtRange = .true.
  397. do 4, j = 1, var_nels(i)
  398. err = index2indexes(j, var_rank(i), var_shape(1,i),
  399. + index)
  400. if (err .ne. 0)
  401. + call error('error in index2indexes 1')
  402. value(j) = MAKE_TYPE($1, hash_$1(var_type(i),
  403. + var_rank(i),
  404. + index, NFT_ITYPE($1)))
  405. val = ARITH($1, value(j))
  406. allInExtRange = allInExtRange .and.
  407. + inRange3(val, var_type(i), NFT_ITYPE($1))
  408. 4 continue
  409. err = nf_put_var_$1(ncid, i, value)
  410. if (canConvert) then
  411. if (allInExtRange) then
  412. if (err .ne. 0)
  413. + call error(nf_strerror(err))
  414. else
  415. if (err .ne. NF_ERANGE .and.
  416. + var_dimid(var_rank(i),i) .ne. RECDIM)
  417. + call errore('Range error: ', err)
  418. endif
  419. else
  420. if (err .ne. NF_ECHAR)
  421. + call errore('wrong type: ', err)
  422. endif
  423. 1 continue
  424. C The preceeding has written nothing for record variables, now try
  425. C again with more than 0 records.
  426. C Write record number NRECS to force writing of preceding records.
  427. C Assumes variable cr is char vector with UNLIMITED dimension.
  428. err = nf_inq_varid(ncid, "cr", vid)
  429. if (err .ne. 0)
  430. + call errore('nf_inq_varid: ', err)
  431. index(1) = NRECS
  432. err = nf_put_var1_text(ncid, vid, index, 'x')
  433. if (err .ne. 0)
  434. + call errore('nf_put_var1_text: ', err)
  435. do 5 i = 1, NVARS
  436. C Only test record variables here
  437. if (var_rank(i) .ge. 1 .and.
  438. + var_dimid(var_rank(i),i) .eq. RECDIM) then
  439. canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
  440. + (NFT_ITYPE($1) .eq. NFT_TEXT)
  441. if (var_rank(i) .gt. MAX_RANK)
  442. + stop 'var_rank(i) .gt. MAX_RANK'
  443. if (var_nels(i) .gt. MAX_NELS)
  444. + stop 'var_nels(i) .gt. MAX_NELS'
  445. err = nf_put_var_$1(BAD_ID, i, value)
  446. nels = 1
  447. do 6 j = 1, var_rank(i)
  448. nels = nels * var_shape(j,i)
  449. 6 continue
  450. allInExtRange = .true.
  451. do 7, j = 1, nels
  452. err = index2indexes(j, var_rank(i), var_shape(1,i),
  453. + index)
  454. if (err .ne. 0)
  455. + call error('error in index2indexes()')
  456. value(j) = MAKE_TYPE($1, hash_$1(var_type(i),
  457. + var_rank(i),
  458. + index, NFT_ITYPE($1)))
  459. val = ARITH($1, value(j))
  460. allInExtRange = allInExtRange .and.
  461. + inRange3(val, var_type(i), NFT_ITYPE($1))
  462. 7 continue
  463. err = nf_put_var_$1(ncid, i, value)
  464. if (canConvert) then
  465. if (allInExtRange) then
  466. if (err .ne. 0)
  467. + call error(nf_strerror(err))
  468. else
  469. if (err .ne. NF_ERANGE)
  470. + call errore('range error: ', err)
  471. endif
  472. else
  473. if (nels .gt. 0 .and. err .ne. NF_ECHAR)
  474. + call errore('wrong type: ', err)
  475. endif
  476. endif
  477. 5 continue
  478. err = nf_close(ncid)
  479. if (err .ne. 0)
  480. + call errore('nf_close: ', err)
  481. call check_vars_$1(scratch)
  482. err = nf_delete(scratch)
  483. if (err .ne. 0)
  484. + call errorc('delete of scratch file failed: ',
  485. + scratch)
  486. end
  487. ])dnl
  488. dnl TEST_NF_PUT_VARA(TYPE)
  489. dnl
  490. define([TEST_NF_PUT_VARA],dnl
  491. [dnl
  492. subroutine test_nf_put_vara_$1()
  493. implicit none
  494. #include "tests.inc"
  495. integer ncid
  496. integer i
  497. integer j
  498. integer k
  499. integer d
  500. integer err
  501. integer nslabs
  502. integer nels
  503. integer start(MAX_RANK)
  504. integer edge(MAX_RANK)
  505. integer mid(MAX_RANK)
  506. integer index(MAX_RANK)
  507. logical canConvert !/* Both text or both numeric */
  508. logical allInExtRange !/* all values within external range? */
  509. DATATYPE($1) value(MAX_NELS)
  510. doubleprecision val
  511. integer udshift
  512. err = nf_create(scratch, NF_CLOBBER, ncid)
  513. if (err .ne. 0) then
  514. call errore('nf_create: ', err)
  515. return
  516. end if
  517. call def_dims(ncid)
  518. call def_vars(ncid)
  519. err = nf_enddef(ncid)
  520. if (err .ne. 0)
  521. + call errore('nf_enddef: ', err)
  522. do 1, i = 1, NVARS
  523. canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
  524. + (NFT_ITYPE($1) .eq. NFT_TEXT)
  525. if (.not.(var_rank(i) .le. MAX_RANK))
  526. + stop 'assert(var_rank(i) .le. MAX_RANK)'
  527. if (.not.(var_nels(i) .le. MAX_NELS))
  528. + stop 'assert(var_nels(i) .le. MAX_NELS)'
  529. do 2, j = 1, var_rank(i)
  530. start(j) = 1
  531. edge(j) = 1
  532. 2 continue
  533. err = nf_put_vara_$1(BAD_ID, i, start,
  534. + edge, value)
  535. if (err .ne. NF_EBADID)
  536. + call errore('bad ncid: ', err)
  537. err = nf_put_vara_$1(ncid, BAD_VARID,
  538. + start, edge, value)
  539. if (err .ne. NF_ENOTVAR)
  540. + call errore('bad var id: ', err)
  541. do 3, j = 1, var_rank(i)
  542. if (var_dimid(j,i) .ne. RECDIM) then !/* skip record dim */
  543. start(j) = var_shape(j,i) + 1
  544. err = nf_put_vara_$1(ncid, i, start,
  545. + edge, value)
  546. if (.not. canConvert) then
  547. if (err .ne. NF_ECHAR)
  548. + call errore('conversion: ', err)
  549. else
  550. if (err .ne. NF_EINVALCOORDS)
  551. + call errore('bad start: ', err)
  552. endif
  553. start(j) = 1
  554. edge(j) = var_shape(j,i) + 1
  555. err = nf_put_vara_$1(ncid, i, start,
  556. + edge, value)
  557. if (.not. canConvert) then
  558. if (err .ne. NF_ECHAR)
  559. + call errore('conversion: ', err)
  560. else
  561. if (err .ne. NF_EEDGE)
  562. + call errore('bad edge: ', err)
  563. endif
  564. edge(j) = 1
  565. end if
  566. 3 continue
  567. C /* Check correct error returned even when nothing to put */
  568. do 20, j = 1, var_rank(i)
  569. edge(j) = 0
  570. 20 continue
  571. err = nf_put_vara_$1(BAD_ID, i, start,
  572. + edge, value)
  573. if (err .ne. NF_EBADID)
  574. + call errore('bad ncid: ', err)
  575. err = nf_put_vara_$1(ncid, BAD_VARID,
  576. + start, edge, value)
  577. if (err .ne. NF_ENOTVAR)
  578. + call errore('bad var id: ', err)
  579. do 21, j = 1, var_rank(i)
  580. if (var_dimid(j,i) .gt. 1) then ! skip record dim
  581. start(j) = var_shape(j,i) + 2
  582. err = nf_put_vara_$1(ncid, i, start,
  583. + edge, value)
  584. if (.not. canConvert) then
  585. if (err .ne. NF_ECHAR)
  586. + call errore('conversion: ', err)
  587. else
  588. if (err .ne. NF_EINVALCOORDS)
  589. + call errore('bad start: ', err)
  590. endif
  591. start(j) = 1
  592. endif
  593. 21 continue
  594. err = nf_put_vara_$1(ncid, i, start, edge, value)
  595. if (canConvert) then
  596. if (err .ne. 0)
  597. + call error(nf_strerror(err))
  598. else
  599. if (err .ne. NF_ECHAR)
  600. + call errore('wrong type: ', err)
  601. endif
  602. do 22, j = 1, var_rank(i)
  603. edge(j) = 1
  604. 22 continue
  605. !/* Choose a random point dividing each dim into 2 parts */
  606. !/* Put 2^rank (nslabs) slabs so defined */
  607. nslabs = 1
  608. do 4, j = 1, var_rank(i)
  609. mid(j) = roll( var_shape(j,i) )
  610. nslabs = nslabs * 2
  611. 4 continue
  612. !/* bits of k determine whether to put lower or upper part of dim */
  613. do 5, k = 1, nslabs
  614. nels = 1
  615. do 6, j = 1, var_rank(i)
  616. if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
  617. start(j) = 1
  618. edge(j) = mid(j)
  619. else
  620. start(j) = 1 + mid(j)
  621. edge(j) = var_shape(j,i) - mid(j)
  622. end if
  623. nels = nels * edge(j)
  624. 6 continue
  625. allInExtRange = .true.
  626. do 7, j = 1, nels
  627. err = index2indexes(j, var_rank(i), edge, index)
  628. if (err .ne. 0)
  629. + call error('error in index2indexes 1')
  630. do 8, d = 1, var_rank(i)
  631. index(d) = index(d) + start(d) - 1
  632. 8 continue
  633. value(j)= MAKE_TYPE($1, hash_$1(var_type(i),
  634. + var_rank(i), index,
  635. + NFT_ITYPE($1)))
  636. val = ARITH($1, value(j))
  637. allInExtRange = allInExtRange .and.
  638. + inRange3(val, var_type(i), NFT_ITYPE($1))
  639. 7 continue
  640. err = nf_put_vara_$1(ncid, i, start,
  641. + edge, value)
  642. if (canConvert) then
  643. if (allInExtRange) then
  644. if (err .ne. 0)
  645. + call error(nf_strerror(err))
  646. else
  647. if (err .ne. NF_ERANGE)
  648. + call errore('range error: ', err)
  649. end if
  650. else
  651. if (nels .gt. 0 .and. err .ne. NF_ECHAR)
  652. + call errore('wrong type: ', err)
  653. end if
  654. 5 continue
  655. 1 continue
  656. err = nf_close(ncid)
  657. if (err .ne. 0)
  658. + call errore('nf_close: ', err)
  659. call check_vars_$1(scratch)
  660. err = nf_delete(scratch)
  661. if (err .ne. 0)
  662. + call errorc('delete of scratch file failed: ',
  663. + scratch)
  664. end
  665. ])dnl
  666. dnl TEST_NF_PUT_VARS(TYPE)
  667. dnl
  668. define([TEST_NF_PUT_VARS],dnl
  669. [dnl
  670. subroutine test_nf_put_vars_$1()
  671. implicit none
  672. #include "tests.inc"
  673. integer ncid
  674. integer d
  675. integer i
  676. integer j
  677. integer k
  678. integer m
  679. integer err
  680. integer nels
  681. integer nslabs
  682. integer nstarts !/* number of different starts */
  683. integer start(MAX_RANK)
  684. integer edge(MAX_RANK)
  685. integer index(MAX_RANK)
  686. integer index2(MAX_RANK)
  687. integer mid(MAX_RANK)
  688. integer count(MAX_RANK)
  689. integer sstride(MAX_RANK)
  690. integer stride(MAX_RANK)
  691. logical canConvert !/* Both text or both numeric */
  692. logical allInExtRange !/* all values within external range? */
  693. DATATYPE($1) value(MAX_NELS)
  694. doubleprecision val
  695. integer udshift
  696. err = nf_create(scratch, NF_CLOBBER, ncid)
  697. if (err .ne. 0) then
  698. call errore('nf_create: ', err)
  699. return
  700. end if
  701. call def_dims(ncid)
  702. call def_vars(ncid)
  703. err = nf_enddef(ncid)
  704. if (err .ne. 0)
  705. + call errore('nf_enddef: ', err)
  706. do 1, i = 1, NVARS
  707. canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
  708. + (NFT_ITYPE($1) .eq. NFT_TEXT)
  709. if (.not.(var_rank(i) .le. MAX_RANK))
  710. + stop 'assert(var_rank(i) .le. MAX_RANK)'
  711. if (.not.(var_nels(i) .le. MAX_NELS))
  712. + stop 'assert(var_nels(i) .le. MAX_NELS)'
  713. do 2, j = 1, var_rank(i)
  714. start(j) = 1
  715. edge(j) = 1
  716. stride(j) = 1
  717. 2 continue
  718. err = nf_put_vars_$1(BAD_ID, i, start,
  719. + edge, stride, value)
  720. if (err .ne. NF_EBADID)
  721. + call errore('bad ncid: ', err)
  722. err = nf_put_vars_$1(ncid, BAD_VARID, start,
  723. + edge, stride,
  724. + value)
  725. if (err .ne. NF_ENOTVAR)
  726. + call errore('bad var id: ', err)
  727. do 3, j = 1, var_rank(i)
  728. if (var_dimid(j,i) .ne. RECDIM) then ! skip record dim
  729. start(j) = var_shape(j,i) + 2
  730. err = nf_put_vars_$1(ncid, i, start,
  731. + edge, stride,
  732. + value)
  733. if (.not. canConvert) then
  734. if (err .ne. NF_ECHAR)
  735. + call errore('conversion: ', err)
  736. else
  737. if (err .ne. NF_EINVALCOORDS)
  738. + call errore('bad start: ', err)
  739. endif
  740. start(j) = 1
  741. edge(j) = var_shape(j,i) + 1
  742. err = nf_put_vars_$1(ncid, i, start,
  743. + edge, stride,
  744. + value)
  745. if (.not. canConvert) then
  746. if (err .ne. NF_ECHAR)
  747. + call errore('conversion: ', err)
  748. else
  749. if (err .ne. NF_EEDGE)
  750. + call errore('bad edge: ', err)
  751. endif
  752. edge(j) = 1
  753. stride(j) = 0
  754. err = nf_put_vars_$1(ncid, i, start,
  755. + edge, stride,
  756. + value)
  757. if (.not. canConvert) then
  758. if (err .ne. NF_ECHAR)
  759. + call errore('conversion: ', err)
  760. else
  761. if (err .ne. NF_ESTRIDE)
  762. + call errore('bad stride: ', err)
  763. endif
  764. stride(j) = 1
  765. end if
  766. 3 continue
  767. !/* Choose a random point dividing each dim into 2 parts */
  768. !/* Put 2^rank (nslabs) slabs so defined */
  769. nslabs = 1
  770. do 4, j = 1, var_rank(i)
  771. mid(j) = roll( var_shape(j,i) )
  772. nslabs = nslabs * 2
  773. 4 continue
  774. !/* bits of k determine whether to put lower or upper part of dim */
  775. !/* choose random stride from 1 to edge */
  776. do 5, k = 1, nslabs
  777. nstarts = 1
  778. do 6, j = 1, var_rank(i)
  779. if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
  780. start(j) = 1
  781. edge(j) = mid(j)
  782. else
  783. start(j) = 1 + mid(j)
  784. edge(j) = var_shape(j,i) - mid(j)
  785. end if
  786. if (edge(j) .gt. 0) then
  787. stride(j) = 1+roll(edge(j))
  788. else
  789. stride(j) = 1
  790. end if
  791. sstride(j) = stride(j)
  792. nstarts = nstarts * stride(j)
  793. 6 continue
  794. do 7, m = 1, nstarts
  795. err = index2indexes(m, var_rank(i), sstride, index)
  796. if (err .ne. 0)
  797. + call error('error in index2indexes')
  798. nels = 1
  799. do 8, j = 1, var_rank(i)
  800. count(j) = 1 + (edge(j) - index(j)) / stride(j)
  801. nels = nels * count(j)
  802. index(j) = index(j) + start(j) - 1
  803. 8 continue
  804. !/* Random choice of forward or backward */
  805. C/* TODO
  806. C if ( roll(2) ) {
  807. C for (j = 1 j .lt. var_rank(i) j++) {
  808. C index(j) += (count(j) - 1) * stride(j)
  809. C stride(j) = -stride(j)
  810. C }
  811. C }
  812. C*/
  813. allInExtRange = .true.
  814. do 9, j = 1, nels
  815. err = index2indexes(j, var_rank(i), count,
  816. + index2)
  817. if (err .ne. 0)
  818. + call error('error in index2indexes')
  819. do 10, d = 1, var_rank(i)
  820. index2(d) = index(d) +
  821. + (index2(d)-1) * stride(d)
  822. 10 continue
  823. value(j) = MAKE_TYPE($1, hash_$1(var_type(i),
  824. + var_rank(i),
  825. + index2, NFT_ITYPE($1)))
  826. val = ARITH($1, value(j))
  827. allInExtRange = allInExtRange .and.
  828. + inRange3(val, var_type(i),
  829. + NFT_ITYPE($1))
  830. 9 continue
  831. err = nf_put_vars_$1(ncid, i, index,
  832. + count, stride,
  833. + value)
  834. if (canConvert) then
  835. if (allInExtRange) then
  836. if (err .ne. 0)
  837. + call error(nf_strerror(err))
  838. else
  839. if (err .ne. NF_ERANGE)
  840. + call errore('range error: ', err)
  841. end if
  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 check_vars_$1(scratch)
  853. err = nf_delete(scratch)
  854. if (err .ne. 0)
  855. + call errorc('delete of scratch file failed:',
  856. + scratch)
  857. end
  858. ])dnl
  859. dnl TEST_NF_PUT_VARM(TYPE)
  860. dnl
  861. define([TEST_NF_PUT_VARM],dnl
  862. [dnl
  863. subroutine test_nf_put_varm_$1()
  864. implicit none
  865. #include "tests.inc"
  866. integer ncid
  867. integer d
  868. integer i
  869. integer j
  870. integer k
  871. integer m
  872. integer err
  873. integer nels
  874. integer nslabs
  875. integer nstarts !/* number of different starts */
  876. integer start(MAX_RANK)
  877. integer edge(MAX_RANK)
  878. integer index(MAX_RANK)
  879. integer index2(MAX_RANK)
  880. integer mid(MAX_RANK)
  881. integer count(MAX_RANK)
  882. integer sstride(MAX_RANK)
  883. integer stride(MAX_RANK)
  884. integer imap(MAX_RANK)
  885. logical canConvert !/* Both text or both numeric */
  886. logical allInExtRange !/* all values within external range? */
  887. DATATYPE($1) value(MAX_NELS)
  888. doubleprecision val
  889. integer udshift
  890. err = nf_create(scratch, NF_CLOBBER, ncid)
  891. if (err .ne. 0) then
  892. call errore('nf_create: ', err)
  893. return
  894. end if
  895. call def_dims(ncid)
  896. call def_vars(ncid)
  897. err = nf_enddef(ncid)
  898. if (err .ne. 0)
  899. + call errore('nf_enddef: ', err)
  900. do 1, i = 1, NVARS
  901. canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
  902. + (NFT_ITYPE($1) .eq. NFT_TEXT)
  903. if (.not.(var_rank(i) .le. MAX_RANK))
  904. + stop 'assert(var_rank(i) .le. MAX_RANK)'
  905. if (.not.(var_nels(i) .le. MAX_NELS))
  906. + stop 'assert(var_nels(i) .le. MAX_NELS)'
  907. do 2, j = 1, var_rank(i)
  908. start(j) = 1
  909. edge(j) = 1
  910. stride(j) = 1
  911. imap(j) = 1
  912. 2 continue
  913. err = nf_put_varm_$1(BAD_ID, i, start,
  914. + edge, stride, imap,
  915. + value)
  916. if (err .ne. NF_EBADID)
  917. + call errore('bad ncid: ', err)
  918. err = nf_put_varm_$1(ncid, BAD_VARID, start,
  919. + edge, stride,
  920. + imap, value)
  921. if (err .ne. NF_ENOTVAR)
  922. + call errore('bad var id: ', err)
  923. do 3, j = 1, var_rank(i)
  924. if (var_dimid(j,i) .ne. RECDIM) then !/* skip record dim */
  925. start(j) = var_shape(j,i) + 2
  926. err = nf_put_varm_$1(ncid, i, start,
  927. + edge, stride,
  928. + imap, value)
  929. if (.not. canConvert) then
  930. if (err .ne. NF_ECHAR)
  931. + call errore('conversion: ', err)
  932. else
  933. if (err .ne. NF_EINVALCOORDS)
  934. + call errore('bad start: ', err)
  935. endif
  936. start(j) = 1
  937. edge(j) = var_shape(j,i) + 1
  938. err = nf_put_varm_$1(ncid, i, start,
  939. + edge, stride,
  940. + imap, value)
  941. if (.not. canConvert) then
  942. if (err .ne. NF_ECHAR)
  943. + call errore('conversion: ', err)
  944. else
  945. if (err .ne. NF_EEDGE)
  946. + call errore('bad edge: ', err)
  947. endif
  948. edge(j) = 1
  949. stride(j) = 0
  950. err = nf_put_varm_$1(ncid, i, start,
  951. + edge, stride,
  952. + imap, value)
  953. if (.not. canConvert) then
  954. if (err .ne. NF_ECHAR)
  955. + call errore('conversion: ', err)
  956. else
  957. if (err .ne. NF_ESTRIDE)
  958. + call errore('bad stride: ', err)
  959. endif
  960. stride(j) = 1
  961. end if
  962. 3 continue
  963. !/* Choose a random point dividing each dim into 2 parts */
  964. !/* Put 2^rank (nslabs) slabs so defined */
  965. nslabs = 1
  966. do 4, j = 1, var_rank(i)
  967. mid(j) = roll( var_shape(j,i) )
  968. nslabs = nslabs * 2
  969. 4 continue
  970. !/* bits of k determine whether to put lower or upper part of dim */
  971. !/* choose random stride from 1 to edge */
  972. do 5, k = 1, nslabs
  973. nstarts = 1
  974. do 6, j = 1, var_rank(i)
  975. if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
  976. start(j) = 1
  977. edge(j) = mid(j)
  978. else
  979. start(j) = 1 + mid(j)
  980. edge(j) = var_shape(j,i) - mid(j)
  981. end if
  982. if (edge(j) .gt. 0) then
  983. stride(j) = 1+roll(edge(j))
  984. else
  985. stride(j) = 1
  986. end if
  987. sstride(j) = stride(j)
  988. nstarts = nstarts * stride(j)
  989. 6 continue
  990. do 7, m = 1, nstarts
  991. err = index2indexes(m, var_rank(i), sstride, index)
  992. if (err .ne. 0)
  993. + call error('error in index2indexes')
  994. nels = 1
  995. do 8, j = 1, var_rank(i)
  996. count(j) = 1 + (edge(j) - index(j)) / stride(j)
  997. nels = nels * count(j)
  998. index(j) = index(j) + start(j) - 1
  999. 8 continue
  1000. !/* Random choice of forward or backward */
  1001. C/* TODO
  1002. C if ( roll(2) ) then
  1003. C do 9, j = 1, var_rank(i)
  1004. C index(j) = index(j) +
  1005. C + (count(j) - 1) * stride(j)
  1006. C stride(j) = -stride(j)
  1007. C9 continue
  1008. C end if
  1009. C*/
  1010. if (var_rank(i) .gt. 0) then
  1011. imap(1) = 1
  1012. do 10, j = 2, var_rank(i)
  1013. imap(j) = imap(j-1) * count(j-1)
  1014. 10 continue
  1015. end if
  1016. allInExtRange = .true.
  1017. do 11 j = 1, nels
  1018. err = index2indexes(j, var_rank(i), count,
  1019. + index2)
  1020. if (err .ne. 0)
  1021. + call error('error in index2indexes')
  1022. do 12, d = 1, var_rank(i)
  1023. index2(d) = index(d) +
  1024. + (index2(d)-1) * stride(d)
  1025. 12 continue
  1026. value(j) = MAKE_TYPE($1, hash_$1(var_type(i),
  1027. + var_rank(i),
  1028. + index2, NFT_ITYPE($1)))
  1029. val = ARITH($1, value(j))
  1030. allInExtRange = allInExtRange .and.
  1031. + inRange3(val, var_type(i),
  1032. + NFT_ITYPE($1))
  1033. 11 continue
  1034. err = nf_put_varm_$1(ncid,i,index,count,
  1035. + stride,imap,
  1036. + value)
  1037. if (canConvert) then
  1038. if (allInExtRange) then
  1039. if (err .ne. 0)
  1040. + call error(nf_strerror(err))
  1041. else
  1042. if (err .ne. NF_ERANGE)
  1043. + call errore('range error: ', err)
  1044. end if
  1045. else
  1046. if (nels .gt. 0 .and. err .ne. NF_ECHAR)
  1047. + call errore('wrong type: ', err)
  1048. end if
  1049. 7 continue
  1050. 5 continue
  1051. 1 continue
  1052. err = nf_close(ncid)
  1053. if (err .ne. 0)
  1054. + call errore('nf_close: ', err)
  1055. call check_vars_$1(scratch)
  1056. err = nf_delete(scratch)
  1057. if (err .ne. 0)
  1058. + call errorc('delete of scratch file failed:',
  1059. + scratch)
  1060. end
  1061. ])dnl
  1062. dnl TEST_NF_PUT_ATT(TYPE) numeric only
  1063. dnl
  1064. define([TEST_NF_PUT_ATT],dnl
  1065. [dnl
  1066. subroutine test_nf_put_att_$1()
  1067. implicit none
  1068. #include "tests.inc"
  1069. integer ncid
  1070. integer i
  1071. integer j
  1072. integer k
  1073. integer ndx(1)
  1074. integer err
  1075. DATATYPE($1) value(MAX_NELS)
  1076. logical allInExtRange !/* all values within external range? */
  1077. doubleprecision val
  1078. err = nf_create(scratch, NF_NOCLOBBER, ncid)
  1079. if (err .ne. 0) then
  1080. call errore('nf_create: ', err)
  1081. return
  1082. end if
  1083. call def_dims(ncid)
  1084. call def_vars(ncid)
  1085. do 1, i = 0, NVARS
  1086. do 2, j = 1, NATTS(i)
  1087. if (.not.(ATT_TYPE(j,i) .eq. NF_CHAR)) then
  1088. if (.not.((ATT_LEN(j,i) .le. MAX_NELS)))
  1089. + stop 'assert(ATT_LEN(j,i) .le. MAX_NELS)'
  1090. err = nf_put_att_$1(BAD_ID, i,
  1091. + ATT_NAME(j,i),
  1092. + ATT_TYPE(j,i),
  1093. + ATT_LEN(j,i), value)
  1094. if (err .ne. NF_EBADID)
  1095. + call errore('bad ncid: ', err)
  1096. err = nf_put_att_$1(ncid, BAD_VARID,
  1097. + ATT_NAME(j,i),
  1098. + ATT_TYPE(j,i), ATT_LEN(j,i), value)
  1099. if (err .ne. NF_ENOTVAR)
  1100. + call errore('bad var id: ', err)
  1101. err = nf_put_att_$1(ncid, i,
  1102. + ATT_NAME(j,i), BAD_TYPE,
  1103. + ATT_LEN(j,i), value)
  1104. if (err .ne. NF_EBADTYPE)
  1105. + call errore('bad type: ', err)
  1106. allInExtRange = .true.
  1107. do 3, k = 1, ATT_LEN(j,i)
  1108. ndx(1) = k
  1109. value(k) = hash_$1(ATT_TYPE(j,i), -1, ndx,
  1110. + NFT_ITYPE($1))
  1111. val = ARITH($1, value(k))
  1112. allInExtRange = allInExtRange .and.
  1113. + inRange3(val, ATT_TYPE(j,i),
  1114. + NFT_ITYPE($1))
  1115. 3 continue
  1116. err = nf_put_att_$1(ncid, i, ATT_NAME(j,i),
  1117. + ATT_TYPE(j,i), ATT_LEN(j,i),
  1118. + value)
  1119. if (allInExtRange) then
  1120. if (err .ne. 0)
  1121. + call error(nf_strerror(err))
  1122. else
  1123. if (err .ne. NF_ERANGE)
  1124. + call errore('range error: ', err)
  1125. end if
  1126. end if
  1127. 2 continue
  1128. 1 continue
  1129. call check_atts_$1(ncid)
  1130. err = nf_close(ncid)
  1131. if (err .ne. 0)
  1132. + call errore('nf_close: ', err)
  1133. err = nf_delete(scratch)
  1134. if (err .ne. 0)
  1135. + call errorc('delete of scratch file failed:',
  1136. + scratch)
  1137. end
  1138. ])dnl
  1139. divert(0)dnl
  1140. dnl If you see this line, you can ignore the next one.
  1141. C Do not edit this file. It is produced from the corresponding .m4 source */
  1142. C********************************************************************
  1143. C Copyright 1996, UCAR/Unidata
  1144. C See netcdf/COPYRIGHT file for copying and redistribution conditions.
  1145. C $Id: test_put.m4,v 1.15 2005/01/12 19:52:13 ed Exp $
  1146. C********************************************************************
  1147. HASH(text)
  1148. #ifdef NF_INT1_T
  1149. HASH(int1)
  1150. #endif
  1151. #ifdef NF_INT2_T
  1152. HASH(int2)
  1153. #endif
  1154. HASH(int)
  1155. HASH(real)
  1156. HASH(double)
  1157. CHECK_VARS(text)
  1158. #ifdef NF_INT1_T
  1159. CHECK_VARS(int1)
  1160. #endif
  1161. #ifdef NF_INT2_T
  1162. CHECK_VARS(int2)
  1163. #endif
  1164. CHECK_VARS(int)
  1165. CHECK_VARS(real)
  1166. CHECK_VARS(double)
  1167. CHECK_ATTS(text)
  1168. #ifdef NF_INT1_T
  1169. CHECK_ATTS(int1)
  1170. #endif
  1171. #ifdef NF_INT2_T
  1172. CHECK_ATTS(int2)
  1173. #endif
  1174. CHECK_ATTS(int)
  1175. CHECK_ATTS(real)
  1176. CHECK_ATTS(double)
  1177. TEST_NF_PUT_VAR1(text)
  1178. #ifdef NF_INT1_T
  1179. TEST_NF_PUT_VAR1(int1)
  1180. #endif
  1181. #ifdef NF_INT2_T
  1182. TEST_NF_PUT_VAR1(int2)
  1183. #endif
  1184. TEST_NF_PUT_VAR1(int)
  1185. TEST_NF_PUT_VAR1(real)
  1186. TEST_NF_PUT_VAR1(double)
  1187. TEST_NF_PUT_VAR(text)
  1188. #ifdef NF_INT1_T
  1189. TEST_NF_PUT_VAR(int1)
  1190. #endif
  1191. #ifdef NF_INT2_T
  1192. TEST_NF_PUT_VAR(int2)
  1193. #endif
  1194. TEST_NF_PUT_VAR(int)
  1195. TEST_NF_PUT_VAR(real)
  1196. TEST_NF_PUT_VAR(double)
  1197. TEST_NF_PUT_VARA(text)
  1198. #ifdef NF_INT1_T
  1199. TEST_NF_PUT_VARA(int1)
  1200. #endif
  1201. #ifdef NF_INT2_T
  1202. TEST_NF_PUT_VARA(int2)
  1203. #endif
  1204. TEST_NF_PUT_VARA(int)
  1205. TEST_NF_PUT_VARA(real)
  1206. TEST_NF_PUT_VARA(double)
  1207. TEST_NF_PUT_VARS(text)
  1208. #ifdef NF_INT1_T
  1209. TEST_NF_PUT_VARS(int1)
  1210. #endif
  1211. #ifdef NF_INT2_T
  1212. TEST_NF_PUT_VARS(int2)
  1213. #endif
  1214. TEST_NF_PUT_VARS(int)
  1215. TEST_NF_PUT_VARS(real)
  1216. TEST_NF_PUT_VARS(double)
  1217. TEST_NF_PUT_VARM(text)
  1218. #ifdef NF_INT1_T
  1219. TEST_NF_PUT_VARM(int1)
  1220. #endif
  1221. #ifdef NF_INT2_T
  1222. TEST_NF_PUT_VARM(int2)
  1223. #endif
  1224. TEST_NF_PUT_VARM(int)
  1225. TEST_NF_PUT_VARM(real)
  1226. TEST_NF_PUT_VARM(double)
  1227. subroutine test_nf_put_att_text()
  1228. implicit none
  1229. #include "tests.inc"
  1230. integer ncid
  1231. integer i
  1232. integer j
  1233. integer k
  1234. integer err
  1235. character value(MAX_NELS)
  1236. err = nf_create(scratch, NF_NOCLOBBER, ncid)
  1237. if (err .ne. 0) then
  1238. call errore('NF_create: ', err)
  1239. return
  1240. end if
  1241. call def_dims(ncid)
  1242. call def_vars(ncid)
  1243. do 1, i = 0, NVARS
  1244. do 2, j = 1, NATTS(i)
  1245. if (ATT_TYPE(j,i) .eq. NF_CHAR) then
  1246. if (.not.(ATT_LEN(j,i) .le. MAX_NELS))
  1247. + stop 'assert(ATT_LEN(j,i) .le. MAX_NELS)'
  1248. err = nf_put_att_text(BAD_ID, i,
  1249. + ATT_NAME(j,i), ATT_LEN(j,i), value)
  1250. if (err .ne. NF_EBADID)
  1251. + call errore('bad ncid: ', err)
  1252. err = nf_put_att_text(ncid, BAD_VARID,
  1253. + ATT_NAME(j,i),
  1254. + ATT_LEN(j,i), value)
  1255. if (err .ne. NF_ENOTVAR)
  1256. + call errore('bad var id: ', err)
  1257. do 3, k = 1, ATT_LEN(j,i)
  1258. value(k) = char(int(hash(ATT_TYPE(j,i), -1, k)))
  1259. 3 continue
  1260. err = nf_put_att_text(ncid, i, ATT_NAME(j,i),
  1261. + ATT_LEN(j,i), value)
  1262. if (err .ne. 0)
  1263. + call error(NF_strerror(err))
  1264. end if
  1265. 2 continue
  1266. 1 continue
  1267. call check_atts_text(ncid)
  1268. err = NF_close(ncid)
  1269. if (err .ne. 0)
  1270. + call errore('NF_close: ', err)
  1271. err = nf_delete(scratch)
  1272. if (err .ne. 0)
  1273. + call errorc('delete of scratch file failed:',
  1274. + scratch)
  1275. end
  1276. #ifdef NF_INT1_T
  1277. TEST_NF_PUT_ATT(int1)
  1278. #endif
  1279. #ifdef NF_INT2_T
  1280. TEST_NF_PUT_ATT(int2)
  1281. #endif
  1282. TEST_NF_PUT_ATT(int)
  1283. TEST_NF_PUT_ATT(real)
  1284. TEST_NF_PUT_ATT(double)