1 |
C $Header: /u/gcmpack/MITgcm/pkg/land/land_output.F,v 1.4 2009/12/29 23:05:52 jmc Exp $ |
2 |
C $Name: $ |
3 |
|
4 |
#include "LAND_OPTIONS.h" |
5 |
|
6 |
CBOP |
7 |
C !ROUTINE: LAND_OUTPUT |
8 |
C !INTERFACE: |
9 |
SUBROUTINE LAND_OUTPUT( myTime, myIter, myThid ) |
10 |
C !DESCRIPTION: \bv |
11 |
C *==========================================================* |
12 |
C | S/R LAND_OUTPUT |
13 |
C | o general routine for Land output |
14 |
C *==========================================================* |
15 |
C | - write snap-shot & time-average output |
16 |
C | - call monitor to write global quantities |
17 |
C *==========================================================* |
18 |
C \ev |
19 |
|
20 |
C !USES: |
21 |
IMPLICIT NONE |
22 |
|
23 |
C === Global variables === |
24 |
#include "LAND_SIZE.h" |
25 |
#include "EEPARAMS.h" |
26 |
#include "PARAMS.h" |
27 |
#include "LAND_PARAMS.h" |
28 |
#include "LAND_VARS.h" |
29 |
#include "LAND_TAVE.h" |
30 |
#ifdef ALLOW_AIM |
31 |
#include "AIM_FFIELDS.h" |
32 |
#endif |
33 |
|
34 |
C !INPUT/OUTPUT PARAMETERS: |
35 |
C == Routine arguments == |
36 |
C myTime - Current time of simulation ( s ) |
37 |
C myIter - Iteration number |
38 |
C myThid - Number of this instance of the routine |
39 |
_RL myTime |
40 |
INTEGER myIter |
41 |
INTEGER myThid |
42 |
CEOP |
43 |
|
44 |
#ifdef ALLOW_LAND |
45 |
|
46 |
C !FUNCTIONS: |
47 |
LOGICAL DIFFERENT_MULTIPLE |
48 |
EXTERNAL DIFFERENT_MULTIPLE |
49 |
|
50 |
C !LOCAL VARIABLES: |
51 |
C == Local variables == |
52 |
INTEGER bi, bj, k |
53 |
CHARACTER*(MAX_LEN_MBUF) msgBuf |
54 |
CHARACTER*(MAX_LEN_FNAM) fn |
55 |
CHARACTER*(10) suff |
56 |
#ifdef ALLOW_MNC |
57 |
CHARACTER*(1) pf |
58 |
CHARACTER*(80) fmnc |
59 |
#endif |
60 |
|
61 |
#ifdef ALLOW_AIM |
62 |
IF ( land_monFreq.NE.0. ) THEN |
63 |
CALL LAND_MONITOR( aim_landFr, myTime, myIter, myThid ) |
64 |
ENDIF |
65 |
#endif |
66 |
|
67 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
68 |
|
69 |
IF ( |
70 |
& DIFFERENT_MULTIPLE( land_diagFreq, myTime, land_deltaT ) |
71 |
& .OR. dumpInitAndLast.AND.( myTime.EQ.endTime .OR. |
72 |
& myTime.EQ.startTime ) |
73 |
& ) THEN |
74 |
|
75 |
C-- Write snap-shot |
76 |
C jmc: previously done from LAND_DO_DIAGS, but much better here. |
77 |
|
78 |
IF ( land_snapshot_mdsio ) THEN |
79 |
|
80 |
WRITE(suff,'(I10.10)') myIter |
81 |
|
82 |
C-- Write ground Temp and soil moisture : |
83 |
CALL WRITE_FLD_3D_RL( 'land_groundT.', suff, land_nLev, |
84 |
& land_groundT, myIter, myThid ) |
85 |
CALL WRITE_FLD_3D_RL( 'land_enthalp.', suff, land_nLev, |
86 |
& land_enthalp, myIter, myThid ) |
87 |
CALL WRITE_FLD_3D_RL( 'land_groundW.', suff, land_nLev, |
88 |
& land_groundW, myIter, myThid ) |
89 |
C-- other (2-D) state variables: |
90 |
CALL WRITE_FLD_XY_RL( |
91 |
& 'land_skinT.', suff, land_skinT, myIter, myThid ) |
92 |
CALL WRITE_FLD_XY_RL( |
93 |
& 'land_hSnow.', suff, land_hSnow, myIter, myThid ) |
94 |
CALL WRITE_FLD_XY_RL( |
95 |
& 'land_snAge.', suff, land_snowAge, myIter, myThid ) |
96 |
|
97 |
IF ( myIter.NE.nIter0 ) THEN |
98 |
C-- fluxes (2-D map): |
99 |
CALL WRITE_FLD_XY_RL( |
100 |
& 'land_RunOff.', suff, land_runOff, myIter, myThid ) |
101 |
CALL WRITE_FLD_XY_RL( |
102 |
& 'land_enRnOf.', suff, land_enRnOf, myIter, myThid ) |
103 |
CALL WRITE_FLD_XY_RL( |
104 |
& 'land_HeatFx.', suff, land_HeatFlx, myIter, myThid ) |
105 |
CALL WRITE_FLD_XY_RL( |
106 |
& 'land_frWaFx.', suff, land_Pr_m_Ev, myIter, myThid ) |
107 |
CALL WRITE_FLD_XY_RL( |
108 |
& 'land_EnWaFx.', suff, land_EnWFlux, myIter, myThid ) |
109 |
ENDIF |
110 |
|
111 |
ENDIF |
112 |
|
113 |
#ifdef ALLOW_MNC |
114 |
IF ( land_snapshot_mnc ) THEN |
115 |
_BARRIER |
116 |
|
117 |
IF ( writeBinaryPrec .EQ. precFloat64 ) THEN |
118 |
pf(1:1) = 'D' |
119 |
ELSE |
120 |
pf(1:1) = 'R' |
121 |
ENDIF |
122 |
DO k = 1,MAX_LEN_MBUF |
123 |
fmnc(k:k) = ' ' |
124 |
ENDDO |
125 |
fmnc(1:13) = 'land_snapshot' |
126 |
|
127 |
CALL MNC_CW_SET_UDIM(fmnc, -1, myThid) |
128 |
CALL MNC_CW_RL_W_S('D',fmnc,0,0,'T', myTime, myThid) |
129 |
CALL MNC_CW_SET_UDIM(fmnc, 0, myThid) |
130 |
CALL MNC_CW_I_W_S('I',fmnc,0,0,'iter', myIter, myThid) |
131 |
|
132 |
CALL MNC_CW_RL_W(pf,fmnc,0,0, |
133 |
& 'land_groundT', land_groundT, myThid) |
134 |
CALL MNC_CW_RL_W(pf,fmnc,0,0, |
135 |
& 'land_enthalp', land_enthalp, myThid) |
136 |
CALL MNC_CW_RL_W(pf,fmnc,0,0, |
137 |
& 'land_groundW', land_groundW, myThid) |
138 |
|
139 |
CALL MNC_CW_RL_W(pf,fmnc,0,0, |
140 |
& 'land_skinT', land_skinT, myThid) |
141 |
CALL MNC_CW_RL_W(pf,fmnc,0,0, |
142 |
& 'land_hSnow', land_hSnow, myThid) |
143 |
CALL MNC_CW_RL_W(pf,fmnc,0,0, |
144 |
& 'land_snAge', land_snowAge, myThid) |
145 |
CALL MNC_CW_RL_W(pf,fmnc,0,0, |
146 |
& 'land_RunOff', land_runOff, myThid) |
147 |
CALL MNC_CW_RL_W(pf,fmnc,0,0, |
148 |
& 'land_enRnOf', land_enRnOf, myThid) |
149 |
|
150 |
CALL MNC_CW_RL_W(pf,fmnc,0,0, |
151 |
& 'land_HeatFx', land_HeatFlx, myThid) |
152 |
CALL MNC_CW_RL_W(pf,fmnc,0,0, |
153 |
& 'land_frWaFx', land_Pr_m_Ev, myThid) |
154 |
CALL MNC_CW_RL_W(pf,fmnc,0,0, |
155 |
& 'land_EnWaFx', land_EnWFlux, myThid) |
156 |
|
157 |
_BARRIER |
158 |
ENDIF |
159 |
#endif |
160 |
|
161 |
ENDIF |
162 |
|
163 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
164 |
|
165 |
#ifdef ALLOW_LAND_TAVE |
166 |
|
167 |
IF (land_taveFreq.LE.0.) RETURN |
168 |
|
169 |
IF ( myIter.EQ.nIter0 ) THEN |
170 |
C Initialize time-average arrays to zero |
171 |
DO bj = myByLo(myThid), myByHi(myThid) |
172 |
DO bi = myBxLo(myThid), myBxHi(myThid) |
173 |
CALL TIMEAVE_RESET(land_grTtave,land_nLev, bi, bj, myThid) |
174 |
CALL TIMEAVE_RESET(land_entave, land_nLev, bi, bj, myThid) |
175 |
CALL TIMEAVE_RESET(land_grWtave,land_nLev, bi, bj, myThid) |
176 |
CALL TIMEAVE_RESET(land_sTtave, 1, bi, bj, myThid) |
177 |
CALL TIMEAVE_RESET(land_hStave, 1, bi, bj, myThid) |
178 |
CALL TIMEAVE_RESET(land_sAtave, 1, bi, bj, myThid) |
179 |
CALL TIMEAVE_RESET(land_ROftave, 1, bi, bj, myThid) |
180 |
CALL TIMEAVE_RESET(land_eROtave, 1, bi, bj, myThid) |
181 |
land_timeAve(bi,bj) = 0. |
182 |
ENDDO |
183 |
ENDDO |
184 |
|
185 |
C Dump files and restart average computation if needed |
186 |
ELSEIF ( |
187 |
& DIFFERENT_MULTIPLE( land_taveFreq, myTime, land_deltaT ) |
188 |
& ) THEN |
189 |
|
190 |
C Normalize by integrated time |
191 |
DO bj = myByLo(myThid), myByHi(myThid) |
192 |
DO bi = myBxLo(myThid), myBxHi(myThid) |
193 |
CALL TIMEAVE_NORMALIZE( land_grTtave, land_timeAve, |
194 |
& land_nLev, bi, bj, myThid ) |
195 |
CALL TIMEAVE_NORMALIZE( land_entave, land_timeAve, |
196 |
& land_nLev, bi, bj, myThid ) |
197 |
CALL TIMEAVE_NORMALIZE( land_grWtave, land_timeAve, |
198 |
& land_nLev, bi, bj, myThid ) |
199 |
CALL TIMEAVE_NORMALIZE( land_sTtave, land_timeAve, |
200 |
& 1, bi, bj, myThid ) |
201 |
CALL TIMEAVE_NORMALIZE( land_hStave, land_timeAve, |
202 |
& 1, bi, bj, myThid ) |
203 |
CALL TIMEAVE_NORMALIZE( land_sAtave, land_timeAve, |
204 |
& 1, bi, bj, myThid ) |
205 |
CALL TIMEAVE_NORMALIZE( land_ROftave, land_timeAve, |
206 |
& 1, bi, bj, myThid ) |
207 |
CALL TIMEAVE_NORMALIZE( land_eROtave, land_timeAve, |
208 |
& 1, bi, bj, myThid ) |
209 |
ENDDO |
210 |
ENDDO |
211 |
|
212 |
IF ( land_timeave_mdsio ) THEN |
213 |
|
214 |
WRITE(fn,'(A,I10.10)') 'land_tave.', myIter |
215 |
CALL WRITE_REC_3D_RL( fn, writeBinaryPrec, land_nLev, |
216 |
& land_grTtave, 1, myIter, myThid ) |
217 |
CALL WRITE_REC_3D_RL( fn, writeBinaryPrec, land_nLev, |
218 |
& land_entave, 2, myIter, myThid ) |
219 |
CALL WRITE_REC_3D_RL( fn, writeBinaryPrec, land_nLev, |
220 |
& land_grWtave, 3, myIter, myThid ) |
221 |
k = 3*land_nLev |
222 |
CALL WRITE_REC_XY_RL( fn, land_sTtave, k+1, myIter, myThid ) |
223 |
CALL WRITE_REC_XY_RL( fn, land_hStave, k+2, myIter, myThid ) |
224 |
CALL WRITE_REC_XY_RL( fn, land_sAtave, k+3, myIter, myThid ) |
225 |
CALL WRITE_REC_XY_RL( fn, land_ROftave, k+4, myIter, myThid ) |
226 |
CALL WRITE_REC_XY_RL( fn, land_eROtave, k+5, myIter, myThid ) |
227 |
|
228 |
ENDIF |
229 |
|
230 |
#ifdef ALLOW_MNC |
231 |
IF ( land_timeave_mnc ) THEN |
232 |
_BARRIER |
233 |
|
234 |
IF ( writeBinaryPrec .EQ. precFloat64 ) THEN |
235 |
pf(1:1) = 'D' |
236 |
ELSE |
237 |
pf(1:1) = 'R' |
238 |
ENDIF |
239 |
|
240 |
DO k = 1,MAX_LEN_FNAM |
241 |
fn(k:k) = ' ' |
242 |
ENDDO |
243 |
WRITE(fn,'(a)') 'land_tave' |
244 |
CALL MNC_CW_SET_UDIM(fn, -1, myThid) |
245 |
CALL MNC_CW_I_W_S('I',fn,0,0,'iter', myIter, myThid) |
246 |
CALL MNC_CW_SET_UDIM(fn, 0, myThid) |
247 |
CALL MNC_CW_RL_W_S('D',fn,0,0,'T', myTime, myThid) |
248 |
CALL MNC_CW_RL_W(pf,fn,0,0, |
249 |
& 'land_groundT', land_grTtave, myThid) |
250 |
CALL MNC_CW_RL_W(pf,fn,0,0, |
251 |
& 'land_enthalp', land_entave, myThid) |
252 |
CALL MNC_CW_RL_W(pf,fn,0,0, |
253 |
& 'land_groundW', land_grWtave, myThid) |
254 |
|
255 |
CALL MNC_CW_RL_W(pf,fn,0,0, |
256 |
& 'land_skinT', land_sTtave, myThid) |
257 |
CALL MNC_CW_RL_W(pf,fn,0,0, |
258 |
& 'land_hSnow', land_hStave, myThid) |
259 |
CALL MNC_CW_RL_W(pf,fn,0,0, |
260 |
& 'land_snAge', land_sAtave, myThid) |
261 |
CALL MNC_CW_RL_W(pf,fn,0,0, |
262 |
& 'land_RunOff', land_ROftave, myThid) |
263 |
CALL MNC_CW_RL_W(pf,fn,0,0, |
264 |
& 'land_enRnOf', land_eROtave, myThid) |
265 |
|
266 |
_BARRIER |
267 |
ENDIF |
268 |
#endif |
269 |
|
270 |
WRITE(msgBuf,'(A,I10)') |
271 |
& '// Land Time-average written, t-step', myIter |
272 |
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
273 |
& SQUEEZE_RIGHT, myThid ) |
274 |
WRITE(msgBuf,'(A)') ' ' |
275 |
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
276 |
& SQUEEZE_RIGHT, myThid ) |
277 |
|
278 |
C Reset averages to zero |
279 |
DO bj = myByLo(myThid), myByHi(myThid) |
280 |
DO bi = myBxLo(myThid), myBxHi(myThid) |
281 |
CALL TIMEAVE_RESET(land_grTtave,land_nLev, bi, bj, myThid) |
282 |
CALL TIMEAVE_RESET(land_entave, land_nLev, bi, bj, myThid) |
283 |
CALL TIMEAVE_RESET(land_grWtave,land_nLev, bi, bj, myThid) |
284 |
CALL TIMEAVE_RESET(land_sTtave, 1, bi, bj, myThid) |
285 |
CALL TIMEAVE_RESET(land_hStave, 1, bi, bj, myThid) |
286 |
CALL TIMEAVE_RESET(land_sAtave, 1, bi, bj, myThid) |
287 |
CALL TIMEAVE_RESET(land_ROftave, 1, bi, bj, myThid) |
288 |
CALL TIMEAVE_RESET(land_eROtave, 1, bi, bj, myThid) |
289 |
land_timeAve(bi,bj) = 0. |
290 |
ENDDO |
291 |
ENDDO |
292 |
|
293 |
ENDIF |
294 |
|
295 |
#endif /* ALLOW_LAND_TAVE */ |
296 |
|
297 |
#endif /* ALLOW_LAND */ |
298 |
|
299 |
RETURN |
300 |
END |