/[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.16 - (show annotations) (download)
Fri Apr 2 16:12:48 2004 UTC (20 years, 1 month ago) by edhill
Branch: MAIN
CVS Tags: checkpoint52n_post, checkpoint53d_post, checkpoint54a_pre, checkpoint54e_post, checkpoint54a_post, checkpoint53c_post, checkpoint54b_post, checkpoint53b_pre, checkpoint55b_post, checkpoint54d_post, checkpoint52m_post, checkpoint55, checkpoint53a_post, checkpoint54, checkpoint54f_post, checkpoint53b_post, checkpoint53, checkpoint53g_post, checkpoint53f_post, checkpoint55a_post, checkpoint53d_pre, checkpoint54c_post
Changes since 1.15: +14 -12 lines
 o more comments for the api_reference (protex)

1 C $Header: /u/gcmpack/MITgcm/pkg/mnc/mnc_var.F,v 1.15 2004/04/02 05:13:33 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
246 CALL MNC_VAR_ADD_ATTR_ANY(fname,vname,atname,
247 & 1, sval, 0, 0.0D0, 0.0, 0, myThid)
248 RETURN
249 END
250 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
251 CBOP 1
252 C !ROUTINE: MNC_VAR_ADD_ATTR_DBL
253
254 C !INTERFACE:
255 SUBROUTINE MNC_VAR_ADD_ATTR_DBL(
256 I fname,
257 I vname,
258 I atname,
259 I nv,
260 I dval,
261 I myThid )
262
263 C !DESCRIPTION:
264 C Subroutine for adding a double-precision real attribute to a
265 C NetCDF file.
266
267 C !USES:
268 implicit none
269
270 C !INPUT PARAMETERS:
271 integer myThid,nv
272 character*(*) fname,vname,atname
273 REAL*8 dval(*)
274 CEOP
275
276 CALL MNC_VAR_ADD_ATTR_ANY(fname,vname,atname,
277 & 2, ' ', nv, dval, 0.0, 0, myThid)
278 RETURN
279 END
280
281 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
282 CBOP 1
283 C !ROUTINE: MNC_VAR_ADD_ATTR_REAL
284
285 C !INTERFACE:
286 SUBROUTINE MNC_VAR_ADD_ATTR_REAL(
287 I fname,
288 I vname,
289 I atname,
290 I nv,
291 I rval,
292 I myThid )
293
294 C !DESCRIPTION:
295 C Subroutine for adding a single-precision real attribute to a
296 C NetCDF file.
297
298 C !USES:
299 implicit none
300
301 C !INPUT PARAMETERS:
302 integer myThid,nv
303 character*(*) fname,vname,atname
304 REAL*4 rval(*)
305 CEOP
306
307 CALL MNC_VAR_ADD_ATTR_ANY(fname,vname,atname,
308 & 3, ' ', nv, 0.0D0, rval, 0, myThid)
309 RETURN
310 END
311
312 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
313 CBOP 1
314 C !ROUTINE: MNC_VAR_ADD_ATTR_INT
315
316 C !INTERFACE:
317 SUBROUTINE MNC_VAR_ADD_ATTR_INT(
318 I fname,
319 I vname,
320 I atname,
321 I nv,
322 I ival,
323 I myThid )
324
325 C !DESCRIPTION:
326 C Subroutine for adding an integer attribute to a
327 C NetCDF file.
328
329 C !USES:
330 implicit none
331
332 C !INPUT PARAMETERS:
333 integer myThid,nv
334 character*(*) fname,vname,atname
335 integer ival(*)
336 CEOP
337
338 CALL MNC_VAR_ADD_ATTR_ANY(fname,vname,atname,
339 & 4, ' ', nv, 0.0D0, 0.0, ival, myThid)
340 RETURN
341 END
342
343 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
344 CBOP 1
345 C !ROUTINE: MNC_VAR_ADD_ATTR_ANY
346
347 C !INTERFACE:
348 SUBROUTINE MNC_VAR_ADD_ATTR_ANY(
349 I fname,
350 I vname,
351 I atname,
352 I atype, cs,len,dv,rv,iv,
353 I myThid )
354
355 C !DESCRIPTION:
356 C General subroutine for adding attributes to a NetCDF file.
357
358 C !USES:
359 implicit none
360 #include "netcdf.inc"
361 #include "mnc_common.h"
362 #include "EEPARAMS.h"
363
364 C !INPUT PARAMETERS:
365 integer myThid,atype,len
366 character*(*) fname,vname,atname
367 character*(*) cs
368 REAL*8 dv(*)
369 REAL*4 rv(*)
370 integer iv(*)
371 CEOP
372
373 C !LOCAL VARIABLES:
374 integer n, indf,ind_fv_ids, fid,vid, err
375 character*(MAX_LEN_MBUF) msgbuf
376 integer lenf,lenv,lenat,lens
377
378 C Functions
379 integer ILNBLNK
380
381 C Strip trailing spaces
382 lenf = ILNBLNK(fname)
383 lenv = ILNBLNK(vname)
384 lenat = ILNBLNK(atname)
385 lens = ILNBLNK(cs)
386
387 CALL MNC_GET_FVINDS(fname, vname, indf, ind_fv_ids, myThid)
388 IF ((indf .LT. 1).OR.(ind_fv_ids .LT. 1)) THEN
389 write(msgbuf,'(5a)') 'MNC ERROR: file ''', fname(1:lenf),
390 & ''' is not open or does not contain variable ''',
391 & vname(1:lenv), ''''
392 CALL print_error(msgbuf, mythid)
393 stop 'ABNORMAL END: S/R MNC_VAR_ADD_ATTR_STR'
394 ENDIF
395 fid = mnc_f_info(indf,2)
396 vid = mnc_fv_ids(indf,(ind_fv_ids+1))
397
398 C Set the attribute
399 CALL MNC_FILE_REDEF(fname, myThid)
400 IF (atype .EQ. 1) THEN
401 err = NF_PUT_ATT_TEXT(fid, vid, atname, lens, cs)
402 ELSEIF (atype .EQ. 2) THEN
403 err = NF_PUT_ATT_DOUBLE(fid, vid, atname, NF_DOUBLE, len, dv)
404 ELSEIF (atype .EQ. 3) THEN
405 err = NF_PUT_ATT_REAL(fid, vid, atname, NF_FLOAT, len, rv)
406 ELSEIF (atype .EQ. 4) THEN
407 err = NF_PUT_ATT_INT(fid, vid, atname, NF_INT, len, iv)
408 ELSE
409 write(msgbuf,'(a,i10,a)') 'MNC ERROR: atype = ''', atype,
410 & ''' is invalid--must be: [1-4]'
411 n = ILNBLNK(msgbuf)
412 CALL print_error(msgbuf(1:n), mythid)
413 stop 'ABNORMAL END: S/R MNC_VAR_ADD_ATTR_ANY'
414 ENDIF
415 write(msgbuf,'(5a)') 'adding attribute ''', atname(1:lenat),
416 & ''' to file ''', fname(1:lenf), ''''
417 CALL MNC_HANDLE_ERR(err, msgbuf, myThid)
418
419 RETURN
420 END
421
422 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
423
424 SUBROUTINE MNC_VAR_WRITE_DBL(
425 I fname,
426 I vname,
427 I var,
428 I myThid )
429
430 implicit none
431 C Arguments
432 integer myThid
433 character*(*) fname,vname
434 REAL*8 var(*)
435
436 CALL MNC_VAR_WRITE_ANY(fname,vname,1,0,var,0.0,0, myThid)
437 RETURN
438 END
439
440 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
441
442 SUBROUTINE MNC_VAR_WRITE_REAL(
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*4 var(*)
453
454 CALL MNC_VAR_WRITE_ANY(fname,vname,2,0,0.0D0,var,0, myThid)
455 RETURN
456 END
457
458 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
459
460 SUBROUTINE MNC_VAR_WRITE_INT(
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 integer var(*)
471
472 CALL MNC_VAR_WRITE_ANY(fname,vname,3,0,0.0D0,0.0,var, myThid)
473 RETURN
474 END
475
476 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
477
478 SUBROUTINE MNC_VAR_APPEND_DBL(
479 I fname,
480 I vname,
481 I var,
482 I append,
483 I myThid )
484
485 implicit none
486 C Arguments
487 integer myThid, append
488 character*(*) fname,vname
489 REAL*8 var(*)
490
491 CALL MNC_VAR_WRITE_ANY(fname,vname,1,append,var,0.0,0, myThid)
492 RETURN
493 END
494
495 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
496
497 SUBROUTINE MNC_VAR_APPEND_REAL(
498 I fname,
499 I vname,
500 I var,
501 I append,
502 I myThid )
503
504 implicit none
505 C Arguments
506 integer myThid, append
507 character*(*) fname,vname
508 REAL*4 var(*)
509
510 CALL MNC_VAR_WRITE_ANY(fname,vname,2,append,0.0D0,var,0,myThid)
511 RETURN
512 END
513
514 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
515
516 SUBROUTINE MNC_VAR_APPEND_INT(
517 I fname,
518 I vname,
519 I var,
520 I append,
521 I myThid )
522
523 implicit none
524 C Arguments
525 integer myThid, append
526 character*(*) fname,vname
527 integer var(*)
528
529 CALL MNC_VAR_WRITE_ANY(fname,vname,3,append,0.0D0,0.0,var,myThid)
530 RETURN
531 END
532
533 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
534
535 SUBROUTINE MNC_VAR_WRITE_ANY(
536 I fname,
537 I vname,
538 I vtype,
539 I append,
540 I dv,
541 I rv,
542 I iv,
543 I myThid )
544
545 implicit none
546 #include "netcdf.inc"
547 #include "mnc_common.h"
548 #include "EEPARAMS.h"
549
550 C Arguments
551 integer myThid, vtype
552 character*(*) fname,vname
553 REAL*8 dv(*)
554 REAL*4 rv(*)
555 integer iv(*)
556 integer append
557
558 C Functions
559 integer ILNBLNK
560
561 C Local Variables
562 integer i,j,k, n, indf,ind_fv_ids, fid,vid,did, ig, err, ds,de
563 character*(MAX_LEN_MBUF) msgbuf
564 integer lenf,lenv, lend
565 integer vstart(100), vcount(100)
566
567 C Strip trailing spaces
568 lenf = ILNBLNK(fname)
569 lenv = ILNBLNK(vname)
570
571 CALL MNC_GET_FVINDS(fname, vname, indf, ind_fv_ids, myThid)
572 IF ((indf .LT. 1).OR.(ind_fv_ids .LT. 1)) THEN
573 write(msgbuf,'(5a)') 'MNC ERROR: file ''', fname(1:lenf),
574 & ''' is not open or does not contain variable ''',
575 & vname(1:lenv), ''''
576 CALL print_error(msgbuf, mythid)
577 stop 'ABNORMAL END: S/R MNC_VAR_ADD_ATTR_STR'
578 ENDIF
579 fid = mnc_f_info(indf,2)
580 vid = mnc_fv_ids(indf,(ind_fv_ids+1))
581
582 C Get the lengths from the dim IDs
583 ig = mnc_fv_ids(indf,(ind_fv_ids+2))
584 ds = mnc_f_info(indf,ig+1)
585 de = mnc_f_info(indf,ig+2)
586 k = 0
587 DO i = ds,de
588 k = k + 1
589 vstart(k) = 1
590 vcount(k) = mnc_d_size( mnc_fd_ind(indf,i) )
591 ENDDO
592
593 C Check for the unlimited dimension
594 j = mnc_d_size( mnc_fd_ind(indf,de) )
595 IF (j .LT. 1) THEN
596 did = mnc_d_ids( mnc_fd_ind(indf,de) )
597 err = NF_INQ_DIMLEN(fid, did, lend)
598 write(msgbuf,'(a)') 'reading current length of unlimited dim'
599 CALL MNC_HANDLE_ERR(err, msgbuf, myThid)
600 IF (append .GT. 0) THEN
601 lend = lend + append
602 ENDIF
603 IF (lend .LT. 1) lend = 1
604 vstart(k) = lend
605 vcount(k) = 1
606 ENDIF
607
608 CALL MNC_FILE_ENDDEF(fname, myThid)
609 IF (vtype .EQ. 1) THEN
610 err = NF_PUT_VARA_DOUBLE(fid, vid, vstart, vcount, dv)
611 ELSEIF (vtype .EQ. 2) THEN
612 err = NF_PUT_VARA_REAL(fid, vid, vstart, vcount, rv)
613 ELSEIF (vtype .EQ. 3) THEN
614 err = NF_PUT_VARA_INT(fid, vid, vstart, vcount, iv)
615 ELSE
616 write(msgbuf,'(a,i10,a)') 'MNC ERROR: vtype = ''', vtype,
617 & ''' is invalid--must be: [1|2|3]'
618 n = ILNBLNK(msgbuf)
619 CALL print_error(msgbuf(1:n), mythid)
620 stop 'ABNORMAL END: S/R MNC_VAR_WRITE_ALL'
621 ENDIF
622 write(msgbuf,'(5a)') 'writing variable ''', vname(1:lenv),
623 & ''' to file ''', fname(1:lenf), ''''
624 CALL MNC_HANDLE_ERR(err, msgbuf, myThid)
625
626 RETURN
627 END
628
629 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
630

  ViewVC Help
Powered by ViewVC 1.1.22