IODA Bundle
netcdf_mod.f90
Go to the documentation of this file.
1 module netcdf_mod
2 
3 use netcdf
5 
6 implicit none
7 
8 private
9 
10 ! public subroutines
12 public :: open_netcdf_for_write
14 public :: put_netcdf_var
15 
16 ! variables visible to this module only
17 integer :: ncstatus
18 
20  module procedure get_netcdf_var_1d_real
21  module procedure get_netcdf_var_1d_integer
22  module procedure get_netcdf_var_1d_char
23 end interface
24 
25 interface put_netcdf_var
26  module procedure put_netcdf_var_real
27  module procedure put_netcdf_var_integer
28  module procedure put_netcdf_var_char
29 end interface
30 
31 contains
32 
33 subroutine open_netcdf(fname,ncfileid)
34  character(len=*), intent(in) :: fname
35  integer, intent(out) :: ncfileid
36 
37  ncstatus = nf90_open(path=trim(adjustl(fname)),mode=nf90_nowrite,ncid=ncfileid) ! open file
38  if ( ncstatus /= 0 ) then
39  write(0,fmt='(a)') 'error opening netcdf file '//trim(adjustl(fname))
40  write(0,*) 'ncstatus = ', ncstatus
41  stop
42  endif
43 
44  return
45 end subroutine open_netcdf
46 
47 subroutine close_netcdf(fname,ncfileid)
48  character(len=*), intent(in) :: fname
49  integer, intent(in) :: ncfileid
50  ncstatus = nf90_close(ncfileid) ! close file
51  if ( ncstatus /= 0 ) then
52  write(0,fmt='(a)') 'error closing netcdf file '//trim(adjustl(fname))
53  write(0,*) 'ncstatus = ', ncstatus
54  stop
55  endif
56 end subroutine close_netcdf
57 
58 subroutine get_netcdf_dims(fileid,variable,output)
59  integer, intent(in) :: fileid
60  character(len=*), intent(in) :: variable
61  integer, intent(out) :: output
62 
63  integer :: ncdimid, ierr
64 
65  ierr = 0
66  ncstatus = nf90_inq_dimid(fileid,trim(adjustl(variable)),ncdimid) ; ierr = ierr + ncstatus
67  ncstatus = nf90_inquire_dimension(fileid,ncdimid,len=output) ; ierr = ierr + ncstatus
68  if ( ierr /= 0 ) then
69  write(0,*) 'Error reading dimension for '//trim(adjustl(variable))
70  write(0,*) 'ierr = ',ierr
71  stop
72  endif
73 ! write(*,fmt='(a,i8)')variable//' = ', output ! print out dimensions for the variable
74 
75  return
76 
77 end subroutine get_netcdf_dims
78 
79 subroutine get_netcdf_var_1d_real(fileid,variable,dim1,output)
80 
81  integer, intent(in) :: fileid, dim1
82  character(len=*), intent(in) :: variable
83  real, intent(inout), dimension(dim1) :: output
84 
85  integer :: ncvarid, ierr
86 
87  ierr = 0
88  ncstatus = nf90_inq_varid(fileid,trim(adjustl(variable)),ncvarid) ; ierr = ierr + ncstatus
89  ncstatus = nf90_get_var(fileid,ncvarid,output) ; ierr = ierr + ncstatus
90 
91  if ( ierr /= 0 ) then
92  write(0,*) 'Error reading data for '//trim(adjustl(variable))
93  write(0,*) 'ierr = ',ierr
94  stop
95  endif
96 
97  return
98 
99 end subroutine get_netcdf_var_1d_real
100 
101 subroutine get_netcdf_var_1d_integer(fileid,variable,dim1,output)
102 
103  integer, intent(in) :: fileid, dim1
104  character(len=*), intent(in) :: variable
105  integer, intent(inout), dimension(dim1) :: output
106 
107  integer :: ncvarid, ierr
108 
109  ierr = 0
110  ncstatus = nf90_inq_varid(fileid,trim(adjustl(variable)),ncvarid) ; ierr = ierr + ncstatus
111  ncstatus = nf90_get_var(fileid,ncvarid,output) ; ierr = ierr + ncstatus
112 
113  if ( ierr /= 0 ) then
114  write(0,*) 'Error reading data for '//trim(adjustl(variable))
115  write(0,*) 'ierr = ',ierr
116  stop
117  endif
118 
119  return
120 
121 end subroutine get_netcdf_var_1d_integer
122 
123 subroutine get_netcdf_var_1d_char(fileid,variable,dim1,output)
124 
125  integer, intent(in) :: fileid, dim1
126  character(len=*), intent(in) :: variable
127  character(len=*), intent(inout), dimension(dim1) :: output
128 
129  integer :: ncvarid, ierr
130 
131  ierr = 0
132  ncstatus = nf90_inq_varid(fileid,trim(adjustl(variable)),ncvarid) ; ierr = ierr + ncstatus
133  ncstatus = nf90_get_var(fileid,ncvarid,output) ; ierr = ierr + ncstatus
134 
135  if ( ierr /= 0 ) then
136  write(0,*) 'Error reading data for '//trim(adjustl(variable))
137  write(0,*) 'ierr = ',ierr
138  stop
139  endif
140 
141  return
142 
143 end subroutine get_netcdf_var_1d_char
144 
145 subroutine open_netcdf_for_write(fname,ncfileid)
146  character(len=*), intent(in) :: fname
147  integer, intent(out) :: ncfileid
148 
149  ! create nc file
150  !ncstatus = nf90_create(path=trim(adjustl(fname)),cmode=nf90_clobber,ncid=ncfileid)
151  ncstatus = nf90_create(path=trim(adjustl(fname)),cmode=nf90_netcdf4,ncid=ncfileid)
152  if ( ncstatus /= 0 ) then
153  write(0,fmt='(a)') 'error creating netcdf file '//trim(adjustl(fname))
154  write(0,*) 'ierr = ', ncstatus
155  stop
156  endif
157 
158  return
159 end subroutine open_netcdf_for_write
160 
161 subroutine def_netcdf_dims(fileid,variable,input,output)
162  integer, intent(in) :: fileid
163  character(len=*), intent(in) :: variable ! name of this dimension
164  integer, intent(in) :: input ! size of this dimension
165  integer, intent(out) :: output ! ncid of this dimension
166 
167  integer :: ncdimid, ierr
168 
169  ierr = 0
170  ncstatus = nf90_def_dim(fileid,trim(adjustl(variable)),input,ncdimid)
171  ierr = ierr + ncstatus
172  ncstatus = nf90_put_att(fileid, nf90_global, variable, input)
173  ierr = ierr + ncstatus
174 
175  if ( ierr /= 0 ) then
176  write(0,*) 'Error defining dimension for '//trim(adjustl(variable))
177  write(0,*) 'ncstatus = ', ierr
178  stop
179  endif
180 
181  output = ncdimid
182 
183  return
184 end subroutine def_netcdf_dims
185 
186 subroutine def_netcdf_var(fileid,variable,dimids,nctype,attrib_name,attrib)
187 
188  integer, intent(in) :: fileid
189  character(len=*), intent(in) :: variable
190  integer, dimension(:), intent(in) :: dimids
191  integer, intent(in) :: nctype
192  character(len=*), intent(in), optional :: attrib_name
193  character(len=*), intent(in), optional :: attrib
194 
195  integer :: ncvarid, ierr
196  character(len=nstring) :: att_name
197  character(len=nstring) :: att
198 
199  ierr = 0
200  ncstatus = nf90_def_var(fileid,trim(adjustl(variable)),nctype,dimids,ncvarid)
201  ierr = ierr + ncstatus
202  if ( nctype == nf90_float ) then
203  ncstatus = nf90_def_var_fill(fileid, ncvarid, 0, missing_r)
204  ierr = ierr + ncstatus
205  else if ( nctype == nf90_int ) then
206  ncstatus = nf90_def_var_fill(fileid, ncvarid, 0, missing_i)
207  ierr = ierr + ncstatus
208  end if
209 
210  att_name = ''
211  att = ''
212  if ( present(attrib_name) ) att_name = attrib_name
213  if ( present(attrib ) ) att = attrib
214  if ( len_trim(att_name) > 0 .and. len_trim(att) > 0 ) then
215  ncstatus = nf90_put_att(fileid, ncvarid, trim(att_name), trim(att))
216  ierr = ierr + ncstatus
217  end if
218 
219  if ( ierr /= 0 ) then
220  write(0,*) 'Error defining var for '//trim(adjustl(variable))
221  write(0,*) 'ierr = ', ierr
222  stop
223  endif
224 
225  return
226 end subroutine def_netcdf_var
227 
228 subroutine def_netcdf_end(fileid)
229 
230  integer, intent(in) :: fileid
231 
232  ncstatus = nf90_enddef(fileid)
233  if ( ncstatus /= 0 ) then
234  write(0,*) 'Error end defining for fileid = ', fileid
235  write(0,*) 'ncstatus = ', ncstatus
236  stop
237  endif
238 
239  return
240 end subroutine def_netcdf_end
241 
242 subroutine put_netcdf_var_real(fileid,variable,input)
243 
244  integer, intent(in) :: fileid
245  character(len=*), intent(in) :: variable
246  real, dimension(:), intent(in) :: input
247 
248  integer :: ncvarid, ierr
249 
250  ierr = 0
251  ncstatus = nf90_inq_varid(fileid,trim(adjustl(variable)),ncvarid)
252  ierr = ierr + ncstatus
253  ncstatus = nf90_put_var(fileid,ncvarid,input)
254  ierr = ierr + ncstatus
255 
256  if ( ierr /= 0 ) then
257  write(0,*) 'Error writing data for '//trim(adjustl(variable))
258  write(0,*) 'ierr = ',ierr
259  stop
260  endif
261 
262  return
263 end subroutine put_netcdf_var_real
264 
265 subroutine put_netcdf_var_integer(fileid,variable,input)
266 
267  integer, intent(in) :: fileid
268  character(len=*), intent(in) :: variable
269  integer, dimension(:), intent(in) :: input
270 
271  integer :: ncvarid, ierr
272 
273  ierr = 0
274  ncstatus = nf90_inq_varid(fileid,trim(adjustl(variable)),ncvarid)
275  ierr = ierr + ncstatus
276  ncstatus = nf90_put_var(fileid,ncvarid,input)
277  ierr = ierr + ncstatus
278 
279  if ( ierr /= 0 ) then
280  write(0,*) 'Error writing data for '//trim(adjustl(variable))
281  write(0,*) 'ierr = ',ierr
282  stop
283  endif
284 
285  return
286 end subroutine put_netcdf_var_integer
287 
288 subroutine put_netcdf_var_char(fileid,variable,input)
289 
290  integer, intent(in) :: fileid
291  character(len=*), intent(in) :: variable
292  character(len=*), dimension(:), intent(in) :: input
293 
294  integer :: ncvarid, ierr
295 
296  ierr = 0
297  ncstatus = nf90_inq_varid(fileid,trim(adjustl(variable)),ncvarid)
298  ierr = ierr + ncstatus
299  ncstatus = nf90_put_var(fileid,ncvarid,input)
300  ierr = ierr + ncstatus
301 
302  if ( ierr /= 0 ) then
303  write(0,*) 'Error writing data for '//trim(adjustl(variable))
304  write(0,*) 'ierr = ',ierr
305  stop
306  endif
307 
308  return
309 end subroutine put_netcdf_var_char
310 
311 end module netcdf_mod
integer(i_kind), parameter nstring
Definition: define_mod.f90:15
integer(i_kind), parameter missing_i
Definition: define_mod.f90:11
real(r_kind), parameter missing_r
Definition: define_mod.f90:10
subroutine put_netcdf_var_integer(fileid, variable, input)
Definition: netcdf_mod.f90:266
subroutine, public close_netcdf(fname, ncfileid)
Definition: netcdf_mod.f90:48
subroutine put_netcdf_var_real(fileid, variable, input)
Definition: netcdf_mod.f90:243
subroutine, public get_netcdf_dims(fileid, variable, output)
Definition: netcdf_mod.f90:59
subroutine get_netcdf_var_1d_real(fileid, variable, dim1, output)
Definition: netcdf_mod.f90:80
subroutine, public def_netcdf_dims(fileid, variable, input, output)
Definition: netcdf_mod.f90:162
subroutine, public open_netcdf_for_write(fname, ncfileid)
Definition: netcdf_mod.f90:146
subroutine get_netcdf_var_1d_integer(fileid, variable, dim1, output)
Definition: netcdf_mod.f90:102
integer ncstatus
Definition: netcdf_mod.f90:17
subroutine, public def_netcdf_end(fileid)
Definition: netcdf_mod.f90:229
subroutine, public open_netcdf(fname, ncfileid)
Definition: netcdf_mod.f90:34
subroutine get_netcdf_var_1d_char(fileid, variable, dim1, output)
Definition: netcdf_mod.f90:124
subroutine, public def_netcdf_var(fileid, variable, dimids, nctype, attrib_name, attrib)
Definition: netcdf_mod.f90:187
subroutine put_netcdf_var_char(fileid, variable, input)
Definition: netcdf_mod.f90:289