/[MITgcm]/MITgcm_contrib/ocean_inversion_project/write_netCDF/write_nc_phys.F
ViewVC logotype

Contents of /MITgcm_contrib/ocean_inversion_project/write_netCDF/write_nc_phys.F

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


Revision 1.1 - (show annotations) (download)
Tue Oct 21 06:21:52 2003 UTC (21 years, 9 months ago) by dimitri
Branch: MAIN
CVS Tags: HEAD
added netcdf output files

1 !***********************************************************************
2 ! $Header: /usr/data/cvsroot/fletcher/MOM_3/MOM_3/ocmip2/write_nc_phys.F,v 1.1.1.1 2003/05/01 21:25:53 fletcher Exp $
3 !***********************************************************************
4 ! NAME: WRITE_NC_phys
5 !
6 ! INPUT:
7 ! group = group code (ex: IPSL)
8 ! production = production (model and version ex: OPA 8.1)
9 !
10 ! secs_per_month = number of seconds in each model month
11 !
12 ! imt_trx = tracer Zonal grid dimension
13 ! jmt_trx = tracer Meridional grid dimension
14 ! kmt_trx = tracer Depth grid dimension
15 !
16 ! PT = monthly potential temperature [C]
17 ! SAL = monthly salinity [psu]
18 ! TFLX = monthly net surface heat flux [W/m^2]
19 ! H2OFLX = monthly net surface freshwater flux [m/y]
20 !
21 ! kmt_UV = Horizontal Velocity Depth grid dimension
22 !
23 ! imt_Eul_U = Eulerian Zonal Velocity Zonal grid dimension
24 ! jmt_Eul_U = Eulerian Zonal Velocity Meridional grid dimension
25 ! Eul_U = monthly Eulerian Zonal Velocity [m/s]
26 ! WS_x = monthly Zonal Wind Stress [N/m^2]
27 !
28 ! imt_Eul_V = Eulerian Meridional Velocity Zonal grid dimension
29 ! jmt_Eul_V = Eulerian Meridional Velocity Meridional grid dimension
30 ! Eul_V = monthly Eulerian Meridional Velocity [m/s]
31 ! WS_y = monthly Meridional Wind Stress [N/m^2]
32 !
33 ! has_eddy = logical flag, true if model has eddy induced velocities
34 !
35 ! imt_Eddy_U = Eddy Induced Zonal Velocity Zonal grid dimension
36 ! jmt_Eddy_U = Eddy Induced Zonal Velocity Meridional grid dimension
37 ! Eddy_U = monthly Eddy Induced Zonal Velocity [m/s]
38 !
39 ! imt_Eddy_V = Eddy Induced Meridional Velocity Zonal grid dimension
40 ! jmt_Eddy_V = Eddy Induced Meridional Velocity Meridional grid dimension
41 ! Eddy_V = monthly Eddy Induced Meridional Velocity [m/s]
42 !
43 ! OUTPUT FILE:
44 ! A netcdf file (clobbed if exists) with
45 ! the filename group_phys.nc
46 !
47 !***********************************************************************
48
49 SUBROUTINE WRITE_NC_phys(
50 & group, production,
51 & secs_per_month,
52 & imt_trx, jmt_trx, kmt_trx,
53 & PT, SAL, TFLX, H2OFLX,
54 & kmt_UV,
55 & imt_Eul_U, jmt_Eul_U, Eul_U, WS_x,
56 & imt_Eul_V, jmt_Eul_V, Eul_V, WS_y,
57 & has_eddy,
58 & imt_Eddy_U, jmt_Eddy_U, Eddy_U,
59 & imt_Eddy_V, jmt_Eddy_V, Eddy_V)
60
61 IMPLICIT NONE
62 #include "netcdf.inc"
63
64 ! Arguments
65 CHARACTER*(*) group
66 CHARACTER*(*) production
67 REAL secs_per_month(12)
68 INTEGER imt_trx, jmt_trx, kmt_trx
69
70 REAL PT(imt_trx, jmt_trx, kmt_trx, 12)
71 REAL SAL(imt_trx, jmt_trx, kmt_trx, 12)
72 REAL TFLX(imt_trx, jmt_trx, 12)
73 REAL H2OFLX(imt_trx, jmt_trx, 12)
74
75 INTEGER kmt_UV
76
77 INTEGER imt_Eul_U, jmt_Eul_U
78 REAL Eul_U(imt_Eul_U, jmt_Eul_U, kmt_UV, 12)
79 REAL WS_x(imt_Eul_U, jmt_Eul_U, 12)
80
81 INTEGER imt_Eul_V, jmt_Eul_V
82 REAL Eul_V(imt_Eul_V, jmt_Eul_V, kmt_UV, 12)
83 REAL WS_y(imt_Eul_V, jmt_Eul_V, 12)
84
85 LOGICAL has_eddy
86
87 INTEGER imt_Eddy_U, jmt_Eddy_U
88 REAL Eddy_U(imt_Eddy_U, jmt_Eddy_U, kmt_UV, 12)
89
90 INTEGER imt_Eddy_V, jmt_Eddy_V
91 REAL Eddy_V(imt_Eddy_V, jmt_Eddy_V, kmt_UV, 12)
92
93 ! Constants
94 REAL msv
95 PARAMETER (msv = -1.E+34)
96
97 ! Local variables
98 CHARACTER*256 filename, tempname
99 INTEGER NC_ID
100 INTEGER STATUS
101 INTEGER TWO_DIM
102 INTEGER time_DIM
103 INTEGER lon_trx_DIM, lat_trx_DIM, depth_trx_DIM
104 INTEGER depth_UV_DIM
105 INTEGER lon_Eul_U_DIM, lat_Eul_U_DIM
106 INTEGER lon_Eul_V_DIM, lat_Eul_V_DIM
107 INTEGER lon_Eddy_U_DIM, lat_Eddy_U_DIM
108 INTEGER lon_Eddy_V_DIM, lat_Eddy_V_DIM
109 INTEGER DIMIDS(4)
110 INTEGER time_ID, bounds_time_ID
111 INTEGER PT_ID, SAL_ID, TFLX_ID, H2OFLX_ID
112 INTEGER Eul_U_ID, WS_x_ID
113 INTEGER Eul_V_ID, WS_y_ID
114 INTEGER Eddy_U_ID
115 INTEGER Eddy_V_ID
116
117 INTEGER I
118 REAL TIME(12), bounds_TIME(12,2)
119
120 !***********************************************************************
121 ! Build the NetCDF filename
122 !***********************************************************************
123 filename = group//'_phys.nc'
124
125 !***********************************************************************
126 ! Open the NetCDF file
127 !***********************************************************************
128 STATUS = NF_CREATE(filename, NF_CLOBBER, NC_ID)
129 IF (STATUS .NE. NF_NOERR) THEN
130 PRINT *, 'NetCDF error opening ', filename
131 PRINT *, NF_STRERROR(STATUS)
132 STOP 'Stopped'
133 ENDIF
134
135 !***********************************************************************
136 ! Define dimensions
137 !***********************************************************************
138 CALL DEF_DIM(NC_ID, 'two', 2, TWO_DIM)
139
140 CALL DEF_DIM(NC_ID, 'time', 12, time_DIM)
141
142 CALL DEF_DIM(NC_ID, 'x_trx', imt_trx, lon_trx_DIM)
143 CALL DEF_DIM(NC_ID, 'y_trx', jmt_trx, lat_trx_DIM)
144 CALL DEF_DIM(NC_ID, 'z_trx', kmt_trx, depth_trx_DIM)
145
146 CALL DEF_DIM(NC_ID, 'z_UV', kmt_UV, depth_UV_DIM)
147
148 CALL DEF_DIM(NC_ID, 'x_Eul_U', imt_Eul_U, lon_Eul_U_DIM)
149 CALL DEF_DIM(NC_ID, 'y_Eul_U', jmt_Eul_U, lat_Eul_U_DIM)
150
151 CALL DEF_DIM(NC_ID, 'x_Eul_V', imt_Eul_V, lon_Eul_V_DIM)
152 CALL DEF_DIM(NC_ID, 'y_Eul_V', jmt_Eul_V, lat_Eul_V_DIM)
153
154 IF (has_eddy) THEN
155 CALL DEF_DIM(NC_ID, 'x_Eddy_U', imt_Eddy_U, lon_Eddy_U_DIM)
156 CALL DEF_DIM(NC_ID, 'y_Eddy_U', jmt_Eddy_U, lat_Eddy_U_DIM)
157
158 CALL DEF_DIM(NC_ID, 'x_Eddy_V', imt_Eddy_V, lon_Eddy_V_DIM)
159 CALL DEF_DIM(NC_ID, 'y_Eddy_V', jmt_Eddy_V, lat_Eddy_V_DIM)
160 ENDIF ! IF (has_eddy)
161
162 !***********************************************************************
163 ! Define variables & attributes
164 !***********************************************************************
165
166 DIMIDS(1) = time_DIM
167 CALL DEF_REAL(NC_ID, 'time', time_ID, 1, DIMIDS)
168 CALL ADD_ATT_TEXT(NC_ID, time_ID, 'long_name', 'Time')
169 CALL ADD_ATT_TEXT(NC_ID, time_ID, 'units',
170 & 'seconds since 0001-01-01 00:00:00')
171 CALL ADD_ATT_TEXT(NC_ID, time_ID, 'bounds', 'bounds_time')
172
173 DIMIDS(1) = time_DIM
174 DIMIDS(2) = TWO_DIM
175 CALL DEF_REAL(NC_ID, 'bounds_time', bounds_time_ID, 2, DIMIDS)
176
177 DIMIDS(1) = lon_trx_DIM
178 DIMIDS(2) = lat_trx_DIM
179 DIMIDS(3) = depth_trx_DIM
180 DIMIDS(4) = time_DIM
181
182 CALL DEF_REAL(NC_ID, 'PT', PT_ID, 4, DIMIDS)
183 CALL ADD_ATT_TEXT(NC_ID, PT_ID, 'long_name',
184 & 'Potential Temperature')
185 CALL ADD_ATT_TEXT(NC_ID, PT_ID, 'units', 'C')
186 CALL ADD_ATT_TEXT(NC_ID, PT_ID, 'coordinates',
187 & 'lon lat depth time')
188 CALL ADD_ATT_REAL(NC_ID, PT_ID, 'missing_value', msv)
189
190 CALL DEF_REAL(NC_ID, 'SAL', SAL_ID, 4, DIMIDS)
191 CALL ADD_ATT_TEXT(NC_ID, SAL_ID, 'long_name', 'Salinity')
192 CALL ADD_ATT_TEXT(NC_ID, SAL_ID, 'units', 'psu')
193 CALL ADD_ATT_TEXT(NC_ID, SAL_ID, 'coordinates',
194 & 'lon lat depth time')
195 CALL ADD_ATT_REAL(NC_ID, SAL_ID, 'missing_value', msv)
196
197 DIMIDS(1) = lon_trx_DIM
198 DIMIDS(2) = lat_trx_DIM
199 DIMIDS(3) = time_DIM
200
201 CALL DEF_REAL(NC_ID, 'TFLX', TFLX_ID, 3, DIMIDS)
202 CALL ADD_ATT_TEXT(NC_ID, TFLX_ID, 'long_name',
203 & 'Net Surface Heat Flux')
204 CALL ADD_ATT_TEXT(NC_ID, TFLX_ID, 'units', 'W/m^2')
205 CALL ADD_ATT_TEXT(NC_ID, TFLX_ID, 'coordinates',
206 & 'lon lat time')
207 CALL ADD_ATT_REAL(NC_ID, TFLX_ID, 'missing_value', msv)
208
209 CALL DEF_REAL(NC_ID, 'H2OFLX', H2OFLX_ID, 3, DIMIDS)
210 CALL ADD_ATT_TEXT(NC_ID, H2OFLX_ID, 'long_name',
211 & 'Net Surface Freshwater Flux')
212 CALL ADD_ATT_TEXT(NC_ID, H2OFLX_ID, 'units', 'm/y')
213 CALL ADD_ATT_TEXT(NC_ID, H2OFLX_ID, 'coordinates',
214 & 'lon lat time')
215 CALL ADD_ATT_REAL(NC_ID, H2OFLX_ID, 'missing_value', msv)
216
217 DIMIDS(1) = lon_Eul_U_DIM
218 DIMIDS(2) = lat_Eul_U_DIM
219 DIMIDS(3) = depth_UV_DIM
220 DIMIDS(4) = time_DIM
221
222 CALL DEF_REAL(NC_ID, 'Eul_U', Eul_U_ID, 4, DIMIDS)
223 CALL ADD_ATT_TEXT(NC_ID, Eul_U_ID, 'long_name',
224 & 'Eulerian Zonal Velocity')
225 CALL ADD_ATT_TEXT(NC_ID, Eul_U_ID, 'units', 'm/s')
226 CALL ADD_ATT_TEXT(NC_ID, Eul_U_ID, 'coordinates',
227 & 'lon_Eul_U lat_Eul_U depth_UV time')
228 CALL ADD_ATT_TEXT(NC_ID, Eul_U_ID, 'vector_angle',
229 & 'vector_angle_Eul_U')
230 CALL ADD_ATT_REAL(NC_ID, Eul_U_ID, 'missing_value', msv)
231
232 DIMIDS(1) = lon_Eul_U_DIM
233 DIMIDS(2) = lat_Eul_U_DIM
234 DIMIDS(3) = time_DIM
235
236 CALL DEF_REAL(NC_ID, 'WS_x', WS_x_ID, 3, DIMIDS)
237 CALL ADD_ATT_TEXT(NC_ID, WS_x_ID, 'long_name',
238 & 'Zonal Wind Stress')
239 CALL ADD_ATT_TEXT(NC_ID, WS_x_ID, 'units', 'N/m^2')
240 CALL ADD_ATT_TEXT(NC_ID, WS_x_ID, 'coordinates',
241 & 'lon_Eul_U lat_Eul_U time')
242 CALL ADD_ATT_TEXT(NC_ID, WS_x_ID, 'vector_angle',
243 & 'vector_angle_Eul_U')
244 CALL ADD_ATT_REAL(NC_ID, WS_x_ID, 'missing_value', msv)
245
246 DIMIDS(1) = lon_Eul_V_DIM
247 DIMIDS(2) = lat_Eul_V_DIM
248 DIMIDS(3) = depth_UV_DIM
249 DIMIDS(4) = time_DIM
250
251 CALL DEF_REAL(NC_ID, 'Eul_V', Eul_V_ID, 4, DIMIDS)
252 CALL ADD_ATT_TEXT(NC_ID, Eul_V_ID, 'long_name',
253 & 'Eulerian Meridional Velocity')
254 CALL ADD_ATT_TEXT(NC_ID, Eul_V_ID, 'units', 'm/s')
255 CALL ADD_ATT_TEXT(NC_ID, Eul_V_ID, 'coordinates',
256 & 'lon_Eul_V lat_Eul_V depth_UV time')
257 CALL ADD_ATT_TEXT(NC_ID, Eul_V_ID, 'vector_angle',
258 & 'vector_angle_Eul_V')
259 CALL ADD_ATT_REAL(NC_ID, Eul_V_ID, 'missing_value', msv)
260
261 DIMIDS(1) = lon_Eul_V_DIM
262 DIMIDS(2) = lat_Eul_V_DIM
263 DIMIDS(3) = time_DIM
264
265 CALL DEF_REAL(NC_ID, 'WS_y', WS_y_ID, 3, DIMIDS)
266 CALL ADD_ATT_TEXT(NC_ID, WS_y_ID, 'long_name',
267 & 'Meridional Wind Stress')
268 CALL ADD_ATT_TEXT(NC_ID, WS_y_ID, 'units', 'N/m^2')
269 CALL ADD_ATT_TEXT(NC_ID, WS_y_ID, 'coordinates',
270 & 'lon_Eul_V lat_Eul_V time')
271 CALL ADD_ATT_TEXT(NC_ID, WS_y_ID, 'vector_angle',
272 & 'vector_angle_Eul_V')
273 CALL ADD_ATT_REAL(NC_ID, WS_y_ID, 'missing_value', msv)
274
275 IF (has_eddy) THEN
276
277 DIMIDS(1) = lon_Eddy_U_DIM
278 DIMIDS(2) = lat_Eddy_U_DIM
279 DIMIDS(3) = depth_UV_DIM
280 DIMIDS(4) = time_DIM
281
282 CALL DEF_REAL(NC_ID, 'Eddy_U', Eddy_U_ID, 4, DIMIDS)
283 CALL ADD_ATT_TEXT(NC_ID, Eddy_U_ID, 'long_name',
284 & 'Eddy Induced Zonal Velocity')
285 CALL ADD_ATT_TEXT(NC_ID, Eddy_U_ID, 'units', 'm/s')
286 CALL ADD_ATT_TEXT(NC_ID, Eddy_U_ID, 'coordinates',
287 & 'lon_Eddy_U lat_Eddy_U depth_UV time')
288 CALL ADD_ATT_TEXT(NC_ID, Eddy_U_ID, 'vector_angle',
289 & 'vector_angle_Eddy_U')
290 CALL ADD_ATT_REAL(NC_ID, Eddy_U_ID, 'missing_value', msv)
291
292 DIMIDS(1) = lon_Eddy_V_DIM
293 DIMIDS(2) = lat_Eddy_V_DIM
294 DIMIDS(3) = depth_UV_DIM
295 DIMIDS(4) = time_DIM
296
297 CALL DEF_REAL(NC_ID, 'Eddy_V', Eddy_V_ID, 4, DIMIDS)
298 CALL ADD_ATT_TEXT(NC_ID, Eddy_V_ID, 'long_name',
299 & 'Eddy Induced Meridional Velocity')
300 CALL ADD_ATT_TEXT(NC_ID, Eddy_V_ID, 'units', 'm/s')
301 CALL ADD_ATT_TEXT(NC_ID, Eddy_V_ID, 'coordinates',
302 & 'lon_Eddy_V lat_Eddy_V depth_UV time')
303 CALL ADD_ATT_TEXT(NC_ID, Eddy_V_ID, 'vector_angle',
304 & 'vector_angle_Eddy_V')
305 CALL ADD_ATT_REAL(NC_ID, Eddy_V_ID, 'missing_value', msv)
306
307 ENDIF ! IF (has_eddy)
308
309 !***********************************************************************
310 ! Define global attributes
311 !***********************************************************************
312 CALL ADD_ATT_TEXT(NC_ID, NF_GLOBAL, 'output_routine',
313 & '$RCSfile: write_nc_phys.F,v $, $Revision: 1.1.1.1 $')
314
315 CALL ADD_ATT_TEXT(NC_ID, NF_GLOBAL, 'file_name', filename)
316
317 tempname = group//'_grid.nc'
318 CALL ADD_ATT_TEXT(NC_ID, NF_GLOBAL,'trx_associate_file',tempname)
319
320 tempname = group//'_vel_grid.nc'
321 CALL ADD_ATT_TEXT(NC_ID,NF_GLOBAL,'vel_associate_file',tempname)
322
323 CALL ADD_ATT_TEXT(NC_ID, NF_GLOBAL, 'project', 'OCMIP')
324
325 CALL ADD_ATT_TEXT(NC_ID, NF_GLOBAL, 'institution', group)
326
327 CALL ADD_ATT_TEXT(NC_ID, NF_GLOBAL, 'production', production)
328
329 IF (has_eddy) THEN
330 CALL ADD_ATT_TEXT(NC_ID, NF_GLOBAL, 'has_eddy', 'TRUE')
331 ELSE
332 CALL ADD_ATT_TEXT(NC_ID, NF_GLOBAL, 'has_eddy', 'FALSE')
333 ENDIF
334
335 !***********************************************************************
336 ! End of define mode
337 !***********************************************************************
338 STATUS = NF_ENDDEF(NC_ID)
339 IF (STATUS .NE. NF_NOERR) THEN
340 PRINT *, 'NetCDF error ending define mode'
341 PRINT *, NF_STRERROR(STATUS)
342 STOP 'Stopped'
343 ENDIF
344
345 !***********************************************************************
346 ! Write data to file
347 !***********************************************************************
348 DO I = 1, 12
349 IF (I .EQ. 1) THEN
350 bounds_TIME(I,1) = 0.0
351 ELSE
352 bounds_TIME(I,1) = bounds_TIME(I-1,2)
353 ENDIF
354 TIME(I) = bounds_TIME(I,1) + 0.5 * secs_per_month(i)
355 bounds_TIME(I,2) = bounds_TIME(I,1) + secs_per_month(i)
356 ENDDO
357
358 CALL PUT_REAL(NC_ID, time_ID, TIME, 'time')
359 CALL PUT_REAL(NC_ID, bounds_time_ID, bounds_TIME, 'bounds_TIME')
360
361 CALL PUT_REAL(NC_ID, PT_ID, PT, 'PT')
362 CALL PUT_REAL(NC_ID, SAL_ID, SAL, 'SAL')
363
364 CALL PUT_REAL(NC_ID, TFLX_ID, TFLX, 'TFLX')
365 CALL PUT_REAL(NC_ID, H2OFLX_ID, H2OFLX, 'H2OFLX')
366
367 CALL PUT_REAL(NC_ID, Eul_U_ID, Eul_U, 'Eul_U')
368 CALL PUT_REAL(NC_ID, WS_x_ID, WS_x, 'WS_x')
369
370 CALL PUT_REAL(NC_ID, Eul_V_ID, Eul_V, 'Eul_V')
371 CALL PUT_REAL(NC_ID, WS_y_ID, WS_y, 'WS_y')
372
373 IF (has_eddy) THEN
374 CALL PUT_REAL(NC_ID, Eddy_U_ID, Eddy_U, 'Eddy_U')
375 CALL PUT_REAL(NC_ID, Eddy_V_ID, Eddy_V, 'Eddy_V')
376 ENDIF ! IF (has_eddy)
377
378 !***********************************************************************
379 ! Close the NetCDF file
380 !***********************************************************************
381
382 STATUS = NF_CLOSE(NC_ID)
383 IF (STATUS .NE. NF_NOERR) THEN
384 PRINT *, 'NetCDF error closing ', filename
385 PRINT *, NF_STRERROR(STATUS)
386 STOP 'Stopped'
387 ENDIF
388
389 END

  ViewVC Help
Powered by ViewVC 1.1.22