/[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.17 - (show annotations) (download)
Thu Sep 23 16:17:57 2004 UTC (19 years, 7 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint55c_post, checkpoint55d_pre, checkpoint57b_post, checkpoint55j_post, checkpoint56b_post, checkpoint55h_post, checkpoint56c_post, checkpoint57a_post, checkpoint55g_post, checkpoint55f_post, checkpoint57a_pre, checkpoint55i_post, checkpoint57, checkpoint56, checkpoint55e_post, checkpoint56a_post, checkpoint55d_post
Changes since 1.16: +23 -5 lines
try to pass through the Check-Bounds option (but didn't get very far)

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

  ViewVC Help
Powered by ViewVC 1.1.22