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

Contents of /MITgcm/pkg/mnc/mnc_file.F

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


Revision 1.7 - (show annotations) (download)
Sat Jan 17 13:55:49 2004 UTC (20 years, 4 months ago) by edhill
Branch: MAIN
Changes since 1.6: +22 -14 lines
 o fix MNC dimensions so they are now per-NetCDF-file: this was a serious
     error in the earlier design
 o fix use of _RL,_RS where they should be REAL*4,REAL*8
 o intelligent error handling for situations where the number of NetCDF
     variables exceeds the available storage space within the MNC
     "tables"
 o add descriptions to the variables in the model_grid output

1 C $Header: /u/u3/gcmpack/MITgcm/pkg/mnc/mnc_file.F,v 1.6 2004/01/14 23:02:52 edhill Exp $
2 C $Name: $
3
4 #include "MNC_OPTIONS.h"
5
6 C==================================================================
7
8 SUBROUTINE MNC_FILE_CREATE(
9 I myThid,
10 I fname )
11
12 implicit none
13
14 C Arguments
15 integer myThid
16 character*(*) fname
17
18 CALL MNC_FILE_OPEN(myThid, fname, 0)
19
20 RETURN
21 END
22
23 C==================================================================
24
25 SUBROUTINE MNC_FILE_OPEN(
26 I myThid,
27 I fname,
28 I itype )
29
30 implicit none
31 #include "netcdf.inc"
32 #include "mnc_common.h"
33 #include "EEPARAMS.h"
34
35 C Arguments
36 integer myThid
37 character*(*) fname
38 integer itype
39 C itype => [ 0=new | 1=append ]
40
41 C Functions
42 integer ILNBLNK
43
44 C Local Variables
45 integer n, err, fid, ind
46 character*(MAX_LEN_MBUF) msgbuf
47
48 C Is the file already open?
49 CALL MNC_GET_IND(myThid, MNC_MAX_ID, fname, mnc_f_names, ind)
50 IF ( ind .GT. 0 ) THEN
51 write(msgbuf,'(3a)') 'MNC_FILE_OPEN ERROR: ''', fname,
52 & ''' is already open -- cannot open twice'
53 CALL print_error( msgbuf, mythid )
54 stop 'ABNORMAL END: package MNC'
55 ENDIF
56
57 write(msgbuf,'(3a)') 'opening ''', fname, ''''
58 IF ( itype .EQ. 0 ) THEN
59 C Create new file
60 err = NF_CREATE( fname, NF_CLOBBER, fid )
61 CALL MNC_HANDLE_ERR(myThid, err, msgbuf)
62 ELSEIF ( itype .EQ. 1 ) THEN
63 C Append to existing file
64 err = NF_OPEN( fname, NF_WRITE, fid )
65 CALL MNC_HANDLE_ERR(myThid, err, msgbuf)
66 ELSE
67 C Error
68 write(msgbuf,'(a,i5,a)') 'MNC_FILE_OPEN ERROR: ''', itype,
69 & ''' is not defined--should be: [0|1]'
70 CALL print_error( msgbuf, mythid )
71 stop 'ABNORMAL END: S/R MNC_FILE_ADD_ATTR_STR'
72 ENDIF
73
74 CALL MNC_GET_NEXT_EMPTY_IND(myThid, MNC_MAX_ID, mnc_f_names, ind)
75 n = ILNBLNK(fname)
76 mnc_f_names(ind)(1:n) = fname(1:n)
77 mnc_f_info(ind,1) = 1
78 mnc_f_info(ind,2) = fid
79 mnc_f_info(ind,3) = 0
80 mnc_fv_ids(ind,1) = 0
81 mnc_f_alld(ind,1) = 0
82
83 RETURN
84 END
85
86 C==================================================================
87
88 SUBROUTINE MNC_FILE_ADD_ATTR_STR(
89 I myThid,
90 I fname,
91 I atname,
92 I sval )
93
94 implicit none
95 C Arguments
96 integer myThid
97 character*(*) fname, atname, sval
98
99 CALL MNC_FILE_ADD_ATTR_ANY(myThid,fname,atname, 1,
100 & sval, 0, 0.0D0, 0.0, 0 )
101 RETURN
102 END
103
104 C==================================================================
105
106 SUBROUTINE MNC_FILE_ADD_ATTR_DBL(
107 I myThid,
108 I fname,
109 I atname,
110 I len,
111 I dval )
112
113 implicit none
114 C Arguments
115 integer myThid, len
116 character*(*) fname, atname
117 REAL*8 dval
118
119 CALL MNC_FILE_ADD_ATTR_ANY(myThid,fname,atname, 2,
120 & ' ', len, dval, 0.0, 0 )
121 RETURN
122 END
123
124 C==================================================================
125
126 SUBROUTINE MNC_FILE_ADD_ATTR_REAL(
127 I myThid,
128 I fname,
129 I atname,
130 I len,
131 I rval )
132
133 implicit none
134 C Arguments
135 integer myThid, len
136 character*(*) fname, atname
137 REAL*4 rval
138
139 CALL MNC_FILE_ADD_ATTR_ANY(myThid,fname,atname, 3,
140 & ' ', len, 0.0D0, rval, 0 )
141 RETURN
142 END
143
144 C==================================================================
145
146 SUBROUTINE MNC_FILE_ADD_ATTR_INT(
147 I myThid,
148 I fname,
149 I atname,
150 I len,
151 I ival )
152
153 implicit none
154 C Arguments
155 integer myThid, len, ival
156 character*(*) fname, atname
157
158 CALL MNC_FILE_ADD_ATTR_ANY(myThid,fname,atname, 4,
159 & ' ', len, 0.0D0, 0.0, ival )
160 RETURN
161 END
162
163 C==================================================================
164
165 SUBROUTINE MNC_FILE_ADD_ATTR_ANY(
166 I myThid,
167 I fname,
168 I atname,
169 I atype, sv, len,dv,rv,iv )
170
171 implicit none
172 #include "netcdf.inc"
173 #include "mnc_common.h"
174 #include "EEPARAMS.h"
175
176 C Arguments
177 integer myThid, atype, len, iv
178 character*(*) fname, atname, sv
179 REAL*8 dv
180 REAL*4 rv
181
182 C Functions
183 integer ILNBLNK
184
185 C Local Variables
186 integer n, err, fid, ind, n1, lens
187 character*(MNC_MAX_CHAR) s1
188 character*(MAX_LEN_MBUF) msgbuf
189
190 C Verify that the file is open
191 CALL MNC_GET_IND(myThid, MNC_MAX_ID, fname, mnc_f_names, ind)
192 IF (ind .LT. 0) THEN
193 write(msgbuf,'(3a)') 'MNC ERROR: file ''',
194 & fname, ''' must be opened first'
195 CALL print_error( msgbuf, mythid )
196 stop 'ABNORMAL END: S/R MNC_FILE_ADD_ATTR_INT'
197 ENDIF
198 fid = mnc_f_info(ind,2)
199
200 C Enter define mode
201 CALL MNC_FILE_REDEF(myThid, fname)
202
203 s1(1:MNC_MAX_CHAR) = mnc_blank_name(1:MNC_MAX_CHAR)
204 n1 = ILNBLNK(atname)
205 s1(1:n1) = atname(1:n1)
206
207 IF (atype .EQ. 1) THEN
208 lens = ILNBLNK(sv)
209 err = NF_PUT_ATT_TEXT(fid, NF_GLOBAL, s1, lens, sv)
210 CALL MNC_HANDLE_ERR(myThid, err,
211 & 'adding TEXT attribute in S/R MNC_FILE_ADD_ATTR_ANY')
212 ELSEIF (atype .EQ. 2) THEN
213 err = NF_PUT_ATT_DOUBLE(fid, NF_GLOBAL, s1, NF_DOUBLE, len, dv)
214 CALL MNC_HANDLE_ERR(myThid, err,
215 & 'adding DOUBLE attribute in S/R MNC_FILE_ADD_ATTR_ANY')
216 ELSEIF (atype .EQ. 3) THEN
217 err = NF_PUT_ATT_REAL(fid, NF_GLOBAL, s1, NF_FLOAT, len, rv)
218 CALL MNC_HANDLE_ERR(myThid, err,
219 & 'adding REAL attribute in S/R MNC_FILE_ADD_ATTR_ANY')
220 ELSEIF (atype .EQ. 4) THEN
221 err = NF_PUT_ATT_INT(fid, NF_GLOBAL, s1, NF_INT, len, iv)
222 CALL MNC_HANDLE_ERR(myThid, err,
223 & 'adding INT attribute in S/R MNC_FILE_ADD_ATTR_ANY')
224 ELSE
225 write(msgbuf,'(a,i10,a)') 'MNC ERROR: atype = ''', atype,
226 & ''' is invalid--must be: [1-4]'
227 n = ILNBLNK(msgbuf)
228 CALL print_error(msgbuf(1:n), mythid)
229 stop 'ABNORMAL END: S/R MNC_VAR_ADD_ATTR_ANY'
230 ENDIF
231
232 RETURN
233 END
234
235 C==================================================================
236
237 SUBROUTINE MNC_FILE_CLOSE(
238 I myThid,
239 I fname )
240
241 implicit none
242 #include "netcdf.inc"
243 #include "mnc_common.h"
244 #include "EEPARAMS.h"
245
246 C Arguments
247 integer myThid
248 character*(*) fname
249
250 C Local Variables
251 integer i,j,k,n, err, fid, ind
252 character*(MAX_LEN_MBUF) msgbuf
253
254 C Check that the file is open
255 CALL MNC_GET_IND(myThid, MNC_MAX_ID, fname, mnc_f_names, ind)
256 IF (ind .LT. 1) THEN
257 write(msgbuf,'(3a)') 'MNC Warning: file ''', fname,
258 & ''' is already closed'
259 CALL print_error( msgbuf, mythid )
260 RETURN
261 ENDIF
262 fid = mnc_f_info(ind,2)
263 err = NF_CLOSE(fid)
264 write(msgbuf,'(3a)') ' cannot close file ''', fname, ''''
265 CALL MNC_HANDLE_ERR(myThid, err, msgbuf)
266
267 C Clear all the file, grid, variable, and dim names and refs
268 n = mnc_fv_ids(ind,1)
269 IF (n .GE. 1) THEN
270 DO i = 1,n
271 j = 2*i
272 k = mnc_fv_ids(ind,j)
273 mnc_v_names(k)(1:MNC_MAX_CHAR)=mnc_blank_name(1:MNC_MAX_CHAR)
274 ENDDO
275 ENDIF
276 n = mnc_f_alld(ind,1)
277 DO i = 1,n
278 j = mnc_f_alld(ind,i+1)
279 mnc_d_names(j)(1:MNC_MAX_CHAR) = mnc_blank_name(1:MNC_MAX_CHAR)
280 ENDDO
281 mnc_f_alld(ind,1) = 0
282 DO i = 1,3
283 mnc_f_info(ind,i) = 0
284 ENDDO
285 mnc_f_names(ind)(1:MNC_MAX_CHAR) = mnc_blank_name(1:MNC_MAX_CHAR)
286
287 RETURN
288 END
289
290 C==================================================================
291
292 SUBROUTINE MNC_FILE_REDEF(
293 I myThid,
294 I fname )
295
296 implicit none
297 #include "netcdf.inc"
298 #include "mnc_common.h"
299 #include "EEPARAMS.h"
300
301 C Arguments
302 integer myThid
303 character*(*) fname
304
305 C Functions
306 integer ILNBLNK
307
308 C Local Variables
309 integer ind, fid, def, err, n
310 character*(MAX_LEN_MBUF) msgbuf
311
312 C Verify that the file is open
313 CALL MNC_GET_IND(myThid, MNC_MAX_ID, fname, mnc_f_names, ind)
314 IF (ind .LT. 0) THEN
315 n = ILNBLNK(fname)
316 write(msgbuf,'(3a)') 'MNC ERROR: file ''',
317 & fname(1:n), ''' must be opened first'
318 CALL print_error( msgbuf, mythid )
319 stop 'ABNORMAL END: S/R MNC_FILE_REDEF'
320 ENDIF
321 def = mnc_f_info(ind,1)
322 fid = mnc_f_info(ind,2)
323
324 IF (def .NE. 1) THEN
325 C Enter define mode
326 err = NF_REDEF(fid)
327 CALL MNC_HANDLE_ERR(myThid, err,
328 & 'entering define mode in S/R MNC_FILE_REDEF')
329 mnc_f_info(ind,1) = 1
330 ENDIF
331
332 RETURN
333 END
334
335 C==================================================================
336
337 SUBROUTINE MNC_FILE_ENDDEF(
338 I myThid,
339 I fname )
340
341 implicit none
342 #include "netcdf.inc"
343 #include "mnc_common.h"
344 #include "EEPARAMS.h"
345
346 C Arguments
347 integer myThid
348 character*(*) fname
349
350 C Functions
351 integer ILNBLNK
352
353 C Local Variables
354 integer ind, fid, def, err, n
355 character*(MAX_LEN_MBUF) msgbuf
356
357 C Verify that the file is open
358 CALL MNC_GET_IND(myThid, MNC_MAX_ID, fname, mnc_f_names, ind)
359 IF (ind .LT. 0) THEN
360 n = ILNBLNK(fname)
361 write(msgbuf,'(3a)') 'MNC ERROR: file ''',
362 & fname(1:n), ''' must be opened first'
363 CALL print_error( msgbuf, mythid )
364 stop 'ABNORMAL END: S/R MNC_FILE_REDEF'
365 ENDIF
366 def = mnc_f_info(ind,1)
367 fid = mnc_f_info(ind,2)
368
369 IF (def .NE. 2) THEN
370 C Enter define mode
371 err = NF_ENDDEF(fid)
372 CALL MNC_HANDLE_ERR(myThid, err,
373 & 'ending define mode in S/R MNC_FILE_ENDDEF')
374 mnc_f_info(ind,1) = 2
375 ENDIF
376
377 RETURN
378 END
379

  ViewVC Help
Powered by ViewVC 1.1.22