fbstatncio.F90 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995
  1. #define MYFILE 'fbstatncio.F90'
  2. MODULE fbstatncio
  3. USE fbacctype
  4. USE nctools
  5. IMPLICIT NONE
  6. REAL, PARAMETER :: fbstncmiss = 99999.
  7. TYPE fbstatnctype
  8. INTEGER :: nlev,nbox,nadd
  9. CHARACTER(len=20), POINTER, DIMENSION(:) :: area
  10. CHARACTER(len=32), POINTER, DIMENSION(:) :: name
  11. REAL, POINTER, DIMENSION(:) :: dep
  12. REAL, POINTER, DIMENSION(:,:,:) :: val
  13. INTEGER, POINTER, DIMENSION(:,:) :: cnt
  14. END TYPE fbstatnctype
  15. TYPE fbstathistnctype
  16. INTEGER :: nlev,nbox,npoints
  17. CHARACTER(len=20), POINTER, DIMENSION(:) :: area
  18. REAL, POINTER, DIMENSION(:) :: dep,val
  19. INTEGER, POINTER, DIMENSION(:,:,:) :: nhist
  20. END TYPE fbstathistnctype
  21. TYPE fbstatxynctype
  22. INTEGER :: nlev,nbox,npoints
  23. CHARACTER(len=20), POINTER, DIMENSION(:) :: area
  24. REAL, POINTER, DIMENSION(:) :: dep,val
  25. INTEGER, POINTER, DIMENSION(:,:,:,:) :: nxy
  26. END TYPE fbstatxynctype
  27. CONTAINS
  28. SUBROUTINE fbstat_ncwrite(cdfilename,nvar,cdvar,nadd,cdadd,&
  29. & nobe,cdobe,nbge,cdbge,&
  30. & nbox,nboxl,lenboxname,cdboxnam,lskipbox,nlev,pdep,&
  31. & knum,pbias,prms,pstd,pomean,pmmean,knuma,poamean, &
  32. & knumo,poerr,povar,knumb,pberr,pbvar)
  33. ! Arguments
  34. CHARACTER(len=*) :: cdfilename ! Netcdf filename
  35. INTEGER :: nvar ! Number of variables
  36. CHARACTER(len=*), DIMENSION(nvar) :: cdvar ! Name of variables
  37. INTEGER :: nadd ! Number of additional data
  38. CHARACTER(len=*), DIMENSION(nadd) :: cdadd ! Name of entries
  39. INTEGER :: nobe ! Number of obs errors
  40. CHARACTER(len=*), DIMENSION(nadd) :: cdobe ! Name of obs erors
  41. INTEGER :: nbge ! Number of bg errors
  42. CHARACTER(len=*), DIMENSION(nadd) :: cdbge ! Name of bg erors
  43. INTEGER :: nbox ! Total number of boxes
  44. INTEGER :: nboxl ! Actual number of boxes
  45. INTEGER :: lenboxname ! Length of box names
  46. CHARACTER(len=lenboxname), DIMENSION(nbox) :: &
  47. & cdboxnam ! Name of boxes
  48. LOGICAL, DIMENSION(nbox) :: lskipbox ! Boxes to skip
  49. INTEGER :: nlev ! Number of levels
  50. REAL,DIMENSION(nlev) :: pdep ! Depth of levels
  51. INTEGER, DIMENSION(nlev,nboxl,nadd,nvar) :: & ! Output data
  52. & knum
  53. REAL, DIMENSION(nlev,nboxl,nadd,nvar) :: & ! Output data
  54. & pbias, prms, pstd, pomean, pmmean
  55. INTEGER, DIMENSION(nlev,nboxl,nvar) :: & ! Output data
  56. & knuma
  57. REAL, DIMENSION(nlev,nboxl,nvar) :: & ! Output data
  58. & poamean
  59. INTEGER, DIMENSION(nlev,nboxl,nobe,nvar) :: & ! Output data
  60. & knumo
  61. REAL, DIMENSION(nlev,nboxl,nobe,nvar) :: & ! Output data
  62. & poerr,povar
  63. INTEGER, DIMENSION(nlev,nboxl,nbge,nvar) :: & ! Output data
  64. & knumb
  65. REAL, DIMENSION(nlev,nboxl,nbge,nvar) :: & ! Output data
  66. & pberr,pbvar
  67. ! Local variables
  68. INTEGER :: jadd,jvar,incvar,iv,jbox,ip
  69. CHARACTER(len=50) :: cncvarbase
  70. CHARACTER(len=60), ALLOCATABLE, DIMENSION(:) :: cncvar
  71. ! netcdf stuff
  72. INTEGER :: ncid,idlev,idbox,idlbox,idimdep(1),idimbox(2),idimids(2)
  73. INTEGER :: idvbox,idvlev
  74. INTEGER, ALLOCATABLE, DIMENSION(:) :: idvar
  75. INTEGER :: inoboxes
  76. REAL, ALLOCATABLE, DIMENSION(:,:) :: ztmp
  77. INTEGER, ALLOCATABLE, DIMENSION(:,:) :: itmp
  78. CHARACTER(len=lenboxname), DIMENSION(:), ALLOCATABLE :: &
  79. & clboxnam ! Name of boxes
  80. ! Open netCDF files.
  81. CALL nchdlerr(nf90_create(TRIM(cdfilename),nf90_clobber,ncid),&
  82. & __LINE__,MYFILE)
  83. ! Create dimensions
  84. inoboxes=nbox-COUNT(lskipbox)
  85. ALLOCATE(ztmp(nlev,inoboxes),itmp(nlev,inoboxes),clboxnam(inoboxes))
  86. CALL nchdlerr(nf90_def_dim(ncid,"depth",nlev,idlev),__LINE__,MYFILE)
  87. CALL nchdlerr(nf90_def_dim(ncid,"box",inoboxes,idbox),&
  88. & __LINE__,MYFILE)
  89. CALL nchdlerr(nf90_def_dim(ncid,"len",lenboxname,idlbox),__LINE__,MYFILE)
  90. ! Box variable name
  91. idimbox(1)=idlbox
  92. idimbox(2)=idbox
  93. CALL nchdlerr(nf90_def_var(ncid,'box',nf90_char,idimbox,idvbox),&
  94. & __LINE__,MYFILE)
  95. ! Depths
  96. idimdep(1)=idlev
  97. CALL nchdlerr(nf90_def_var(ncid,'depth',nf90_float,idimdep,idvlev),&
  98. & __LINE__,MYFILE)
  99. ! Setup variables names
  100. idimids(1)=idlev
  101. idimids(2)=idbox
  102. incvar=(nadd*6+nobe*3+nbge*3+2)*nvar
  103. ALLOCATE(cncvar(incvar),idvar(incvar))
  104. iv=0
  105. DO jvar=1,nvar
  106. DO jadd=1,nadd
  107. WRITE(cncvarbase,'(3A)')TRIM(cdvar(jvar)),'_',TRIM(cdadd(jadd))
  108. iv=iv+1
  109. cncvar(iv)=TRIM(cncvarbase)//'_bias'
  110. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),nf90_float,&
  111. & idimids,idvar(iv)),__LINE__,MYFILE)
  112. CALL nchdlerr(nf90_put_att(ncid,idvar(iv),"missing_value",fbstncmiss),&
  113. & __LINE__,MYFILE)
  114. iv=iv+1
  115. cncvar(iv)=TRIM(cncvarbase)//'_rms'
  116. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),nf90_float,&
  117. & idimids,idvar(iv)),__LINE__,MYFILE)
  118. CALL nchdlerr(nf90_put_att(ncid,idvar(iv),"missing_value",fbstncmiss),&
  119. & __LINE__,MYFILE)
  120. iv=iv+1
  121. cncvar(iv)=TRIM(cncvarbase)//'_std'
  122. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),nf90_float,&
  123. & idimids,idvar(iv)),__LINE__,MYFILE)
  124. CALL nchdlerr(nf90_put_att(ncid,idvar(iv),"missing_value",fbstncmiss),&
  125. & __LINE__,MYFILE)
  126. iv=iv+1
  127. cncvar(iv)=TRIM(cncvarbase)//'_omean'
  128. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),nf90_float,&
  129. & idimids,idvar(iv)),__LINE__,MYFILE)
  130. CALL nchdlerr(nf90_put_att(ncid,idvar(iv),"missing_value",fbstncmiss),&
  131. & __LINE__,MYFILE)
  132. iv=iv+1
  133. cncvar(iv)=TRIM(cncvarbase)//'_mmean'
  134. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),nf90_float,&
  135. & idimids,idvar(iv)),__LINE__,MYFILE)
  136. CALL nchdlerr(nf90_put_att(ncid,idvar(iv),"missing_value",fbstncmiss),&
  137. & __LINE__,MYFILE)
  138. iv=iv+1
  139. cncvar(iv)=TRIM(cncvarbase)//'_count'
  140. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),nf90_int,&
  141. & idimids,idvar(iv)),__LINE__,MYFILE)
  142. CALL nchdlerr(nf90_put_att(ncid,idvar(iv),"missing_value",fbstncmiss),&
  143. & __LINE__,MYFILE)
  144. ENDDO
  145. DO jadd=1,nobe
  146. WRITE(cncvarbase,'(3A)')TRIM(cdvar(jvar)),'_',TRIM(cdobe(jadd))
  147. iv=iv+1
  148. cncvar(iv)=TRIM(cncvarbase)//'_meanerr'
  149. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),nf90_float,&
  150. & idimids,idvar(iv)),__LINE__,MYFILE)
  151. CALL nchdlerr(nf90_put_att(ncid,idvar(iv),"missing_value",fbstncmiss),&
  152. & __LINE__,MYFILE)
  153. iv=iv+1
  154. cncvar(iv)=TRIM(cncvarbase)//'_meanvar'
  155. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),nf90_float,&
  156. & idimids,idvar(iv)),__LINE__,MYFILE)
  157. CALL nchdlerr(nf90_put_att(ncid,idvar(iv),"missing_value",fbstncmiss),&
  158. & __LINE__,MYFILE)
  159. iv=iv+1
  160. cncvar(iv)=TRIM(cncvarbase)//'_count'
  161. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),nf90_int,&
  162. & idimids,idvar(iv)),__LINE__,MYFILE)
  163. CALL nchdlerr(nf90_put_att(ncid,idvar(iv),"missing_value",fbstncmiss),&
  164. & __LINE__,MYFILE)
  165. ENDDO
  166. DO jadd=1,nbge
  167. WRITE(cncvarbase,'(3A)')TRIM(cdvar(jvar)),'_',TRIM(cdbge(jadd))
  168. iv=iv+1
  169. cncvar(iv)=TRIM(cncvarbase)//'_meanerr'
  170. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),nf90_float,&
  171. & idimids,idvar(iv)),__LINE__,MYFILE)
  172. CALL nchdlerr(nf90_put_att(ncid,idvar(iv),"missing_value",fbstncmiss),&
  173. & __LINE__,MYFILE)
  174. iv=iv+1
  175. cncvar(iv)=TRIM(cncvarbase)//'_meanvar'
  176. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),nf90_float,&
  177. & idimids,idvar(iv)),__LINE__,MYFILE)
  178. CALL nchdlerr(nf90_put_att(ncid,idvar(iv),"missing_value",fbstncmiss),&
  179. & __LINE__,MYFILE)
  180. iv=iv+1
  181. cncvar(iv)=TRIM(cncvarbase)//'_count'
  182. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),nf90_int,&
  183. & idimids,idvar(iv)),__LINE__,MYFILE)
  184. CALL nchdlerr(nf90_put_att(ncid,idvar(iv),"missing_value",fbstncmiss),&
  185. & __LINE__,MYFILE)
  186. ENDDO
  187. WRITE(cncvarbase,'(A)')TRIM(cdvar(jvar))
  188. iv=iv+1
  189. cncvar(iv)=TRIM(cncvarbase)//'_omean'
  190. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),nf90_float,&
  191. & idimids,idvar(iv)),__LINE__,MYFILE)
  192. CALL nchdlerr(nf90_put_att(ncid,idvar(iv),"missing_value",fbstncmiss),&
  193. & __LINE__,MYFILE)
  194. iv=iv+1
  195. cncvar(iv)=TRIM(cncvarbase)//'_count'
  196. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),nf90_int,&
  197. & idimids,idvar(iv)),__LINE__,MYFILE)
  198. CALL nchdlerr(nf90_put_att(ncid,idvar(iv),"missing_value",fbstncmiss),&
  199. & __LINE__,MYFILE)
  200. ENDDO
  201. CALL nchdlerr(nf90_enddef(ncid),__LINE__,MYFILE)
  202. ! Write box names
  203. ip=0
  204. DO jbox=1,nbox
  205. IF (.NOT.lskipbox(jbox)) THEN
  206. ip=ip+1
  207. clboxnam(ip)=cdboxnam(jbox)
  208. ENDIF
  209. ENDDO
  210. CALL nchdlerr(nf90_put_var(ncid,idvbox,clboxnam),&
  211. & __LINE__,MYFILE)
  212. ! Write levels
  213. CALL nchdlerr(nf90_put_var(ncid,idvlev,pdep),&
  214. & __LINE__,MYFILE)
  215. ! Write the output data
  216. iv=0
  217. DO jvar=1,nvar
  218. DO jadd=1,nadd
  219. iv=iv+1
  220. ip=0
  221. DO jbox=1,nbox
  222. IF (.NOT.lskipbox(jbox)) THEN
  223. ip=ip+1
  224. ztmp(:,ip)=pbias(:,ip,jadd,jvar)
  225. ENDIF
  226. ENDDO
  227. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),ztmp),&
  228. & __LINE__,MYFILE)
  229. iv=iv+1
  230. ip=0
  231. DO jbox=1,nbox
  232. IF (.NOT.lskipbox(jbox)) THEN
  233. ip=ip+1
  234. ztmp(:,ip)=prms(:,ip,jadd,jvar)
  235. ENDIF
  236. ENDDO
  237. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),ztmp),&
  238. & __LINE__,MYFILE)
  239. iv=iv+1
  240. ip=0
  241. DO jbox=1,nbox
  242. IF (.NOT.lskipbox(jbox)) THEN
  243. ip=ip+1
  244. ztmp(:,ip)=pstd(:,ip,jadd,jvar)
  245. ENDIF
  246. ENDDO
  247. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),ztmp),&
  248. & __LINE__,MYFILE)
  249. iv=iv+1
  250. ip=0
  251. DO jbox=1,nbox
  252. IF (.NOT.lskipbox(jbox)) THEN
  253. ip=ip+1
  254. ztmp(:,ip)=pomean(:,ip,jadd,jvar)
  255. ENDIF
  256. ENDDO
  257. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),ztmp),&
  258. & __LINE__,MYFILE)
  259. iv=iv+1
  260. ip=0
  261. DO jbox=1,nbox
  262. IF (.NOT.lskipbox(jbox)) THEN
  263. ip=ip+1
  264. ztmp(:,ip)=pmmean(:,ip,jadd,jvar)
  265. ENDIF
  266. ENDDO
  267. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),ztmp),&
  268. & __LINE__,MYFILE)
  269. iv=iv+1
  270. ip=0
  271. DO jbox=1,nbox
  272. IF (.NOT.lskipbox(jbox)) THEN
  273. ip=ip+1
  274. itmp(:,ip)=knum(:,ip,jadd,jvar)
  275. ENDIF
  276. ENDDO
  277. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),itmp),&
  278. & __LINE__,MYFILE)
  279. ENDDO
  280. DO jadd=1,nobe
  281. iv=iv+1
  282. ip=0
  283. DO jbox=1,nbox
  284. IF (.NOT.lskipbox(jbox)) THEN
  285. ip=ip+1
  286. ztmp(:,ip)=poerr(:,ip,jadd,jvar)
  287. ENDIF
  288. ENDDO
  289. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),ztmp),&
  290. & __LINE__,MYFILE)
  291. iv=iv+1
  292. ip=0
  293. DO jbox=1,nbox
  294. IF (.NOT.lskipbox(jbox)) THEN
  295. ip=ip+1
  296. ztmp(:,ip)=povar(:,ip,jadd,jvar)
  297. ENDIF
  298. ENDDO
  299. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),ztmp),&
  300. & __LINE__,MYFILE)
  301. iv=iv+1
  302. ip=0
  303. DO jbox=1,nbox
  304. IF (.NOT.lskipbox(jbox)) THEN
  305. ip=ip+1
  306. itmp(:,ip)=knumo(:,ip,jadd,jvar)
  307. ENDIF
  308. ENDDO
  309. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),itmp),&
  310. & __LINE__,MYFILE)
  311. ENDDO
  312. DO jadd=1,nbge
  313. iv=iv+1
  314. ip=0
  315. DO jbox=1,nbox
  316. IF (.NOT.lskipbox(jbox)) THEN
  317. ip=ip+1
  318. ztmp(:,ip)=pberr(:,ip,jadd,jvar)
  319. ENDIF
  320. ENDDO
  321. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),ztmp),&
  322. & __LINE__,MYFILE)
  323. iv=iv+1
  324. ip=0
  325. DO jbox=1,nbox
  326. IF (.NOT.lskipbox(jbox)) THEN
  327. ip=ip+1
  328. ztmp(:,ip)=pbvar(:,ip,jadd,jvar)
  329. ENDIF
  330. ENDDO
  331. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),ztmp),&
  332. & __LINE__,MYFILE)
  333. iv=iv+1
  334. ip=0
  335. DO jbox=1,nbox
  336. IF (.NOT.lskipbox(jbox)) THEN
  337. ip=ip+1
  338. itmp(:,ip)=knumb(:,ip,jadd,jvar)
  339. ENDIF
  340. ENDDO
  341. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),itmp),&
  342. & __LINE__,MYFILE)
  343. ENDDO
  344. iv=iv+1
  345. ip=0
  346. DO jbox=1,nbox
  347. IF (.NOT.lskipbox(jbox)) THEN
  348. ip=ip+1
  349. ztmp(:,ip)=poamean(:,ip,jvar)
  350. ENDIF
  351. ENDDO
  352. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),ztmp),&
  353. & __LINE__,MYFILE)
  354. iv=iv+1
  355. ip=0
  356. DO jbox=1,nbox
  357. IF (.NOT.lskipbox(jbox)) THEN
  358. ip=ip+1
  359. itmp(:,ip)=knuma(:,ip,jvar)
  360. ENDIF
  361. ENDDO
  362. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),itmp),&
  363. & __LINE__,MYFILE)
  364. ENDDO
  365. ! Close the file
  366. CALL nchdlerr(nf90_close(ncid),__LINE__,MYFILE)
  367. DEALLOCATE(cncvar,idvar,ztmp,itmp,clboxnam)
  368. END SUBROUTINE fbstat_ncwrite
  369. SUBROUTINE fbstat_ncwrite_hist(cdfilename,nvar,cdvar,nadd,cdadd,&
  370. & nbox,lenboxname,cdboxnam,lskipbox,nlev,pdep,&
  371. & zhist,zhistmin,zhiststep,ntyp)
  372. ! Arguments
  373. CHARACTER(len=*) :: cdfilename ! Netcdf filename
  374. INTEGER :: nvar ! Number of variables
  375. CHARACTER(len=*), DIMENSION(nvar) :: cdvar ! Name of variables
  376. INTEGER :: nadd ! Number of addiables
  377. CHARACTER(len=*), DIMENSION(nadd) :: cdadd ! Name of entries
  378. INTEGER :: nbox ! Number of boxes
  379. INTEGER :: lenboxname ! Length of box names
  380. CHARACTER(len=lenboxname), dimension(nbox) :: &
  381. & cdboxnam ! Name of boxes
  382. LOGICAL, DIMENSION(nbox) :: lskipbox ! Boxes to skip
  383. INTEGER :: nlev ! Number of levels
  384. REAL,DIMENSION(nlev) :: pdep ! Depth of levels
  385. TYPE(histtype), DIMENSION(nvar) :: zhist ! Histogram data
  386. REAL, DIMENSION(nvar) :: &
  387. & zhistmin,zhiststep ! Histogram info
  388. integer :: ntyp ! Type to write
  389. ! Local variables
  390. INTEGER :: jadd,jvar,incvar,ji,iv,ip,jbox
  391. CHARACTER(len=50) :: cncvarbase
  392. CHARACTER(len=60), ALLOCATABLE, DIMENSION(:) :: cncvar
  393. ! netcdf stuff
  394. INTEGER :: ncid,idlev,idbox,idlbox,idimhist(nvar),&
  395. & idimdep(1),idimbox(2),idimids(2),idimval(1),idimcnt(3)
  396. INTEGER :: idvbox,idvlev
  397. INTEGER, ALLOCATABLE, DIMENSION(:) :: idvar
  398. CHARACTER(len=40) :: cdhdimname
  399. REAL, ALLOCATABLE, DIMENSION(:) :: zhval
  400. INTEGER :: inoboxes
  401. INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: itmp
  402. CHARACTER(len=lenboxname), DIMENSION(:), ALLOCATABLE :: &
  403. & clboxnam ! Name of boxes
  404. ! Open netCDF files.
  405. CALL nchdlerr(nf90_create(TRIM(cdfilename),nf90_clobber,ncid),&
  406. & __LINE__,MYFILE)
  407. ! Create dimensions
  408. inoboxes=nbox-COUNT(lskipbox)
  409. ALLOCATE(clboxnam(inoboxes))
  410. CALL nchdlerr(nf90_def_dim(ncid,"depth",nlev,idlev),__LINE__,MYFILE)
  411. CALL nchdlerr(nf90_def_dim(ncid,"box",inoboxes,idbox),&
  412. & __LINE__,MYFILE)
  413. CALL nchdlerr(nf90_def_dim(ncid,"len",lenboxname,idlbox),__LINE__,MYFILE)
  414. DO jvar=1,nvar
  415. WRITE(cdhdimname,'(A,A)')'hist',TRIM(cdvar(jvar))
  416. CALL nchdlerr(nf90_def_dim(ncid,TRIM(cdhdimname),&
  417. & zhist(jvar)%npoints,idimhist(jvar)),&
  418. & __LINE__,MYFILE)
  419. ENDDO
  420. ! Box variable name
  421. idimbox(1)=idlbox
  422. idimbox(2)=idbox
  423. CALL nchdlerr(nf90_def_var(ncid,'box',nf90_char,idimbox,idvbox),&
  424. & __LINE__,MYFILE)
  425. ! Depths
  426. idimdep(1)=idlev
  427. CALL nchdlerr(nf90_def_var(ncid,'depth',nf90_float,idimdep,idvlev),&
  428. & __LINE__,MYFILE)
  429. ! Histogram values and depths
  430. incvar=nvar+nadd*nvar
  431. ALLOCATE(cncvar(incvar),idvar(incvar))
  432. iv=0
  433. DO jvar=1,nvar
  434. iv=iv+1
  435. WRITE(cncvar(iv),'(A,A)')TRIM(cdvar(jvar)),'_val'
  436. idimval(1)=idimhist(jvar)
  437. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),&
  438. & nf90_float,idimval,idvar(iv)),&
  439. & __LINE__,MYFILE)
  440. DO jadd=1,nadd
  441. iv=iv+1
  442. WRITE(cncvar(iv),'(A,A,A)')TRIM(cdvar(jvar)),&
  443. & TRIM(cdadd(jadd)),'_count'
  444. idimcnt(1)=idimhist(jvar)
  445. idimcnt(2)=idlev
  446. idimcnt(3)=idbox
  447. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),&
  448. & nf90_int,idimcnt,idvar(iv)),&
  449. & __LINE__,MYFILE)
  450. ENDDO
  451. ENDDO
  452. CALL nchdlerr(nf90_enddef(ncid),__LINE__,MYFILE)
  453. ! Write box names
  454. ip=0
  455. DO jbox=1,nbox
  456. IF (.NOT.lskipbox(jbox)) THEN
  457. ip=ip+1
  458. clboxnam(ip)=cdboxnam(jbox)
  459. ENDIF
  460. ENDDO
  461. CALL nchdlerr(nf90_put_var(ncid,idvbox,clboxnam),&
  462. & __LINE__,MYFILE)
  463. ! Write levels
  464. CALL nchdlerr(nf90_put_var(ncid,idvlev,pdep),&
  465. & __LINE__,MYFILE)
  466. iv=0
  467. DO jvar=1,nvar
  468. iv=iv+1
  469. ALLOCATE(zhval(zhist(jvar)%npoints))
  470. DO ji=1,zhist(jvar)%npoints
  471. zhval(ji)=(ji-1)*zhiststep(jvar)+zhistmin(jvar)
  472. ENDDO
  473. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),zhval),&
  474. & __LINE__,MYFILE)
  475. DEALLOCATE(zhval)
  476. DO jadd=1,nadd
  477. iv=iv+1
  478. ALLOCATE(itmp(zhist(jvar)%npoints,nlev,inoboxes))
  479. ip=0
  480. DO jbox=1,nbox
  481. IF(.NOT.lskipbox(jbox)) THEN
  482. ip=ip+1
  483. itmp(:,:,ip)=zhist(jvar)%nhist(:,:,ip,jadd,ntyp)
  484. ENDIF
  485. ENDDO
  486. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),itmp),&
  487. & __LINE__,MYFILE)
  488. DEALLOCATE(itmp)
  489. ENDDO
  490. ENDDO
  491. ! Close the file
  492. CALL nchdlerr(nf90_close(ncid),__LINE__,MYFILE)
  493. DEALLOCATE(cncvar,idvar,clboxnam)
  494. END SUBROUTINE fbstat_ncwrite_hist
  495. SUBROUTINE fbstat_ncwrite_xy(cdfilename,nvar,cdvar,nadd,cdadd,&
  496. & nbox,lenboxname,cdboxnam,lskipbox,nlev,pdep,&
  497. & zxy,zxymin,zxystep,ntyp)
  498. ! Arguments
  499. CHARACTER(len=*) :: cdfilename ! Netcdf filename
  500. INTEGER :: nvar ! Number of variables
  501. CHARACTER(len=*), DIMENSION(nvar) :: cdvar ! Name of variables
  502. INTEGER :: nadd ! Number of addiables
  503. CHARACTER(len=*), DIMENSION(nadd) :: cdadd ! Name of entries
  504. INTEGER :: nbox ! Number of boxes
  505. INTEGER :: lenboxname ! Length of box names
  506. CHARACTER(len=lenboxname), dimension(nbox) :: &
  507. & cdboxnam ! Name of boxes
  508. LOGICAL, DIMENSION(nbox) :: lskipbox ! Boxes to skip
  509. INTEGER :: nlev ! Number of levels
  510. REAL,DIMENSION(nlev) :: pdep ! Depth of levels
  511. TYPE(xytype), DIMENSION(nvar) :: zxy ! xyplot data
  512. REAL, DIMENSION(nvar) :: &
  513. & zxymin,zxystep ! xyplot info
  514. integer :: ntyp ! Type to write
  515. ! Local variables
  516. INTEGER :: jadd,jvar,incvar,ji,iv,ip,jbox
  517. CHARACTER(len=50) :: cncvarbase
  518. CHARACTER(len=60), ALLOCATABLE, DIMENSION(:) :: cncvar
  519. ! netcdf stuff
  520. INTEGER :: ncid,idlev,idbox,idlbox,idimxy(nvar),&
  521. & idimdep(1),idimbox(2),idimids(2),idimval(1),idimcnt(4)
  522. INTEGER :: idvbox,idvlev
  523. INTEGER, ALLOCATABLE, DIMENSION(:) :: idvar
  524. CHARACTER(len=40) :: cdhdimname
  525. REAL, ALLOCATABLE, DIMENSION(:) :: zhval
  526. INTEGER :: inoboxes
  527. INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:) :: itmp
  528. CHARACTER(len=lenboxname), DIMENSION(:), ALLOCATABLE :: &
  529. & clboxnam ! Name of boxes
  530. ! Open netCDF files.
  531. CALL nchdlerr(nf90_create(TRIM(cdfilename),nf90_clobber,ncid),&
  532. & __LINE__,MYFILE)
  533. ! Create dimensions
  534. inoboxes=nbox-COUNT(lskipbox)
  535. ALLOCATE(clboxnam(inoboxes))
  536. CALL nchdlerr(nf90_def_dim(ncid,"depth",nlev,idlev),__LINE__,MYFILE)
  537. CALL nchdlerr(nf90_def_dim(ncid,"box",inoboxes,idbox),&
  538. & __LINE__,MYFILE)
  539. CALL nchdlerr(nf90_def_dim(ncid,"len",lenboxname,idlbox),__LINE__,MYFILE)
  540. DO jvar=1,nvar
  541. WRITE(cdhdimname,'(A,A)')'xy',TRIM(cdvar(jvar))
  542. CALL nchdlerr(nf90_def_dim(ncid,TRIM(cdhdimname),&
  543. & zxy(jvar)%npoints,idimxy(jvar)),&
  544. & __LINE__,MYFILE)
  545. ENDDO
  546. ! Box variable name
  547. idimbox(1)=idlbox
  548. idimbox(2)=idbox
  549. CALL nchdlerr(nf90_def_var(ncid,'box',nf90_char,idimbox,idvbox),&
  550. & __LINE__,MYFILE)
  551. ! Depths
  552. idimdep(1)=idlev
  553. CALL nchdlerr(nf90_def_var(ncid,'depth',nf90_float,idimdep,idvlev),&
  554. & __LINE__,MYFILE)
  555. ! Histogram values and depths
  556. incvar=nvar+nadd*nvar
  557. ALLOCATE(cncvar(incvar),idvar(incvar))
  558. iv=0
  559. DO jvar=1,nvar
  560. iv=iv+1
  561. WRITE(cncvar(iv),'(A,A)')TRIM(cdvar(jvar)),'_val'
  562. idimval(1)=idimxy(jvar)
  563. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),&
  564. & nf90_float,idimval,idvar(iv)),&
  565. & __LINE__,MYFILE)
  566. DO jadd=1,nadd
  567. iv=iv+1
  568. WRITE(cncvar(iv),'(A,A,A)')TRIM(cdvar(jvar)),&
  569. & TRIM(cdadd(jadd)),'_count'
  570. idimcnt(1)=idimxy(jvar)
  571. idimcnt(2)=idimxy(jvar)
  572. idimcnt(3)=idlev
  573. idimcnt(4)=idbox
  574. CALL nchdlerr(nf90_def_var(ncid,TRIM(cncvar(iv)),&
  575. & nf90_int,idimcnt,idvar(iv)),&
  576. & __LINE__,MYFILE)
  577. ENDDO
  578. ENDDO
  579. CALL nchdlerr(nf90_enddef(ncid),__LINE__,MYFILE)
  580. ! Write box names
  581. ip=0
  582. DO jbox=1,nbox
  583. IF (.NOT.lskipbox(jbox)) THEN
  584. ip=ip+1
  585. clboxnam(ip)=cdboxnam(jbox)
  586. ENDIF
  587. ENDDO
  588. CALL nchdlerr(nf90_put_var(ncid,idvbox,clboxnam),&
  589. & __LINE__,MYFILE)
  590. ! Write levels
  591. CALL nchdlerr(nf90_put_var(ncid,idvlev,pdep),&
  592. & __LINE__,MYFILE)
  593. iv=0
  594. DO jvar=1,nvar
  595. iv=iv+1
  596. ALLOCATE(zhval(zxy(jvar)%npoints))
  597. DO ji=1,zxy(jvar)%npoints
  598. zhval(ji)=(ji-1)*zxystep(jvar)+zxymin(jvar)
  599. ENDDO
  600. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),zhval),&
  601. & __LINE__,MYFILE)
  602. DEALLOCATE(zhval)
  603. DO jadd=1,nadd
  604. iv=iv+1
  605. ALLOCATE(itmp(zxy(jvar)%npoints,zxy(jvar)%npoints,nlev,inoboxes))
  606. ip=0
  607. DO jbox=1,nbox
  608. IF(.NOT.lskipbox(jbox)) THEN
  609. ip=ip+1
  610. itmp(:,:,:,ip)=zxy(jvar)%nxy(:,:,:,ip,jadd,ntyp)
  611. ENDIF
  612. ENDDO
  613. CALL nchdlerr(nf90_put_var(ncid,idvar(iv),itmp),&
  614. & __LINE__,MYFILE)
  615. DEALLOCATE(itmp)
  616. ENDDO
  617. ENDDO
  618. ! Close the file
  619. CALL nchdlerr(nf90_close(ncid),__LINE__,MYFILE)
  620. DEALLOCATE(cncvar,idvar,clboxnam)
  621. END SUBROUTINE fbstat_ncwrite_xy
  622. SUBROUTINE fbstat_ncread(cdfilename,cdvar,sdata)
  623. ! Arguments
  624. CHARACTER(len=*) :: cdfilename ! Netcdf filename
  625. CHARACTER(len=*) :: cdvar ! Name of variables
  626. TYPE(fbstatnctype) :: sdata ! Data to be filled
  627. ! Local variables
  628. INTEGER :: nbox,nlev,nadd,nvar
  629. INTEGER :: ncid,dimid,varid,i,icntpos
  630. CHARACTER(len=128) :: cdname,tmpname
  631. ! Open the file and get the dimensions
  632. CALL nchdlerr(nf90_open(cdfilename,nf90_nowrite,ncid),__LINE__,MYFILE)
  633. CALL nchdlerr(nf90_inq_dimid(ncid,'box',dimid),__LINE__,MYFILE)
  634. CALL nchdlerr(nf90_inquire_dimension(ncid,dimid,&
  635. & len=nbox),__LINE__,MYFILE)
  636. CALL nchdlerr(nf90_inq_dimid(ncid,'depth',dimid),__LINE__,MYFILE)
  637. CALL nchdlerr(nf90_inquire_dimension(ncid,dimid,&
  638. & len=nlev),__LINE__,MYFILE)
  639. CALL nchdlerr(nf90_inquire(ncid,nVariables=nvar),__LINE__,MYFILE)
  640. ! Count the number of variables and find the "count" position
  641. nadd=0
  642. icntpos=0
  643. DO i=1,nvar
  644. CALL nchdlerr(nf90_inquire_variable(ncid,i,name=cdname),&
  645. & __LINE__,MYFILE)
  646. IF (TRIM(cdvar)//'_count'==TRIM(cdname)) THEN
  647. icntpos=i
  648. ELSE
  649. IF (TRIM(cdvar)==cdname(1:LEN_TRIM(cdvar))) THEN
  650. tmpname=cdname(LEN_TRIM(cdvar)+2:)
  651. IF (INDEX(tmpname,'_')==0) THEN
  652. nadd=nadd+1
  653. ENDIF
  654. ENDIF
  655. ENDIF
  656. ENDDO
  657. ! Allocate the data structure
  658. CALL fbstat_ncread_alloc(sdata,nlev,nbox,nadd)
  659. ! Get the box names in files
  660. CALL nchdlerr(nf90_inq_varid(ncid,'box',varid),__LINE__,MYFILE)
  661. CALL nchdlerr(nf90_get_var(ncid,varid,sdata%area),__LINE__,MYFILE)
  662. ! Get the depths
  663. CALL nchdlerr(nf90_inq_varid(ncid,'depth',varid),__LINE__,MYFILE)
  664. CALL nchdlerr(nf90_get_var(ncid,varid,sdata%dep),__LINE__,MYFILE)
  665. nadd=0
  666. DO i=1,nvar
  667. CALL nchdlerr(nf90_inquire_variable(ncid,i,name=cdname),&
  668. & __LINE__,MYFILE)
  669. IF (i==icntpos) THEN
  670. CALL nchdlerr(nf90_get_var(ncid,i,sdata%cnt),__LINE__,MYFILE)
  671. ELSE
  672. IF (TRIM(cdvar)==cdname(1:LEN_TRIM(cdvar))) THEN
  673. tmpname=cdname(LEN_TRIM(cdvar)+2:)
  674. IF (INDEX(tmpname,'_')==0) THEN
  675. nadd=nadd+1
  676. sdata%name(nadd)=tmpname(1:MAX(LEN_TRIM(tmpname),32))
  677. CALL nchdlerr(nf90_get_var(ncid,i,sdata%val(:,:,nadd)),&
  678. & __LINE__,MYFILE)
  679. ENDIF
  680. ENDIF
  681. ENDIF
  682. ENDDO
  683. CALL nchdlerr(nf90_close(ncid),__LINE__,MYFILE)
  684. END SUBROUTINE fbstat_ncread
  685. SUBROUTINE fbstat_ncread_alloc(sdata,nlev,nbox,nadd)
  686. ! Arguments
  687. TYPE(fbstatnctype) :: sdata ! Data to be allocated
  688. INTEGER :: nlev,nbox,nadd
  689. ! Local variables
  690. sdata%nlev=nlev
  691. sdata%nbox=nbox
  692. sdata%nadd=nadd
  693. ALLOCATE( &
  694. & sdata%area(nbox), &
  695. & sdata%dep(nlev), &
  696. & sdata%name(nadd), &
  697. & sdata%val(nlev,nbox,nadd), &
  698. & sdata%cnt(nlev,nbox) &
  699. )
  700. END SUBROUTINE fbstat_ncread_alloc
  701. SUBROUTINE fbstat_ncread_dealloc(sdata)
  702. ! Arguments
  703. TYPE(fbstatnctype) :: sdata ! Data to be deallocated
  704. ! Local variables
  705. sdata%nlev=0
  706. sdata%nbox=0
  707. sdata%nadd=0
  708. DEALLOCATE( &
  709. & sdata%area, &
  710. & sdata%dep, &
  711. & sdata%name, &
  712. & sdata%val, &
  713. & sdata%cnt &
  714. )
  715. END SUBROUTINE fbstat_ncread_dealloc
  716. SUBROUTINE fbstat_ncread_hist(cdfilename,cdvar,cdext,sdata)
  717. ! Arguments
  718. CHARACTER(len=*) :: cdfilename ! Netcdf filename
  719. CHARACTER(len=*) :: cdvar ! Name of variables
  720. CHARACTER(len=*) :: cdext ! Name of extras
  721. TYPE(fbstathistnctype) :: sdata ! Data to be filled
  722. ! Local variables
  723. INTEGER :: nbox,nlev,npoints
  724. INTEGER :: ncid,dimid,varid
  725. ! Open the file and get the dimensions
  726. CALL nchdlerr(nf90_open(cdfilename,nf90_nowrite,ncid),__LINE__,MYFILE)
  727. CALL nchdlerr(nf90_inq_dimid(ncid,'box',dimid),__LINE__,MYFILE)
  728. CALL nchdlerr(nf90_inquire_dimension(ncid,dimid,&
  729. & len=nbox),__LINE__,MYFILE)
  730. CALL nchdlerr(nf90_inq_dimid(ncid,'depth',dimid),__LINE__,MYFILE)
  731. CALL nchdlerr(nf90_inquire_dimension(ncid,dimid,&
  732. & len=nlev),__LINE__,MYFILE)
  733. CALL nchdlerr(nf90_inq_dimid(ncid,'hist'//TRIM(cdvar),dimid),&
  734. & __LINE__,MYFILE)
  735. CALL nchdlerr(nf90_inquire_dimension(ncid,dimid,&
  736. & len=npoints),__LINE__,MYFILE)
  737. ! Allocate the data structure
  738. CALL fbstat_ncread_hist_alloc(sdata,npoints,nlev,nbox)
  739. ! Get the box names in files
  740. CALL nchdlerr(nf90_inq_varid(ncid,'box',varid),__LINE__,MYFILE)
  741. CALL nchdlerr(nf90_get_var(ncid,varid,sdata%area),__LINE__,MYFILE)
  742. ! Get the depths
  743. CALL nchdlerr(nf90_inq_varid(ncid,'depth',varid),__LINE__,MYFILE)
  744. CALL nchdlerr(nf90_get_var(ncid,varid,sdata%dep),__LINE__,MYFILE)
  745. ! Get values
  746. CALL nchdlerr(nf90_inq_varid(ncid,TRIM(cdvar)//'_val',varid),&
  747. & __LINE__,MYFILE)
  748. CALL nchdlerr(nf90_get_var(ncid,varid,sdata%val),__LINE__,MYFILE)
  749. ! Get histograms
  750. CALL nchdlerr(nf90_inq_varid(ncid,&
  751. & TRIM(cdvar)//TRIM(cdext)//'_count',varid),&
  752. & __LINE__,MYFILE)
  753. CALL nchdlerr(nf90_get_var(ncid,varid,sdata%nhist),__LINE__,MYFILE)
  754. CALL nchdlerr(nf90_close(ncid),__LINE__,MYFILE)
  755. END SUBROUTINE fbstat_ncread_hist
  756. SUBROUTINE fbstat_ncread_hist_alloc(sdata,npoints,nlev,nbox)
  757. ! Arguments
  758. TYPE(fbstathistnctype) :: sdata ! Data to be allocated
  759. INTEGER :: npoints,nlev,nbox
  760. ! Local variables
  761. sdata%nlev=nlev
  762. sdata%nbox=nbox
  763. sdata%npoints=npoints
  764. ALLOCATE( &
  765. & sdata%area(nbox), &
  766. & sdata%dep(nlev), &
  767. & sdata%val(npoints), &
  768. & sdata%nhist(npoints,nlev,nbox) &
  769. & )
  770. END SUBROUTINE fbstat_ncread_hist_alloc
  771. SUBROUTINE fbstat_ncread_hist_dealloc(sdata)
  772. ! Arguments
  773. TYPE(fbstathistnctype) :: sdata ! Data to be deallocated
  774. ! Local variables
  775. sdata%nlev=0
  776. sdata%nbox=0
  777. sdata%npoints=0
  778. DEALLOCATE( &
  779. & sdata%area, &
  780. & sdata%dep, &
  781. & sdata%val, &
  782. & sdata%nhist &
  783. & )
  784. END SUBROUTINE fbstat_ncread_hist_dealloc
  785. SUBROUTINE fbstat_ncread_xy(cdfilename,cdvar,cdext,sdata)
  786. ! Arguments
  787. CHARACTER(len=*) :: cdfilename ! Netcdf filename
  788. CHARACTER(len=*) :: cdvar ! Name of variables
  789. CHARACTER(len=*) :: cdext ! Name of extras
  790. TYPE(fbstatxynctype) :: sdata ! Data to be filled
  791. ! Local variables
  792. INTEGER :: nbox,nlev,npoints
  793. INTEGER :: ncid,dimid,varid
  794. ! Open the file and get the dimensions
  795. CALL nchdlerr(nf90_open(cdfilename,nf90_nowrite,ncid),__LINE__,MYFILE)
  796. CALL nchdlerr(nf90_inq_dimid(ncid,'box',dimid),__LINE__,MYFILE)
  797. CALL nchdlerr(nf90_inquire_dimension(ncid,dimid,&
  798. & len=nbox),__LINE__,MYFILE)
  799. CALL nchdlerr(nf90_inq_dimid(ncid,'depth',dimid),__LINE__,MYFILE)
  800. CALL nchdlerr(nf90_inquire_dimension(ncid,dimid,&
  801. & len=nlev),__LINE__,MYFILE)
  802. CALL nchdlerr(nf90_inq_dimid(ncid,'xy'//TRIM(cdvar),dimid),&
  803. & __LINE__,MYFILE)
  804. CALL nchdlerr(nf90_inquire_dimension(ncid,dimid,&
  805. & len=npoints),__LINE__,MYFILE)
  806. ! Allocate the data structure
  807. CALL fbstat_ncread_xy_alloc(sdata,npoints,nlev,nbox)
  808. ! Get the box names in files
  809. CALL nchdlerr(nf90_inq_varid(ncid,'box',varid),__LINE__,MYFILE)
  810. CALL nchdlerr(nf90_get_var(ncid,varid,sdata%area),__LINE__,MYFILE)
  811. ! Get the depths
  812. CALL nchdlerr(nf90_inq_varid(ncid,'depth',varid),__LINE__,MYFILE)
  813. CALL nchdlerr(nf90_get_var(ncid,varid,sdata%dep),__LINE__,MYFILE)
  814. ! Get values
  815. CALL nchdlerr(nf90_inq_varid(ncid,TRIM(cdvar)//'_val',varid),&
  816. & __LINE__,MYFILE)
  817. CALL nchdlerr(nf90_get_var(ncid,varid,sdata%val),__LINE__,MYFILE)
  818. ! Get xyograms
  819. CALL nchdlerr(nf90_inq_varid(ncid,&
  820. & TRIM(cdvar)//TRIM(cdext)//'_count',varid),&
  821. & __LINE__,MYFILE)
  822. CALL nchdlerr(nf90_get_var(ncid,varid,sdata%nxy),__LINE__,MYFILE)
  823. CALL nchdlerr(nf90_close(ncid),__LINE__,MYFILE)
  824. END SUBROUTINE fbstat_ncread_xy
  825. SUBROUTINE fbstat_ncread_xy_alloc(sdata,npoints,nlev,nbox)
  826. ! Arguments
  827. TYPE(fbstatxynctype) :: sdata ! Data to be allocated
  828. INTEGER :: npoints,nlev,nbox
  829. ! Local variables
  830. sdata%nlev=nlev
  831. sdata%nbox=nbox
  832. sdata%npoints=npoints
  833. ALLOCATE( &
  834. & sdata%area(nbox), &
  835. & sdata%dep(nlev), &
  836. & sdata%val(npoints), &
  837. & sdata%nxy(npoints,npoints,nlev,nbox) &
  838. & )
  839. END SUBROUTINE fbstat_ncread_xy_alloc
  840. SUBROUTINE fbstat_ncread_xy_dealloc(sdata)
  841. ! Arguments
  842. TYPE(fbstatxynctype) :: sdata ! Data to be deallocated
  843. ! Local variables
  844. sdata%nlev=0
  845. sdata%nbox=0
  846. sdata%npoints=0
  847. DEALLOCATE( &
  848. & sdata%area, &
  849. & sdata%dep, &
  850. & sdata%val, &
  851. & sdata%nxy &
  852. & )
  853. END SUBROUTINE fbstat_ncread_xy_dealloc
  854. END MODULE fbstatncio