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

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

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


Revision 1.6 - (hide annotations) (download)
Mon Aug 6 16:56:59 2012 UTC (11 years, 10 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 jmc 1.6 C $Header: /u/gcmpack/MITgcm/pkg/kpp/kpp_output.F,v 1.5 2012/06/07 17:09:47 jmc Exp $
2 jmc 1.1 C $Name: $
3    
4     #include "KPP_OPTIONS.h"
5 jmc 1.4 #ifdef ALLOW_GMREDI
6     # include "GMREDI_OPTIONS.h"
7     #endif
8 jmc 1.2 #undef MULTIPLE_RECORD_KPP_STATE_FILES
9 jmc 1.1
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 jmc 1.4 #ifdef ALLOW_GMREDI
54     # include "GMREDI.h"
55     #endif
56     #ifdef ALLOW_MNC
57     # include "MNC_PARAMS.h"
58     #endif
59 jmc 1.1
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 jmc 1.2 C !FUNCTIONS:
71     LOGICAL DIFFERENT_MULTIPLE
72     EXTERNAL DIFFERENT_MULTIPLE
73 jmc 1.4 #ifdef ALLOW_DIAGNOSTICS
74     LOGICAL DIAGNOSTICS_IS_ON
75     EXTERNAL DIAGNOSTICS_IS_ON
76     #endif
77 jmc 1.2
78 jmc 1.1 C !LOCAL VARIABLES:
79 jmc 1.4 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 jmc 1.1 CHARACTER*(MAX_LEN_MBUF) suff
84 jmc 1.4 #if (defined ALLOW_TIMEAVE) || (defined ALLOW_DIAGNOSTICS)
85     INTEGER bi, bj
86     INTEGER i, j, k
87     _RL tmpFac
88     #endif
89 jmc 1.2 #ifdef ALLOW_TIMEAVE
90 jmc 1.1 _RL DDTT
91     LOGICAL dumpFiles
92 jmc 1.2 #endif
93 jmc 1.4 #ifdef ALLOW_DIAGNOSTICS
94     _RL tmpLoc(1:sNx,1:sNy,Nr)
95     #endif
96 jmc 1.2 #ifdef ALLOW_MNC
97 jmc 1.1 CHARACTER*(1) pf
98 jmc 1.2 #endif
99 jmc 1.1 CEOP
100    
101 jmc 1.2 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 jmc 1.1 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 jmc 1.2 IF ( writeBinaryPrec .EQ. precFloat64 ) THEN
163     pf(1:1) = 'D'
164     ELSE
165     pf(1:1) = 'R'
166     ENDIF
167 jmc 1.1 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 jmc 1.2 IF ( KPP_taveFreq .GT. 0. _d 0 ) THEN
191 jmc 1.1
192     C Initialize averages to zero
193 jmc 1.2 IF ( myIter.EQ.nIter0 ) THEN
194 jmc 1.1
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 jmc 1.4 CALL TIMEAVE_RESET(KPPghatKStave, Nr,bi,bj,myThid)
200 jmc 1.1 CALL TIMEAVE_RESET(KPPdiffKzStave,Nr,bi,bj,myThid)
201     CALL TIMEAVE_RESET(KPPhbltave, 1, bi,bj,myThid)
202 jmc 1.2 KPP_timeAve(bi,bj) = 0.
203 jmc 1.1 ENDDO
204     ENDDO
205    
206 jmc 1.2 ELSE
207 jmc 1.1
208     C Time Average KPP fields
209 jmc 1.2 DDTT=deltaTclock
210 jmc 1.4 IF ( useGMRedi .AND. KPP_ghatUseTotalDiffus ) THEN
211     tmpFac = 1. _d 0
212     ELSE
213     tmpFac = 0. _d 0
214     ENDIF
215 jmc 1.2 DO bj = myByLo(myThid), myByHi(myThid)
216     DO bi = myBxLo(myThid), myBxHi(myThid)
217 jmc 1.1 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 jmc 1.4 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 jmc 1.1 CALL TIMEAVE_CUMULATE(
236     & KPPhbltave, KPPhbl, 1, DDTT,bi,bj,myThid)
237     C Keep record of how much time has been integrated over
238 jmc 1.2 KPP_timeAve(bi,bj) = KPP_timeAve(bi,bj)+DDTT
239     ENDDO
240 jmc 1.1 ENDDO
241    
242 jmc 1.2 ENDIF
243 jmc 1.1
244     C Dump files and restart average computation if needed
245 jmc 1.2 dumpFiles = .FALSE.
246     IF ( myIter .NE. nIter0 ) THEN
247 jmc 1.1 dumpFiles =
248     & DIFFERENT_MULTIPLE(KPP_taveFreq,myTime,deltaTClock)
249     #ifdef ALLOW_CAL
250     IF ( useCAL ) THEN
251 jmc 1.5 CALL CAL_TIME2DUMP( zeroRL, KPP_taveFreq, deltaTClock,
252 jmc 1.1 U dumpFiles,
253     I myTime, myIter, myThid )
254     ENDIF
255     #endif
256 jmc 1.2 ENDIF
257 jmc 1.1
258 jmc 1.2 IF (dumpFiles) THEN
259 jmc 1.1 C Normalize by integrated time
260     DO bj = myByLo(myThid), myByHi(myThid)
261     DO bi = myBxLo(myThid), myBxHi(myThid)
262 jmc 1.2 CALL TIMEAVE_NORMALIZE( KPPviscAztave,
263     & KPP_timeAve, Nr, bi, bj, myThid )
264     CALL TIMEAVE_NORMALIZE( KPPdiffKzTtave,
265     & KPP_timeAve, Nr, bi, bj, myThid )
266 jmc 1.4 CALL TIMEAVE_NORMALIZE( KPPghatKStave,
267 jmc 1.2 & 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 jmc 1.1 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 jmc 1.4 CALL WRITE_REC_XYZ_RL('KPPviscAz-T',KPPviscAztave,
281 jmc 1.1 & kpp_drctrecTave,myIter,myThid)
282 jmc 1.4 CALL WRITE_REC_XYZ_RL('KPPdiffKzT-T',KPPdiffKzTtave,
283 jmc 1.1 & kpp_drctrecTave,myIter,myThid)
284 jmc 1.4 CALL WRITE_REC_XYZ_RL('KPPdiffKzS-T',KPPdiffKzStave,
285 jmc 1.1 & kpp_drctrecTave,myIter,myThid)
286 jmc 1.4 CALL WRITE_REC_XYZ_RL('KPPghatKS-T',KPPghatKStave,
287 jmc 1.1 & kpp_drctrecTave,myIter,myThid)
288 jmc 1.4 CALL WRITE_REC_XY_RL('KPPhbl-T',KPPhbltave,
289 jmc 1.1 & 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 jmc 1.4 CALL WRITE_FLD_XYZ_RL('KPPviscAz-T.',suff,KPPviscAztave,
302 jmc 1.1 & myIter,myThid)
303 jmc 1.4 CALL WRITE_FLD_XYZ_RL('KPPdiffKzT-T.',suff,KPPdiffKzTtave,
304 jmc 1.1 & myIter,myThid)
305 jmc 1.4 CALL WRITE_FLD_XYZ_RL('KPPdiffKzS-T.',suff,KPPdiffKzStave,
306 jmc 1.1 & myIter,myThid)
307 jmc 1.4 CALL WRITE_FLD_XYZ_RL('KPPghatKS-T.',suff,KPPghatKStave,
308 jmc 1.1 & myIter,myThid)
309 jmc 1.4 CALL WRITE_FLD_XY_RL('KPPhbl-T.',suff,KPPhbltave,
310 jmc 1.1 & 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 jmc 1.2 IF ( writeBinaryPrec .EQ. precFloat64 ) THEN
317     pf(1:1) = 'D'
318     ELSE
319     pf(1:1) = 'R'
320     ENDIF
321 jmc 1.1 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 jmc 1.4 & 'KPPviscAz', KPPviscAztave, myThid)
327 jmc 1.1 CALL MNC_CW_RL_W(pf,'kpp_timeave',0,0,
328 jmc 1.4 & 'KPPdiffKzT', KPPdiffKzTtave, myThid)
329 jmc 1.1 CALL MNC_CW_RL_W(pf,'kpp_timeave',0,0,
330 jmc 1.4 & 'KPPdiffKzS', KPPdiffKzStave, myThid)
331 jmc 1.1 CALL MNC_CW_RL_W(pf,'kpp_timeave',0,0,
332 jmc 1.4 & 'KPPghatKS', KPPghatKStave, myThid)
333 jmc 1.1 CALL MNC_CW_RL_W(pf,'kpp_timeave',0,0,
334 jmc 1.4 & 'KPPHBL', KPPhbltave, myThid)
335 jmc 1.1 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 jmc 1.4 CALL TIMEAVE_RESET(KPPghatKStave, Nr,bi,bj,myThid)
344 jmc 1.1 CALL TIMEAVE_RESET(KPPdiffKzStave,Nr,bi,bj,myThid)
345     CALL TIMEAVE_RESET(KPPhbltave, 1, bi,bj,myThid)
346 jmc 1.2 KPP_timeAve(bi,bj) = 0.
347 jmc 1.1 ENDDO
348     ENDDO
349    
350 jmc 1.2 C-- end if dumpFiles
351     ENDIF
352    
353     C-- end if KPP_taveFreq > 0
354 jmc 1.1 ENDIF
355     #endif /* ALLOW_TIMEAVE */
356    
357     #ifdef ALLOW_DIAGNOSTICS
358 jmc 1.3 C do not fill during call from INITIALISE_VARIA
359 jmc 1.1 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 jmc 1.4 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 jmc 1.1 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