/[MITgcm]/MITgcm/pkg/mnc/mnc_var.F
ViewVC logotype

Contents of /MITgcm/pkg/mnc/mnc_var.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.8 - (show annotations) (download)
Sat Jan 17 13:55:49 2004 UTC (20 years, 4 months ago) by edhill
Branch: MAIN
Changes since 1.7: +22 -13 lines
 o fix MNC dimensions so they are now per-NetCDF-file: this was a serious
     error in the earlier design
 o fix use of _RL,_RS where they should be REAL*4,REAL*8
 o intelligent error handling for situations where the number of NetCDF
     variables exceeds the available storage space within the MNC
     "tables"
 o add descriptions to the variables in the model_grid output

1 C $Header: /u/u3/gcmpack/MITgcm/pkg/mnc/mnc_var.F,v 1.7 2004/01/15 04:31:24 edhill Exp $
2 C $Name: $
3
4 #include "MNC_OPTIONS.h"
5
6 C==================================================================
7
8 SUBROUTINE MNC_VAR_INIT_DBL(
9 I myThid,
10 I fname,
11 I gname,
12 I vname,
13 I units )
14
15 implicit none
16 #include "netcdf.inc"
17
18 C Arguments
19 integer myThid
20 character*(*) fname,gname,vname,units
21
22 CALL MNC_VAR_INIT_ANY(myThid,fname,gname,vname,units, NF_DOUBLE)
23 RETURN
24 END
25
26 C==================================================================
27
28 SUBROUTINE MNC_VAR_INIT_REAL(
29 I myThid,
30 I fname,
31 I gname,
32 I vname,
33 I units )
34
35 implicit none
36 #include "netcdf.inc"
37
38 C Arguments
39 integer myThid
40 character*(*) fname,gname,vname,units
41
42 CALL MNC_VAR_INIT_ANY(myThid,fname,gname,vname,units, NF_FLOAT)
43 RETURN
44 END
45
46 C==================================================================
47
48 SUBROUTINE MNC_VAR_INIT_INT(
49 I myThid,
50 I fname,
51 I gname,
52 I vname,
53 I units )
54
55 implicit none
56 #include "netcdf.inc"
57
58 C Arguments
59 integer myThid
60 character*(*) fname,gname,vname,units
61
62 CALL MNC_VAR_INIT_ANY(myThid,fname,gname,vname,units, NF_INT)
63 RETURN
64 END
65
66 C==================================================================
67
68 SUBROUTINE MNC_VAR_INIT_ANY(
69 I myThid,
70 I fname,
71 I gname,
72 I vname,
73 I units,
74 I vtype )
75
76 implicit none
77 #include "netcdf.inc"
78 #include "mnc_common.h"
79 #include "EEPARAMS.h"
80
81 C Arguments
82 integer myThid
83 character*(*) fname,gname,vname,units
84 integer vtype
85
86 C Functions
87 integer ILNBLNK
88
89 C Local Variables
90 integer i,j,k, n, indf,indv, fid, nd, ngrid, is,ie, err
91 integer vid, nv, ind_g_finfo, needed
92 character*(MAX_LEN_MBUF) msgbuf
93 integer ids(20)
94 integer lenf,leng,lenv,lenu
95
96 C Strip trailing spaces
97 lenf = ILNBLNK(fname)
98 leng = ILNBLNK(gname)
99 lenv = ILNBLNK(vname)
100 lenu = ILNBLNK(units)
101
102 C Check that the file is open
103 CALL MNC_GET_IND(myThid, MNC_MAX_ID, fname, mnc_f_names, indf)
104 IF (indf .LT. 1) THEN
105 write(msgbuf,'(3a)') 'MNC ERROR: file ''', fname,
106 & ''' must be opened first'
107 CALL print_error(msgbuf, mythid)
108 stop 'ABNORMAL END: S/R MNC_VAR_INIT_ANY'
109 ENDIF
110 fid = mnc_f_info(indf,2)
111
112 C Check for sufficient storage space in mnc_fv_ids
113 needed = 1 + 3*(mnc_fv_ids(indf,1) + 1)
114 IF (needed .GE. MNC_MAX_INFO) THEN
115 write(msgbuf,'(2a,i7,a)') 'MNC ERROR: MNC_MAX_INFO exceeded',
116 & ': please increase it to ', 2*MNC_MAX_INFO,
117 & ' in the file ''pkg/mnc/mnc_common.h'''
118 CALL print_error(msgbuf, mythid)
119 stop 'ABNORMAL END: S/R MNC_VAR_INIT_ANY'
120 ENDIF
121
122 C Get the grid information
123 ngrid = mnc_f_info(indf,3)
124 IF (ngrid .LT. 1) THEN
125 write(msgbuf,'(3a)') 'MNC ERROR: file ''', fname(1:lenf),
126 & ''' contains NO grids'
127 CALL print_error(msgbuf, mythid)
128 stop 'ABNORMAL END: S/R MNC_VAR_INIT_ANY'
129 ENDIF
130 DO i = 1,ngrid
131 j = 4 + (i-1)*3
132 k = mnc_f_info(indf,j)
133 n = ILNBLNK(mnc_g_names(k))
134 IF ((leng .EQ. n)
135 & .AND. (mnc_g_names(k)(1:n) .EQ. gname(1:n))) THEN
136 ind_g_finfo = j
137 is = mnc_f_info(indf,(j+1))
138 ie = mnc_f_info(indf,(j+2))
139 nd = 0
140 DO k = is,ie
141 nd = nd + 1
142 ids(nd) = mnc_fg_ids(indf,k)
143 ENDDO
144 GOTO 10
145 ENDIF
146 ENDDO
147 write(msgbuf,'(5a)') 'MNC ERROR: file ''', fname(1:lenf),
148 & ''' does not contain grid ''', gname(1:leng), ''''
149 CALL print_error(msgbuf, mythid)
150 stop 'ABNORMAL END: S/R MNC_VAR_INIT_ANY'
151 10 CONTINUE
152
153 C Add the variable definition
154 CALL MNC_FILE_REDEF(myThid, fname)
155 err = NF_DEF_VAR(fid, vname, vtype, nd, ids, vid)
156 write(msgbuf,'(5a)') 'defining variable ''', vname(1:lenv),
157 & ''' in file ''', fname(1:lenf), ''''
158 CALL MNC_HANDLE_ERR(myThid, err, msgbuf)
159
160 C Success, so save the variable info
161 CALL MNC_GET_NEXT_EMPTY_IND(myThid, MNC_MAX_ID, mnc_v_names, indv)
162 mnc_v_names(indv)(1:lenv) = vname(1:lenv)
163 nv = mnc_fv_ids(indf,1)
164 i = 2 + nv*3
165 j = i + 1
166 k = i + 2
167 mnc_fv_ids(indf,i) = indv
168 mnc_fv_ids(indf,j) = vid
169 mnc_fv_ids(indf,k) = ind_g_finfo
170 mnc_fv_ids(indf,1) = nv + 1
171
172 C Add the units
173 CALL MNC_VAR_ADD_ATTR_STR(myThid, fname, vname, 'units', units)
174
175 RETURN
176 END
177
178 C==================================================================
179
180 SUBROUTINE MNC_VAR_ADD_ATTR_STR(
181 I myThid,
182 I fname,
183 I vname,
184 I atname,
185 I sval )
186
187 implicit none
188 C Arguments
189 integer myThid
190 character*(*) fname,vname,atname,sval
191
192 CALL MNC_VAR_ADD_ATTR_ANY(myThid,fname,vname,atname,
193 & 1, sval, 0, 0.0D0, 0.0, 0)
194 RETURN
195 END
196 C==================================================================
197
198 SUBROUTINE MNC_VAR_ADD_ATTR_DBL(
199 I myThid,
200 I fname,
201 I vname,
202 I atname,
203 I nv,
204 I dval )
205
206 implicit none
207 C Arguments
208 integer myThid,nv
209 character*(*) fname,vname,atname
210 REAL*8 dval(*)
211
212 CALL MNC_VAR_ADD_ATTR_ANY(myThid,fname,vname,atname,
213 & 2, ' ', nv, dval, 0.0, 0)
214 RETURN
215 END
216
217 C==================================================================
218
219 SUBROUTINE MNC_VAR_ADD_ATTR_REAL(
220 I myThid,
221 I fname,
222 I vname,
223 I atname,
224 I nv,
225 I rval )
226
227 implicit none
228 C Arguments
229 integer myThid,nv
230 character*(*) fname,vname,atname
231 REAL*4 rval(*)
232
233 CALL MNC_VAR_ADD_ATTR_ANY(myThid,fname,vname,atname,
234 & 3, ' ', nv, 0.0D0, rval, 0)
235 RETURN
236 END
237
238 C==================================================================
239
240 SUBROUTINE MNC_VAR_ADD_ATTR_INT(
241 I myThid,
242 I fname,
243 I vname,
244 I atname,
245 I nv,
246 I ival )
247
248 implicit none
249 C Arguments
250 integer myThid,nv
251 character*(*) fname,vname,atname
252 integer ival(*)
253
254 CALL MNC_VAR_ADD_ATTR_ANY(myThid,fname,vname,atname,
255 & 4, ' ', nv, 0.0D0, 0.0, ival)
256 RETURN
257 END
258
259 C==================================================================
260
261 SUBROUTINE MNC_VAR_ADD_ATTR_ANY(
262 I myThid,
263 I fname,
264 I vname,
265 I atname,
266 I atype, cs,len,dv,rv,iv )
267
268 implicit none
269 #include "netcdf.inc"
270 #include "mnc_common.h"
271 #include "EEPARAMS.h"
272
273 C Arguments
274 integer myThid,atype,len
275 character*(*) fname,vname,atname
276 character*(*) cs
277 REAL*8 dv(*)
278 REAL*4 rv(*)
279 integer iv(*)
280
281 C Functions
282 integer ILNBLNK
283
284 C Local Variables
285 integer n, indf,ind_fv_ids, fid,vid, err
286 character*(MAX_LEN_MBUF) msgbuf
287 integer lenf,lenv,lenat,lens
288
289 C Strip trailing spaces
290 lenf = ILNBLNK(fname)
291 lenv = ILNBLNK(vname)
292 lenat = ILNBLNK(atname)
293 lens = ILNBLNK(cs)
294
295 CALL MNC_GET_FVINDS(myThid, fname, vname, indf, ind_fv_ids)
296 IF ((indf .LT. 1).OR.(ind_fv_ids .LT. 1)) THEN
297 write(msgbuf,'(5a)') 'MNC ERROR: file ''', fname(1:lenf),
298 & ''' is not open or does not contain variable ''',
299 & vname(1:lenv), ''''
300 CALL print_error(msgbuf, mythid)
301 stop 'ABNORMAL END: S/R MNC_VAR_ADD_ATTR_STR'
302 ENDIF
303 fid = mnc_f_info(indf,2)
304 vid = mnc_fv_ids(indf,(ind_fv_ids+1))
305
306 C Set the attribute
307 CALL MNC_FILE_REDEF(myThid, fname)
308 IF (atype .EQ. 1) THEN
309 err = NF_PUT_ATT_TEXT(fid, vid, atname, lens, cs)
310 ELSEIF (atype .EQ. 2) THEN
311 err = NF_PUT_ATT_DOUBLE(fid, vid, atname, NF_DOUBLE, len, dv)
312 ELSEIF (atype .EQ. 3) THEN
313 err = NF_PUT_ATT_REAL(fid, vid, atname, NF_FLOAT, len, rv)
314 ELSEIF (atype .EQ. 4) THEN
315 err = NF_PUT_ATT_INT(fid, vid, atname, NF_INT, len, iv)
316 ELSE
317 write(msgbuf,'(a,i10,a)') 'MNC ERROR: atype = ''', atype,
318 & ''' is invalid--must be: [1-4]'
319 n = ILNBLNK(msgbuf)
320 CALL print_error(msgbuf(1:n), mythid)
321 stop 'ABNORMAL END: S/R MNC_VAR_ADD_ATTR_ANY'
322 ENDIF
323 write(msgbuf,'(5a)') 'adding attribute ''', atname(1:lenat),
324 & ''' to file ''', fname(1:lenf), ''''
325 CALL MNC_HANDLE_ERR(myThid, err, msgbuf)
326
327 RETURN
328 END
329
330 C==================================================================
331
332 SUBROUTINE MNC_VAR_WRITE_DBL(
333 I myThid,
334 I fname,
335 I vname,
336 I var )
337
338 implicit none
339 C Arguments
340 integer myThid
341 character*(*) fname,vname
342 REAL*8 var(*)
343
344 CALL MNC_VAR_WRITE_ANY(myThid,fname,vname, 1, var, 0.0, 0 )
345 RETURN
346 END
347
348 C==================================================================
349
350 SUBROUTINE MNC_VAR_WRITE_REAL(
351 I myThid,
352 I fname,
353 I vname,
354 I var )
355
356 implicit none
357 C Arguments
358 integer myThid
359 character*(*) fname,vname
360 REAL*4 var(*)
361
362 CALL MNC_VAR_WRITE_ANY(myThid,fname,vname, 2, 0.0D0, var, 0 )
363 RETURN
364 END
365
366 C==================================================================
367
368 SUBROUTINE MNC_VAR_WRITE_INT(
369 I myThid,
370 I fname,
371 I vname,
372 I var )
373
374 implicit none
375 C Arguments
376 integer myThid
377 character*(*) fname,vname
378 integer var(*)
379
380 CALL MNC_VAR_WRITE_ANY(myThid,fname,vname, 3, 0.0D0, 0.0, var )
381 RETURN
382 END
383
384 C==================================================================
385
386 SUBROUTINE MNC_VAR_WRITE_ANY(
387 I myThid,
388 I fname,
389 I vname,
390 I vtype,
391 I dv,
392 I rv,
393 I iv )
394
395 implicit none
396 #include "netcdf.inc"
397 #include "mnc_common.h"
398 #include "EEPARAMS.h"
399
400 C Arguments
401 integer myThid, vtype
402 character*(*) fname,vname
403 REAL*8 dv(*)
404 REAL*4 rv(*)
405 integer iv(*)
406
407 C Functions
408 integer ILNBLNK
409
410 C Local Variables
411 integer i,j,k, n, indf,ind_fv_ids, fid,vid,did, ig, err, ds,de
412 character*(MAX_LEN_MBUF) msgbuf
413 integer lenf,lenv, lend
414 integer vstart(100), vcount(100)
415
416 C Strip trailing spaces
417 lenf = ILNBLNK(fname)
418 lenv = ILNBLNK(vname)
419
420 CALL MNC_GET_FVINDS(myThid, fname, vname, indf, ind_fv_ids)
421 IF ((indf .LT. 1).OR.(ind_fv_ids .LT. 1)) THEN
422 write(msgbuf,'(5a)') 'MNC ERROR: file ''', fname(1:lenf),
423 & ''' is not open or does not contain variable ''',
424 & vname(1:lenv), ''''
425 CALL print_error(msgbuf, mythid)
426 stop 'ABNORMAL END: S/R MNC_VAR_ADD_ATTR_STR'
427 ENDIF
428 fid = mnc_f_info(indf,2)
429 vid = mnc_fv_ids(indf,(ind_fv_ids+1))
430
431 C Get the lengths from the dim IDs
432 ig = mnc_fv_ids(indf,(ind_fv_ids+2))
433 ds = mnc_f_info(indf,ig+1)
434 de = mnc_f_info(indf,ig+2)
435 k = 0
436 DO i = ds,de
437 k = k + 1
438 vstart(k) = 1
439 vcount(k) = mnc_d_size( mnc_fd_ind(indf,i) )
440 ENDDO
441
442 C Check for the unlimited dimension
443 j = mnc_d_size( mnc_fd_ind(indf,de) )
444 IF (j .LT. 1) THEN
445 did = mnc_fg_ids(indf,de)
446 err = NF_INQ_DIMLEN(fid, did, lend)
447 write(msgbuf,'(a)') 'reading current length of unlimited dim'
448 CALL MNC_HANDLE_ERR(myThid, err, msgbuf)
449 IF (lend .LT. 1) lend = lend + 1
450 vstart(k) = lend
451 vcount(k) = 1
452 ENDIF
453
454 CALL MNC_FILE_ENDDEF(myThid, fname)
455 IF (vtype .EQ. 1) THEN
456 err = NF_PUT_VARA_DOUBLE(fid, vid, vstart, vcount, dv)
457 ELSEIF (vtype .EQ. 2) THEN
458 err = NF_PUT_VARA_REAL(fid, vid, vstart, vcount, rv)
459 ELSEIF (vtype .EQ. 3) THEN
460 err = NF_PUT_VARA_INT(fid, vid, vstart, vcount, iv)
461 ELSE
462 write(msgbuf,'(a,i10,a)') 'MNC ERROR: vtype = ''', vtype,
463 & ''' is invalid--must be: [1|2|3]'
464 n = ILNBLNK(msgbuf)
465 CALL print_error(msgbuf(1:n), mythid)
466 stop 'ABNORMAL END: S/R MNC_VAR_WRITE_ALL'
467 ENDIF
468 write(msgbuf,'(5a)') 'writing variable ''', vname(1:lenv),
469 & ''' to file ''', fname(1:lenf), ''''
470 CALL MNC_HANDLE_ERR(myThid, err, msgbuf)
471
472 RETURN
473 END
474

  ViewVC Help
Powered by ViewVC 1.1.22