/[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.20 - (show annotations) (download)
Fri Mar 10 05:50:23 2006 UTC (18 years, 2 months ago) by edhill
Branch: MAIN
Changes since 1.19: +3 -2 lines
various mnc cleanups and improvements:
 + shrink lookup tables by factor of ~4
 + better error reporting when running out of lookup space
 + able to handle longer path/file names (up to 500 chars)

1 C $Header: /u/gcmpack/MITgcm/pkg/mnc/mnc_var.F,v 1.19 2006/02/24 20:39:10 edhill Exp $
2 C $Name: $
3
4 #include "MNC_OPTIONS.h"
5
6 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7 CBOP 1
8 C !ROUTINE: MNC_VAR_INIT_DBL
9
10 C !INTERFACE:
11 SUBROUTINE MNC_VAR_INIT_DBL(
12 I fname,
13 I gname,
14 I vname,
15 I irv,
16 I myThid )
17
18 C !DESCRIPTION:
19 C Create a double-precision real variable within a NetCDF file
20 C context.
21
22 C !USES:
23 implicit none
24 #include "netcdf.inc"
25
26 C !INPUT PARAMETERS:
27 integer irv,myThid
28 character*(*) fname,gname,vname
29 CEOP
30
31 CALL MNC_VAR_INIT_ANY(fname,gname,vname, NF_DOUBLE, irv,myThid)
32 RETURN
33 END
34
35 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
36 CBOP 1
37 C !ROUTINE: MNC_VAR_INIT_REAL
38
39 C !INTERFACE:
40 SUBROUTINE MNC_VAR_INIT_REAL(
41 I fname,
42 I gname,
43 I vname,
44 I irv,
45 I myThid )
46
47 C !DESCRIPTION:
48 C Create a single-precision real variable within a NetCDF file
49 C context.
50
51 C !USES:
52 implicit none
53 #include "netcdf.inc"
54
55 C !INPUT PARAMETERS:
56 integer irv,myThid
57 character*(*) fname,gname,vname
58 CEOP
59
60 CALL MNC_VAR_INIT_ANY(fname,gname,vname, NF_FLOAT, irv,myThid)
61 RETURN
62 END
63
64 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
65 CBOP 1
66 C !ROUTINE: MNC_VAR_INIT_INT
67
68 C !INTERFACE:
69 SUBROUTINE MNC_VAR_INIT_INT(
70 I fname,
71 I gname,
72 I vname,
73 I irv,
74 I myThid )
75
76 C !DESCRIPTION:
77 C Create an integer variable within a NetCDF file context.
78
79 C !USES:
80 implicit none
81 #include "netcdf.inc"
82
83 C !INPUT PARAMETERS:
84 integer irv,myThid
85 character*(*) fname,gname,vname
86 CEOP
87
88 CALL MNC_VAR_INIT_ANY(fname,gname,vname, NF_INT, irv,myThid)
89 RETURN
90 END
91
92 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
93 CBOP 1
94 C !ROUTINE: MNC_VAR_INIT_ANY
95
96 C !INTERFACE:
97 SUBROUTINE MNC_VAR_INIT_ANY(
98 I fname,
99 I gname,
100 I vname,
101 I vtype,
102 I irv,
103 I myThid )
104
105 C !DESCRIPTION:
106 C General function for creating variables within a NetCDF file
107 C context.
108
109 C !USES:
110 implicit none
111 #include "netcdf.inc"
112 #include "mnc_common.h"
113 #include "EEPARAMS.h"
114
115 C !INPUT PARAMETERS:
116 integer irv,myThid
117 character*(*) fname,gname,vname
118 integer vtype
119 CEOP
120
121 C !LOCAL VARIABLES:
122 integer i,j,k, n, indf,indv, fid, nd, ngrid, is,ie, err
123 integer vid, nv, ind_g_finfo, needed, nvar
124 character*(MAX_LEN_MBUF) msgbuf
125 integer ids(20)
126 integer lenf,leng,lenv
127
128 C Functions
129 integer ILNBLNK
130
131 C Strip trailing spaces
132 lenf = ILNBLNK(fname)
133 leng = ILNBLNK(gname)
134 lenv = ILNBLNK(vname)
135
136 C Check that the file is open
137 CALL MNC_GET_IND(MNC_MAX_ID, fname, mnc_f_names, indf, myThid)
138 IF (indf .LT. 1) THEN
139 write(msgbuf,'(3a)') 'MNC ERROR: file ''', fname,
140 & ''' must be opened first'
141 CALL print_error(msgbuf, mythid)
142 stop 'ABNORMAL END: S/R MNC_VAR_INIT_ANY'
143 ENDIF
144 fid = mnc_f_info(indf,2)
145
146 C Check for sufficient storage space in mnc_fv_ids
147 needed = 1 + 3*(mnc_fv_ids(indf,1) + 1)
148 IF (needed .GE. MNC_MAX_INFO) THEN
149 write(msgbuf,'(2a,i7,a)') 'MNC ERROR: MNC_MAX_INFO exceeded',
150 & ': please increase it to ', 2*MNC_MAX_INFO,
151 & ' in the file ''pkg/mnc/mnc_common.h'''
152 CALL print_error(msgbuf, mythid)
153 stop 'ABNORMAL END: S/R MNC_VAR_INIT_ANY'
154 ENDIF
155
156 C Get the grid information
157 ngrid = mnc_f_info(indf,3)
158 IF (ngrid .LT. 1) THEN
159 write(msgbuf,'(3a)') 'MNC ERROR: file ''', fname(1:lenf),
160 & ''' contains NO grids'
161 CALL print_error(msgbuf, mythid)
162 stop 'ABNORMAL END: S/R MNC_VAR_INIT_ANY'
163 ENDIF
164 DO i = 1,ngrid
165 j = 4 + (i-1)*3
166 k = mnc_f_info(indf,j)
167 n = ILNBLNK(mnc_g_names(k))
168 IF ((leng .EQ. n)
169 & .AND. (mnc_g_names(k)(1:n) .EQ. gname(1:n))) THEN
170 ind_g_finfo = j
171 is = mnc_f_info(indf,(j+1))
172 ie = mnc_f_info(indf,(j+2))
173 nd = 0
174 DO k = is,ie
175 nd = nd + 1
176 ids(nd) = mnc_d_ids(mnc_fd_ind(indf,k))
177 ENDDO
178 GOTO 10
179 ENDIF
180 ENDDO
181 write(msgbuf,'(5a)') 'MNC ERROR: file ''', fname(1:lenf),
182 & ''' does not contain grid ''', gname(1:leng), ''''
183 CALL print_error(msgbuf, mythid)
184 stop 'ABNORMAL END: S/R MNC_VAR_INIT_ANY'
185 10 CONTINUE
186
187 C Check if the variable is already defined
188 nvar = mnc_fv_ids(indf,1)
189 DO i = 1,nvar
190 j = 2 + 3*(i-1)
191 IF (mnc_v_names(mnc_fv_ids(indf,j)) .EQ. vname) THEN
192 k = mnc_f_info(indf,mnc_fv_ids(indf,j+2))
193 IF (mnc_g_names(k) .NE. gname) THEN
194 write(msgbuf,'(5a)') 'MNC ERROR: variable ''',
195 & vname(1:lenv), ''' is already defined in file ''',
196 & fname(1:lenf), ''' but using a different grid shape'
197 CALL print_error(msgbuf, mythid)
198 stop 'ABNORMAL END: S/R MNC_VAR_INIT_ANY'
199 ELSE
200 C Its OK, the variable and grid names are the same
201 irv = 0
202 RETURN
203 ENDIF
204 ENDIF
205 ENDDO
206
207 irv = 1
208
209 C Add the variable definition
210 CALL MNC_FILE_REDEF(fname, myThid)
211 err = NF_DEF_VAR(fid, vname, vtype, nd, ids, vid)
212 IF ( err .NE. NF_NOERR ) THEN
213 write(msgbuf,'(2a)') 'ERROR: MNC will not ',
214 & 'overwrite variables in existing NetCDF'
215 CALL PRINT_ERROR( msgBuf, myThid )
216 write(msgbuf,'(2a)') ' files. Please',
217 & ' make sure that you are not trying to'
218 CALL PRINT_ERROR( msgBuf, myThid )
219 write(msgbuf,'(2a)') ' overwrite output',
220 & 'files from a previous model run!'
221 CALL PRINT_ERROR( msgBuf, myThid )
222 write(msgbuf,'(5a)') 'defining variable ''', vname(1:lenv),
223 & ''' in file ''', fname(1:lenf), ''''
224 CALL MNC_HANDLE_ERR(err, msgbuf, myThid)
225 ENDIF
226
227 C Success, so save the variable info
228 CALL MNC_GET_NEXT_EMPTY_IND(MNC_MAX_ID,mnc_v_names,'mnc_v_names',
229 & indv, myThid)
230 mnc_v_names(indv)(1:lenv) = vname(1:lenv)
231 nv = mnc_fv_ids(indf,1)
232 i = 2 + nv*3
233 mnc_fv_ids(indf,i) = indv
234 mnc_fv_ids(indf,i+1) = vid
235 mnc_fv_ids(indf,i+2) = ind_g_finfo
236 mnc_fv_ids(indf,1) = nv + 1
237
238 RETURN
239 END
240
241 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
242 CBOP 1
243 C !ROUTINE: MNC_VAR_ADD_ATTR_STR
244
245 C !INTERFACE:
246 SUBROUTINE MNC_VAR_ADD_ATTR_STR(
247 I fname,
248 I vname,
249 I atname,
250 I sval,
251 I myThid )
252
253 C !DESCRIPTION:
254 C Subroutine for adding a character string attribute to a NetCDF
255 C file.
256
257 C !USES:
258 implicit none
259
260 C !INPUT PARAMETERS:
261 integer myThid
262 character*(*) fname,vname,atname,sval
263 CEOP
264 real*8 dZero(1)
265 real*4 sZero(1)
266 integer iZero(1)
267 dZero(1) = 0.0D0
268 sZero(1) = 0.0
269 iZero(1) = 0
270
271 CALL MNC_VAR_ADD_ATTR_ANY(fname,vname,atname,
272 & 1, sval, 0, dZero, sZero, iZero, myThid)
273 RETURN
274 END
275 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
276 CBOP 1
277 C !ROUTINE: MNC_VAR_ADD_ATTR_DBL
278
279 C !INTERFACE:
280 SUBROUTINE MNC_VAR_ADD_ATTR_DBL(
281 I fname,
282 I vname,
283 I atname,
284 I nv,
285 I dval,
286 I myThid )
287
288 C !DESCRIPTION:
289 C Subroutine for adding a double-precision real attribute to a
290 C NetCDF file.
291
292 C !USES:
293 implicit none
294
295 C !INPUT PARAMETERS:
296 integer myThid,nv
297 character*(*) fname,vname,atname
298 REAL*8 dval(*)
299 CEOP
300 real*4 sZero(1)
301 integer iZero(1)
302 sZero(1) = 0.0
303 iZero(1) = 0
304
305 CALL MNC_VAR_ADD_ATTR_ANY(fname,vname,atname,
306 & 2, ' ', nv, dval, sZero, iZero, myThid)
307 RETURN
308 END
309
310 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
311 CBOP 1
312 C !ROUTINE: MNC_VAR_ADD_ATTR_REAL
313
314 C !INTERFACE:
315 SUBROUTINE MNC_VAR_ADD_ATTR_REAL(
316 I fname,
317 I vname,
318 I atname,
319 I nv,
320 I rval,
321 I myThid )
322
323 C !DESCRIPTION:
324 C Subroutine for adding a single-precision real attribute to a
325 C NetCDF file.
326
327 C !USES:
328 implicit none
329
330 C !INPUT PARAMETERS:
331 integer myThid,nv
332 character*(*) fname,vname,atname
333 REAL*4 rval(*)
334 CEOP
335 real*8 dZero(1)
336 integer iZero(1)
337 dZero(1) = 0.0D0
338 iZero(1) = 0
339
340 CALL MNC_VAR_ADD_ATTR_ANY(fname,vname,atname,
341 & 3, ' ', nv, dZero, rval, iZero, myThid)
342 RETURN
343 END
344
345 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
346 CBOP 1
347 C !ROUTINE: MNC_VAR_ADD_ATTR_INT
348
349 C !INTERFACE:
350 SUBROUTINE MNC_VAR_ADD_ATTR_INT(
351 I fname,
352 I vname,
353 I atname,
354 I nv,
355 I ival,
356 I myThid )
357
358 C !DESCRIPTION:
359 C Subroutine for adding an integer attribute to a
360 C NetCDF file.
361
362 C !USES:
363 implicit none
364
365 C !INPUT PARAMETERS:
366 integer myThid,nv
367 character*(*) fname,vname,atname
368 integer ival(*)
369 CEOP
370 real*8 dZero(1)
371 real*4 sZero(1)
372 dZero(1) = 0.0D0
373 sZero(1) = 0.0
374
375 CALL MNC_VAR_ADD_ATTR_ANY(fname,vname,atname,
376 & 4, ' ', nv, dZero, sZero, ival, myThid)
377 RETURN
378 END
379
380 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
381 CBOP 1
382 C !ROUTINE: MNC_VAR_ADD_ATTR_ANY
383
384 C !INTERFACE:
385 SUBROUTINE MNC_VAR_ADD_ATTR_ANY(
386 I fname,
387 I vname,
388 I atname,
389 I atype, cs,len,dv,rv,iv,
390 I myThid )
391
392 C !DESCRIPTION:
393 C General subroutine for adding attributes to a NetCDF file.
394
395 C !USES:
396 implicit none
397 #include "netcdf.inc"
398 #include "mnc_common.h"
399 #include "EEPARAMS.h"
400
401 C !INPUT PARAMETERS:
402 integer myThid,atype,len
403 character*(*) fname,vname,atname
404 character*(*) cs
405 REAL*8 dv(*)
406 REAL*4 rv(*)
407 integer iv(*)
408 CEOP
409
410 C !LOCAL VARIABLES:
411 integer n, indf,ind_fv_ids, fid,vid, err
412 character*(MAX_LEN_MBUF) msgbuf
413 integer lenf,lenv,lenat,lens
414
415 C Functions
416 integer ILNBLNK
417
418 C Strip trailing spaces
419 lenf = ILNBLNK(fname)
420 lenv = ILNBLNK(vname)
421 lenat = ILNBLNK(atname)
422 lens = ILNBLNK(cs)
423
424 CALL MNC_GET_FVINDS(fname, vname, indf, ind_fv_ids, myThid)
425 IF ((indf .LT. 1).OR.(ind_fv_ids .LT. 1)) THEN
426 write(msgbuf,'(5a)') 'MNC ERROR: file ''', fname(1:lenf),
427 & ''' is not open or does not contain variable ''',
428 & vname(1:lenv), ''''
429 CALL print_error(msgbuf, mythid)
430 stop 'ABNORMAL END: S/R MNC_VAR_ADD_ATTR_STR'
431 ENDIF
432 fid = mnc_f_info(indf,2)
433 vid = mnc_fv_ids(indf,(ind_fv_ids+1))
434
435 C Set the attribute
436 CALL MNC_FILE_REDEF(fname, myThid)
437 IF (atype .EQ. 1) THEN
438 err = NF_PUT_ATT_TEXT(fid, vid, atname, lens, cs)
439 ELSEIF (atype .EQ. 2) THEN
440 err = NF_PUT_ATT_DOUBLE(fid, vid, atname, NF_DOUBLE, len, dv)
441 ELSEIF (atype .EQ. 3) THEN
442 err = NF_PUT_ATT_REAL(fid, vid, atname, NF_FLOAT, len, rv)
443 ELSEIF (atype .EQ. 4) THEN
444 err = NF_PUT_ATT_INT(fid, vid, atname, NF_INT, len, iv)
445 ELSE
446 write(msgbuf,'(a,i10,a)') 'MNC ERROR: atype = ''', atype,
447 & ''' is invalid--must be: [1-4]'
448 n = ILNBLNK(msgbuf)
449 CALL print_error(msgbuf(1:n), mythid)
450 stop 'ABNORMAL END: S/R MNC_VAR_ADD_ATTR_ANY'
451 ENDIF
452 write(msgbuf,'(5a)') 'adding attribute ''', atname(1:lenat),
453 & ''' to file ''', fname(1:lenf), ''''
454 CALL MNC_HANDLE_ERR(err, msgbuf, myThid)
455
456 RETURN
457 END
458
459 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
460
461 SUBROUTINE MNC_VAR_WRITE_DBL(
462 I fname,
463 I vname,
464 I var,
465 I myThid )
466
467 implicit none
468 C Arguments
469 integer myThid
470 character*(*) fname,vname
471 REAL*8 var(*)
472
473 CALL MNC_VAR_WRITE_ANY(fname,vname,1,0,var,0.0,0, myThid)
474 RETURN
475 END
476
477 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
478
479 SUBROUTINE MNC_VAR_WRITE_REAL(
480 I fname,
481 I vname,
482 I var,
483 I myThid )
484
485 implicit none
486 C Arguments
487 integer myThid
488 character*(*) fname,vname
489 REAL*4 var(*)
490
491 CALL MNC_VAR_WRITE_ANY(fname,vname,2,0,0.0D0,var,0, myThid)
492 RETURN
493 END
494
495 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
496
497 SUBROUTINE MNC_VAR_WRITE_INT(
498 I fname,
499 I vname,
500 I var,
501 I myThid )
502
503 implicit none
504 C Arguments
505 integer myThid
506 character*(*) fname,vname
507 integer var(*)
508
509 CALL MNC_VAR_WRITE_ANY(fname,vname,3,0,0.0D0,0.0,var, myThid)
510 RETURN
511 END
512
513 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
514
515 SUBROUTINE MNC_VAR_APPEND_DBL(
516 I fname,
517 I vname,
518 I var,
519 I append,
520 I myThid )
521
522 implicit none
523 C Arguments
524 integer myThid, append
525 character*(*) fname,vname
526 REAL*8 var(*)
527
528 CALL MNC_VAR_WRITE_ANY(fname,vname,1,append,var,0.0,0, myThid)
529 RETURN
530 END
531
532 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
533
534 SUBROUTINE MNC_VAR_APPEND_REAL(
535 I fname,
536 I vname,
537 I var,
538 I append,
539 I myThid )
540
541 implicit none
542 C Arguments
543 integer myThid, append
544 character*(*) fname,vname
545 REAL*4 var(*)
546
547 CALL MNC_VAR_WRITE_ANY(fname,vname,2,append,0.0D0,var,0,myThid)
548 RETURN
549 END
550
551 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
552
553 SUBROUTINE MNC_VAR_APPEND_INT(
554 I fname,
555 I vname,
556 I var,
557 I append,
558 I myThid )
559
560 implicit none
561 C Arguments
562 integer myThid, append
563 character*(*) fname,vname
564 integer var(*)
565
566 CALL MNC_VAR_WRITE_ANY(fname,vname,3,append,0.0D0,0.0,var,myThid)
567 RETURN
568 END
569
570 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
571
572 SUBROUTINE MNC_VAR_WRITE_ANY(
573 I fname,
574 I vname,
575 I vtype,
576 I append,
577 I dv,
578 I rv,
579 I iv,
580 I myThid )
581
582 implicit none
583 #include "netcdf.inc"
584 #include "mnc_common.h"
585 #include "EEPARAMS.h"
586
587 C Arguments
588 integer myThid, vtype
589 character*(*) fname,vname
590 REAL*8 dv(*)
591 REAL*4 rv(*)
592 integer iv(*)
593 integer append
594
595 C Functions
596 integer ILNBLNK
597
598 C Local Variables
599 integer i,j,k, n, indf,ind_fv_ids, fid,vid,did, ig, err, ds,de
600 character*(MAX_LEN_MBUF) msgbuf
601 integer lenf,lenv, lend
602 integer vstart(100), vcount(100)
603
604 C Strip trailing spaces
605 lenf = ILNBLNK(fname)
606 lenv = ILNBLNK(vname)
607
608 CALL MNC_GET_FVINDS(fname, vname, indf, ind_fv_ids, myThid)
609 IF ((indf .LT. 1).OR.(ind_fv_ids .LT. 1)) THEN
610 write(msgbuf,'(5a)') 'MNC ERROR: file ''', fname(1:lenf),
611 & ''' is not open or does not contain variable ''',
612 & vname(1:lenv), ''''
613 CALL print_error(msgbuf, mythid)
614 stop 'ABNORMAL END: S/R MNC_VAR_ADD_ATTR_STR'
615 ENDIF
616 fid = mnc_f_info(indf,2)
617 vid = mnc_fv_ids(indf,(ind_fv_ids+1))
618
619 C Get the lengths from the dim IDs
620 ig = mnc_fv_ids(indf,(ind_fv_ids+2))
621 ds = mnc_f_info(indf,ig+1)
622 de = mnc_f_info(indf,ig+2)
623 k = 0
624 DO i = ds,de
625 k = k + 1
626 vstart(k) = 1
627 vcount(k) = mnc_d_size( mnc_fd_ind(indf,i) )
628 ENDDO
629
630 C Check for the unlimited dimension
631 j = mnc_d_size( mnc_fd_ind(indf,de) )
632 IF (j .LT. 1) THEN
633 did = mnc_d_ids( mnc_fd_ind(indf,de) )
634 err = NF_INQ_DIMLEN(fid, did, lend)
635 write(msgbuf,'(a)') 'reading current length of unlimited dim'
636 CALL MNC_HANDLE_ERR(err, msgbuf, myThid)
637 IF (append .GT. 0) THEN
638 lend = lend + append
639 ENDIF
640 IF (lend .LT. 1) lend = 1
641 vstart(k) = lend
642 vcount(k) = 1
643 ENDIF
644
645 CALL MNC_FILE_ENDDEF(fname, myThid)
646 IF (vtype .EQ. 1) THEN
647 err = NF_PUT_VARA_DOUBLE(fid, vid, vstart, vcount, dv)
648 ELSEIF (vtype .EQ. 2) THEN
649 err = NF_PUT_VARA_REAL(fid, vid, vstart, vcount, rv)
650 ELSEIF (vtype .EQ. 3) THEN
651 err = NF_PUT_VARA_INT(fid, vid, vstart, vcount, iv)
652 ELSE
653 write(msgbuf,'(a,i10,a)') 'MNC ERROR: vtype = ''', vtype,
654 & ''' is invalid--must be: [1|2|3]'
655 n = ILNBLNK(msgbuf)
656 CALL print_error(msgbuf(1:n), mythid)
657 stop 'ABNORMAL END: S/R MNC_VAR_WRITE_ALL'
658 ENDIF
659 write(msgbuf,'(5a)') 'writing variable ''', vname(1:lenv),
660 & ''' to file ''', fname(1:lenf), ''''
661 CALL MNC_HANDLE_ERR(err, msgbuf, myThid)
662
663 RETURN
664 END
665
666 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
667

  ViewVC Help
Powered by ViewVC 1.1.22