/[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.10 - (show annotations) (download)
Sun Jan 25 00:22:57 2004 UTC (20 years, 4 months ago) by edhill
Branch: MAIN
CVS Tags: hrcube_2
Changes since 1.9: +6 -8 lines
 o new version of MNC "internals" with per-file association of all
     entities
 o first version with NetCDF read support
 o fixed the cleanup of internal lookup tables at file closure
 o numerous small bug fixes

1 C $Header: /u/u3/gcmpack/MITgcm/pkg/mnc/mnc_var.F,v 1.9 2004/01/18 23:23:15 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_d_ids(mnc_fd_ind(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 mnc_fv_ids(indf,i) = indv
166 mnc_fv_ids(indf,i+1) = vid
167 mnc_fv_ids(indf,i+2) = ind_g_finfo
168 mnc_fv_ids(indf,1) = nv + 1
169
170 C Add the units
171 CALL MNC_VAR_ADD_ATTR_STR(myThid, fname, vname, 'units', units)
172
173 RETURN
174 END
175
176 C==================================================================
177
178 SUBROUTINE MNC_VAR_ADD_ATTR_STR(
179 I myThid,
180 I fname,
181 I vname,
182 I atname,
183 I sval )
184
185 implicit none
186 C Arguments
187 integer myThid
188 character*(*) fname,vname,atname,sval
189
190 CALL MNC_VAR_ADD_ATTR_ANY(myThid,fname,vname,atname,
191 & 1, sval, 0, 0.0D0, 0.0, 0)
192 RETURN
193 END
194 C==================================================================
195
196 SUBROUTINE MNC_VAR_ADD_ATTR_DBL(
197 I myThid,
198 I fname,
199 I vname,
200 I atname,
201 I nv,
202 I dval )
203
204 implicit none
205 C Arguments
206 integer myThid,nv
207 character*(*) fname,vname,atname
208 REAL*8 dval(*)
209
210 CALL MNC_VAR_ADD_ATTR_ANY(myThid,fname,vname,atname,
211 & 2, ' ', nv, dval, 0.0, 0)
212 RETURN
213 END
214
215 C==================================================================
216
217 SUBROUTINE MNC_VAR_ADD_ATTR_REAL(
218 I myThid,
219 I fname,
220 I vname,
221 I atname,
222 I nv,
223 I rval )
224
225 implicit none
226 C Arguments
227 integer myThid,nv
228 character*(*) fname,vname,atname
229 REAL*4 rval(*)
230
231 CALL MNC_VAR_ADD_ATTR_ANY(myThid,fname,vname,atname,
232 & 3, ' ', nv, 0.0D0, rval, 0)
233 RETURN
234 END
235
236 C==================================================================
237
238 SUBROUTINE MNC_VAR_ADD_ATTR_INT(
239 I myThid,
240 I fname,
241 I vname,
242 I atname,
243 I nv,
244 I ival )
245
246 implicit none
247 C Arguments
248 integer myThid,nv
249 character*(*) fname,vname,atname
250 integer ival(*)
251
252 CALL MNC_VAR_ADD_ATTR_ANY(myThid,fname,vname,atname,
253 & 4, ' ', nv, 0.0D0, 0.0, ival)
254 RETURN
255 END
256
257 C==================================================================
258
259 SUBROUTINE MNC_VAR_ADD_ATTR_ANY(
260 I myThid,
261 I fname,
262 I vname,
263 I atname,
264 I atype, cs,len,dv,rv,iv )
265
266 implicit none
267 #include "netcdf.inc"
268 #include "mnc_common.h"
269 #include "EEPARAMS.h"
270
271 C Arguments
272 integer myThid,atype,len
273 character*(*) fname,vname,atname
274 character*(*) cs
275 REAL*8 dv(*)
276 REAL*4 rv(*)
277 integer iv(*)
278
279 C Functions
280 integer ILNBLNK
281
282 C Local Variables
283 integer n, indf,ind_fv_ids, fid,vid, err
284 character*(MAX_LEN_MBUF) msgbuf
285 integer lenf,lenv,lenat,lens
286
287 C Strip trailing spaces
288 lenf = ILNBLNK(fname)
289 lenv = ILNBLNK(vname)
290 lenat = ILNBLNK(atname)
291 lens = ILNBLNK(cs)
292
293 CALL MNC_GET_FVINDS(myThid, fname, vname, indf, ind_fv_ids)
294 IF ((indf .LT. 1).OR.(ind_fv_ids .LT. 1)) THEN
295 write(msgbuf,'(5a)') 'MNC ERROR: file ''', fname(1:lenf),
296 & ''' is not open or does not contain variable ''',
297 & vname(1:lenv), ''''
298 CALL print_error(msgbuf, mythid)
299 stop 'ABNORMAL END: S/R MNC_VAR_ADD_ATTR_STR'
300 ENDIF
301 fid = mnc_f_info(indf,2)
302 vid = mnc_fv_ids(indf,(ind_fv_ids+1))
303
304 C Set the attribute
305 CALL MNC_FILE_REDEF(myThid, fname)
306 IF (atype .EQ. 1) THEN
307 err = NF_PUT_ATT_TEXT(fid, vid, atname, lens, cs)
308 ELSEIF (atype .EQ. 2) THEN
309 err = NF_PUT_ATT_DOUBLE(fid, vid, atname, NF_DOUBLE, len, dv)
310 ELSEIF (atype .EQ. 3) THEN
311 err = NF_PUT_ATT_REAL(fid, vid, atname, NF_FLOAT, len, rv)
312 ELSEIF (atype .EQ. 4) THEN
313 err = NF_PUT_ATT_INT(fid, vid, atname, NF_INT, len, iv)
314 ELSE
315 write(msgbuf,'(a,i10,a)') 'MNC ERROR: atype = ''', atype,
316 & ''' is invalid--must be: [1-4]'
317 n = ILNBLNK(msgbuf)
318 CALL print_error(msgbuf(1:n), mythid)
319 stop 'ABNORMAL END: S/R MNC_VAR_ADD_ATTR_ANY'
320 ENDIF
321 write(msgbuf,'(5a)') 'adding attribute ''', atname(1:lenat),
322 & ''' to file ''', fname(1:lenf), ''''
323 CALL MNC_HANDLE_ERR(myThid, err, msgbuf)
324
325 RETURN
326 END
327
328 C==================================================================
329
330 SUBROUTINE MNC_VAR_WRITE_DBL(
331 I myThid,
332 I fname,
333 I vname,
334 I var )
335
336 implicit none
337 C Arguments
338 integer myThid
339 character*(*) fname,vname
340 REAL*8 var(*)
341
342 CALL MNC_VAR_WRITE_ANY(myThid,fname,vname,1,0,var,0.0,0)
343 RETURN
344 END
345
346 C==================================================================
347
348 SUBROUTINE MNC_VAR_WRITE_REAL(
349 I myThid,
350 I fname,
351 I vname,
352 I var )
353
354 implicit none
355 C Arguments
356 integer myThid
357 character*(*) fname,vname
358 REAL*4 var(*)
359
360 CALL MNC_VAR_WRITE_ANY(myThid,fname,vname,2,0,0.0D0,var,0)
361 RETURN
362 END
363
364 C==================================================================
365
366 SUBROUTINE MNC_VAR_WRITE_INT(
367 I myThid,
368 I fname,
369 I vname,
370 I var )
371
372 implicit none
373 C Arguments
374 integer myThid
375 character*(*) fname,vname
376 integer var(*)
377
378 CALL MNC_VAR_WRITE_ANY(myThid,fname,vname,3,0,0.0D0,0.0,var)
379 RETURN
380 END
381
382 C==================================================================
383
384 SUBROUTINE MNC_VAR_APPEND_DBL(
385 I myThid,
386 I fname,
387 I vname,
388 I var,
389 I append )
390
391 implicit none
392 C Arguments
393 integer myThid, append
394 character*(*) fname,vname
395 REAL*8 var(*)
396
397 CALL MNC_VAR_WRITE_ANY(myThid,fname,vname,1,append,var,0.0,0)
398 RETURN
399 END
400
401 C==================================================================
402
403 SUBROUTINE MNC_VAR_APPEND_REAL(
404 I myThid,
405 I fname,
406 I vname,
407 I var,
408 I append )
409
410 implicit none
411 C Arguments
412 integer myThid, append
413 character*(*) fname,vname
414 REAL*4 var(*)
415
416 CALL MNC_VAR_WRITE_ANY(myThid,fname,vname,2,append,0.0D0,var,0)
417 RETURN
418 END
419
420 C==================================================================
421
422 SUBROUTINE MNC_VAR_APPEND_INT(
423 I myThid,
424 I fname,
425 I vname,
426 I var,
427 I append )
428
429 implicit none
430 C Arguments
431 integer myThid, append
432 character*(*) fname,vname
433 integer var(*)
434
435 CALL MNC_VAR_WRITE_ANY(myThid,fname,vname,3,append,0.0D0,0.0,var)
436 RETURN
437 END
438
439 C==================================================================
440
441 SUBROUTINE MNC_VAR_WRITE_ANY(
442 I myThid,
443 I fname,
444 I vname,
445 I vtype,
446 I append,
447 I dv,
448 I rv,
449 I iv )
450
451 implicit none
452 #include "netcdf.inc"
453 #include "mnc_common.h"
454 #include "EEPARAMS.h"
455
456 C Arguments
457 integer myThid, vtype
458 character*(*) fname,vname
459 REAL*8 dv(*)
460 REAL*4 rv(*)
461 integer iv(*)
462 integer append
463
464 C Functions
465 integer ILNBLNK
466
467 C Local Variables
468 integer i,j,k, n, indf,ind_fv_ids, fid,vid,did, ig, err, ds,de
469 character*(MAX_LEN_MBUF) msgbuf
470 integer lenf,lenv, lend
471 integer vstart(100), vcount(100)
472
473 C Strip trailing spaces
474 lenf = ILNBLNK(fname)
475 lenv = ILNBLNK(vname)
476
477 CALL MNC_GET_FVINDS(myThid, fname, vname, indf, ind_fv_ids)
478 IF ((indf .LT. 1).OR.(ind_fv_ids .LT. 1)) THEN
479 write(msgbuf,'(5a)') 'MNC ERROR: file ''', fname(1:lenf),
480 & ''' is not open or does not contain variable ''',
481 & vname(1:lenv), ''''
482 CALL print_error(msgbuf, mythid)
483 stop 'ABNORMAL END: S/R MNC_VAR_ADD_ATTR_STR'
484 ENDIF
485 fid = mnc_f_info(indf,2)
486 vid = mnc_fv_ids(indf,(ind_fv_ids+1))
487
488 C Get the lengths from the dim IDs
489 ig = mnc_fv_ids(indf,(ind_fv_ids+2))
490 ds = mnc_f_info(indf,ig+1)
491 de = mnc_f_info(indf,ig+2)
492 k = 0
493 DO i = ds,de
494 k = k + 1
495 vstart(k) = 1
496 vcount(k) = mnc_d_size( mnc_fd_ind(indf,i) )
497 ENDDO
498
499 C Check for the unlimited dimension
500 j = mnc_d_size( mnc_fd_ind(indf,de) )
501 IF (j .LT. 1) THEN
502 did = mnc_d_ids( mnc_fd_ind(indf,de) )
503 err = NF_INQ_DIMLEN(fid, did, lend)
504 write(msgbuf,'(a)') 'reading current length of unlimited dim'
505 CALL MNC_HANDLE_ERR(myThid, err, msgbuf)
506 IF (append .GT. 0) THEN
507 lend = lend + append
508 ENDIF
509 IF (lend .LT. 1) lend = 1
510 vstart(k) = lend
511 vcount(k) = 1
512 ENDIF
513
514 CALL MNC_FILE_ENDDEF(myThid, fname)
515 IF (vtype .EQ. 1) THEN
516 err = NF_PUT_VARA_DOUBLE(fid, vid, vstart, vcount, dv)
517 ELSEIF (vtype .EQ. 2) THEN
518 err = NF_PUT_VARA_REAL(fid, vid, vstart, vcount, rv)
519 ELSEIF (vtype .EQ. 3) THEN
520 err = NF_PUT_VARA_INT(fid, vid, vstart, vcount, iv)
521 ELSE
522 write(msgbuf,'(a,i10,a)') 'MNC ERROR: vtype = ''', vtype,
523 & ''' is invalid--must be: [1|2|3]'
524 n = ILNBLNK(msgbuf)
525 CALL print_error(msgbuf(1:n), mythid)
526 stop 'ABNORMAL END: S/R MNC_VAR_WRITE_ALL'
527 ENDIF
528 write(msgbuf,'(5a)') 'writing variable ''', vname(1:lenv),
529 & ''' to file ''', fname(1:lenf), ''''
530 CALL MNC_HANDLE_ERR(myThid, err, msgbuf)
531
532 RETURN
533 END
534

  ViewVC Help
Powered by ViewVC 1.1.22