LMDZ
nf95_gw_var_m.F90
Go to the documentation of this file.
1 ! $Id$
3 
6 
7  implicit none
8 
9  interface nf95_gw_var
10  ! "nf95_gw_var" stands for "NetCDF 1995 get whole variable".
11  ! These procedures read a whole NetCDF variable (coordinate or
12  ! primary) into an array.
13  ! The difference between the procedures is the rank and type of
14  ! argument "values".
15  ! The procedures do not check the type of the NetCDF variable.
16 
17  ! Not including double precision procedures in the generic
18  ! interface because we use a compilation option that changes default
19  ! real precision.
20  module procedure nf95_gw_var_real_1d, nf95_gw_var_real_2d, &
23  end interface
24 
25  private
26  public nf95_gw_var
27 
28 contains
29 
30  subroutine nf95_gw_var_real_1d(ncid, varid, values)
31 
32  ! Real type, the array has rank 1.
33 
34  integer, intent(in):: ncid
35  integer, intent(in):: varid
36  real, pointer:: values(:)
37 
38  ! Variables local to the procedure:
39  integer nclen
40  integer, pointer:: dimids(:)
41 
42  !---------------------
43 
44  call nf95_inquire_variable(ncid, varid, dimids=dimids)
45 
46  if (size(dimids) /= 1) then
47  print *, "nf95_gw_var_real_1d:"
48  print *, "varid = ", varid
49  print *, "rank of NetCDF variable is ", size(dimids), ", not 1"
50  stop 1
51  end if
52 
53  call nf95_inquire_dimension(ncid, dimids(1), nclen=nclen)
54  deallocate(dimids) ! pointer
55 
56  allocate(values(nclen))
57  if (nclen /= 0) call nf95_get_var(ncid, varid, values)
58 
59  end subroutine nf95_gw_var_real_1d
60 
61  !************************************
62 
63  subroutine nf95_gw_var_real_2d(ncid, varid, values)
64 
65  ! Real type, the array has rank 2.
66 
67  integer, intent(in):: ncid
68  integer, intent(in):: varid
69  real, pointer:: values(:, :)
70 
71  ! Variables local to the procedure:
72  integer nclen1, nclen2
73  integer, pointer:: dimids(:)
74 
75  !---------------------
76 
77  call nf95_inquire_variable(ncid, varid, dimids=dimids)
78 
79  if (size(dimids) /= 2) then
80  print *, "nf95_gw_var_real_2d:"
81  print *, "varid = ", varid
82  print *, "rank of NetCDF variable is ", size(dimids), ", not 2"
83  stop 1
84  end if
85 
86  call nf95_inquire_dimension(ncid, dimids(1), nclen=nclen1)
87  call nf95_inquire_dimension(ncid, dimids(2), nclen=nclen2)
88  deallocate(dimids) ! pointer
89 
90  allocate(values(nclen1, nclen2))
91  if (nclen1 /= 0 .and. nclen2 /= 0) call nf95_get_var(ncid, varid, values)
92 
93  end subroutine nf95_gw_var_real_2d
94 
95  !************************************
96 
97  subroutine nf95_gw_var_real_3d(ncid, varid, values)
98 
99  ! Real type, the array has rank 3.
100 
101  integer, intent(in):: ncid
102  integer, intent(in):: varid
103  real, pointer:: values(:, :, :)
104 
105  ! Variables local to the procedure:
106  integer nclen1, nclen2, nclen3
107  integer, pointer:: dimids(:)
108 
109  !---------------------
110 
111  call nf95_inquire_variable(ncid, varid, dimids=dimids)
112 
113  if (size(dimids) /= 3) then
114  print *, "nf95_gw_var_real_3d:"
115  print *, "varid = ", varid
116  print *, "rank of NetCDF variable is ", size(dimids), ", not 3"
117  stop 1
118  end if
119 
120  call nf95_inquire_dimension(ncid, dimids(1), nclen=nclen1)
121  call nf95_inquire_dimension(ncid, dimids(2), nclen=nclen2)
122  call nf95_inquire_dimension(ncid, dimids(3), nclen=nclen3)
123  deallocate(dimids) ! pointer
124 
125  allocate(values(nclen1, nclen2, nclen3))
126  if (nclen1 * nclen2 * nclen3 /= 0) call nf95_get_var(ncid, varid, values)
127 
128  end subroutine nf95_gw_var_real_3d
129 
130  !************************************
131 
132  subroutine nf95_gw_var_real_4d(ncid, varid, values)
134  ! Real type, the array has rank 4.
135 
136  integer, intent(in):: ncid
137  integer, intent(in):: varid
138  real, pointer:: values(:, :, :, :)
139 
140  ! Variables local to the procedure:
141  integer len_dim(4), i
142  integer, pointer:: dimids(:)
143 
144  !---------------------
145 
146  call nf95_inquire_variable(ncid, varid, dimids=dimids)
147 
148  if (size(dimids) /= 4) then
149  print *, "nf95_gw_var_real_4d:"
150  print *, "varid = ", varid
151  print *, "rank of NetCDF variable is ", size(dimids), ", not 4"
152  stop 1
153  end if
154 
155  do i = 1, 4
156  call nf95_inquire_dimension(ncid, dimids(i), nclen=len_dim(i))
157  end do
158  deallocate(dimids) ! pointer
159 
160  allocate(values(len_dim(1), len_dim(2), len_dim(3), len_dim(4)))
161  if (all(len_dim /= 0)) call nf95_get_var(ncid, varid, values)
162 
163  end subroutine nf95_gw_var_real_4d
164 
165  !************************************
166 
167  subroutine nf95_gw_var_real_5d(ncid, varid, values)
169  ! Real type, the array has rank 5.
170 
171  integer, intent(in):: ncid
172  integer, intent(in):: varid
173  real, pointer:: values(:, :, :, :, :)
174 
175  ! Variables local to the procedure:
176  integer len_dim(5), i
177  integer, pointer:: dimids(:)
178 
179  !---------------------
180 
181  call nf95_inquire_variable(ncid, varid, dimids=dimids)
182 
183  if (size(dimids) /= 5) then
184  print *, "nf95_gw_var_real_5d:"
185  print *, "varid = ", varid
186  print *, "rank of NetCDF variable is ", size(dimids), ", not 5"
187  stop 1
188  end if
189 
190  do i = 1, 5
191  call nf95_inquire_dimension(ncid, dimids(i), nclen=len_dim(i))
192  end do
193  deallocate(dimids) ! pointer
194 
195  allocate(values(len_dim(1), len_dim(2), len_dim(3), len_dim(4), len_dim(5)))
196  if (all(len_dim /= 0)) call nf95_get_var(ncid, varid, values)
197 
198  end subroutine nf95_gw_var_real_5d
199 
200  !************************************
201 
202 !!$ subroutine nf95_gw_var_dble_1d(ncid, varid, values)
203 !!$
204 !!$ ! Double precision, the array has rank 1.
205 !!$
206 !!$ integer, intent(in):: ncid
207 !!$ integer, intent(in):: varid
208 !!$ double precision, pointer:: values(:)
209 !!$
210 !!$ ! Variables local to the procedure:
211 !!$ integer nclen
212 !!$ integer, pointer:: dimids(:)
213 !!$
214 !!$ !---------------------
215 !!$
216 !!$ call nf95_inquire_variable(ncid, varid, dimids=dimids)
217 !!$
218 !!$ if (size(dimids) /= 1) then
219 !!$ print *, "nf95_gw_var_dble_1d:"
220 !!$ print *, "varid = ", varid
221 !!$ print *, "rank of NetCDF variable is ", size(dimids), ", not 1"
222 !!$ stop 1
223 !!$ end if
224 !!$
225 !!$ call nf95_inquire_dimension(ncid, dimids(1), nclen=nclen)
226 !!$ deallocate(dimids) ! pointer
227 !!$
228 !!$ allocate(values(nclen))
229 !!$ if (nclen /= 0) call NF95_GET_VAR(ncid, varid, values)
230 !!$
231 !!$ end subroutine nf95_gw_var_dble_1d
232 !!$
233 !!$ !************************************
234 !!$
235 !!$ subroutine nf95_gw_var_dble_3d(ncid, varid, values)
236 !!$
237 !!$ ! Double precision, the array has rank 3.
238 !!$
239 !!$ integer, intent(in):: ncid
240 !!$ integer, intent(in):: varid
241 !!$ double precision, pointer:: values(:, :, :)
242 !!$
243 !!$ ! Variables local to the procedure:
244 !!$ integer nclen1, nclen2, nclen3
245 !!$ integer, pointer:: dimids(:)
246 !!$
247 !!$ !---------------------
248 !!$
249 !!$ call nf95_inquire_variable(ncid, varid, dimids=dimids)
250 !!$
251 !!$ if (size(dimids) /= 3) then
252 !!$ print *, "nf95_gw_var_dble_3d:"
253 !!$ print *, "varid = ", varid
254 !!$ print *, "rank of NetCDF variable is ", size(dimids), ", not 3"
255 !!$ stop 1
256 !!$ end if
257 !!$
258 !!$ call nf95_inquire_dimension(ncid, dimids(1), nclen=nclen1)
259 !!$ call nf95_inquire_dimension(ncid, dimids(2), nclen=nclen2)
260 !!$ call nf95_inquire_dimension(ncid, dimids(3), nclen=nclen3)
261 !!$ deallocate(dimids) ! pointer
262 !!$
263 !!$ allocate(values(nclen1, nclen2, nclen3))
264 !!$ if (nclen1 * nclen2 * nclen3 /= 0) call NF95_GET_VAR(ncid, varid, values)
265 !!$
266 !!$ end subroutine nf95_gw_var_dble_3d
267 !!$
268  !************************************
269 
270  subroutine nf95_gw_var_int_1d(ncid, varid, values)
272  ! Integer type, the array has rank 1.
273 
274  integer, intent(in):: ncid
275  integer, intent(in):: varid
276  integer, pointer:: values(:)
277 
278  ! Variables local to the procedure:
279  integer nclen
280  integer, pointer:: dimids(:)
281 
282  !---------------------
283 
284  call nf95_inquire_variable(ncid, varid, dimids=dimids)
285 
286  if (size(dimids) /= 1) then
287  print *, "nf95_gw_var_int_1d:"
288  print *, "varid = ", varid
289  print *, "rank of NetCDF variable is ", size(dimids), ", not 1"
290  stop 1
291  end if
292 
293  call nf95_inquire_dimension(ncid, dimids(1), nclen=nclen)
294  deallocate(dimids) ! pointer
295 
296  allocate(values(nclen))
297  if (nclen /= 0) call nf95_get_var(ncid, varid, values)
298 
299  end subroutine nf95_gw_var_int_1d
300 
301  !************************************
302 
303  subroutine nf95_gw_var_int_3d(ncid, varid, values)
305  ! Integer type, the array has rank 3.
306 
307  integer, intent(in):: ncid
308  integer, intent(in):: varid
309  integer, pointer:: values(:, :, :)
310 
311  ! Variables local to the procedure:
312  integer nclen1, nclen2, nclen3
313  integer, pointer:: dimids(:)
314 
315  !---------------------
316 
317  call nf95_inquire_variable(ncid, varid, dimids=dimids)
318 
319  if (size(dimids) /= 3) then
320  print *, "nf95_gw_var_int_3d:"
321  print *, "varid = ", varid
322  print *, "rank of NetCDF variable is ", size(dimids), ", not 3"
323  stop 1
324  end if
325 
326  call nf95_inquire_dimension(ncid, dimids(1), nclen=nclen1)
327  call nf95_inquire_dimension(ncid, dimids(2), nclen=nclen2)
328  call nf95_inquire_dimension(ncid, dimids(3), nclen=nclen3)
329  deallocate(dimids) ! pointer
330 
331  allocate(values(nclen1, nclen2, nclen3))
332  if (nclen1 * nclen2 * nclen3 /= 0) call nf95_get_var(ncid, varid, values)
333 
334  end subroutine nf95_gw_var_int_3d
335 
336 end module nf95_gw_var_m
subroutine nf95_gw_var_real_5d(ncid, varid, values)
subroutine nf95_inquire_variable(ncid, varid, name, xtype, ndims, dimids, nAtts, ncerr)
Definition: simple.F90:115
subroutine nf95_inquire_dimension(ncid, dimid, name, nclen, ncerr)
Definition: simple.F90:64
subroutine nf95_gw_var_int_3d(ncid, varid, values)
subroutine nf95_gw_var_real_1d(ncid, varid, values)
Definition: simple.F90:2
subroutine nf95_gw_var_real_3d(ncid, varid, values)
subroutine nf95_gw_var_int_1d(ncid, varid, values)
subroutine nf95_gw_var_real_2d(ncid, varid, values)
subroutine nf95_gw_var_real_4d(ncid, varid, values)