orog_mask_tools  1.13.0
io_utils.F90
Go to the documentation of this file.
1 
4 
8 
9  module io_utils
10 
11  implicit none
12 
13  private
14 
15  public :: qc_orog_by_ramp
16  public :: read_global_mask
17  public :: read_global_orog
18  public :: read_mask
19  public :: read_mdl_dims
20  public :: read_mdl_grid_file
21  public :: write_mask_netcdf
22  public :: write_netcdf
23 
24  contains
25 
41  subroutine write_netcdf(im, jm, slm, land_frac, oro, hprime, ntiles, tile, geolon, geolat, lon, lat)
42  use netcdf
43  implicit none
44  integer, intent(in):: im, jm, ntiles, tile
45  real, intent(in) :: lon(im), lat(jm)
46  real, intent(in), dimension(im,jm) :: slm, oro, geolon, geolat, land_frac
47  real, intent(in), dimension(im,jm,14):: hprime
48  character(len=128) :: outfile
49  integer :: error, ncid
50  integer :: header_buffer_val = 16384
51  integer :: fsize=65536, inital = 0
52  integer :: dim1, dim2
53  integer :: dim_lon, dim_lat
54  integer :: id_geolon,id_geolat
55  integer :: id_slmsk,id_orog_raw,id_orog_filt,id_land_frac
56  integer :: id_stddev,id_convex
57  integer :: id_oa1,id_oa2,id_oa3,id_oa4
58  integer :: id_ol1,id_ol2,id_ol3,id_ol4
59  integer :: id_theta,id_gamma,id_sigma,id_elvmax
60 
61  if(ntiles > 1) then
62  write(outfile, '(a,i4.4,a)') 'out.oro.tile', tile, '.nc'
63  else
64  outfile = "out.oro.nc"
65  endif
66 
67  dim1=size(lon,1)
68  dim2=size(lat,1)
69 
70  !--- open the file
71  error = nf90_create(outfile, ior(nf90_netcdf4,nf90_classic_model), ncid, &
72  initialsize=inital, chunksize=fsize)
73  call netcdf_err(error, 'Creating file '//trim(outfile) )
74  !--- define dimension
75  error = nf90_def_dim(ncid, 'lon', dim1, dim_lon)
76  call netcdf_err(error, 'define dimension lon for file='//trim(outfile) )
77  error = nf90_def_dim(ncid, 'lat', dim2, dim_lat)
78  call netcdf_err(error, 'define dimension lat for file='//trim(outfile) )
79 
80  !--- define field
81 !---geolon
82  error = nf90_def_var(ncid, 'geolon', nf90_float, (/dim_lon,dim_lat/), id_geolon)
83  call netcdf_err(error, 'define var geolon for file='//trim(outfile) )
84  error = nf90_put_att(ncid, id_geolon, "long_name", "Longitude")
85  call netcdf_err(error, 'define geolon name for file='//trim(outfile) )
86  error = nf90_put_att(ncid, id_geolon, "units", "degrees_east")
87  call netcdf_err(error, 'define geolon units for file='//trim(outfile) )
88 !---geolat
89  error = nf90_def_var(ncid, 'geolat', nf90_float, (/dim_lon,dim_lat/), id_geolat)
90  call netcdf_err(error, 'define var geolat for file='//trim(outfile) )
91  error = nf90_put_att(ncid, id_geolat, "long_name", "Latitude")
92  call netcdf_err(error, 'define geolat name for file='//trim(outfile) )
93  error = nf90_put_att(ncid, id_geolat, "units", "degrees_north")
94  call netcdf_err(error, 'define geolat units for file='//trim(outfile) )
95 !---slmsk
96  error = nf90_def_var(ncid, 'slmsk', nf90_float,(/dim_lon,dim_lat/), id_slmsk)
97  call netcdf_err(error, 'define var slmsk for file='//trim(outfile) )
98  error = nf90_put_att(ncid, id_slmsk, "coordinates", "geolon geolat")
99  call netcdf_err(error, 'define slmsk coordinates for file='//trim(outfile) )
100 !--- land_frac
101  error = nf90_def_var(ncid, 'land_frac', nf90_float, (/dim_lon,dim_lat/), id_land_frac)
102  call netcdf_err(error, 'define var land_frac for file='//trim(outfile) )
103  error = nf90_put_att(ncid, id_land_frac, "coordinates", "geolon geolat")
104  call netcdf_err(error, 'define land_frac coordinates for file='//trim(outfile) )
105 !---orography - raw
106  error = nf90_def_var(ncid, 'orog_raw', nf90_float, (/dim_lon,dim_lat/), id_orog_raw)
107  call netcdf_err(error, 'define var orog_raw for file='//trim(outfile) )
108  error = nf90_put_att(ncid, id_orog_raw, "coordinates", "geolon geolat")
109  call netcdf_err(error, 'define orog_raw coordinates for file='//trim(outfile) )
110 !---orography - filtered
111  error = nf90_def_var(ncid, 'orog_filt', nf90_float, (/dim_lon,dim_lat/), id_orog_filt)
112  call netcdf_err(error, 'define var orog_filt for file='//trim(outfile) )
113  error = nf90_put_att(ncid, id_orog_filt, "coordinates", "geolon geolat")
114  call netcdf_err(error, 'define orog_filt coordinates for file='//trim(outfile) )
115 !---stddev
116  error = nf90_def_var(ncid, 'stddev', nf90_float, (/dim_lon,dim_lat/), id_stddev)
117  call netcdf_err(error, 'define var stddev for file='//trim(outfile) )
118  error = nf90_put_att(ncid, id_stddev, "coordinates", "geolon geolat")
119  call netcdf_err(error, 'define stddev coordinates for file='//trim(outfile) )
120 !---convexity
121  error = nf90_def_var(ncid, 'convexity', nf90_float, (/dim_lon,dim_lat/), id_convex)
122  call netcdf_err(error, 'define var convexity for file='//trim(outfile) )
123  error = nf90_put_att(ncid, id_convex, "coordinates", "geolon geolat")
124  call netcdf_err(error, 'define convexity coordinates for file='//trim(outfile) )
125 !---oa1 -> oa4
126  error = nf90_def_var(ncid, 'oa1', nf90_float, (/dim_lon,dim_lat/), id_oa1)
127  call netcdf_err(error, 'define var oa1 for file='//trim(outfile) )
128  error = nf90_put_att(ncid, id_oa1, "coordinates", "geolon geolat")
129  call netcdf_err(error, 'define oa1 coordinates for file='//trim(outfile) )
130  error = nf90_def_var(ncid, 'oa2', nf90_float, (/dim_lon,dim_lat/), id_oa2)
131  call netcdf_err(error, 'define var oa2 for file='//trim(outfile) )
132  error = nf90_put_att(ncid, id_oa2, "coordinates", "geolon geolat")
133  call netcdf_err(error, 'define oa2 coordinates for file='//trim(outfile) )
134  error = nf90_def_var(ncid, 'oa3', nf90_float, (/dim_lon,dim_lat/), id_oa3)
135  call netcdf_err(error, 'define var oa3 for file='//trim(outfile) )
136  error = nf90_put_att(ncid, id_oa3, "coordinates", "geolon geolat")
137  call netcdf_err(error, 'define oa3 coordinates for file='//trim(outfile) )
138  error = nf90_def_var(ncid, 'oa4', nf90_float, (/dim_lon,dim_lat/), id_oa4)
139  call netcdf_err(error, 'define var oa4 for file='//trim(outfile) )
140  error = nf90_put_att(ncid, id_oa4, "coordinates", "geolon geolat")
141  call netcdf_err(error, 'define oa4 coordinates for file='//trim(outfile) )
142 !---ol1 -> ol4
143  error = nf90_def_var(ncid, 'ol1', nf90_float, (/dim_lon,dim_lat/), id_ol1)
144  call netcdf_err(error, 'define var ol1 for file='//trim(outfile) )
145  error = nf90_put_att(ncid, id_ol1, "coordinates", "geolon geolat")
146  call netcdf_err(error, 'define ol1 coordinates for file='//trim(outfile) )
147  error = nf90_def_var(ncid, 'ol2', nf90_float, (/dim_lon,dim_lat/), id_ol2)
148  call netcdf_err(error, 'define var ol2 for file='//trim(outfile) )
149  error = nf90_put_att(ncid, id_ol2, "coordinates", "geolon geolat")
150  call netcdf_err(error, 'define ol2 coordinates for file='//trim(outfile) )
151  error = nf90_def_var(ncid, 'ol3', nf90_float, (/dim_lon,dim_lat/), id_ol3)
152  call netcdf_err(error, 'define var ol3 for file='//trim(outfile) )
153  error = nf90_put_att(ncid, id_ol3, "coordinates", "geolon geolat")
154  call netcdf_err(error, 'define ol3 coordinates for file='//trim(outfile) )
155  error = nf90_def_var(ncid, 'ol4', nf90_float, (/dim_lon,dim_lat/), id_ol4)
156  call netcdf_err(error, 'define var ol4 for file='//trim(outfile) )
157  error = nf90_put_att(ncid, id_ol4, "coordinates", "geolon geolat")
158  call netcdf_err(error, 'define ol4 coordinates for file='//trim(outfile) )
159 !---theta gamma sigma elvmax
160  error = nf90_def_var(ncid, 'theta', nf90_float, (/dim_lon,dim_lat/), id_theta)
161  call netcdf_err(error, 'define var theta for file='//trim(outfile) )
162  error = nf90_put_att(ncid, id_theta, "coordinates", "geolon geolat")
163  call netcdf_err(error, 'define theta coordinates for file='//trim(outfile) )
164  error = nf90_def_var(ncid, 'gamma', nf90_float, (/dim_lon,dim_lat/), id_gamma)
165  call netcdf_err(error, 'define var gamma for file='//trim(outfile) )
166  error = nf90_put_att(ncid, id_gamma, "coordinates", "geolon geolat")
167  call netcdf_err(error, 'define gamma coordinates for file='//trim(outfile) )
168  error = nf90_def_var(ncid, 'sigma', nf90_float, (/dim_lon,dim_lat/), id_sigma)
169  call netcdf_err(error, 'define var sigma for file='//trim(outfile) )
170  error = nf90_put_att(ncid, id_sigma, "coordinates", "geolon geolat")
171  call netcdf_err(error, 'define sigma coordinates for file='//trim(outfile) )
172  error = nf90_def_var(ncid, 'elvmax', nf90_float, (/dim_lon,dim_lat/), id_elvmax)
173  call netcdf_err(error, 'define var elvmax for file='//trim(outfile) )
174  error = nf90_put_att(ncid, id_elvmax, "coordinates", "geolon geolat")
175  call netcdf_err(error, 'define elvmax coordinates for file='//trim(outfile) )
176 
177  error = nf90_enddef(ncid, header_buffer_val,4,0,4)
178  call netcdf_err(error, 'end meta define for file='//trim(outfile) )
179 
180  !--- write out data
181  error = nf90_put_var( ncid, id_geolon, geolon(:dim1,:dim2))
182  call netcdf_err(error, 'write var geolon for file='//trim(outfile) )
183  error = nf90_put_var( ncid, id_geolat, geolat(:dim1,:dim2))
184  call netcdf_err(error, 'write var geolat for file='//trim(outfile) )
185 
186  error = nf90_put_var( ncid, id_slmsk, slm(:dim1,:dim2))
187  call netcdf_err(error, 'write var slmsk for file='//trim(outfile) )
188  error = nf90_put_var( ncid, id_land_frac, land_frac(:dim1,:dim2))
189  call netcdf_err(error, 'write var land_frac for file='//trim(outfile) )
190 
191  error = nf90_put_var( ncid, id_orog_raw, oro(:dim1,:dim2))
192  call netcdf_err(error, 'write var orog_raw for file='//trim(outfile) )
193 ! We no longer filter the orog, so the raw and filtered records are the same.
194  error = nf90_put_var( ncid, id_orog_filt, oro(:dim1,:dim2))
195  call netcdf_err(error, 'write var orog_filt for file='//trim(outfile) )
196 
197  error = nf90_put_var( ncid, id_stddev, hprime(:dim1,:dim2,1))
198  call netcdf_err(error, 'write var stddev for file='//trim(outfile) )
199  error = nf90_put_var( ncid, id_convex, hprime(:dim1,:dim2,2))
200  call netcdf_err(error, 'write var convex for file='//trim(outfile) )
201 
202  error = nf90_put_var( ncid, id_oa1, hprime(:dim1,:dim2,3))
203  call netcdf_err(error, 'write var oa1 for file='//trim(outfile) )
204  error = nf90_put_var( ncid, id_oa2, hprime(:dim1,:dim2,4))
205  call netcdf_err(error, 'write var oa2 for file='//trim(outfile) )
206  error = nf90_put_var( ncid, id_oa3, hprime(:dim1,:dim2,5))
207  call netcdf_err(error, 'write var oa3 for file='//trim(outfile) )
208  error = nf90_put_var( ncid, id_oa4, hprime(:dim1,:dim2,6))
209  call netcdf_err(error, 'write var oa4 for file='//trim(outfile) )
210 
211  error = nf90_put_var( ncid, id_ol1, hprime(:dim1,:dim2,7))
212  call netcdf_err(error, 'write var ol1 for file='//trim(outfile) )
213  error = nf90_put_var( ncid, id_ol2, hprime(:dim1,:dim2,8))
214  call netcdf_err(error, 'write var ol2 for file='//trim(outfile) )
215  error = nf90_put_var( ncid, id_ol3, hprime(:dim1,:dim2,9))
216  call netcdf_err(error, 'write var ol3 for file='//trim(outfile) )
217  error = nf90_put_var( ncid, id_ol4, hprime(:dim1,:dim2,10))
218  call netcdf_err(error, 'write var ol4 for file='//trim(outfile) )
219 
220  error = nf90_put_var( ncid, id_theta, hprime(:dim1,:dim2,11))
221  call netcdf_err(error, 'write var theta for file='//trim(outfile) )
222  error = nf90_put_var( ncid, id_gamma, hprime(:dim1,:dim2,12))
223  call netcdf_err(error, 'write var gamma for file='//trim(outfile) )
224  error = nf90_put_var( ncid, id_sigma, hprime(:dim1,:dim2,13))
225  call netcdf_err(error, 'write var sigma for file='//trim(outfile) )
226  error = nf90_put_var( ncid, id_elvmax, hprime(:dim1,:dim2,14))
227  call netcdf_err(error, 'write var elvmax for file='//trim(outfile) )
228 
229  error = nf90_close(ncid)
230  call netcdf_err(error, 'close file='//trim(outfile) )
231 
232  end subroutine write_netcdf
233 
239  subroutine netcdf_err( err, string )
240  use netcdf
241  implicit none
242  integer, intent(in) :: err
243  character(len=*), intent(in) :: string
244  character(len=256) :: errmsg
245 
246  if( err.EQ.nf90_noerr )return
247  errmsg = nf90_strerror(err)
248  print*, 'FATAL ERROR: ', trim(string), ': ', trim(errmsg)
249  call abort
250 
251  return
252  end subroutine netcdf_err
253 
265 
266  subroutine write_mask_netcdf(im, jm, slm, land_frac, ntiles, tile, geolon, geolat)
267  use netcdf
268  implicit none
269  integer, intent(in):: im, jm, ntiles, tile
270  real, intent(in), dimension(im,jm) :: slm, geolon, geolat, land_frac
271  character(len=128) :: outfile
272  integer :: error, ncid
273  integer :: header_buffer_val = 16384
274  integer :: fsize=65536, inital = 0
275  integer :: dim1, dim2
276  integer :: dim_lon, dim_lat
277  integer :: id_geolon,id_geolat
278  integer :: id_slmsk,id_land_frac
279 
280  if(ntiles > 1) then
281  write(outfile, '(a,i4.4,a)') 'out.oro.tile', tile, '.nc'
282  else
283  outfile = "out.oro.nc"
284  endif
285 
286  dim1=im
287  dim2=jm
288 
289  !--- open the file
290  error = nf90_create(outfile, ior(nf90_netcdf4,nf90_classic_model), ncid, &
291  initialsize=inital, chunksize=fsize)
292  call netcdf_err(error, 'Creating file '//trim(outfile) )
293  !--- define dimension
294  error = nf90_def_dim(ncid, 'lon', dim1, dim_lon)
295  call netcdf_err(error, 'define dimension lon for file='//trim(outfile) )
296  error = nf90_def_dim(ncid, 'lat', dim2, dim_lat)
297  call netcdf_err(error, 'define dimension lat for file='//trim(outfile) )
298 
299  !--- define field
300 !---geolon
301  error = nf90_def_var(ncid, 'geolon', nf90_float, (/dim_lon,dim_lat/), id_geolon)
302  call netcdf_err(error, 'define var geolon for file='//trim(outfile) )
303  error = nf90_put_att(ncid, id_geolon, "long_name", "Longitude")
304  call netcdf_err(error, 'define geolon name for file='//trim(outfile) )
305  error = nf90_put_att(ncid, id_geolon, "units", "degrees_east")
306  call netcdf_err(error, 'define geolon units for file='//trim(outfile) )
307 !---geolat
308  error = nf90_def_var(ncid, 'geolat', nf90_float, (/dim_lon,dim_lat/), id_geolat)
309  call netcdf_err(error, 'define var geolat for file='//trim(outfile) )
310  error = nf90_put_att(ncid, id_geolat, "long_name", "Latitude")
311  call netcdf_err(error, 'define geolat name for file='//trim(outfile) )
312  error = nf90_put_att(ncid, id_geolat, "units", "degrees_north")
313  call netcdf_err(error, 'define geolat units for file='//trim(outfile) )
314 !---slmsk
315  error = nf90_def_var(ncid, 'slmsk', nf90_float, (/dim_lon,dim_lat/), id_slmsk)
316  call netcdf_err(error, 'define var slmsk for file='//trim(outfile) )
317  error = nf90_put_att(ncid, id_slmsk, "coordinates", "geolon geolat")
318  call netcdf_err(error, 'define slmsk coordinates for file='//trim(outfile) )
319 !--- land_frac
320  error = nf90_def_var(ncid, 'land_frac', nf90_float, (/dim_lon,dim_lat/), id_land_frac)
321  call netcdf_err(error, 'define var land_frac for file='//trim(outfile) )
322  error = nf90_put_att(ncid, id_land_frac, "coordinates", "geolon geolat")
323  call netcdf_err(error, 'define land_frac coordinates for file='//trim(outfile) )
324 
325  error = nf90_enddef(ncid, header_buffer_val,4,0,4)
326  call netcdf_err(error, 'end meta define for file='//trim(outfile) )
327 
328  !--- write out data
329  error = nf90_put_var( ncid, id_geolon, geolon(:dim1,:dim2))
330  call netcdf_err(error, 'write var geolon for file='//trim(outfile) )
331 
332  error = nf90_put_var( ncid, id_geolat, geolat(:dim1,:dim2))
333  call netcdf_err(error, 'write var geolat for file='//trim(outfile) )
334 
335  error = nf90_put_var( ncid, id_slmsk, slm(:dim1,:dim2))
336  call netcdf_err(error, 'write var slmsk for file='//trim(outfile) )
337 
338  error = nf90_put_var( ncid, id_land_frac, land_frac(:dim1,:dim2))
339  call netcdf_err(error, 'write var land_frac for file='//trim(outfile) )
340 
341  error = nf90_close(ncid)
342  call netcdf_err(error, 'close file='//trim(outfile) )
343 
344  end subroutine write_mask_netcdf
345 
355 
356  subroutine read_mask(merge_file,slm,land_frac,lake_frac,im,jm)
358  use netcdf
359 
360  implicit none
361 
362  character(len=*), intent(in) :: merge_file
363 
364  integer, intent(in) :: im, jm
365 
366  real, intent(out) :: land_frac(im,jm)
367  real, intent(out) :: lake_frac(im,jm)
368  real, intent(out) :: slm(im,jm)
369 
370  integer ncid, error, id_var
371 
372  print*,'- READ IN EXTERNAL LANDMASK FILE: ',trim(merge_file)
373  error=nf90_open(merge_file,nf90_nowrite,ncid)
374  call netcdf_err(error, 'Open file '//trim(merge_file) )
375 
376  error=nf90_inq_varid(ncid, 'land_frac', id_var)
377  call netcdf_err(error, 'inquire varid of land_frac')
378  error=nf90_get_var(ncid, id_var, land_frac)
379  call netcdf_err(error, 'inquire data of land_frac')
380 
381  error=nf90_inq_varid(ncid, 'slmsk', id_var)
382  call netcdf_err(error, 'inquire varid of slmsk')
383  error=nf90_get_var(ncid, id_var, slm)
384  call netcdf_err(error, 'inquire data of slmsk')
385 
386  error=nf90_inq_varid(ncid, 'lake_frac', id_var)
387  call netcdf_err(error, 'inquire varid of lake_frac')
388  error=nf90_get_var(ncid, id_var, lake_frac)
389  call netcdf_err(error, 'inquire data of lake_frac')
390 
391  error = nf90_close(ncid)
392 
393  end subroutine read_mask
394 
401  subroutine read_mdl_dims(mdl_grid_file, im, jm)
403  use netcdf
404 
405  implicit none
406 
407  character(len=*), intent(in) :: mdl_grid_file
408 
409  integer, intent(out) :: im, jm
410 
411  integer ncid, error, id_dim, nx, ny
412 
413  print*, "- READ MDL GRID DIMENSIONS FROM= ", trim(mdl_grid_file)
414 
415  error=nf90_open(mdl_grid_file, nf90_nowrite, ncid)
416  call netcdf_err(error, 'Opening file '//trim(mdl_grid_file) )
417 
418  error=nf90_inq_dimid(ncid, 'nx', id_dim)
419  call netcdf_err(error, 'inquire dimension nx from file '// trim(mdl_grid_file) )
420  error=nf90_inquire_dimension(ncid, id_dim, len=nx)
421  call netcdf_err(error, 'inquire nx from file '//trim(mdl_grid_file) )
422 
423  error=nf90_inq_dimid(ncid, 'ny', id_dim)
424  call netcdf_err(error, 'inquire dimension ny from file '// trim(mdl_grid_file) )
425  error=nf90_inquire_dimension(ncid, id_dim, len=ny)
426  call netcdf_err(error, 'inquire ny from file '//trim(mdl_grid_file) )
427 
428  error=nf90_close(ncid)
429 
430  im = nx/2
431  jm = ny/2
432 
433  print*,"- MDL GRID DIMENSIONS ", im, jm
434 
435  end subroutine read_mdl_dims
436 
451  subroutine read_mdl_grid_file(mdl_grid_file, im, jm, &
452  geolon, geolon_c, geolat, geolat_c, dx, dy, &
453  is_north_pole, is_south_pole)
455  use netcdf
456 
458 
459  implicit none
460 
461  character(len=*), intent(in) :: mdl_grid_file
462 
463  integer, intent(in) :: im, jm
464 
465  logical, intent(out) :: is_north_pole(im,jm)
466  logical, intent(out) :: is_south_pole(im,jm)
467 
468  real, intent(out) :: geolat(im,jm)
469  real, intent(out) :: geolat_c(im+1,jm+1)
470  real, intent(out) :: geolon(im,jm)
471  real, intent(out) :: geolon_c(im+1,jm+1)
472  real, intent(out) :: dx(im,jm), dy(im,jm)
473 
474  integer :: i, j
475  integer :: ncid, error, id_var, nx, ny
476  integer :: i_south_pole,j_south_pole
477  integer :: i_north_pole,j_north_pole
478 
479  real, allocatable :: tmpvar(:,:)
480 
481  nx = 2*im
482  ny = 2*jm
483 
484  allocate(tmpvar(nx+1,ny+1))
485 
486  print*, "- OPEN AND READ= ", trim(mdl_grid_file)
487 
488  error=nf90_open(mdl_grid_file, nf90_nowrite, ncid)
489  call netcdf_err(error, 'Opening file '//trim(mdl_grid_file) )
490 
491  error=nf90_inq_varid(ncid, 'x', id_var)
492  call netcdf_err(error, 'inquire varid of x from file ' // trim(mdl_grid_file))
493  error=nf90_get_var(ncid, id_var, tmpvar)
494  call netcdf_err(error, 'inquire data of x from file ' // trim(mdl_grid_file))
495 
496 ! Adjust lontitude to be between 0 and 360.
497  do j = 1,ny+1
498  do i = 1,nx+1
499  if(tmpvar(i,j) .GT. 360) tmpvar(i,j) = tmpvar(i,j) - 360
500  if(tmpvar(i,j) .LT. 0) tmpvar(i,j) = tmpvar(i,j) + 360
501  enddo
502  enddo
503 
504  geolon(1:im,1:jm) = tmpvar(2:nx:2,2:ny:2)
505  geolon_c(1:im+1,1:jm+1) = tmpvar(1:nx+1:2,1:ny+1:2)
506 
507  error=nf90_inq_varid(ncid, 'y', id_var)
508  call netcdf_err(error, 'inquire varid of y from file ' // trim(mdl_grid_file))
509  error=nf90_get_var(ncid, id_var, tmpvar)
510  call netcdf_err(error, 'inquire data of y from file ' // trim(mdl_grid_file))
511 
512  geolat(1:im,1:jm) = tmpvar(2:nx:2,2:ny:2)
513  geolat_c(1:im+1,1:jm+1) = tmpvar(1:nx+1:2,1:ny+1:2)
514 
515  call find_poles(tmpvar, nx, ny, i_north_pole, j_north_pole, &
516  i_south_pole, j_south_pole)
517 
518  deallocate(tmpvar)
519 
520  call find_nearest_pole_points(i_north_pole, j_north_pole, &
521  i_south_pole, j_south_pole, im, jm, is_north_pole, &
522  is_south_pole)
523 
524  allocate(tmpvar(nx,ny))
525 
526  error=nf90_inq_varid(ncid, 'area', id_var)
527  call netcdf_err(error, 'inquire varid of area from file ' // trim(mdl_grid_file))
528  error=nf90_get_var(ncid, id_var, tmpvar)
529  call netcdf_err(error, 'inquire data of area from file ' // trim(mdl_grid_file))
530 
531  error = nf90_close(ncid)
532 
533  do j = 1, jm
534  do i = 1, im
535  dx(i,j) = sqrt(tmpvar(2*i-1,2*j-1)+tmpvar(2*i,2*j-1) &
536  + tmpvar(2*i-1,2*j )+tmpvar(2*i,2*j ))
537  dy(i,j) = dx(i,j)
538  enddo
539  enddo
540 
541  deallocate(tmpvar)
542 
543  end subroutine read_mdl_grid_file
544 
551  subroutine read_global_orog(imn,jmn,glob)
553  use orog_utils, only : transpose_orog
554  use netcdf
555 
556  implicit none
557 
558  integer, intent(in) :: imn, jmn
559  integer*2, intent(out) :: glob(imn,jmn)
560 
561  integer :: ncid, error, id_dim, id_var, idim, jdim
562 
563  print*,"- OPEN AND READ ./topography.gmted2010.30s.nc"
564 
565  error=nf90_open("./topography.gmted2010.30s.nc", &
566  nf90_nowrite, ncid)
567  call netcdf_err(error, 'Opening file topography.gmted2010.30s.nc' )
568 
569  error=nf90_inq_dimid(ncid, 'idim', id_dim)
570  call netcdf_err(error, 'Inquire dimid of idim' )
571 
572  error=nf90_inquire_dimension(ncid,id_dim,len=idim)
573  call netcdf_err(error, 'Reading idim' )
574 
575  if (imn /= idim) then
576  print*,"FATAL ERROR: i-dimensions do not match."
577  endif
578 
579  error=nf90_inq_dimid(ncid, 'jdim', id_dim)
580  call netcdf_err(error, 'Inquire dimid of jdim' )
581 
582  error=nf90_inquire_dimension(ncid,id_dim,len=jdim)
583  call netcdf_err(error, 'Reading jdim' )
584 
585  if (jmn /= jdim) then
586  print*,"FATAL ERROR: j-dimensions do not match."
587  endif
588 
589  error=nf90_inq_varid(ncid, 'topo', id_var)
590  call netcdf_err(error, 'Inquire varid of topo')
591 
592  error=nf90_get_var(ncid, id_var, glob)
593  call netcdf_err(error, 'Reading topo')
594 
595  error = nf90_close(ncid)
596 
597  print*,"- MAX/MIN OF OROGRAPHY DATA ",maxval(glob),minval(glob)
598 
599  call transpose_orog(imn,jmn,glob)
600 
601  return
602  end subroutine read_global_orog
603 
610  subroutine read_global_mask(imn, jmn, mask)
612  use orog_utils, only : transpose_mask
613  use netcdf
614 
615  implicit none
616 
617  integer, intent(in) :: imn, jmn
618 
619  integer(1), intent(out) :: mask(imn,jmn)
620 
621  integer :: ncid, id_var, id_dim, error, idim, jdim
622 
623  print*,"- OPEN AND READ ./landcover.umd.30s.nc"
624 
625  error=nf90_open("./landcover.umd.30s.nc",nf90_nowrite,ncid)
626  call netcdf_err(error, 'Opening file landcover.umd.30s.nc' )
627 
628  error=nf90_inq_dimid(ncid, 'idim', id_dim)
629  call netcdf_err(error, 'Inquire dimid of idim' )
630 
631  error=nf90_inquire_dimension(ncid,id_dim,len=idim)
632  call netcdf_err(error, 'Reading idim' )
633 
634  if (imn /= idim) then
635  print*,"FATAL ERROR: i-dimensions do not match."
636  endif
637 
638  error=nf90_inq_dimid(ncid, 'jdim', id_dim)
639  call netcdf_err(error, 'Inquire dimid of jdim' )
640 
641  error=nf90_inquire_dimension(ncid,id_dim,len=jdim)
642  call netcdf_err(error, 'Reading jdim' )
643 
644  if (jmn /= jdim) then
645  print*,"FATAL ERROR: j-dimensions do not match."
646  endif
647 
648  error=nf90_inq_varid(ncid, 'land_mask', id_var)
649  call netcdf_err(error, 'Inquire varid of land_mask')
650 
651  error=nf90_get_var(ncid, id_var, mask)
652  call netcdf_err(error, 'Inquire data of land_mask')
653 
654  error = nf90_close(ncid)
655 
656  call transpose_mask(imn,jmn,mask)
657 
658  end subroutine read_global_mask
659 
668  subroutine qc_orog_by_ramp(imn, jmn, zavg, zslm)
670  use netcdf
671 
672  implicit none
673 
674  integer, intent(in) :: imn, jmn
675  integer, intent(inout) :: zavg(imn,jmn)
676  integer, intent(inout) :: zslm(imn,jmn)
677 
678  integer :: i, j, error, ncid, id_var, id_dim, jramp
679 
680  real(4), allocatable :: gice(:,:)
681 
682 ! Read 30-sec Antarctica RAMP data. Points scan from South
683 ! to North, and from Greenwich to Greenwich.
684 
685  print*,"- OPEN/READ RAMP DATA ./topography.antarctica.ramp.30s.nc"
686 
687  error=nf90_open("./topography.antarctica.ramp.30s.nc", &
688  nf90_nowrite, ncid)
689  call netcdf_err(error, 'Opening RAMP topo file' )
690 
691  error=nf90_inq_dimid(ncid, 'jdim', id_dim)
692  call netcdf_err(error, 'Inquire dimid of jdim' )
693 
694  error=nf90_inquire_dimension(ncid, id_dim, len=jramp)
695  call netcdf_err(error, 'Reading jdim' )
696 
697  allocate (gice(imn+1,jramp))
698 
699  error=nf90_inq_varid(ncid, 'topo', id_var)
700  call netcdf_err(error, 'Inquire varid of RAMP topo')
701 
702  error=nf90_get_var(ncid, id_var, gice)
703  call netcdf_err(error, 'Inquire data of RAMP topo')
704 
705  error = nf90_close(ncid)
706 
707  print*,"- QC GLOBAL OROGRAPHY DATA WITH RAMP."
708 
709 ! If RAMP values are valid, replace the global value with the RAMP
710 ! value. Invalid values are less than or equal to 0 (0, -1, or -99).
711 
712  do j = 1, jramp
713  do i = 1, imn
714  if ( gice(i,j) .gt. 0.) then
715  zavg(i,j) = int( gice(i,j) + 0.5 )
716  zslm(i,j) = 1
717  endif
718  enddo
719  enddo
720 
721  deallocate (gice)
722 
723  end subroutine qc_orog_by_ramp
724 
725  end module io_utils
subroutine, public transpose_mask(imn, jmn, mask)
Transpose the global landmask by flipping the poles and moving the starting longitude to Greenwich...
Definition: orog_utils.F90:177
subroutine netcdf_err(err, string)
Check NetCDF error code and output the error message.
Definition: io_utils.F90:240
subroutine, public qc_orog_by_ramp(imn, jmn, zavg, zslm)
Quality control the global orography and landmask data over Antarctica using RAMP data...
Definition: io_utils.F90:669
subroutine, public read_mdl_grid_file(mdl_grid_file, im, jm, geolon, geolon_c, geolat, geolat_c, dx, dy, is_north_pole, is_south_pole)
Read the grid dimensions from the model 'grid' file.
Definition: io_utils.F90:454
Module containing utilities that read and write data.
Definition: io_utils.F90:9
subroutine, public read_global_orog(imn, jmn, glob)
Read input global 30-arc second orography data.
Definition: io_utils.F90:552
program lake_frac
This program computes lake fraction and depth numbers for FV3 cubed sphere grid cells, from a high resolution lat/lon data set.
Definition: lakefrac.F90:21
subroutine, public read_mdl_dims(mdl_grid_file, im, jm)
Read the grid dimensions from the model 'grid' file.
Definition: io_utils.F90:402
subroutine, public find_poles(geolat, nx, ny, i_north_pole, j_north_pole, i_south_pole, j_south_pole)
Find the point on the model grid tile closest to the north and south pole.
Definition: orog_utils.F90:411
subroutine, public find_nearest_pole_points(i_north_pole, j_north_pole, i_south_pole, j_south_pole, im, jm, is_north_pole, is_south_pole)
Find the point on the model grid tile closest to the north and south pole.
Definition: orog_utils.F90:487
subroutine, public read_global_mask(imn, jmn, mask)
Read input global 30-arc second land mask data.
Definition: io_utils.F90:611
Module containing utilites used by the orog program.
Definition: orog_utils.F90:8
subroutine, public write_netcdf(im, jm, slm, land_frac, oro, hprime, ntiles, tile, geolon, geolat, lon, lat)
Write out orography file in netcdf format.
Definition: io_utils.F90:42
subroutine, public transpose_orog(imn, jmn, glob)
Transpose the global orography data by flipping the poles and moving the starting longitude to Greenw...
Definition: orog_utils.F90:220
subroutine, public read_mask(merge_file, slm, land_frac, lake_frac, im, jm)
Read the land mask file.
Definition: io_utils.F90:357
subroutine, public write_mask_netcdf(im, jm, slm, land_frac, ntiles, tile, geolon, geolat)
Write the land mask file.
Definition: io_utils.F90:267