source: trunk/procs/nc_put.pro @ 92

Last change on this file since 92 was 92, checked in by ericg, 16 years ago

Misc EG updates following merge with new nc_read.pro (r86)

File size: 7.6 KB
Line 
1PRO nc_put, fld, file_name, NCDF_DB = ncdf_db, X = x, Y = y, Z = z, T = t, GLOBAL = global
2
3@common
4@com_eg
5
6; fld = structure
7; fdl.data, fld.units, fld.short_name, fld.long_name, fld.missing_value, fld.direc
8
9; fld.direc= data type (x,xy,xyzt,yt,etc...)
10; X,Y,Z,T = structures containing attributes for each direction :
11;     x.name, x.units, x.long_name, x.data (+t.calendar and t.origin for time)
12; Global = global attributes: conventions, title, origin
13   IF debug_w THEN print, ' '
14   IF debug_w THEN print, '  ENTER nc_put...'
15
16   dim = size(fld.data)
17   dim_check = 0
18
19   type = fld.direc
20
21; open netCDF file
22
23   cdfid = ncdf_create(ncdf_db+file_name, /clobber)
24   IF debug_w THEN print, '    type,cdfid = ', type, cdfid
25   ncdf_control, cdfid, /fill
26
27; grid
28
29   jpi=1
30   jpj=1
31   jpk=1
32
33   xpos = strpos(type, 'x')
34   ypos = strpos(type, 'y')
35   zpos = strpos(type, 'z')
36   tpos = strpos(type, 't')
37
38   IF xpos NE -1 THEN BEGIN
39      dim_check = dim_check+1
40      jpi = dim(xpos+1)
41   ENDIF
42   xid = ncdf_dimdef(cdfid, 'lon', jpi)
43       
44   IF ypos NE -1 THEN BEGIN
45      dim_check = dim_check+1
46      jpj = dim(ypos+1)
47   ENDIF
48   yid = ncdf_dimdef(cdfid, 'lat', jpj)
49
50   IF zpos NE -1 THEN BEGIN
51      dim_check = dim_check+1
52      jpk = dim(zpos+1)
53   ENDIF
54   zid = ncdf_dimdef(cdfid, 'depth', jpk)
55
56   IF tpos NE -1 THEN BEGIN
57      dim_check = dim_check+1
58   ENDIF
59   tid = ncdf_dimdef(cdfid, 'time', /UNLIMITED)
60
61   IF debug_w THEN print, '    dim check ', dim_check
62   
63   IF dim_check NE dim(0) THEN BEGIN
64      print,  ' ERROR data size / type mismatch ', type, dim(0)
65   ENDIF
66   swx = 0
67   swy = 0
68   swz = 0
69   swt = 0
70
71   ; horizontal zonal axis
72   IF debug_w THEN print, '    building zonal axis, xid: ', xid
73;   IF strpos(type, 'x') NE -1 AND keyword_set(X) THEN BEGIN
74      IF strpos (type, 'xy') NE -1 THEN BEGIN
75         lonid = ncdf_vardef(cdfid,'lon', [xid, yid], /FLOAT)
76      ENDIF ELSE lonid = ncdf_vardef(cdfid,'nav_lon', [xid], /FLOAT)
77      NCDF_ATTPUT, cdfid, lonid, 'units', x.units
78      NCDF_ATTPUT, cdfid, lonid, 'long_name', x.long_name
79      NCDF_ATTPUT, cdfid, lonid, 'valid_min', min(x.data), /float
80      NCDF_ATTPUT, cdfid, lonid, 'valid_max', max(x.data), /float
81      swx = 1
82;   ENDIF
83
84   ; horizontal meridional axis
85   IF debug_w THEN print, '    building Y axis, yid: ', yid
86   IF strpos (type, 'xy') NE -1 THEN BEGIN
87      latid = ncdf_vardef(cdfid,'lat', [xid, yid], /FLOAT)
88   ENDIF ELSE latid = ncdf_vardef(cdfid,'nav_lat', [yid], /FLOAT)
89   NCDF_ATTPUT, cdfid, latid, 'units', y.units
90   NCDF_ATTPUT, cdfid, latid, 'long_name', y.long_name
91   NCDF_ATTPUT, cdfid, latid, 'valid_min', min(y.data), /float
92   NCDF_ATTPUT, cdfid, latid, 'valid_max', max(y.data), /float
93   swy = 1
94
95   ; vertical axis
96   IF debug_w THEN print, '    building Z axis, zid: ', zid
97   IF zpos NE -1 AND keyword_set(Z) THEN BEGIN
98      vertid = ncdf_vardef(cdfid,z.name, [zid], /FLOAT)
99      NCDF_ATTPUT, cdfid, vertid, 'units', z.units
100      NCDF_ATTPUT, cdfid, vertid, 'long_name', z.long_name
101      NCDF_ATTPUT, cdfid, vertid, 'valid_min', min(z.data), /float
102      NCDF_ATTPUT, cdfid, vertid, 'valid_max', max(z.data), /float
103      swz = 1
104   ENDIF
105   
106   ; time axis
107   IF debug_w THEN print, '    building T axis, tid: ', tid
108   IF tpos NE -1 AND keyword_set(T) THEN BEGIN
109      mid = NCDF_VARDEF(cdfid, 'time', [tid], /long)
110      NCDF_ATTPUT, cdfid, mid, 'units', t.units
111      NCDF_ATTPUT, cdfid, mid, 'calendar', t.calendar
112      NCDF_ATTPUT, cdfid, mid, 'origin', t.origin
113      NCDF_ATTPUT, cdfid, mid, 'long_name', t.long_name
114      NCDF_ATTPUT, cdfid, mid, 'short_name', 'Time'
115      NCDF_ATTPUT, cdfid, mid, 'valid_min', min(t.data), /long
116      NCDF_ATTPUT, cdfid, mid, 'valid_max', max(t.data), /long
117      time_data = t.data
118      swt = 1
119   ENDIF ELSE BEGIN
120      mid = NCDF_VARDEF(cdfid, 'time', [tid], /long)
121      NCDF_ATTPUT, cdfid, mid, 'units', "days since 1991-03-01 00:00:00"
122      time_data = 1.
123      swt = 1
124      type = type+'t'
125      CASE type OF
126          'xt':   fld.data = reform(fld.data, jpi, 1)
127          'yt':   fld.data = reform(fld.data, jpj, 1)
128          'zt':   fld.data = reform(fld.data, jpk, 1)
129          'xyt':  fld.data = reform(fld.data, jpi, jpj, 1)
130          'xzt':  fld.data = reform(fld.data, jpi, jpk, 1)
131          'yzt':  fld.data = reform(fld.data, jpj, jpk, 1)
132          'xyzt': fld.data = reform(fld.data, jpi, jpj, jpk, 1)
133      ENDCASE 
134   ENDELSE
135
136   IF debug_w THEN print, '    test 1 fld.short_name  = ', fld.short_name
137   IF debug_w THEN print, '    swx,y,z,t  = ', swx, swy, swz, swt
138
139; field attributes
140
141   IF debug_w THEN print, '    type, size fld.data ', type, size(fld.data)
142   
143   varn = strcompress(fld.short_name, /remove_all)
144
145   CASE type OF
146      'x': fldid = NCDF_VARDEF(cdfid,varn, [xid], /FLOAT)
147      'y': fldid = NCDF_VARDEF(cdfid,varn, [yid], /FLOAT)
148      'z': fldid = NCDF_VARDEF(cdfid,varn, [zid], /FLOAT)
149      't': fldid = NCDF_VARDEF(cdfid,varn, [tid], /FLOAT)
150      'xy': fldid = NCDF_VARDEF(cdfid,varn, [xid, yid], /FLOAT)
151      'xz': fldid = NCDF_VARDEF(cdfid,varn, [xid, zid], /FLOAT)
152      'yz': fldid = NCDF_VARDEF(cdfid,varn, [yid, zid], /FLOAT)
153      'xyz': fldid = NCDF_VARDEF(cdfid,varn, [xid, yid, zid], /FLOAT)
154      'xyt': fldid = NCDF_VARDEF(cdfid,varn, [xid, yid, tid], /FLOAT)
155      'xzt': fldid = NCDF_VARDEF(cdfid,varn, [xid, zid, tid], /FLOAT)
156      'yzt':  fldid = NCDF_VARDEF(cdfid,varn, [xid, yid, zid, tid], /FLOAT)
157      'xyzt': fldid = NCDF_VARDEF(cdfid,varn, [xid, yid, zid, tid], /FLOAT)
158      ELSE:
159   ENDCASE
160   CASE type OF
161      'xyzt':  fld.data = reform(fld.data,jpi,jpj,jpk,jpt)
162      ELSE:
163   ENDCASE
164   NCDF_ATTPUT, cdfid, fldid, 'units', fld.units
165   NCDF_ATTPUT, cdfid, fldid, 'long_name', fld.long_name
166   NCDF_ATTPUT, cdfid, fldid, 'short_name', varn
167   NCDF_ATTPUT, cdfid, fldid, 'missing_value', fld.missing_value
168   NCDF_ATTPUT, cdfid, fldid, 'valid_min', min(fld.data(where (fld.data NE fld.missing_value))), /float
169   NCDF_ATTPUT, cdfid, fldid, 'valid_max', max(fld.data(where (fld.data NE fld.missing_value))), /float
170   
171   
172; global attributes
173
174   NCDF_ATTPUT, cdfid, /GLOBAL, 'Conventions', global.conventions
175   NCDF_ATTPUT, cdfid, /GLOBAL, 'Title', global.title
176   NCDF_ATTPUT, cdfid, /GLOBAL, 'Origin', global.origin
177   NCDF_ATTPUT, cdfid, /GLOBAL, 'Software', global.software
178
179; put file in data mode
180
181   NCDF_CONTROL, cdfid, /ENDEF   
182   
183;
184; put grid data
185;
186   print, ' '
187   print, '    Writing '+varn+' to netCDF file ',ncdf_db+file_name
188   
189
190;   stop
191
192   IF swx EQ 1 THEN BEGIN
193      print, '       writing lon, size =', size(x.data)
194      NCDF_VARPUT, cdfid, lonid, x.data
195   END
196   IF swy EQ 1 THEN BEGIN
197      print, '       writing lat, size =', size(y.data)
198      NCDF_VARPUT, cdfid, latid, y.data
199   END
200   IF swz EQ 1 THEN BEGIN
201      print, '       writing depth, size =', size(z.data)
202      NCDF_VARPUT, cdfid, vertid, z.data
203   END
204   IF swt EQ 1 THEN BEGIN
205      print, '       writing time, size=', size (time_data)
206      NCDF_VARPUT, cdfid, mid, time_data
207   END
208
209; put field data
210   
211    print, '       Field legend       =  ',fld.long_name
212    print, '       Field dimensions   =  ',size(fld.data)
213    print, '       Field min/max/unit =  ',min(fld.data(where (fld.data NE fld.missing_value))), max(fld.data(where (fld.data NE fld.missing_value))), '   ', fld.units
214    print, '       Global attributes=  Conventions:  ', global.conventions
215    print, '                           Title:        ', global.title
216    print, '                           Origin:       ', global.origin
217
218;    stop
219
220    NCDF_VARPUT, cdfid, fldid, fld.data
221   
222; close file
223
224    NCDF_CLOSE, cdfid
225    IF debug_w THEN print, '  ...EXIT nc_put'
226
227END
Note: See TracBrowser for help on using the repository browser.