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

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

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


Revision 1.6 - (show annotations) (download)
Mon Aug 6 16:56:59 2012 UTC (11 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f, checkpoint63r, checkpoint63s, checkpoint64, checkpoint65, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65o, checkpoint65l, checkpoint65m, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e
Changes since 1.5: +1 -3 lines
move real-type constant (zeroRS,RL) declaration to EEPARAMS.h

1 C $Header: /u/gcmpack/MITgcm/pkg/kpp/kpp_output.F,v 1.5 2012/06/07 17:09:47 jmc Exp $
2 C $Name: $
3
4 #include "KPP_OPTIONS.h"
5 #ifdef ALLOW_GMREDI
6 # include "GMREDI_OPTIONS.h"
7 #endif
8 #undef MULTIPLE_RECORD_KPP_STATE_FILES
9
10 CBOP
11 C !ROUTINE: KPP_OUTPUT
12
13 C !INTERFACE:
14 SUBROUTINE KPP_OUTPUT( myTime, myIter, myThid )
15
16 C !DESCRIPTION:
17 C Create the KPP diagnostic output.
18 C
19 C The following CPP flag (MULTIPLE_RECORD_KPP_STATE_FILES) is
20 C #define/#undefed here since it is specific to this routine and
21 C very user-preference specific.
22 C
23 C If #undefed (default) the state files are written as in all
24 C versions prior to checkpoint32, where a file is created per
25 C variable, per time and per tile. This *has* to be the default
26 C because most users use this mode and all utilities and scripts
27 C (diagnostic) assume this form. It is also robust, as explained
28 C below.
29 C
30 C If #defined, subsequent snap-shots are written as records in the
31 C same file (no iteration number in filenames).
32 C
33 C Advantages:
34 C - fewer files
35 C - for small problems, is easy to copy the output around
36 C Disadvantages:
37 C - breaks a lot of diagnostic scripts
38 C - for large or long problems this creates huge files
39 C - is an unexpected, unsolicited change in behaviour which came
40 C as a surprise (in c32) and inconvenience to several users
41 C - can not accomodate changing the frequency of output
42 C after a pickup (this is trivial in previous method
43 C but needs new code and parameters in this new method)
44
45 C !USES:
46 IMPLICIT NONE
47 #include "SIZE.h"
48 #include "EEPARAMS.h"
49 #include "PARAMS.h"
50 #include "KPP.h"
51 #include "KPP_PARAMS.h"
52 #include "KPP_TAVE.h"
53 #ifdef ALLOW_GMREDI
54 # include "GMREDI.h"
55 #endif
56 #ifdef ALLOW_MNC
57 # include "MNC_PARAMS.h"
58 #endif
59
60 C !INPUT/OUTPUT PARAMETERS:
61 C myTime :: my time in simulation ( s )
62 C myIter :: my Iteration number
63 C myThid :: my Thread Id number
64 _RL myTime
65 INTEGER myIter
66 INTEGER myThid
67
68 #ifdef ALLOW_KPP
69
70 C !FUNCTIONS:
71 LOGICAL DIFFERENT_MULTIPLE
72 EXTERNAL DIFFERENT_MULTIPLE
73 #ifdef ALLOW_DIAGNOSTICS
74 LOGICAL DIAGNOSTICS_IS_ON
75 EXTERNAL DIAGNOSTICS_IS_ON
76 #endif
77
78 C !LOCAL VARIABLES:
79 C kpp_drctrec :: next record to dump for KPP files
80 INTEGER kpp_drctrec
81 COMMON / KPP_RECORDNUM1 / kpp_drctrec
82 C local variable:
83 CHARACTER*(MAX_LEN_MBUF) suff
84 #if (defined ALLOW_TIMEAVE) || (defined ALLOW_DIAGNOSTICS)
85 INTEGER bi, bj
86 INTEGER i, j, k
87 _RL tmpFac
88 #endif
89 #ifdef ALLOW_TIMEAVE
90 _RL DDTT
91 LOGICAL dumpFiles
92 #endif
93 #ifdef ALLOW_DIAGNOSTICS
94 _RL tmpLoc(1:sNx,1:sNy,Nr)
95 #endif
96 #ifdef ALLOW_MNC
97 CHARACTER*(1) pf
98 #endif
99 CEOP
100
101 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
102
103 C Initialize record numbers in KPP_TAVE
104 IF ( myIter.EQ.nIter0 ) THEN
105 _BEGIN_MASTER( myThid )
106 kpp_drctrec = 1
107 #ifdef ALLOW_TIMEAVE
108 kpp_drctrecTave = 1
109 #endif
110 _END_MASTER( myThid )
111 _BARRIER
112 ENDIF
113
114 C----------------------------------------------------------------
115 C Dump snapshot of KPP variables.
116
117 IF ( myIter.NE.nIter0 .AND.
118 & DIFFERENT_MULTIPLE(kpp_dumpFreq,myTime,deltaTClock)
119 & ) THEN
120
121 IF (KPPwriteState .AND. snapshot_mdsio) THEN
122 #ifdef MULTIPLE_RECORD_KPP_STATE_FILES
123 C Write each snap-shot as a new record in one file per variable
124 C - creates relatively few files but these files can become huge
125 C NOTE: file size and number problems are *SOLVED* by MNC
126 CALL WRITE_REC_XYZ_RL('KPPviscAz',KPPviscAz,kpp_drctrec,
127 & myIter,myThid)
128 CALL WRITE_REC_XYZ_RL('KPPdiffKzT',KPPdiffKzT,kpp_drctrec,
129 & myIter,myThid)
130 CALL WRITE_REC_XYZ_RL('KPPdiffKzS',KPPdiffKzS,kpp_drctrec,
131 & myIter,myThid)
132 CALL WRITE_REC_XYZ_RL('KPPghat',KPPghat,kpp_drctrec,
133 & myIter,myThid)
134 CALL WRITE_REC_XY_RL('KPPhbl',KPPhbl,kpp_drctrec,
135 & myIter,myThid)
136 C-- Increment record counter
137 _BARRIER
138 _BEGIN_MASTER( myThid )
139 kpp_drctrec = kpp_drctrec + 1
140 _END_MASTER( myThid )
141 _BARRIER
142 #else /* MULTIPLE_RECORD_KPP_STATE_FILES */
143 C Write each snap-shot as a new file - creates many files but
144 C for large configurations is easier to transfer
145 C NOTE: file size and number problems are *SOLVED* by MNC
146 WRITE(suff,'(I10.10)') myIter
147 CALL WRITE_FLD_XYZ_RL('KPPviscAz.',suff,KPPviscAz,
148 & myIter,myThid)
149 CALL WRITE_FLD_XYZ_RL('KPPdiffKzT.',suff,KPPdiffKzT,
150 & myIter,myThid)
151 CALL WRITE_FLD_XYZ_RL('KPPdiffKzS.',suff,KPPdiffKzS,
152 & myIter,myThid)
153 CALL WRITE_FLD_XYZ_RL('KPPghat.',suff,KPPghat,
154 & myIter,myThid)
155 CALL WRITE_FLD_XY_RL('KPPhbl.',suff,KPPhbl,
156 & myIter,myThid)
157 #endif /* MULTIPLE_RECORD_KPP_STATE_FILES */
158 ENDIF
159
160 #ifdef ALLOW_MNC
161 IF (KPPwriteState .AND. useMNC .AND. snapshot_mnc) THEN
162 IF ( writeBinaryPrec .EQ. precFloat64 ) THEN
163 pf(1:1) = 'D'
164 ELSE
165 pf(1:1) = 'R'
166 ENDIF
167 CALL MNC_CW_SET_UDIM('kpp_state', -1, myThid)
168 CALL MNC_CW_RL_W_S('D','kpp_state',0,0,'T',myTime,myThid)
169 CALL MNC_CW_SET_UDIM('kpp_state', 0, myThid)
170 CALL MNC_CW_I_W_S('I','kpp_state',0,0,'iter',myIter,myThid)
171 CALL MNC_CW_RL_W(pf,'kpp_state',0,0,
172 & 'KPPviscAz', KPPviscAz, myThid)
173 CALL MNC_CW_RL_W(pf,'kpp_state',0,0,
174 & 'KPPdiffKzT', KPPdiffKzT, myThid)
175 CALL MNC_CW_RL_W(pf,'kpp_state',0,0,
176 & 'KPPdiffKzS', KPPdiffKzS, myThid)
177 CALL MNC_CW_RL_W(pf,'kpp_state',0,0,
178 & 'KPPGHAT', KPPghat, myThid)
179 CALL MNC_CW_RL_W(pf,'kpp_state',0,0,
180 & 'KPPHBL', KPPhbl, myThid)
181 ENDIF
182 #endif /* ALLOW_MNC */
183
184 ENDIF
185
186 C----------------------------------------------------------------
187 C Do KPP time averaging.
188
189 #ifdef ALLOW_TIMEAVE
190 IF ( KPP_taveFreq .GT. 0. _d 0 ) THEN
191
192 C Initialize averages to zero
193 IF ( myIter.EQ.nIter0 ) THEN
194
195 DO bj = myByLo(myThid), myByHi(myThid)
196 DO bi = myBxLo(myThid), myBxHi(myThid)
197 CALL TIMEAVE_RESET(KPPviscAztave, Nr,bi,bj,myThid)
198 CALL TIMEAVE_RESET(KPPdiffKzTtave,Nr,bi,bj,myThid)
199 CALL TIMEAVE_RESET(KPPghatKStave, Nr,bi,bj,myThid)
200 CALL TIMEAVE_RESET(KPPdiffKzStave,Nr,bi,bj,myThid)
201 CALL TIMEAVE_RESET(KPPhbltave, 1, bi,bj,myThid)
202 KPP_timeAve(bi,bj) = 0.
203 ENDDO
204 ENDDO
205
206 ELSE
207
208 C Time Average KPP fields
209 DDTT=deltaTclock
210 IF ( useGMRedi .AND. KPP_ghatUseTotalDiffus ) THEN
211 tmpFac = 1. _d 0
212 ELSE
213 tmpFac = 0. _d 0
214 ENDIF
215 DO bj = myByLo(myThid), myByHi(myThid)
216 DO bi = myBxLo(myThid), myBxHi(myThid)
217 CALL TIMEAVE_CUMULATE(
218 & KPPviscAztave, KPPviscAz, Nr,DDTT,bi,bj,myThid)
219 CALL TIMEAVE_CUMULATE(
220 & KPPdiffKzTtave,KPPdiffKzT,Nr,DDTT,bi,bj,myThid)
221 CALL TIMEAVE_CUMULATE(
222 & KPPdiffKzStave,KPPdiffKzS,Nr,DDTT,bi,bj,myThid)
223 DO k=2,Nr
224 DO j=1,sNy
225 DO i=1,sNx
226 KPPghatKStave(i,j,k,bi,bj) = KPPghatKStave(i,j,k,bi,bj)
227 & + ( KPPdiffKzS(i,j,k,bi,bj)
228 #ifdef ALLOW_GMREDI
229 & +tmpFac*Kwz(i,j,k,bi,bj)
230 #endif
231 & )*KPPghat(i,j,k-1,bi,bj)*DDTT
232 ENDDO
233 ENDDO
234 ENDDO
235 CALL TIMEAVE_CUMULATE(
236 & KPPhbltave, KPPhbl, 1, DDTT,bi,bj,myThid)
237 C Keep record of how much time has been integrated over
238 KPP_timeAve(bi,bj) = KPP_timeAve(bi,bj)+DDTT
239 ENDDO
240 ENDDO
241
242 ENDIF
243
244 C Dump files and restart average computation if needed
245 dumpFiles = .FALSE.
246 IF ( myIter .NE. nIter0 ) THEN
247 dumpFiles =
248 & DIFFERENT_MULTIPLE(KPP_taveFreq,myTime,deltaTClock)
249 #ifdef ALLOW_CAL
250 IF ( useCAL ) THEN
251 CALL CAL_TIME2DUMP( zeroRL, KPP_taveFreq, deltaTClock,
252 U dumpFiles,
253 I myTime, myIter, myThid )
254 ENDIF
255 #endif
256 ENDIF
257
258 IF (dumpFiles) THEN
259 C Normalize by integrated time
260 DO bj = myByLo(myThid), myByHi(myThid)
261 DO bi = myBxLo(myThid), myBxHi(myThid)
262 CALL TIMEAVE_NORMALIZE( KPPviscAztave,
263 & KPP_timeAve, Nr, bi, bj, myThid )
264 CALL TIMEAVE_NORMALIZE( KPPdiffKzTtave,
265 & KPP_timeAve, Nr, bi, bj, myThid )
266 CALL TIMEAVE_NORMALIZE( KPPghatKStave,
267 & KPP_timeAve, Nr, bi, bj, myThid )
268 CALL TIMEAVE_NORMALIZE( KPPdiffKzStave,
269 & KPP_timeAve, Nr, bi, bj, myThid )
270 CALL TIMEAVE_NORMALIZE( KPPhbltave,
271 & KPP_timeAve, 1 , bi, bj, myThid )
272 ENDDO
273 ENDDO
274
275 IF (KPPwriteState .AND. timeave_mdsio) THEN
276 #ifdef MULTIPLE_RECORD_KPP_STATE_FILES
277 C Write each tave output as a new record in one file per variable
278 C - creates relatively few files but these files can become huge
279 C NOTE: file size and number problems are *SOLVED* by MNC
280 CALL WRITE_REC_XYZ_RL('KPPviscAz-T',KPPviscAztave,
281 & kpp_drctrecTave,myIter,myThid)
282 CALL WRITE_REC_XYZ_RL('KPPdiffKzT-T',KPPdiffKzTtave,
283 & kpp_drctrecTave,myIter,myThid)
284 CALL WRITE_REC_XYZ_RL('KPPdiffKzS-T',KPPdiffKzStave,
285 & kpp_drctrecTave,myIter,myThid)
286 CALL WRITE_REC_XYZ_RL('KPPghatKS-T',KPPghatKStave,
287 & kpp_drctrecTave,myIter,myThid)
288 CALL WRITE_REC_XY_RL('KPPhbl-T',KPPhbltave,
289 & kpp_drctrecTave,myIter,myThid)
290 C-- Increment record counter
291 _BARRIER
292 _BEGIN_MASTER( myThid )
293 kpp_drctrecTave = kpp_drctrecTave + 1
294 _END_MASTER( myThid )
295 _BARRIER
296 #else /* MULTIPLE_RECORD_KPP_STATE_FILES */
297 C Write each tave output as a new file - creates many files but for
298 C large configurations is easier to transfer
299 C NOTE: file size and number problems are *SOLVED* by MNC
300 WRITE(suff,'(I10.10)') myIter
301 CALL WRITE_FLD_XYZ_RL('KPPviscAz-T.',suff,KPPviscAztave,
302 & myIter,myThid)
303 CALL WRITE_FLD_XYZ_RL('KPPdiffKzT-T.',suff,KPPdiffKzTtave,
304 & myIter,myThid)
305 CALL WRITE_FLD_XYZ_RL('KPPdiffKzS-T.',suff,KPPdiffKzStave,
306 & myIter,myThid)
307 CALL WRITE_FLD_XYZ_RL('KPPghatKS-T.',suff,KPPghatKStave,
308 & myIter,myThid)
309 CALL WRITE_FLD_XY_RL('KPPhbl-T.',suff,KPPhbltave,
310 & myIter,myThid)
311 #endif /* MULTIPLE_RECORD_KPP_STATE_FILES */
312 ENDIF
313
314 #ifdef ALLOW_MNC
315 IF (KPPwriteState .AND. useMNC .AND. timeave_mnc) THEN
316 IF ( writeBinaryPrec .EQ. precFloat64 ) THEN
317 pf(1:1) = 'D'
318 ELSE
319 pf(1:1) = 'R'
320 ENDIF
321 CALL MNC_CW_SET_UDIM('kpp_timeave', -1, myThid)
322 CALL MNC_CW_RL_W_S('D','kpp_timeave',0,0,'T',myTime,myThid)
323 CALL MNC_CW_SET_UDIM('kpp_timeave', 0, myThid)
324 CALL MNC_CW_I_W_S('I','kpp_timeave',0,0,'iter',myIter,myThid)
325 CALL MNC_CW_RL_W(pf,'kpp_timeave',0,0,
326 & 'KPPviscAz', KPPviscAztave, myThid)
327 CALL MNC_CW_RL_W(pf,'kpp_timeave',0,0,
328 & 'KPPdiffKzT', KPPdiffKzTtave, myThid)
329 CALL MNC_CW_RL_W(pf,'kpp_timeave',0,0,
330 & 'KPPdiffKzS', KPPdiffKzStave, myThid)
331 CALL MNC_CW_RL_W(pf,'kpp_timeave',0,0,
332 & 'KPPghatKS', KPPghatKStave, myThid)
333 CALL MNC_CW_RL_W(pf,'kpp_timeave',0,0,
334 & 'KPPHBL', KPPhbltave, myThid)
335 ENDIF
336 #endif /* ALLOW_MNC */
337
338 C Reset averages to zero
339 DO bj = myByLo(myThid), myByHi(myThid)
340 DO bi = myBxLo(myThid), myBxHi(myThid)
341 CALL TIMEAVE_RESET(KPPviscAztave, Nr,bi,bj,myThid)
342 CALL TIMEAVE_RESET(KPPdiffKzTtave,Nr,bi,bj,myThid)
343 CALL TIMEAVE_RESET(KPPghatKStave, Nr,bi,bj,myThid)
344 CALL TIMEAVE_RESET(KPPdiffKzStave,Nr,bi,bj,myThid)
345 CALL TIMEAVE_RESET(KPPhbltave, 1, bi,bj,myThid)
346 KPP_timeAve(bi,bj) = 0.
347 ENDDO
348 ENDDO
349
350 C-- end if dumpFiles
351 ENDIF
352
353 C-- end if KPP_taveFreq > 0
354 ENDIF
355 #endif /* ALLOW_TIMEAVE */
356
357 #ifdef ALLOW_DIAGNOSTICS
358 C do not fill during call from INITIALISE_VARIA
359 IF ( useDiagnostics .AND. myIter.NE.nIter0 ) THEN
360 CALL DIAGNOSTICS_FILL(KPPviscAz ,'KPPviscA',0,Nr,0,1,1,myThid)
361 CALL DIAGNOSTICS_FILL(KPPdiffKzS,'KPPdiffS',0,Nr,0,1,1,myThid)
362 CALL DIAGNOSTICS_FILL(KPPdiffKzT,'KPPdiffT',0,Nr,0,1,1,myThid)
363 IF ( DIAGNOSTICS_IS_ON( 'KPPghatK', myThid ) ) THEN
364 IF ( useGMRedi .AND. KPP_ghatUseTotalDiffus ) THEN
365 tmpFac = 1. _d 0
366 ELSE
367 tmpFac = 0. _d 0
368 ENDIF
369 DO bj = myByLo(myThid), myByHi(myThid)
370 DO bi = myBxLo(myThid), myBxHi(myThid)
371 DO j=1,sNy
372 DO i=1,sNx
373 tmpLoc(i,j,1) = 0. _d 0
374 ENDDO
375 ENDDO
376 DO k=2,Nr
377 DO j=1,sNy
378 DO i=1,sNx
379 tmpLoc(i,j,k) = KPPghat(i,j,k-1,bi,bj)*
380 & ( KPPdiffKzS(i,j,k,bi,bj)
381 #ifdef ALLOW_GMREDI
382 & + tmpFac*Kwz(i,j,k,bi,bj)
383 #endif
384 & )
385 ENDDO
386 ENDDO
387 ENDDO
388 CALL DIAGNOSTICS_FILL(tmpLoc,'KPPghatK',0,Nr,3,bi,bj,myThid)
389 ENDDO
390 ENDDO
391 ENDIF
392 CALL DIAGNOSTICS_FILL(KPPhbl ,'KPPhbl ',0,1 ,0,1,1,myThid)
393 CALL DIAGNOSTICS_FILL(KPPfrac ,'KPPfrac ',0,1 ,0,1,1,myThid)
394 #ifdef ALLOW_SALT_PLUME
395 CALL DIAGNOSTICS_FILL(KPPplumefrac,'KPPpfrac',0,1 ,0,1,1,myThid)
396 #endif /* ALLOW_SALT_PLUME */
397 ENDIF
398 #endif /* ALLOW_DIAGNOSTICS */
399
400 #endif /* ALLOW_KPP */
401
402 RETURN
403 END

  ViewVC Help
Powered by ViewVC 1.1.22