/[MITgcm]/MITgcm/pkg/kpp/kpp_do_diags.F
ViewVC logotype

Contents of /MITgcm/pkg/kpp/kpp_do_diags.F

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


Revision 1.21 - (show annotations) (download)
Wed May 25 04:03:09 2005 UTC (19 years ago) by edhill
Branch: MAIN
CVS Tags: checkpoint57m_post, checkpoint57s_post, checkpoint57r_post, checkpoint57i_post, checkpoint57n_post, checkpoint57l_post, checkpoint57p_post, checkpoint57q_post, checkpoint57j_post, checkpoint57o_post, checkpoint57k_post
Changes since 1.20: +5 -3 lines
 o for mnc output, fill the 'T' coordinate var with myTime and create a
   separate 'iter' variable for iteration count

1 C $Header: /u/gcmpack/MITgcm/pkg/kpp/kpp_do_diags.F,v 1.20 2005/05/15 03:04:56 jmc Exp $
2 C $Name: $
3
4 #include "KPP_OPTIONS.h"
5
6 #undef MULTIPLE_RECORD_KPP_STATE_FILES
7 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
8 CBOP
9 C !ROUTINE: KPP_DO_DIAGS
10
11 C !INTERFACE:
12 SUBROUTINE KPP_DO_DIAGS( myTime, myIter, myThid )
13
14 C !DESCRIPTION:
15 C Create the KPP diagnostic output.
16 C
17 C The following CPP flag (MULTIPLE_RECORD_KPP_STATE_FILES) is
18 C #define/#undefed here since it is specific to this routine and
19 C very user-preference specific.
20 C
21 C If #undefed (default) the state files are written as in all
22 C versions prior to checkpoint32, where a file is created per
23 C variable, per time and per tile. This *has* to be the default
24 C because most users use this mode and all utilities and scripts
25 C (diagnostic) assume this form. It is also robust, as explained
26 C below.
27 C
28 C If #defined, subsequent snap-shots are written as records in the
29 C same file (no iteration number in filenames).
30 C
31 C Advantages:
32 C - fewer files
33 C - for small problems, is easy to copy the output around
34 C Disadvantages:
35 C - breaks a lot of diagnostic scripts
36 C - for large or long problems this creates huge files
37 C - is an unexpected, unsolicited change in behaviour which came
38 C as a surprise (in c32) and inconvenience to several users
39 C - can not accomodate changing the frequency of output
40 C after a pickup (this is trivial in previous method
41 C but needs new code and parameters in this new method)
42
43 C !USES:
44 IMPLICIT NONE
45 #include "SIZE.h"
46 #include "EEPARAMS.h"
47 #include "PARAMS.h"
48 #ifdef ALLOW_MNC
49 #include "MNC_PARAMS.h"
50 #endif
51 #include "KPP.h"
52 #include "KPP_PARAMS.h"
53 #include "KPP_DIAGS.h"
54
55 C !INPUT/OUTPUT PARAMETERS:
56 _RL myTime
57 INTEGER myIter
58 INTEGER myThid
59
60 #ifdef ALLOW_KPP
61
62 C !LOCAL VARIABLES:
63 CHARACTER*(MAX_LEN_MBUF) suff
64 LOGICAL DIFFERENT_MULTIPLE
65 EXTERNAL DIFFERENT_MULTIPLE
66 INTEGER bi, bj, K
67 _RL DDTT
68 INTEGER thisdate(4), prevdate(4)
69 LOGICAL dumpFiles
70 CEOP
71
72 C----------------------------------------------------------------
73 C Dump snapshot of KPP variables.
74
75 IF ( myIter.NE.nIter0 .AND.
76 & DIFFERENT_MULTIPLE(kpp_dumpFreq,myTime,deltaTClock)
77 & ) THEN
78
79 IF (KPPmixingMaps) THEN
80 CALL PLOT_FIELD_XYRL ( KPPhbl , 'KPPhbl' ,
81 & myIter, myThid )
82 CALL PLOT_FIELD_XYZRL ( KPPviscAz , 'KPPviscAz' ,
83 & Nr, myIter, myThid )
84 CALL PLOT_FIELD_XYZRL ( KPPdiffKzT, 'KPPdiffKzT',
85 & Nr, myIter, myThid )
86 CALL PLOT_FIELD_XYZRL ( KPPghat , 'KPPghat' ,
87 & Nr, myIter, myThid )
88 ENDIF
89
90 IF (KPPwriteState .AND. snapshot_mdsio) THEN
91 #ifdef MULTIPLE_RECORD_KPP_STATE_FILES
92 C Write each snap-shot as a new record in one file per variable
93 C - creates relatively few files but these files can become huge
94 C NOTE: file size and number problems are *SOLVED* by MNC
95 CALL WRITE_REC_XYZ_RL('KPPviscAz',KPPviscAz,kpp_drctrec,
96 & myIter,myThid)
97 CALL WRITE_REC_XYZ_RL('KPPdiffKzT',KPPdiffKzT,kpp_drctrec,
98 & myIter,myThid)
99 CALL WRITE_REC_XYZ_RL('KPPdiffKzS',KPPdiffKzS,kpp_drctrec,
100 & myIter,myThid)
101 CALL WRITE_REC_XYZ_RL('KPPghat',KPPghat,kpp_drctrec,
102 & myIter,myThid)
103 CALL WRITE_REC_XY_RL('KPPhbl',KPPhbl,kpp_drctrec,
104 & myIter,myThid)
105 #else /* MULTIPLE_RECORD_KPP_STATE_FILES */
106 C Write each snap-shot as a new file - creates many files but
107 C for large configurations is easier to transfer
108 C NOTE: file size and number problems are *SOLVED* by MNC
109 WRITE(suff,'(I10.10)') myIter
110 CALL WRITE_FLD_XYZ_RL('KPPviscAz.',suff,KPPviscAz,
111 & myIter,myThid)
112 CALL WRITE_FLD_XYZ_RL('KPPdiffKzT.',suff,KPPdiffKzT,
113 & myIter,myThid)
114 CALL WRITE_FLD_XYZ_RL('KPPdiffKzS.',suff,KPPdiffKzS,
115 & myIter,myThid)
116 CALL WRITE_FLD_XYZ_RL('KPPghat.',suff,KPPghat,
117 & myIter,myThid)
118 CALL WRITE_FLD_XY_RL('KPPhbl.',suff,KPPhbl,
119 & myIter,myThid)
120 #endif /* MULTIPLE_RECORD_KPP_STATE_FILES */
121 ENDIF
122
123 #ifdef ALLOW_MNC
124 IF (KPPwriteState .AND. useMNC .AND. snapshot_mnc) THEN
125 CALL MNC_CW_SET_UDIM('kpp_state', -1, myThid)
126 CALL MNC_CW_RL_W_S('D','kpp_state',0,0,'T',myTime,myThid)
127 CALL MNC_CW_SET_UDIM('kpp_state', 0, myThid)
128 CALL MNC_CW_I_W_S('I','kpp_state',0,0,'iter',myIter,myThid)
129 CALL MNC_CW_RL_W('D','kpp_state',0,0,
130 & 'KPPviscAz', KPPviscAz, myThid)
131 CALL MNC_CW_RL_W('D','kpp_state',0,0,
132 & 'KPPdiffKzT', KPPdiffKzT, myThid)
133 CALL MNC_CW_RL_W('D','kpp_state',0,0,
134 & 'KPPdiffKzS', KPPdiffKzS, myThid)
135 CALL MNC_CW_RL_W('D','kpp_state',0,0,
136 & 'KPPghat', KPPghat, myThid)
137 CALL MNC_CW_RL_W('D','kpp_state',0,0,
138 & 'KPPhbl', KPPhbl, myThid)
139 ENDIF
140 #endif /* ALLOW_MNC */
141
142 C-- Increment record counter
143 kpp_drctrec = kpp_drctrec + 1
144
145 ENDIF
146
147 C----------------------------------------------------------------
148 C Do KPP time averaging.
149
150 #ifdef ALLOW_TIMEAVE
151
152 C Initialize averages to zero
153 IF ( myIter.EQ.nIter0 ) THEN
154
155 DO bj = myByLo(myThid), myByHi(myThid)
156 DO bi = myBxLo(myThid), myBxHi(myThid)
157 CALL TIMEAVE_RESET(KPPviscAztave, Nr,bi,bj,myThid)
158 CALL TIMEAVE_RESET(KPPdiffKzTtave,Nr,bi,bj,myThid)
159 CALL TIMEAVE_RESET(KPPghattave, Nr,bi,bj,myThid)
160 CALL TIMEAVE_RESET(KPPdiffKzStave,Nr,bi,bj,myThid)
161 CALL TIMEAVE_RESET(KPPhbltave, 1, bi,bj,myThid)
162 DO k=1,Nr
163 kpp_TimeAve(k,bi,bj)=0.
164 ENDDO
165 ENDDO
166 ENDDO
167
168 ELSE
169
170 C Time Average KPP fields
171 DDTT=deltaTclock
172 DO bj = myByLo(myThid), myByHi(myThid)
173 DO bi = myBxLo(myThid), myBxHi(myThid)
174 CALL TIMEAVE_CUMULATE(
175 & KPPviscAztave, KPPviscAz, Nr,DDTT,bi,bj,myThid)
176 CALL TIMEAVE_CUMULATE(
177 & KPPdiffKzTtave,KPPdiffKzT,Nr,DDTT,bi,bj,myThid)
178 CALL TIMEAVE_CUMULATE(
179 & KPPghattave, KPPghat, Nr,DDTT,bi,bj,myThid)
180 CALL TIMEAVE_CUMULATE(
181 & KPPdiffKzStave,KPPdiffKzS,Nr,DDTT,bi,bj,myThid)
182 CALL TIMEAVE_CUMULATE(
183 & KPPhbltave, KPPhbl, 1, DDTT,bi,bj,myThid)
184 C Keep record of how much time has been integrated over
185 DO k=1,Nr
186 kpp_TimeAve(k,bi,bj)=kpp_TimeAve(k,bi,bj)+DDTT
187 ENDDO
188 ENDDO
189 ENDDO
190
191 ENDIF
192
193 C Dump files and restart average computation if needed
194 dumpFiles = .FALSE.
195 IF ( myIter .NE. nIter0 ) THEN
196 IF (DIFFERENT_MULTIPLE(KPP_taveFreq,myTime,deltaTClock))
197 & dumpFiles = .TRUE.
198 #ifdef ALLOW_CAL
199 IF ( calendarDumps .AND. (
200 & (KPP_taveFreq.GE. 2592000.AND.KPP_taveFreq.LE. 2678400).OR.
201 & (KPP_taveFreq.GE.31104000.AND.KPP_taveFreq.LE.31968000)))
202 & THEN
203 C-- Convert approximate months (30-31 days) and years (360-372 days)
204 C to exact calendar months and years.
205 C- First determine calendar dates for this and previous time step.
206 call cal_GetDate( myiter ,mytime ,thisdate,mythid )
207 call cal_GetDate( myiter-1,mytime-deltaTClock,prevdate,mythid )
208 dumpFiles = .FALSE.
209 C- Monthly KPP_taveFreq:
210 IF( KPP_taveFreq.GE. 2592000 .AND. KPP_taveFreq.LE. 2678400
211 & .AND. (thisdate(1)-prevdate(1)).GT.50 ) dumpFiles = .TRUE.
212 C- Yearly KPP_taveFreq:
213 IF( KPP_taveFreq.GE.31104000 .AND. KPP_taveFreq.LE.31968000
214 & .AND. (thisdate(1)-prevdate(1)).GT.5000 ) dumpFiles = .TRUE.
215 ENDIF
216 #endif
217 ENDIF
218
219 IF (dumpFiles) THEN
220 C Normalize by integrated time
221 DO bj = myByLo(myThid), myByHi(myThid)
222 DO bi = myBxLo(myThid), myBxHi(myThid)
223 CALL TIMEAVE_NORMALIZ(KPPviscAztave,kpp_timeave,
224 & Nr, bi,bj,myThid)
225 CALL TIMEAVE_NORMALIZ(KPPdiffKzTtave,kpp_timeave,
226 & Nr, bi,bj,myThid)
227 CALL TIMEAVE_NORMALIZ(KPPghattave,kpp_timeave,
228 & Nr, bi,bj,myThid)
229 CALL TIMEAVE_NORMALIZ(KPPdiffKzStave,kpp_timeave,
230 & Nr, bi,bj,myThid)
231 CALL TIMEAVE_NORMALIZ(KPPhbltave,kpp_timeave,
232 & 1, bi,bj,myThid)
233 ENDDO
234 ENDDO
235
236 IF (KPPwriteState .AND. timeave_mdsio) THEN
237 #ifdef MULTIPLE_RECORD_KPP_STATE_FILES
238 C Write each tave output as a new record in one file per variable
239 C - creates relatively few files but these files can become huge
240 C NOTE: file size and number problems are *SOLVED* by MNC
241 CALL WRITE_REC_XYZ_RL('KPPviscAz-T',KPPviscAzTave,
242 & kpp_drctrecTave,myIter,myThid)
243 CALL WRITE_REC_XYZ_RL('KPPdiffKzT-T',KPPdiffKzTTave,
244 & kpp_drctrecTave,myIter,myThid)
245 CALL WRITE_REC_XYZ_RL('KPPdiffKzS-T',KPPdiffKzSTave,
246 & kpp_drctrecTave,myIter,myThid)
247 CALL WRITE_REC_XYZ_RL('KPPghat-T',KPPghatTave,
248 & kpp_drctrecTave,myIter,myThid)
249 CALL WRITE_REC_XY_RL('KPPhbl-T',KPPhblTave,
250 & kpp_drctrecTave,myIter,myThid)
251 C-- Increment record counter
252 kpp_drctrecTave = kpp_drctrecTave + 1
253 #else /* MULTIPLE_RECORD_KPP_STATE_FILES */
254 C Write each tave output as a new file - creates many files but for
255 C large configurations is easier to transfer
256 C NOTE: file size and number problems are *SOLVED* by MNC
257 WRITE(suff,'(I10.10)') myIter
258 CALL WRITE_FLD_XYZ_RL('KPPviscAz-T.',suff,KPPviscAzTave,
259 & myIter,myThid)
260 CALL WRITE_FLD_XYZ_RL('KPPdiffKzT-T.',suff,KPPdiffKzTTave,
261 & myIter,myThid)
262 CALL WRITE_FLD_XYZ_RL('KPPdiffKzS-T.',suff,KPPdiffKzSTave,
263 & myIter,myThid)
264 CALL WRITE_FLD_XYZ_RL('KPPghat-T.',suff,KPPghatTave,
265 & myIter,myThid)
266 CALL WRITE_FLD_XY_RL('KPPhbl-T.',suff,KPPhblTave,
267 & myIter,myThid)
268 #endif /* MULTIPLE_RECORD_KPP_STATE_FILES */
269 ENDIF
270
271 #ifdef ALLOW_MNC
272 IF (KPPwriteState .AND. useMNC .AND. timeave_mnc) THEN
273 CALL MNC_CW_SET_UDIM('kpp_timeave', -1, myThid)
274 CALL MNC_CW_RL_W_S('D','kpp_timeave',0,0,'T',myTime,myThid)
275 CALL MNC_CW_SET_UDIM('kpp_timeave', 0, myThid)
276 CALL MNC_CW_I_W_S('I','kpp_timeave',0,0,'iter',myIter,myThid)
277 CALL MNC_CW_RL_W('D','kpp_timeave',0,0,
278 & 'KPPviscAz', KPPviscAzTave, myThid)
279 CALL MNC_CW_RL_W('D','kpp_timeave',0,0,
280 & 'KPPdiffKzT', KPPdiffKzTTave, myThid)
281 CALL MNC_CW_RL_W('D','kpp_timeave',0,0,
282 & 'KPPdiffKzS', KPPdiffKzSTave, myThid)
283 CALL MNC_CW_RL_W('D','kpp_timeave',0,0,
284 & 'KPPghat', KPPghatTave, myThid)
285 CALL MNC_CW_RL_W('D','kpp_timeave',0,0,
286 & 'KPPhbl', KPPhblTave, myThid)
287 ENDIF
288 #endif /* ALLOW_MNC */
289
290 C Reset averages to zero
291 DO bj = myByLo(myThid), myByHi(myThid)
292 DO bi = myBxLo(myThid), myBxHi(myThid)
293 CALL TIMEAVE_RESET(KPPviscAztave, Nr,bi,bj,myThid)
294 CALL TIMEAVE_RESET(KPPdiffKzTtave,Nr,bi,bj,myThid)
295 CALL TIMEAVE_RESET(KPPghattave, Nr,bi,bj,myThid)
296 CALL TIMEAVE_RESET(KPPdiffKzStave,Nr,bi,bj,myThid)
297 CALL TIMEAVE_RESET(KPPhbltave, 1, bi,bj,myThid)
298 DO k=1,Nr
299 kpp_TimeAve(k,bi,bj)=0.
300 ENDDO
301 ENDDO
302 ENDDO
303
304 ENDIF
305
306 #endif /* ALLOW_TIMEAVE */
307
308 #ifdef ALLOW_DIAGNOSTICS
309 IF ( useDiagnostics ) THEN
310 CALL DIAGNOSTICS_FILL(KPPviscAz ,'KPPviscA',0,Nr,0,1,1,myThid)
311 CALL DIAGNOSTICS_FILL(KPPdiffKzS,'KPPdiffS',0,Nr,0,1,1,myThid)
312 CALL DIAGNOSTICS_FILL(KPPdiffKzT,'KPPdiffT',0,Nr,0,1,1,myThid)
313 CALL DIAGNOSTICS_FILL(KPPghat ,'KPPghat ',0,Nr,0,1,1,myThid)
314 CALL DIAGNOSTICS_FILL(KPPhbl ,'KPPhbl ',0,1 ,0,1,1,myThid)
315 CALL DIAGNOSTICS_FILL(KPPfrac ,'KPPfrac ',0,1 ,0,1,1,myThid)
316 ENDIF
317 #endif /* ALLOW_DIAGNOSTICS */
318
319 #endif /* ALLOW_KPP */
320
321 RETURN
322 END

  ViewVC Help
Powered by ViewVC 1.1.22