PageRenderTime 299ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/other/netcdf_write_matrix/src/nf_test/test_write.F

https://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 1434 lines | 1028 code | 131 blank | 275 comment | 266 complexity | b45470d26c6a56cfffb4aff473784e93 MD5 | raw file
Possible License(s): AGPL-1.0

Large files files are truncated, but you can click here to view the full file

  1. C********************************************************************
  2. C Copyright 1996, UCAR/Unidata
  3. C See netcdf/COPYRIGHT file for copying and redistribution conditions.
  4. C $Id: test_write.F,v 1.14 2005/05/16 11:42:34 ed Exp $
  5. C********************************************************************
  6. C Test nf_create
  7. C For mode in NF_NOCLOBBER, NF_CLOBBER do:
  8. C create netcdf file 'scratch.nc' with no data, close it
  9. C test that it can be opened, do nf_inq to check nvars = 0, etc.
  10. C Try again in NF_NOCLOBBER mode, check error return
  11. C On exit, delete this file
  12. subroutine test_nf_create()
  13. implicit none
  14. #include "tests.inc"
  15. integer clobber !/* 0 for NF_NOCLOBBER, 1 for NF_CLOBBER */
  16. integer err
  17. integer ncid
  18. integer ndims !/* number of dimensions */
  19. integer nvars !/* number of variables */
  20. integer ngatts !/* number of global attributes */
  21. integer recdim !/* id of unlimited dimension */
  22. integer flags
  23. flags = NF_NOCLOBBER
  24. do 1, clobber = 0, 1
  25. err = nf_create(scratch, flags, ncid)
  26. if (err .ne. 0) then
  27. call errore('nf_create: ', err)
  28. end if
  29. err = nf_close(ncid)
  30. if (err .ne. 0) then
  31. call errore('nf_close: ', err)
  32. end if
  33. err = nf_open(scratch, NF_NOWRITE, ncid)
  34. if (err .ne. 0) then
  35. call errore('nf_open: ', err)
  36. end if
  37. err = nf_inq(ncid, ndims, nvars, ngatts, recdim)
  38. if (err .ne. 0) then
  39. call errore('nf_inq: ', err)
  40. else if (ndims .ne. 0) then
  41. call errori(
  42. + 'nf_inq: wrong number of dimensions returned, ',
  43. + ndims)
  44. else if (nvars .ne. 0) then
  45. call errori(
  46. + 'nf_inq: wrong number of variables returned, ',
  47. + nvars)
  48. else if (ngatts .ne. 0) then
  49. call errori(
  50. + 'nf_inq: wrong number of global atts returned, ',
  51. + ngatts)
  52. else if (recdim .ge. 1) then
  53. call errori(
  54. + 'nf_inq: wrong record dimension ID returned, ',
  55. + recdim)
  56. end if
  57. err = nf_close(ncid)
  58. if (err .ne. 0) then
  59. call errore('nf_close: ', err)
  60. end if
  61. flags = NF_CLOBBER
  62. 1 continue
  63. err = nf_create(scratch, NF_NOCLOBBER, ncid)
  64. if (err .ne. NF_EEXIST) then
  65. call errore('attempt to overwrite file: ', err)
  66. end if
  67. err = nf_delete(scratch)
  68. if (err .ne. 0) then
  69. call errori('delete of scratch file failed: ', err)
  70. end if
  71. end
  72. C Test nf_redef
  73. C (In fact also tests nf_enddef - called from test_nf_enddef)
  74. C BAD_ID
  75. C attempt redef (error) & enddef on read-only file
  76. C create file, define dims & vars.
  77. C attempt put var (error)
  78. C attempt redef (error) & enddef.
  79. C put vars
  80. C attempt def new dims (error)
  81. C redef
  82. C def new dims, vars.
  83. C put atts
  84. C enddef
  85. C put vars
  86. C close
  87. C check file: vars & atts
  88. subroutine test_nf_redef()
  89. implicit none
  90. #include "tests.inc"
  91. integer title_len
  92. parameter (title_len = 9)
  93. integer ncid !/* netcdf id */
  94. integer dimid !/* dimension id */
  95. integer vid !/* variable id */
  96. integer err
  97. character*(title_len) title
  98. doubleprecision var
  99. character*(NF_MAX_NAME) name
  100. integer length
  101. title = 'Not funny'
  102. C /* BAD_ID tests */
  103. err = nf_redef(BAD_ID)
  104. if (err .ne. NF_EBADID)
  105. + call errore('bad ncid: ', err)
  106. err = nf_enddef(BAD_ID)
  107. if (err .ne. NF_EBADID)
  108. + call errore('bad ncid: ', err)
  109. C /* read-only tests */
  110. err = nf_open(testfile, NF_NOWRITE, ncid)
  111. if (err .ne. 0)
  112. + call errore('nf_open: ', err)
  113. err = nf_redef(ncid)
  114. if (err .ne. NF_EPERM)
  115. + call errore('nf_redef in NF_NOWRITE mode: ', err)
  116. err = nf_enddef(ncid)
  117. if (err .ne. NF_ENOTINDEFINE)
  118. + call errore('nf_redef in NF_NOWRITE mode: ', err)
  119. err = nf_close(ncid)
  120. if (err .ne. 0)
  121. + call errore('nf_close: ', err)
  122. C /* tests using scratch file */
  123. err = nf_create(scratch, NF_NOCLOBBER, ncid)
  124. if (err .ne. 0) then
  125. call errore('nf_create: ', err)
  126. return
  127. end if
  128. call def_dims(ncid)
  129. call def_vars(ncid)
  130. call put_atts(ncid)
  131. err = nf_inq_varid(ncid, 'd', vid)
  132. if (err .ne. 0)
  133. + call errore('nf_inq_varid: ', err)
  134. var = 1.0
  135. err = nf_put_var1_double(ncid, vid, 0, var)
  136. if (err .ne. NF_EINDEFINE)
  137. + call errore('nf_put_var... in define mode: ', err)
  138. err = nf_redef(ncid)
  139. if (err .ne. NF_EINDEFINE)
  140. + call errore('nf_redef in define mode: ', err)
  141. err = nf_enddef(ncid)
  142. if (err .ne. 0)
  143. + call errore('nf_enddef: ', err)
  144. call put_vars(ncid)
  145. err = nf_def_dim(ncid, 'abc', 8, dimid)
  146. if (err .ne. NF_ENOTINDEFINE)
  147. + call errore('nf_def_dim in define mode: ', err)
  148. err = nf_redef(ncid)
  149. if (err .ne. 0)
  150. + call errore('nf_redef: ', err)
  151. err = nf_def_dim(ncid, 'abc', 8, dimid)
  152. if (err .ne. 0)
  153. + call errore('nf_def_dim: ', err)
  154. err = nf_def_var(ncid, 'abc', NF_INT, 0, 0, vid)
  155. if (err .ne. 0)
  156. + call errore('nf_def_var: ', err)
  157. err = nf_put_att_text(ncid, NF_GLOBAL, 'title', len(title),
  158. + title)
  159. if (err .ne .0)
  160. + call errore('nf_put_att_text: ', err)
  161. err = nf_enddef(ncid)
  162. if (err .ne. 0)
  163. + call errore('nf_enddef: ', err)
  164. var = 1.0
  165. err = nf_put_var1_double(ncid, vid, 0, var)
  166. if (err .ne. 0)
  167. + call errore('nf_put_var1_double: ', err)
  168. err = nf_close(ncid)
  169. if (err .ne. 0)
  170. + call errore('nf_close: ', err)
  171. C /* check scratch file written as expected */
  172. call check_file(scratch)
  173. err = nf_open(scratch, NF_NOWRITE, ncid)
  174. if (err .ne. 0)
  175. + call errore('nf_open: ', err)
  176. err = nf_inq_dim(ncid, dimid, name, length)
  177. if (err .ne. 0)
  178. + call errore('nf_inq_dim: ', err)
  179. if (name .ne. "abc")
  180. + call errori('Unexpected dim name in netCDF ', ncid)
  181. if (length .ne. 8)
  182. + call errori('Unexpected dim length: ', length)
  183. err = nf_get_var1_double(ncid, vid, 0, var)
  184. if (err .ne. 0)
  185. + call errore('nf_get_var1_double: ', err)
  186. if (var .ne. 1.0)
  187. + call errori(
  188. + 'nf_get_var1_double: unexpected value in netCDF ', ncid)
  189. err = nf_close(ncid)
  190. if (err .ne. 0)
  191. + call errore('nf_close: ', err)
  192. err = nf_delete(scratch)
  193. if (err .ne. 0)
  194. + call errori('delete failed for netCDF: ', err)
  195. end
  196. C Test nf_enddef
  197. C Simply calls test_nf_redef which tests both nf_redef & nf_enddef
  198. subroutine test_nf_enddef()
  199. implicit none
  200. #include "tests.inc"
  201. call test_nf_redef
  202. end
  203. C Test nf_sync
  204. C try with bad handle, check error
  205. C try in define mode, check error
  206. C try writing with one handle, reading with another on same netCDF
  207. subroutine test_nf_sync()
  208. implicit none
  209. #include "tests.inc"
  210. integer ncidw !/* netcdf id for writing */
  211. integer ncidr !/* netcdf id for reading */
  212. integer err
  213. C /* BAD_ID test */
  214. err = nf_sync(BAD_ID)
  215. if (err .ne. NF_EBADID)
  216. + call errore('bad ncid: ', err)
  217. C /* create scratch file & try nf_sync in define mode */
  218. err = nf_create(scratch, NF_NOCLOBBER, ncidw)
  219. if (err .ne. 0) then
  220. call errore('nf_create: ', err)
  221. return
  222. end if
  223. err = nf_sync(ncidw)
  224. if (err .ne. NF_EINDEFINE)
  225. + call errore('nf_sync called in define mode: ', err)
  226. C /* write using same handle */
  227. call def_dims(ncidw)
  228. call def_vars(ncidw)
  229. call put_atts(ncidw)
  230. err = nf_enddef(ncidw)
  231. if (err .ne. 0)
  232. + call errore('nf_enddef: ', err)
  233. call put_vars(ncidw)
  234. err = nf_sync(ncidw)
  235. if (err .ne. 0)
  236. + call errore('nf_sync of ncidw failed: ', err)
  237. C /* open another handle, nf_sync, read (check) */
  238. err = nf_open(scratch, NF_NOWRITE, ncidr)
  239. if (err .ne. 0)
  240. + call errore('nf_open: ', err)
  241. err = nf_sync(ncidr)
  242. if (err .ne. 0)
  243. + call errore('nf_sync of ncidr failed: ', err)
  244. call check_dims(ncidr)
  245. call check_atts(ncidr)
  246. call check_vars(ncidr)
  247. C /* close both handles */
  248. err = nf_close(ncidr)
  249. if (err .ne. 0)
  250. + call errore('nf_close: ', err)
  251. err = nf_close(ncidw)
  252. if (err .ne. 0)
  253. + call errore('nf_close: ', err)
  254. err = nf_delete(scratch)
  255. if (err .ne. 0)
  256. + call errori('delete of scratch file failed: ', err)
  257. end
  258. C Test nf_abort
  259. C try with bad handle, check error
  260. C try in define mode before anything written, check that file was deleted
  261. C try after nf_enddef, nf_redef, define new dims, vars, atts
  262. C try after writing variable
  263. subroutine test_nf_abort()
  264. implicit none
  265. #include "tests.inc"
  266. integer ncid !/* netcdf id */
  267. integer err
  268. integer ndims
  269. integer nvars
  270. integer ngatts
  271. integer recdim
  272. C /* BAD_ID test */
  273. err = nf_abort(BAD_ID)
  274. if (err .ne. NF_EBADID)
  275. + call errore('bad ncid: status = ', err)
  276. C /* create scratch file & try nf_abort in define mode */
  277. err = nf_create(scratch, NF_NOCLOBBER, ncid)
  278. if (err .ne. 0) then
  279. call errore('nf_create: ', err)
  280. return
  281. end if
  282. call def_dims(ncid)
  283. call def_vars(ncid)
  284. call put_atts(ncid)
  285. err = nf_abort(ncid)
  286. if (err .ne. 0)
  287. + call errore('nf_abort of ncid failed: ', err)
  288. err = nf_close(ncid) !/* should already be closed */
  289. if (err .ne. NF_EBADID)
  290. + call errore('bad ncid: ', err)
  291. err = nf_delete(scratch) !/* should already be deleted */
  292. if (err .eq. 0)
  293. + call errori('scratch file should not exist: ', err)
  294. C create scratch file
  295. C do nf_enddef & nf_redef
  296. C define new dims, vars, atts
  297. C try nf_abort: should restore previous state (no dims, vars, atts)
  298. err = nf_create(scratch, NF_NOCLOBBER, ncid)
  299. if (err .ne. 0) then
  300. call errore('nf_create: ', err)
  301. return
  302. end if
  303. err = nf_enddef(ncid)
  304. if (err .ne. 0)
  305. + call errore('nf_enddef: ', err)
  306. err = nf_redef(ncid)
  307. if (err .ne. 0)
  308. + call errore('nf_redef: ', err)
  309. call def_dims(ncid)
  310. call def_vars(ncid)
  311. call put_atts(ncid)
  312. err = nf_abort(ncid)
  313. if (err .ne. 0)
  314. + call errore('nf_abort of ncid failed: ', err)
  315. err = nf_close(ncid) !/* should already be closed */
  316. if (err .ne. NF_EBADID)
  317. + call errore('bad ncid: ', err)
  318. err = nf_open(scratch, NF_NOWRITE, ncid)
  319. if (err .ne. 0)
  320. + call errore('nf_open: ', err)
  321. err = nf_inq (ncid, ndims, nvars, ngatts, recdim)
  322. if (err .ne. 0)
  323. + call errore('nf_inq: ', err)
  324. if (ndims .ne. 0)
  325. + call errori('ndims should be ', 0)
  326. if (nvars .ne. 0)
  327. + call errori('nvars should be ', 0)
  328. if (ngatts .ne. 0)
  329. + call errori('ngatts should be ', 0)
  330. err = nf_close (ncid)
  331. if (err .ne. 0)
  332. + call errore('nf_close: ', err)
  333. C /* try nf_abort in data mode - should just close */
  334. err = nf_create(scratch, NF_CLOBBER, ncid)
  335. if (err .ne. 0) then
  336. call errore('nf_create: ', err)
  337. return
  338. end if
  339. call def_dims(ncid)
  340. call def_vars(ncid)
  341. call put_atts(ncid)
  342. err = nf_enddef(ncid)
  343. if (err .ne. 0)
  344. + call errore('nf_enddef: ', err)
  345. call put_vars(ncid)
  346. err = nf_abort(ncid)
  347. if (err .ne. 0)
  348. + call errore('nf_abort of ncid failed: ', err)
  349. err = nf_close(ncid) !/* should already be closed */
  350. if (err .ne. NF_EBADID)
  351. + call errore('bad ncid: ', err)
  352. call check_file(scratch)
  353. err = nf_delete(scratch)
  354. if (err .ne. 0)
  355. + call errori('delete of scratch file failed: ', err)
  356. end
  357. C Test nf_def_dim
  358. C try with bad netCDF handle, check error
  359. C try in data mode, check error
  360. C check that returned id is one more than previous id
  361. C try adding same dimension twice, check error
  362. C try with illegal sizes, check error
  363. C make sure unlimited size works, shows up in nf_inq_unlimdim
  364. C try to define a second unlimited dimension, check error
  365. subroutine test_nf_def_dim()
  366. implicit none
  367. #include "tests.inc"
  368. integer ncid
  369. integer err !/* status */
  370. integer i
  371. integer dimid !/* dimension id */
  372. integer length
  373. C /* BAD_ID test */
  374. err = nf_def_dim(BAD_ID, 'abc', 8, dimid)
  375. if (err .ne. NF_EBADID)
  376. + call errore('bad ncid: ', err)
  377. C /* data mode test */
  378. err = nf_create(scratch, NF_CLOBBER, ncid)
  379. if (err .ne. 0) then
  380. call errore('nf_create: ', err)
  381. return
  382. end if
  383. err = nf_enddef(ncid)
  384. if (err .ne. 0)
  385. + call errore('nf_enddef: ', err)
  386. err = nf_def_dim(ncid, 'abc', 8, dimid)
  387. if (err .ne. NF_ENOTINDEFINE)
  388. + call errore('bad ncid: ', err)
  389. C /* define-mode tests: unlimited dim */
  390. err = nf_redef(ncid)
  391. if (err .ne. 0)
  392. + call errore('nf_redef: ', err)
  393. err = nf_def_dim(ncid, dim_name(1), NF_UNLIMITED, dimid)
  394. if (err .ne. 0)
  395. + call errore('nf_def_dim: ', err)
  396. if (dimid .ne. 1)
  397. + call errori('Unexpected dimid: ', dimid)
  398. err = nf_inq_unlimdim(ncid, dimid)
  399. if (err .ne. 0)
  400. + call errore('nf_inq_unlimdim: ', err)
  401. if (dimid .ne. RECDIM)
  402. + call error('Unexpected recdim: ')
  403. err = nf_inq_dimlen(ncid, dimid, length)
  404. if (length .ne. 0)
  405. + call errori('Unexpected length: ', 0)
  406. err = nf_def_dim(ncid, 'abc', NF_UNLIMITED, dimid)
  407. if (err .ne. NF_EUNLIMIT)
  408. + call errore('2nd unlimited dimension: ', err)
  409. C /* define-mode tests: remaining dims */
  410. do 1, i = 2, NDIMS
  411. err = nf_def_dim(ncid, dim_name(i-1), dim_len(i),
  412. + dimid)
  413. if (err .ne. NF_ENAMEINUSE)
  414. + call errore('duplicate name: ', err)
  415. err = nf_def_dim(ncid, BAD_NAME, dim_len(i), dimid)
  416. if (err .ne. NF_EBADNAME)
  417. + call errore('bad name: ', err)
  418. err = nf_def_dim(ncid, dim_name(i), NF_UNLIMITED-1,
  419. + dimid)
  420. if (err .ne. NF_EDIMSIZE)
  421. + call errore('bad size: ', err)
  422. err = nf_def_dim(ncid, dim_name(i), dim_len(i), dimid)
  423. if (err .ne. 0)
  424. + call errore('nf_def_dim: ', err)
  425. if (dimid .ne. i)
  426. + call errori('Unexpected dimid: ', 0)
  427. 1 continue
  428. C /* Following just to expand unlimited dim */
  429. call def_vars(ncid)
  430. err = nf_enddef(ncid)
  431. if (err .ne. 0)
  432. + call errore('nf_enddef: ', err)
  433. call put_vars(ncid)
  434. C /* Check all dims */
  435. call check_dims(ncid)
  436. err = nf_close(ncid)
  437. if (err .ne. 0)
  438. + call errore('nf_close: ', err)
  439. err = nf_delete(scratch)
  440. if (err .ne. 0)
  441. + call errori('delete of scratch file failed: ', err)
  442. end
  443. C Test nf_rename_dim
  444. C try with bad netCDF handle, check error
  445. C check that proper rename worked with nf_inq_dim
  446. C try renaming to existing dimension name, check error
  447. C try with bad dimension handle, check error
  448. subroutine test_nf_rename_dim()
  449. implicit none
  450. #include "tests.inc"
  451. integer ncid
  452. integer err !/* status */
  453. character*(NF_MAX_NAME) name
  454. C /* BAD_ID test */
  455. err = nf_rename_dim(BAD_ID, 1, 'abc')
  456. if (err .ne. NF_EBADID)
  457. + call errore('bad ncid: ', err)
  458. C /* main tests */
  459. err = nf_create(scratch, NF_NOCLOBBER, ncid)
  460. if (err .ne. 0) then
  461. call errore('nf_create: ', err)
  462. return
  463. end if
  464. call def_dims(ncid)
  465. err = nf_rename_dim(ncid, BAD_DIMID, 'abc')
  466. if (err .ne. NF_EBADDIM)
  467. + call errore('bad dimid: ', err)
  468. err = nf_rename_dim(ncid, 3, 'abc')
  469. if (err .ne. 0)
  470. + call errore('nf_rename_dim: ', err)
  471. err = nf_inq_dimname(ncid, 3, name)
  472. if (name .ne. 'abc')
  473. + call errorc('Unexpected name: ', name)
  474. err = nf_rename_dim(ncid, 1, 'abc')
  475. if (err .ne. NF_ENAMEINUSE)
  476. + call errore('duplicate name: ', err)
  477. err = nf_close(ncid)
  478. if (err .ne. 0)
  479. + call errore('nf_close: ', err)
  480. err = nf_delete(scratch)
  481. if (err .ne. 0)
  482. + call errori('delete of scratch file failed: ', err)
  483. end
  484. C Test nf_def_var
  485. C try with bad netCDF handle, check error
  486. C try with bad name, check error
  487. C scalar tests:
  488. C check that proper define worked with nf_inq_var
  489. C try redefining an existing variable, check error
  490. C try with bad datatype, check error
  491. C try with bad number of dimensions, check error
  492. C try in data mode, check error
  493. C check that returned id is one more than previous id
  494. C try with bad dimension ids, check error
  495. subroutine test_nf_def_var()
  496. implicit none
  497. #include "tests.inc"
  498. integer ncid
  499. integer vid
  500. integer err !/* status */
  501. integer i
  502. integer ndims
  503. integer na
  504. character*(NF_MAX_NAME) name
  505. integer dimids(MAX_RANK)
  506. integer datatype
  507. C /* BAD_ID test */
  508. err = nf_def_var(BAD_ID, 'abc', NF_SHORT, 0, dimids, vid)
  509. if (err .ne. NF_EBADID)
  510. + call errore('bad ncid: status = ', err)
  511. C /* scalar tests */
  512. err = nf_create(scratch, NF_NOCLOBBER, ncid)
  513. if (err .ne. 0) then
  514. call errore('nf_create: ', err)
  515. return
  516. end if
  517. err = nf_def_var(ncid, 'abc', NF_SHORT, 0, dimids, vid)
  518. if (err .ne. 0)
  519. + call errore('nf_def_var: ', err)
  520. err = nf_inq_var(ncid, vid, name, datatype, ndims, dimids,
  521. + na)
  522. if (err .ne. 0)
  523. + call errore('nf_inq_var: ', err)
  524. if (name .ne. 'abc')
  525. + call errorc('Unexpected name: ', name)
  526. if (datatype .ne. NF_SHORT)
  527. + call error('Unexpected datatype')
  528. if (ndims .ne. 0)
  529. + call error('Unexpected rank')
  530. err = nf_def_var(ncid, BAD_NAME, NF_SHORT, 0, dimids, vid)
  531. if (err .ne. NF_EBADNAME)
  532. + call errore('bad name: ', err)
  533. err = nf_def_var(ncid, 'abc', NF_SHORT, 0, dimids, vid)
  534. if (err .ne. NF_ENAMEINUSE)
  535. + call errore('duplicate name: ', err)
  536. err = nf_def_var(ncid, 'ABC', BAD_TYPE, -1, dimids, vid)
  537. if (err .ne. NF_EBADTYPE)
  538. + call errore('bad type: ', err)
  539. err = nf_def_var(ncid, 'ABC', NF_SHORT, -1, dimids, vid)
  540. if (err .ne. NF_EINVAL)
  541. + call errore('bad rank: ', err)
  542. err = nf_enddef(ncid)
  543. if (err .ne. 0)
  544. + call errore('nf_enddef: ', err)
  545. err = nf_def_var(ncid, 'ABC', NF_SHORT, 0, dimids, vid)
  546. if (err .ne. NF_ENOTINDEFINE)
  547. + call errore('nf_def_var called in data mode: ', err)
  548. err = nf_close(ncid)
  549. if (err .ne. 0)
  550. + call errore('nf_close: ', err)
  551. err = nf_delete(scratch)
  552. if (err .ne. 0)
  553. + call errorc('delete of scratch file failed: ', scratch)
  554. C /* general tests using global vars */
  555. err = nf_create(scratch, NF_CLOBBER, ncid)
  556. if (err .ne. 0) then
  557. call errore('nf_create: ', err)
  558. return
  559. end if
  560. call def_dims(ncid)
  561. do 1, i = 1, NVARS
  562. err = nf_def_var(ncid, var_name(i), var_type(i),
  563. + var_rank(i), var_dimid(1,i), vid)
  564. if (err .ne. 0)
  565. + call errore('nf_def_var: ', err)
  566. if (vid .ne. i)
  567. + call error('Unexpected varid')
  568. 1 continue
  569. C /* try bad dim ids */
  570. dimids(1) = BAD_DIMID
  571. err = nf_def_var(ncid, 'abc', NF_SHORT, 1, dimids, vid)
  572. if (err .ne. NF_EBADDIM)
  573. + call errore('bad dim ids: ', err)
  574. err = nf_close(ncid)
  575. if (err .ne. 0)
  576. + call errore('nf_close: ', err)
  577. err = nf_delete(scratch)
  578. if (err .ne. 0)
  579. + call errorc('delete of scratch file failed: ', scratch)
  580. end
  581. C Test nf_rename_var
  582. C try with bad netCDF handle, check error
  583. C try with bad variable handle, check error
  584. C try renaming to existing variable name, check error
  585. C check that proper rename worked with nf_inq_varid
  586. C try in data mode, check error
  587. subroutine test_nf_rename_var()
  588. implicit none
  589. #include "tests.inc"
  590. integer ncid
  591. integer vid
  592. integer err
  593. integer i
  594. character*(NF_MAX_NAME) name
  595. err = nf_create(scratch, NF_NOCLOBBER, ncid)
  596. if (err .ne. 0) then
  597. call errore('nf_create: ', err)
  598. return
  599. end if
  600. err = nf_rename_var(ncid, BAD_VARID, 'newName')
  601. if (err .ne. NF_ENOTVAR)
  602. + call errore('bad var id: ', err)
  603. call def_dims(ncid)
  604. call def_vars(ncid)
  605. C /* Prefix "new_" to each name */
  606. do 1, i = 1, NVARS
  607. err = nf_rename_var(BAD_ID, i, 'newName')
  608. if (err .ne. NF_EBADID)
  609. + call errore('bad ncid: ', err)
  610. err = nf_rename_var(ncid, i, var_name(NVARS))
  611. if (err .ne. NF_ENAMEINUSE)
  612. + call errore('duplicate name: ', err)
  613. name = 'new_' // var_name(i)
  614. err = nf_rename_var(ncid, i, name)
  615. if (err .ne. 0)
  616. + call errore('nf_rename_var: ', err)
  617. err = nf_inq_varid(ncid, name, vid)
  618. if (err .ne. 0)
  619. + call errore('nf_inq_varid: ', err)
  620. if (vid .ne. i)
  621. + call error('Unexpected varid')
  622. 1 continue
  623. C /* Change to data mode */
  624. C /* Try making names even longer. Then restore original names */
  625. err = nf_enddef(ncid)
  626. if (err .ne. 0)
  627. + call errore('nf_enddef: ', err)
  628. do 2, i = 1, NVARS
  629. name = 'even_longer_' // var_name(i)
  630. err = nf_rename_var(ncid, i, name)
  631. if (err .ne. NF_ENOTINDEFINE)
  632. + call errore('longer name in data mode: ', err)
  633. err = nf_rename_var(ncid, i, var_name(i))
  634. if (err .ne. 0)
  635. + call errore('nf_rename_var: ', err)
  636. err = nf_inq_varid(ncid, var_name(i), vid)
  637. if (err .ne. 0)
  638. + call errore('nf_inq_varid: ', err)
  639. if (vid .ne. i)
  640. + call error('Unexpected varid')
  641. 2 continue
  642. call put_vars(ncid)
  643. call check_vars(ncid)
  644. err = nf_close(ncid)
  645. if (err .ne. 0)
  646. + call errore('nf_close: ', err)
  647. err = nf_delete(scratch)
  648. if (err .ne. 0)
  649. + call errorc('delete of scratch file failed: ', scratch)
  650. end
  651. C Test nf_copy_att
  652. C try with bad source or target netCDF handles, check error
  653. C try with bad source or target variable handle, check error
  654. C try with nonexisting attribute, check error
  655. C check that NF_GLOBAL variable for source or target works
  656. C check that new attribute put works with target in define mode
  657. C check that old attribute put works with target in data mode
  658. C check that changing type and length of an attribute work OK
  659. C try with same ncid for source and target, different variables
  660. C try with same ncid for source and target, same variable
  661. subroutine test_nf_copy_att()
  662. implicit none
  663. #include "tests.inc"
  664. integer ncid_in
  665. integer ncid_out
  666. integer vid
  667. integer err
  668. integer i
  669. integer j
  670. character*(NF_MAX_NAME) name !/* of att */
  671. integer datatype !/* of att */
  672. integer length !/* of att */
  673. character*1 value
  674. err = nf_open(testfile, NF_NOWRITE, ncid_in)
  675. if (err .ne. 0)
  676. + call errore('nf_open: ', err)
  677. err = nf_create(scratch, NF_NOCLOBBER, ncid_out)
  678. if (err .ne. 0) then
  679. call errore('nf_create: ', err)
  680. return
  681. end if
  682. call def_dims(ncid_out)
  683. call def_vars(ncid_out)
  684. do 1, i = 0, NVARS
  685. vid = VARID(i)
  686. do 2, j = 1, NATTS(i)
  687. name = ATT_NAME(j,i)
  688. err = nf_copy_att(ncid_in, BAD_VARID, name, ncid_out,
  689. + vid)
  690. if (err .ne. NF_ENOTVAR)
  691. + call errore('bad var id: ', err)
  692. err = nf_copy_att(ncid_in, vid, name, ncid_out,
  693. + BAD_VARID)
  694. if (err .ne. NF_ENOTVAR)
  695. + call errore('bad var id: ', err)
  696. err = nf_copy_att(BAD_ID, vid, name, ncid_out, vid)
  697. if (err .ne. NF_EBADID)
  698. + call errore('bad ncid: ', err)
  699. err = nf_copy_att(ncid_in, vid, name, BAD_ID, vid)
  700. if (err .ne. NF_EBADID)
  701. + call errore('bad ncid: ', err)
  702. err = nf_copy_att(ncid_in, vid, 'noSuch', ncid_out, vid)
  703. if (err .ne. NF_ENOTATT)
  704. + call errore('bad attname: ', err)
  705. err = nf_copy_att(ncid_in, vid, name, ncid_out, vid)
  706. if (err .ne. 0)
  707. + call errore('nf_copy_att: ', err)
  708. err = nf_copy_att(ncid_out, vid, name, ncid_out, vid)
  709. if (err .ne. 0)
  710. + call errore('source = target: ', err)
  711. 2 continue
  712. 1 continue
  713. err = nf_close(ncid_in)
  714. if (err .ne. 0)
  715. + call errore('nf_close: ', err)
  716. C /* Close scratch. Reopen & check attributes */
  717. err = nf_close(ncid_out)
  718. if (err .ne. 0)
  719. + call errore('nf_close: ', err)
  720. err = nf_open(scratch, NF_WRITE, ncid_out)
  721. if (err .ne. 0)
  722. + call errore('nf_open: ', err)
  723. call check_atts(ncid_out)
  724. C change to define mode
  725. C define single char. global att. ':a' with value 'A'
  726. C This will be used as source for following copies
  727. err = nf_redef(ncid_out)
  728. if (err .ne. 0)
  729. + call errore('nf_redef: ', err)
  730. err = nf_put_att_text(ncid_out, NF_GLOBAL, 'a', 1, 'A')
  731. if (err .ne. 0)
  732. + call errore('nf_put_att_text: ', err)
  733. C change to data mode
  734. C Use scratch as both source & dest.
  735. C try copy to existing att. change type & decrease length
  736. C rename 1st existing att of each var (if any) 'a'
  737. C if this att. exists them copy ':a' to it
  738. err = nf_enddef(ncid_out)
  739. if (err .ne. 0)
  740. + call errore('nf_enddef: ', err)
  741. do 3, i = 1, NVARS
  742. if (NATTS(i) .gt. 0 .and. ATT_LEN(1,i) .gt. 0) then
  743. err = nf_rename_att(ncid_out, i, att_name(1,i), 'a')
  744. if (err .ne. 0)
  745. + call errore('nf_rename_att: ', err)
  746. err = nf_copy_att(ncid_out, NF_GLOBAL, 'a', ncid_out,
  747. + i)
  748. if (err .ne. 0)
  749. + call errore('nf_copy_att: ', err)
  750. end if
  751. 3 continue
  752. err = nf_close(ncid_out)
  753. if (err .ne. 0)
  754. + call errore('nf_close: ', err)
  755. C /* Reopen & check */
  756. err = nf_open(scratch, NF_WRITE, ncid_out)
  757. if (err .ne. 0)
  758. + call errore('nf_open: ', err)
  759. do 4, i = 1, NVARS
  760. if (NATTS(i) .gt. 0 .and. ATT_LEN(1,i) .gt. 0) then
  761. err = nf_inq_att(ncid_out, i, 'a', datatype, length)
  762. if (err .ne. 0)
  763. + call errore('nf_inq_att: ', err)
  764. if (datatype .ne. NF_CHAR)
  765. + call error('Unexpected type')
  766. if (length .ne. 1)
  767. + call error('Unexpected length')
  768. err = nf_get_att_text(ncid_out, i, 'a', value)
  769. if (err .ne. 0)
  770. + call errore('nf_get_att_text: ', err)
  771. if (value .ne. 'A')
  772. + call error('Unexpected value')
  773. end if
  774. 4 continue
  775. err = nf_close(ncid_out)
  776. if (err .ne. 0)
  777. + call errore('nf_close: ', err)
  778. err = nf_delete(scratch)
  779. if (err .ne. 0)
  780. + call errorc('delete of scratch file failed', scratch)
  781. end
  782. C Test nf_rename_att
  783. C try with bad netCDF handle, check error
  784. C try with bad variable handle, check error
  785. C try with nonexisting att name, check error
  786. C try renaming to existing att name, check error
  787. C check that proper rename worked with nf_inq_attid
  788. C try in data mode, check error
  789. subroutine test_nf_rename_att()
  790. implicit none
  791. #include "tests.inc"
  792. integer ncid
  793. integer vid
  794. integer err
  795. integer i
  796. integer j
  797. integer k
  798. integer attnum
  799. character*(NF_MAX_NAME) atnam
  800. character*(NF_MAX_NAME) name
  801. character*(NF_MAX_NAME) oldname
  802. character*(NF_MAX_NAME) newname
  803. integer nok !/* count of valid comparisons */
  804. integer datatype
  805. integer attyp
  806. integer length
  807. integer attlength
  808. integer ndx(1)
  809. character*(MAX_NELS) text
  810. doubleprecision value(MAX_NELS)
  811. doubleprecision expect
  812. nok = 0
  813. err = nf_create(scratch, NF_NOCLOBBER, ncid)
  814. if (err .ne. 0) then
  815. call errore('nf_create: ', err)
  816. return
  817. end if
  818. err = nf_rename_att(ncid, BAD_VARID, 'abc', 'newName')
  819. if (err .ne. NF_ENOTVAR)
  820. + call errore('bad var id: ', err)
  821. call def_dims(ncid)
  822. call def_vars(ncid)
  823. call put_atts(ncid)
  824. do 1, i = 0, NVARS
  825. vid = VARID(i)
  826. do 2, j = 1, NATTS(i)
  827. atnam = ATT_NAME(j,i)
  828. err = nf_rename_att(BAD_ID, vid, atnam, 'newName')
  829. if (err .ne. NF_EBADID)
  830. + call errore('bad ncid: ', err)
  831. err = nf_rename_att(ncid, vid, 'noSuch', 'newName')
  832. if (err .ne. NF_ENOTATT)
  833. + call errore('bad attname: ', err)
  834. newname = 'new_' // atnam
  835. err = nf_rename_att(ncid, vid, atnam, newname)
  836. if (err .ne. 0)
  837. + call errore('nf_rename_att: ', err)
  838. err = nf_inq_attid(ncid, vid, newname, attnum)
  839. if (err .ne. 0)
  840. + call errore('nf_inq_attid: ', err)
  841. if (attnum .ne. j)
  842. + call error('Unexpected attnum')
  843. 2 continue
  844. 1 continue
  845. C /* Close. Reopen & check */
  846. err = nf_close(ncid)
  847. if (err .ne. 0)
  848. + call errore('nf_close: ', err)
  849. err = nf_open(scratch, NF_WRITE, ncid)
  850. if (err .ne. 0)
  851. + call errore('nf_open: ', err)
  852. do 3, i = 0, NVARS
  853. vid = VARID(i)
  854. do 4, j = 1, NATTS(i)
  855. atnam = ATT_NAME(j,i)
  856. attyp = ATT_TYPE(j,i)
  857. attlength = ATT_LEN(j,i)
  858. newname = 'new_' // atnam
  859. err = nf_inq_attname(ncid, vid, j, name)
  860. if (err .ne. 0)
  861. + call errore('nf_inq_attname: ', err)
  862. if (name .ne. newname)
  863. + call error('nf_inq_attname: unexpected name')
  864. err = nf_inq_att(ncid, vid, name, datatype, length)
  865. if (err .ne. 0)
  866. + call errore('nf_inq_att: ', err)
  867. if (datatype .ne. attyp)
  868. + call error('nf_inq_att: unexpected type')
  869. if (length .ne. attlength)
  870. + call error('nf_inq_att: unexpected length')
  871. if (datatype .eq. NF_CHAR) then
  872. err = nf_get_att_text(ncid, vid, name, text)
  873. if (err .ne. 0)
  874. + call errore('nf_get_att_text: ', err)
  875. do 5, k = 1, attlength
  876. ndx(1) = k
  877. expect = hash(datatype, -1, ndx)
  878. if (ichar(text(k:k)) .ne. expect) then
  879. call error(
  880. + 'nf_get_att_text: unexpected value')
  881. else
  882. nok = nok + 1
  883. end if
  884. 5 continue
  885. else
  886. err = nf_get_att_double(ncid, vid, name, value)
  887. if (err .ne. 0)
  888. + call errore('nf_get_att_double: ', err)
  889. do 6, k = 1, attlength
  890. ndx(1) = k
  891. expect = hash(datatype, -1, ndx)
  892. if (inRange(expect, datatype)) then
  893. if (.not. equal(value(k),expect,datatype,
  894. + NF_DOUBLE)) then
  895. call error(
  896. + 'nf_get_att_double: unexpected value')
  897. else
  898. nok = nok + 1
  899. end if
  900. end if
  901. 6 continue
  902. end if
  903. 4 continue
  904. 3 continue
  905. call print_nok(nok)
  906. C /* Now in data mode */
  907. C /* Try making names even longer. Then restore original names */
  908. do 7, i = 0, NVARS
  909. vid = VARID(i)
  910. do 8, j = 1, NATTS(i)
  911. atnam = ATT_NAME(j,i)
  912. oldname = 'new_' // atnam
  913. newname = 'even_longer_' // atnam
  914. err = nf_rename_att(ncid, vid, oldname, newname)
  915. if (err .ne. NF_ENOTINDEFINE)
  916. + call errore('longer name in data mode: ', err)
  917. err = nf_rename_att(ncid, vid, oldname, atnam)
  918. if (err .ne. 0)
  919. + call errore('nf_rename_att: ', err)
  920. err = nf_inq_attid(ncid, vid, atnam, attnum)
  921. if (err .ne. 0)
  922. + call errore('nf_inq_attid: ', err)
  923. if (attnum .ne. j)
  924. + call error('Unexpected attnum')
  925. 8 continue
  926. 7 continue
  927. err = nf_close(ncid)
  928. if (err .ne. 0)
  929. + call errore('nf_close: ', err)
  930. err = nf_delete(scratch)
  931. if (err .ne. 0)
  932. + call errori('delete of scratch file failed: ', err)
  933. end
  934. C Test nf_del_att
  935. C try with bad netCDF handle, check error
  936. C try with bad variable handle, check error
  937. C try with nonexisting att name, check error
  938. C check that proper delete worked using:
  939. C nf_inq_attid, nf_inq_natts, nf_inq_varnatts
  940. subroutine test_nf_del_att()
  941. implicit none
  942. #include "tests.inc"
  943. integer ncid
  944. integer err
  945. integer i
  946. integer j
  947. integer attnum
  948. integer na
  949. integer numatts
  950. integer vid
  951. character*(NF_MAX_NAME) name !/* of att */
  952. err = nf_create(scratch, NF_NOCLOBBER, ncid)
  953. if (err .ne. 0) then
  954. call errore('nf_create: ', err)
  955. return
  956. end if
  957. err = nf_del_att(ncid, BAD_VARID, 'abc')
  958. if (err .ne. NF_ENOTVAR)
  959. + call errore('bad var id: ', err)
  960. call def_dims(ncid)
  961. call def_vars(ncid)
  962. call put_atts(ncid)
  963. do 1, i = 0, NVARS
  964. vid = VARID(i)
  965. numatts = NATTS(i)
  966. do 2, j = 1, numatts
  967. name = ATT_NAME(j,i)
  968. err = nf_del_att(BAD_ID, vid, name)
  969. if (err .ne. NF_EBADID)
  970. + call errore('bad ncid: ', err)
  971. err = nf_del_att(ncid, vid, 'noSuch')
  972. if (err .ne. NF_ENOTATT)
  973. + call errore('bad attname: ', err)
  974. err = nf_del_att(ncid, vid, name)
  975. if (err .ne. 0)
  976. + call errore('nf_del_att: ', err)
  977. err = nf_inq_attid(ncid, vid, name, attnum)
  978. if (err .ne. NF_ENOTATT)
  979. + call errore('bad attname: ', err)
  980. if (i .lt. 1) then
  981. err = nf_inq_natts(ncid, na)
  982. if (err .ne. 0)
  983. + call errore('nf_inq_natts: ', err)
  984. if (na .ne. numatts-j) then
  985. call errori('natts: expected: ', numatts-j)
  986. call errori('natts: got: ', na)
  987. end if
  988. end if
  989. err = nf_inq_varnatts(ncid, vid, na)
  990. if (err .ne. 0)
  991. + call errore('nf_inq_natts: ', err)
  992. if (na .ne. numatts-j) then
  993. call errori('natts: expected: ', numatts-j)
  994. call errori('natts: got: ', na)
  995. end if
  996. 2 continue
  997. 1 continue
  998. C /* Close. Reopen & check no attributes left */
  999. err = nf_close(ncid)
  1000. if (err .ne. 0)
  1001. + call errore('nf_close: ', err)
  1002. err = nf_open(scratch, NF_WRITE, ncid)
  1003. if (err .ne. 0)
  1004. + call errore('nf_open: ', err)
  1005. err = nf_inq_natts(ncid, na)
  1006. if (err .ne. 0)
  1007. + call errore('nf_inq_natts: ', err)
  1008. if (na .ne. 0)
  1009. + call errori('natts: expected 0, got ', na)
  1010. do 3, i = 0, NVARS
  1011. vid = VARID(i)
  1012. err = nf_inq_varnatts(ncid, vid, na)
  1013. if (err .ne. 0)
  1014. + call errore('nf_inq_natts: ', err)
  1015. if (na .ne. 0)
  1016. + call errori('natts: expected 0, got ', na)
  1017. 3 continue
  1018. C /* restore attributes. change to data mode. try to delete */
  1019. err = nf_redef(ncid)
  1020. if (err .ne. 0)
  1021. + call errore('nf_redef: ', err)
  1022. call put_atts(ncid)
  1023. err = nf_enddef(ncid)
  1024. if (err .ne. 0)
  1025. + call errore('nf_enddef: ', err)
  1026. do 4, i = 0, NVARS
  1027. vid = VARID(i)
  1028. numatts = NATTS(i)
  1029. do 5, j = 1, numatts
  1030. name = ATT_NAME(j,i)
  1031. err = nf_del_att(ncid, vid, name)
  1032. if (err .ne. NF_ENOTINDEFINE)
  1033. + call errore('in data mode: ', err)
  1034. 5 continue
  1035. 4 continue
  1036. err = nf_close(ncid)
  1037. if (err .ne. 0)
  1038. + call errore('nf_close: ', err)
  1039. err = nf_delete(scratch)
  1040. if (err .ne. 0)
  1041. + call errori('delete of scratch file failed: ', err)
  1042. end
  1043. C Test nf_set_fill
  1044. C try with bad netCDF handle, check error
  1045. C try in read-only mode, check error
  1046. C try with bad new_fillmode, check error
  1047. C try in data mode, check error
  1048. C check that proper set to NF_FILL works for record & non-record variables
  1049. C (note that it is not possible to test NF_NOFILL mode!)
  1050. C close file & create again for test using attribute _FillValue
  1051. subroutine test_nf_set_fill()
  1052. implicit none
  1053. #include "tests.inc"
  1054. integer ncid
  1055. integer vid
  1056. integer err
  1057. integer i
  1058. integer j
  1059. integer old_fillmode
  1060. integer nok !/* count of valid comparisons */
  1061. character*1 text
  1062. doubleprecision value
  1063. doubleprecision fill
  1064. integer index(MAX_RANK)
  1065. nok = 0
  1066. value = 0
  1067. C /* bad ncid */
  1068. err = nf_set_fill(BAD_ID, NF_NOFILL, old_fillmode)
  1069. if (err .ne. NF_EBADID)
  1070. + call errore('bad ncid: ', err)
  1071. C /* try in read-only mode */
  1072. err = nf_open(testfile, NF_NOWRITE, ncid)
  1073. if (err .ne. 0)
  1074. + call errore('nf_open: ', err)
  1075. err = nf_set_fill(ncid, NF_NOFILL, old_fillmode)
  1076. if (err .ne. NF_EPERM)
  1077. + call errore('read-only: ', err)
  1078. err = nf_close(ncid)
  1079. if (err .ne. 0)
  1080. + call errore('nf_close: ', err)
  1081. C /* create scratch */
  1082. err = nf_create(scratch, NF_NOCLOBBER, ncid)
  1083. if (err .ne. 0) then
  1084. call errore('nf_create: ', err)
  1085. return
  1086. end if
  1087. C /* BAD_FILLMODE */
  1088. err = nf_set_fill(ncid, BAD_FILLMODE, old_fillmode)
  1089. if (err .ne. NF_EINVAL)
  1090. + call errore('bad fillmode: ', err)
  1091. C /* proper calls */
  1092. err = nf_set_fill(ncid, NF_NOFILL, old_fillmode)
  1093. if (err .ne. 0)
  1094. + call errore('nf_set_fill: ', err)
  1095. if (old_fillmode .ne. NF_FILL)
  1096. + call errori('Unexpected old fill mode: ', old_fillmode)
  1097. err = nf_set_fill(ncid, NF_FILL, old_fillmode)
  1098. if (err .ne. 0)
  1099. + call errore('nf_set_fill: ', err)
  1100. if (old_fillmode .ne. NF_NOFILL)
  1101. + call errori('Unexpected old fill mode: ', old_fillmode)
  1102. C /* define dims & vars */
  1103. call def_dims(ncid)
  1104. call def_vars(ncid)
  1105. C /* Change to data mode. Set fillmode again */
  1106. err = nf_enddef(ncid)
  1107. if (err .ne. 0)
  1108. + call errore('nf_enddef: ', err)
  1109. err = nf_set_fill(ncid, NF_FILL, old_fillmode)
  1110. if (err .ne. 0)
  1111. + call errore('nf_set_fill: ', err)
  1112. if (old_fillmode .ne. NF_FILL)
  1113. + call errori('Unexpected old fill mode: ', old_fillmode)
  1114. C /* Write record number NRECS to force writing of preceding records */
  1115. C /* Assumes variable cr is char vector with UNLIMITED dimension */
  1116. err = nf_inq_varid(ncid, 'cr', vid)
  1117. if (err .ne. 0)
  1118. + call errore('nf_inq_varid: ', err)
  1119. index(1) = NRECS
  1120. text = char(NF_FILL_CHAR)
  1121. err = nf_put_var1_text(ncid, vid, index, text)
  1122. if (err .ne. 0)
  1123. + call errore('nf_put_var1_text: ', err)
  1124. C /* get all variables & check all values equal default fill */
  1125. do 1, i = 1, NVARS
  1126. if (var_type(i) .eq. NF_CHAR) then
  1127. fill = NF_FILL_CHAR
  1128. else if (var_type(i) .eq. NF_BYTE) then
  1129. fill = NF_FILL_BYTE
  1130. else if (var_type(i) .eq. NF_SHORT) then
  1131. fill = NF_FILL_SHORT
  1132. else if (var_type(i) .eq. NF_INT) then
  1133. fill = NF_FILL_INT
  1134. else if (var_type(i) .eq. NF_FLOAT) then
  1135. fill = NF_FILL_FLOAT
  1136. else if (var_type(i) .eq. NF_DOUBLE) then
  1137. fill = NF_FILL_DOUBLE
  1138. else
  1139. stop 'test_nf_set_fill(): impossible var_type(i)'
  1140. end if
  1141. do 2, j = 1, var_nels(i)
  1142. err = index2indexes(j, var_rank(i), var_shape(1,i),
  1143. + index)
  1144. if (err .ne. 0)
  1145. + call error('error in index2indexes()')
  1146. if (var_type(i) .eq. NF_CHAR) then
  1147. err = nf_get_var1_text(ncid, i, index, text)
  1148. if (err .ne. 0)
  1149. + call errore('nf_get_var1_text failed: ',err)
  1150. value = ichar(text)
  1151. else
  1152. err = nf_get_var1_double(ncid, i, index, value)
  1153. if (err .ne. 0)
  1154. + call errore('nf_get_var1_double failed: ',err)
  1155. end if
  1156. if (value .ne. fill .and.
  1157. + abs((fill - value)/fill) .gt. 1.0e-9) then
  1158. call errord('Unexpected fill value: ', value)
  1159. else
  1160. nok = nok + 1
  1161. end if
  1162. 2 continue
  1163. 1 continue
  1164. C /* close scratch & create again for test using attribute _FillValue */
  1165. err = nf_close(ncid)
  1166. if (err .ne. 0)
  1167. + call errore('nf_close: ', err)
  1168. err = nf_create(scratch, NF_CLOBBER, ncid)
  1169. if (err .ne. 0) then
  1170. call errore('nf_create: ', err)
  1171. return
  1172. end if
  1173. call def_dims(ncid)
  1174. call def_vars(ncid)
  1175. C /* set _FillValue = 42 for all vars */
  1176. fill = 42
  1177. text = char(int(fill))
  1178. do 3, i = 1, NVARS
  1179. if (var_type(i) .eq. NF_CHAR) then
  1180. err = nf_put_att_text(ncid, i, '_FillValue', 1, text)
  1181. if (err .ne. 0)
  1182. + call errore('nf_put_att_text: ', err)
  1183. else
  1184. err = nf_put_att_double(ncid, i, '_FillValue',
  1185. + var_type(i),1,fill)
  1186. if (err .ne. 0)
  1187. + call errore('nf_put_att_double: ', err)
  1188. end if
  1189. 3 continue
  1190. C /* data mode. write records */
  1191. err = nf_enddef(ncid)
  1192. if (err .ne. 0)
  1193. + call errore('nf_enddef: ', err)
  1194. index(1) = NRECS
  1195. err = nf_put_var1_text(ncid, vid, index, text)
  1196. if (err .ne. 0)
  1197. + call errore('nf_put_var1_text: ', err)
  1198. C /* get all variables & check all values equal 42 */
  1199. do 4, i = 1, NVARS
  1200. do 5, j = 1, var_nels(i)
  1201. err = index2indexes(j, var_rank(i), var_shape(1,i),
  1202. + index)
  1203. if (err .ne. 0)
  1204. + call error('error in index2indexes')
  1205. if (var_type(i) .eq. NF_CHAR) then
  1206. err = nf_get_var1_text(ncid, i, index, text)
  1207. if (err .ne. 0)
  1208. + call errore('nf_get_var1_text failed: ',err)
  1209. value = ichar(text)
  1210. else
  1211. err = nf_get_var1_double(ncid, i, index, value)
  1212. if (err .ne. 0)
  1213. + call errore('nf_get_var1_double failed: ', err)
  1214. end if
  1215. if (value .ne. fill) then
  1216. call errord(' Value expected: ', fill)
  1217. call errord(' Value read: ', value)
  1218. else
  1219. nok = nok + 1
  1220. end if
  1221. 5 continue
  1222. 4 continue
  1223. call print_nok(nok)
  1224. err = nf_close(ncid)
  1225. if (err .ne. 0)
  1226. + call errore('nf_close: ', err)
  1227. err = nf_delete(scratch)
  1228. if (err .ne. 0)
  1229. + call errori('delete of scratch file failed: ', err)
  1230. end
  1231. C * Test nc_set_default_format
  1232. C * try with bad default format
  1233. C * try with NULL old_formatp
  1234. C * try in data mode, check error
  1235. C * check that proper set to NC_FILL works for record & non-record variables
  1236. C * (note that it is not possible to test NC_NOFILL mode!)
  1237. C * close file & create again for test using attribute _FillValue
  1238. subroutine test_nf_set_default_format()
  1239. implicit none
  1240. #include "tests.inc"
  1241. integer ncid
  1242. integer err
  1243. integer i
  1244. integer version
  1245. integer old_format
  1246. integer nf_get_file_version
  1247. C /* bad format */
  1248. err = nf_set_default_format(5, old_format)
  1249. IF (err .ne. NF_EINVAL)
  1250. + call errore("bad default format: status = %d", err)
  1251. C /* Cycle through available formats. (actually netcdf-4 formats are
  1252. C ignored for the moment - ed 5/15/5) */
  1253. do 1 i=1, 2
  1254. err = nf_set_default_format(i, old_format)
  1255. if (err .ne. 0)
  1256. + call errore("setting classic format: status = %d", err)
  1257. err = nf_create(scratch, NF_CLOBBER, ncid)
  1258. if (err .ne. 0) call errore("bad nf_create: status = %d", err)
  1259. err = nf_put_att_text(ncid, NF_GLOBAL, "testatt",
  1260. + 4, "blah")
  1261. if (err .ne. 0) call errore("bad put_att: status = %d", err)
  1262. err = nf_close(ncid)
  1263. if (err .ne. 0) call errore("bad close: status = %d", err)
  1264. err = nf_get_file_version(scratch, version)
  1265. if (err .ne. 0) call errore("bad file version = %d", err)
  1266. if (version .ne. i)
  1267. + call errore("bad file version = %d", err)
  1268. 1 continue
  1269. C /* Remove the left-over file. */
  1270. C err = nf_delete(scratch)
  1271. if (err .ne. 0) call errore("remove failed", err)
  1272. end
  1273. C This function looks in a file for the netCDF magic number.
  1274. integer function nf_get_file_version(path, version)
  1275. implicit none
  1276. #include "tests.inc"
  1277. character*(*) path
  1278. integer version, iosnum
  1279. character magic*4
  1280. integer ver
  1281. integer f
  1282. parameter (f = 10)
  1283. open(f, file=path, status='OLD', form='UNFOR…

Large files files are truncated, but you can click here to view the full file