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

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

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


Revision 1.9 - (hide annotations) (download)
Sun Jan 18 23:23:15 2004 UTC (20 years, 4 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint52i_post, checkpoint52i_pre, checkpoint52h_pre
Changes since 1.8: +67 -5 lines
 o first working (tested) version of MNC that duplicates most of the
     model/src/write_state.F functionalty
 o add MNC hooks in write_state.F and the_model_main.F
 o fix loop nesting error in mnc_reshape.template
 o add MNC_VAR_APPEND_* routines for UNLIMITED-dim variables

1 edhill 1.9 C $Header: /u/u3/gcmpack/MITgcm/pkg/mnc/mnc_var.F,v 1.8 2004/01/17 13:55:49 edhill Exp $
2 edhill 1.1 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 edhill 1.5 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 edhill 1.1 I vname,
73 edhill 1.5 I units,
74     I vtype )
75 edhill 1.1
76     implicit none
77 edhill 1.3 #include "netcdf.inc"
78 edhill 1.1 #include "mnc_common.h"
79     #include "EEPARAMS.h"
80    
81     C Arguments
82     integer myThid
83 edhill 1.5 character*(*) fname,gname,vname,units
84     integer vtype
85 edhill 1.1
86     C Functions
87     integer ILNBLNK
88    
89     C Local Variables
90 edhill 1.3 integer i,j,k, n, indf,indv, fid, nd, ngrid, is,ie, err
91 edhill 1.8 integer vid, nv, ind_g_finfo, needed
92 edhill 1.1 character*(MAX_LEN_MBUF) msgbuf
93 edhill 1.8 integer ids(20)
94 edhill 1.5 integer lenf,leng,lenv,lenu
95 edhill 1.1
96 edhill 1.3 C Strip trailing spaces
97     lenf = ILNBLNK(fname)
98     leng = ILNBLNK(gname)
99     lenv = ILNBLNK(vname)
100 edhill 1.5 lenu = ILNBLNK(units)
101 edhill 1.3
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 edhill 1.7 stop 'ABNORMAL END: S/R MNC_VAR_INIT_ANY'
109 edhill 1.1 ENDIF
110 edhill 1.3 fid = mnc_f_info(indf,2)
111    
112 edhill 1.8 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 edhill 1.3 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 edhill 1.7 stop 'ABNORMAL END: S/R MNC_VAR_INIT_ANY'
129 edhill 1.3 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 edhill 1.4 ind_g_finfo = j
137 edhill 1.3 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 edhill 1.7 stop 'ABNORMAL END: S/R MNC_VAR_INIT_ANY'
151 edhill 1.3 10 CONTINUE
152    
153     C Add the variable definition
154     CALL MNC_FILE_REDEF(myThid, fname)
155 edhill 1.5 err = NF_DEF_VAR(fid, vname, vtype, nd, ids, vid)
156 edhill 1.3 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 edhill 1.5 i = 2 + nv*3
165 edhill 1.3 j = i + 1
166 edhill 1.4 k = i + 2
167 edhill 1.3 mnc_fv_ids(indf,i) = indv
168     mnc_fv_ids(indf,j) = vid
169 edhill 1.4 mnc_fv_ids(indf,k) = ind_g_finfo
170 edhill 1.3 mnc_fv_ids(indf,1) = nv + 1
171    
172 edhill 1.5 C Add the units
173     CALL MNC_VAR_ADD_ATTR_STR(myThid, fname, vname, 'units', units)
174    
175 edhill 1.3 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 edhill 1.5 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 edhill 1.8 REAL*8 dval(*)
211 edhill 1.5
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 edhill 1.8 REAL*4 rval(*)
232 edhill 1.5
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 edhill 1.3 #include "netcdf.inc"
270     #include "mnc_common.h"
271     #include "EEPARAMS.h"
272    
273     C Arguments
274 edhill 1.5 integer myThid,atype,len
275     character*(*) fname,vname,atname
276     character*(*) cs
277 edhill 1.8 REAL*8 dv(*)
278     REAL*4 rv(*)
279 edhill 1.5 integer iv(*)
280 edhill 1.3
281     C Functions
282     integer ILNBLNK
283    
284     C Local Variables
285 edhill 1.8 integer n, indf,ind_fv_ids, fid,vid, err
286 edhill 1.3 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 edhill 1.5 lens = ILNBLNK(cs)
294 edhill 1.3
295 edhill 1.4 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 edhill 1.3 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 edhill 1.4 vid = mnc_fv_ids(indf,(ind_fv_ids+1))
305 edhill 1.3
306     C Set the attribute
307     CALL MNC_FILE_REDEF(myThid, fname)
308 edhill 1.5 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 edhill 1.3 write(msgbuf,'(5a)') 'adding attribute ''', atname(1:lenat),
324 edhill 1.4 & ''' 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 edhill 1.5 C Arguments
340     integer myThid
341     character*(*) fname,vname
342 edhill 1.8 REAL*8 var(*)
343 edhill 1.5
344 edhill 1.9 CALL MNC_VAR_WRITE_ANY(myThid,fname,vname,1,0,var,0.0,0)
345 edhill 1.5 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 edhill 1.8 REAL*4 var(*)
361 edhill 1.5
362 edhill 1.9 CALL MNC_VAR_WRITE_ANY(myThid,fname,vname,2,0,0.0D0,var,0)
363 edhill 1.5 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 edhill 1.9 CALL MNC_VAR_WRITE_ANY(myThid,fname,vname,3,0,0.0D0,0.0,var)
381     RETURN
382     END
383    
384     C==================================================================
385    
386     SUBROUTINE MNC_VAR_APPEND_DBL(
387     I myThid,
388     I fname,
389     I vname,
390     I var,
391     I append )
392    
393     implicit none
394     C Arguments
395     integer myThid, append
396     character*(*) fname,vname
397     REAL*8 var(*)
398    
399     CALL MNC_VAR_WRITE_ANY(myThid,fname,vname,1,append,var,0.0,0)
400     RETURN
401     END
402    
403     C==================================================================
404    
405     SUBROUTINE MNC_VAR_APPEND_REAL(
406     I myThid,
407     I fname,
408     I vname,
409     I var,
410     I append )
411    
412     implicit none
413     C Arguments
414     integer myThid, append
415     character*(*) fname,vname
416     REAL*4 var(*)
417    
418     CALL MNC_VAR_WRITE_ANY(myThid,fname,vname,2,append,0.0D0,var,0)
419     RETURN
420     END
421    
422     C==================================================================
423    
424     SUBROUTINE MNC_VAR_APPEND_INT(
425     I myThid,
426     I fname,
427     I vname,
428     I var,
429     I append )
430    
431     implicit none
432     C Arguments
433     integer myThid, append
434     character*(*) fname,vname
435     integer var(*)
436    
437     CALL MNC_VAR_WRITE_ANY(myThid,fname,vname,3,append,0.0D0,0.0,var)
438 edhill 1.5 RETURN
439     END
440    
441     C==================================================================
442    
443     SUBROUTINE MNC_VAR_WRITE_ANY(
444     I myThid,
445     I fname,
446     I vname,
447     I vtype,
448 edhill 1.9 I append,
449 edhill 1.5 I dv,
450     I rv,
451     I iv )
452    
453     implicit none
454 edhill 1.4 #include "netcdf.inc"
455     #include "mnc_common.h"
456     #include "EEPARAMS.h"
457    
458     C Arguments
459 edhill 1.5 integer myThid, vtype
460     character*(*) fname,vname
461 edhill 1.8 REAL*8 dv(*)
462     REAL*4 rv(*)
463 edhill 1.5 integer iv(*)
464 edhill 1.9 integer append
465 edhill 1.4
466     C Functions
467     integer ILNBLNK
468    
469     C Local Variables
470     integer i,j,k, n, indf,ind_fv_ids, fid,vid,did, ig, err, ds,de
471     character*(MAX_LEN_MBUF) msgbuf
472     integer lenf,lenv, lend
473     integer vstart(100), vcount(100)
474    
475     C Strip trailing spaces
476     lenf = ILNBLNK(fname)
477     lenv = ILNBLNK(vname)
478    
479     CALL MNC_GET_FVINDS(myThid, fname, vname, indf, ind_fv_ids)
480     IF ((indf .LT. 1).OR.(ind_fv_ids .LT. 1)) THEN
481     write(msgbuf,'(5a)') 'MNC ERROR: file ''', fname(1:lenf),
482     & ''' is not open or does not contain variable ''',
483     & vname(1:lenv), ''''
484     CALL print_error(msgbuf, mythid)
485     stop 'ABNORMAL END: S/R MNC_VAR_ADD_ATTR_STR'
486     ENDIF
487     fid = mnc_f_info(indf,2)
488     vid = mnc_fv_ids(indf,(ind_fv_ids+1))
489    
490     C Get the lengths from the dim IDs
491     ig = mnc_fv_ids(indf,(ind_fv_ids+2))
492     ds = mnc_f_info(indf,ig+1)
493     de = mnc_f_info(indf,ig+2)
494     k = 0
495     DO i = ds,de
496     k = k + 1
497     vstart(k) = 1
498     vcount(k) = mnc_d_size( mnc_fd_ind(indf,i) )
499     ENDDO
500    
501     C Check for the unlimited dimension
502     j = mnc_d_size( mnc_fd_ind(indf,de) )
503     IF (j .LT. 1) THEN
504     did = mnc_fg_ids(indf,de)
505     err = NF_INQ_DIMLEN(fid, did, lend)
506     write(msgbuf,'(a)') 'reading current length of unlimited dim'
507     CALL MNC_HANDLE_ERR(myThid, err, msgbuf)
508 edhill 1.9 IF (append .GT. 0) THEN
509     lend = lend + append
510     ENDIF
511     IF (lend .LT. 1) lend = 1
512 edhill 1.4 vstart(k) = lend
513     vcount(k) = 1
514     ENDIF
515    
516     CALL MNC_FILE_ENDDEF(myThid, fname)
517 edhill 1.5 IF (vtype .EQ. 1) THEN
518     err = NF_PUT_VARA_DOUBLE(fid, vid, vstart, vcount, dv)
519     ELSEIF (vtype .EQ. 2) THEN
520     err = NF_PUT_VARA_REAL(fid, vid, vstart, vcount, rv)
521     ELSEIF (vtype .EQ. 3) THEN
522     err = NF_PUT_VARA_INT(fid, vid, vstart, vcount, iv)
523     ELSE
524     write(msgbuf,'(a,i10,a)') 'MNC ERROR: vtype = ''', vtype,
525     & ''' is invalid--must be: [1|2|3]'
526     n = ILNBLNK(msgbuf)
527     CALL print_error(msgbuf(1:n), mythid)
528     stop 'ABNORMAL END: S/R MNC_VAR_WRITE_ALL'
529     ENDIF
530 edhill 1.4 write(msgbuf,'(5a)') 'writing variable ''', vname(1:lenv),
531 edhill 1.3 & ''' to file ''', fname(1:lenf), ''''
532     CALL MNC_HANDLE_ERR(myThid, err, msgbuf)
533 edhill 1.1
534 edhill 1.2 RETURN
535 edhill 1.1 END
536    

  ViewVC Help
Powered by ViewVC 1.1.22