1 |
C $Header: /u/gcmpack/MITgcm/pkg/my82/my82_do_diags.F,v 1.4 2008/04/14 09:42:03 mlosch Exp $ |
2 |
C $Name: $ |
3 |
|
4 |
#include "MY82_OPTIONS.h" |
5 |
|
6 |
#undef MULTIPLE_RECORD_MY82_STATE_FILES |
7 |
CBOP |
8 |
C !ROUTINE: MY82_DO_DIAGS |
9 |
C !INTERFACE: |
10 |
SUBROUTINE MY82_DO_DIAGS( myCurrentTime, myIter, myThid ) |
11 |
C !DESCRIPTION: \bv |
12 |
C *==========================================================* |
13 |
C | SUBROUTINE MY82_DO_DIAGS |
14 |
C | o Do MY82 diagnostic output. |
15 |
C *========================================================== |
16 |
C | The following CPP flag (MULTIPLE_RECORD_MY82_STATE_FILES) is |
17 |
C | #define/#undefed here since it is specific to this routine |
18 |
C | and very user-preference specific. |
19 |
C | |
20 |
C | If #undefed (default) the state files are written as in all versions |
21 |
C | prior to checkpoint32, where a file is created per variable, per time |
22 |
C | and per tile. This *has* to be the default because most users use this |
23 |
C | mode and all utilities and scripts (diagnostic) assume this form. |
24 |
C | It is also robust, as explained below. |
25 |
C | |
26 |
C | If #defined, subsequent snap-shots are written as records in the |
27 |
C | same file (no iteration number in filenames). |
28 |
C | Advantages: - fewer files |
29 |
C | - for small problems, is easy to copy the output around |
30 |
C | Disadvantages: |
31 |
C | - breaks a lot of diagnostic scripts |
32 |
C | - for large or long problems this creates huge files |
33 |
C | - is an unexpected, unsolicited change in behaviour which came |
34 |
C | as a surprise (in c32) and inconvenience to several users |
35 |
C | - can not accomodate changing the frequency of output |
36 |
C | after a pickup (this is trivial in previous method |
37 |
C | but needs new code and parameters in this new method) |
38 |
C *==========================================================* |
39 |
C \ev |
40 |
|
41 |
C !USES: |
42 |
IMPLICIT NONE |
43 |
C === Global variables === |
44 |
#include "SIZE.h" |
45 |
#include "EEPARAMS.h" |
46 |
#include "PARAMS.h" |
47 |
#ifdef ALLOW_MNC |
48 |
#include "MNC_PARAMS.h" |
49 |
#endif |
50 |
#include "MY82.h" |
51 |
#include "MY82_DIAGS.h" |
52 |
|
53 |
C !INPUT/OUTPUT PARAMETERS: |
54 |
C == Routine arguments == |
55 |
C myCurrentTime - Current time of simulation ( s ) |
56 |
C myIter - Iteration number |
57 |
C myThid - Number of this instance of INI_FORCING |
58 |
_RL myCurrentTime |
59 |
INTEGER myIter |
60 |
INTEGER myThid |
61 |
|
62 |
#ifdef ALLOW_MY82 |
63 |
|
64 |
C !LOCAL VARIABLES: |
65 |
C == Local variables == |
66 |
CHARACTER*(MAX_LEN_MBUF) suff |
67 |
LOGICAL DIFFERENT_MULTIPLE |
68 |
EXTERNAL DIFFERENT_MULTIPLE |
69 |
INTEGER bi, bj, K |
70 |
_RL DDTT |
71 |
CHARACTER*(1) pf |
72 |
CEOP |
73 |
|
74 |
IF ( writeBinaryPrec .EQ. precFloat64 ) THEN |
75 |
pf(1:1) = 'D' |
76 |
ELSE |
77 |
pf(1:1) = 'R' |
78 |
ENDIF |
79 |
|
80 |
C---------------------------------------------------------------- |
81 |
C Dump snapshot of MY82 variables. |
82 |
C---------------------------------------------------------------- |
83 |
|
84 |
IF ( |
85 |
& DIFFERENT_MULTIPLE(MYdumpFreq, |
86 |
& myCurrentTime,deltaTClock) |
87 |
& ) THEN |
88 |
|
89 |
IF (MYmixingMaps) THEN |
90 |
CALL PLOT_FIELD_XYRL ( MYhbl , 'MYhbl' , |
91 |
& myIter, myThid ) |
92 |
CALL PLOT_FIELD_XYZRL ( MYviscAr, 'MYviscAr', |
93 |
& Nr, myIter, myThid ) |
94 |
CALL PLOT_FIELD_XYZRL ( MYdiffKr, 'MYdiffKr', |
95 |
& Nr, myIter, myThid ) |
96 |
ENDIF |
97 |
|
98 |
IF (MYwriteState .AND. snapshot_mdsio) THEN |
99 |
#ifdef MULTIPLE_RECORD_MY82_STATE_FILES |
100 |
C Write each snap-shot as a new record in one file per variable |
101 |
C - creates relatively few files but these files can become huge |
102 |
CALL WRITE_REC_XYZ_RL('MYviscAr',MYviscAr,my_drctrec, |
103 |
& myIter,myThid) |
104 |
CALL WRITE_REC_XYZ_RL('MYdiffKr',MYdiffKr,my_drctrec, |
105 |
& myIter,myThid) |
106 |
CALL WRITE_REC_XY_RL('MYhbl',MYhbl,my_drctrec, |
107 |
& myIter,myThid) |
108 |
#else /* MULTIPLE_RECORD_MY82_STATE_FILES */ |
109 |
C Write each snap-shot as a new file |
110 |
C - creates many files but for large configurations is easier to |
111 |
C transfer analyse a particular snap-shots |
112 |
WRITE(suff,'(I10.10)') myIter |
113 |
CALL WRITE_FLD_XYZ_RL('MYviscAr.',suff,MYviscAr, |
114 |
& myIter,myThid) |
115 |
CALL WRITE_FLD_XYZ_RL('MYdiffKr.',suff,MYdiffKr, |
116 |
& myIter,myThid) |
117 |
CALL WRITE_FLD_XY_RL('MYhbl.',suff,MYhbl, |
118 |
& myIter,myThid) |
119 |
#endif /* MULTIPLE_RECORD_MY82_STATE_FILES */ |
120 |
ENDIF |
121 |
|
122 |
#ifdef ALLOW_MNC |
123 |
IF (MYwriteState .AND. useMNC .AND. snapshot_mnc ) THEN |
124 |
CALL MNC_CW_SET_UDIM('my_state', -1, myThid) |
125 |
CALL MNC_CW_RL_W_S('D','my_state',0,0,'T',myCurrentTime,myThid) |
126 |
CALL MNC_CW_SET_UDIM('my_state', 0, myThid) |
127 |
CALL MNC_CW_I_W_S('I','my_state',0,0,'iter',myIter,myThid) |
128 |
CALL MNC_CW_RL_W(pf,'my_state',0,0, |
129 |
& 'MYviscAr', MYviscAr, myThid) |
130 |
CALL MNC_CW_RL_W(pf,'my_state',0,0, |
131 |
& 'MYdiffKr', MYdiffKr, myThid) |
132 |
print *, 'ml-hbl 1' |
133 |
CALL MNC_CW_RL_W(pf,'my_state',0,0, |
134 |
& 'MYhbl', MYhbl, myThid) |
135 |
print *, 'ml-hbl 2' |
136 |
ENDIF |
137 |
#endif /* ALLOW_MNC */ |
138 |
|
139 |
C-- Increment record counter |
140 |
my_drctrec = my_drctrec + 1 |
141 |
|
142 |
ENDIF |
143 |
|
144 |
C---------------------------------------------------------------- |
145 |
C Do MY82 time averaging. |
146 |
C---------------------------------------------------------------- |
147 |
|
148 |
#ifdef ALLOW_TIMEAVE |
149 |
|
150 |
C Initialize averages to zero |
151 |
IF ( myIter.EQ.nIter0 ) THEN |
152 |
DO bj = myByLo(myThid), myByHi(myThid) |
153 |
DO bi = myBxLo(myThid), myBxHi(myThid) |
154 |
CALL TIMEAVE_RESET(MYviscArtave, Nr,bi,bj,myThid) |
155 |
CALL TIMEAVE_RESET(MYdiffKrtave,Nr,bi,bj,myThid) |
156 |
CALL TIMEAVE_RESET(MYhbltave, 1, bi,bj,myThid) |
157 |
DO k=1,Nr |
158 |
my_TimeAve(k,bi,bj)=0. |
159 |
ENDDO |
160 |
ENDDO |
161 |
ENDDO |
162 |
ENDIF |
163 |
|
164 |
C Time Average MY82 fields |
165 |
IF ( myIter .EQ. nIter0 .OR. |
166 |
& DIFFERENT_MULTIPLE(MYtaveFreq,myCurrentTime,deltaTClock) |
167 |
& ) THEN |
168 |
DDTT=0.5*deltaTclock |
169 |
ELSE |
170 |
DDTT=deltaTclock |
171 |
ENDIF |
172 |
DO bj = myByLo(myThid), myByHi(myThid) |
173 |
DO bi = myBxLo(myThid), myBxHi(myThid) |
174 |
CALL TIMEAVE_CUMULATE( |
175 |
& MYviscArtave,MYviscAr,Nr,DDTT,bi,bj,myThid) |
176 |
CALL TIMEAVE_CUMULATE( |
177 |
& MYdiffKrtave,MYdiffKr,Nr,DDTT,bi,bj,myThid) |
178 |
CALL TIMEAVE_CUMULATE( |
179 |
& MYhbltave, MYhbl, 1, DDTT,bi,bj,myThid) |
180 |
C Keep record of how much time has been integrated over |
181 |
DO k=1,Nr |
182 |
my_TimeAve(k,bi,bj)=my_TimeAve(k,bi,bj)+DDTT |
183 |
ENDDO |
184 |
ENDDO |
185 |
ENDDO |
186 |
|
187 |
C Dump files and restart average computation if needed |
188 |
IF ( myIter.NE.nIter0 .AND. |
189 |
& DIFFERENT_MULTIPLE(MYtaveFreq,myCurrentTime,deltaTClock) |
190 |
& ) THEN |
191 |
|
192 |
C Normalize by integrated time |
193 |
DO bj = myByLo(myThid), myByHi(myThid) |
194 |
DO bi = myBxLo(myThid), myBxHi(myThid) |
195 |
CALL TIMEAVE_NORMALIZ(MYviscArtave,my_timeave, |
196 |
& Nr, bi,bj,myThid) |
197 |
CALL TIMEAVE_NORMALIZ(MYdiffKrtave,my_timeave, |
198 |
& Nr, bi,bj,myThid) |
199 |
CALL TIMEAVE_NORMALIZ(MYhbltave ,my_timeave, |
200 |
& 1, bi,bj,myThid) |
201 |
ENDDO |
202 |
ENDDO |
203 |
|
204 |
IF (MYwriteState .AND. timeave_mdsio) THEN |
205 |
#ifdef MULTIPLE_RECORD_MY82_STATE_FILES |
206 |
C Write each snap-shot as a new record in one file per variable |
207 |
C - creates relatively few files but these files can become huge |
208 |
CALL WRITE_REC_XYZ_RL('MYviscAr-T',MYviscArTave, |
209 |
& my_drctrecTave,myIter,myThid) |
210 |
CALL WRITE_REC_XYZ_RL('MYdiffKr-T',MYdiffKrTave, |
211 |
& my_drctrecTave,myIter,myThid) |
212 |
CALL WRITE_REC_XY_RL('MYhbl-T', MYhblTave, |
213 |
& my_drctrecTave,myIter,myThid) |
214 |
C-- Increment record counter |
215 |
my_drctrecTave = my_drctrecTave + 1 |
216 |
|
217 |
#else /* MULTIPLE_RECORD_MY82_STATE_FILES */ |
218 |
|
219 |
C Write each snap-shot as a new file |
220 |
C - creates many files but for large configurations is easier to |
221 |
C transfer analyse a particular snap-shots |
222 |
WRITE(suff,'(I10.10)') myIter |
223 |
CALL WRITE_FLD_XYZ_RL('MYviscAr-T.',suff,MYviscArTave, |
224 |
& myIter,myThid) |
225 |
CALL WRITE_FLD_XYZ_RL('MYdiffKr-T.',suff,MYdiffKrTave, |
226 |
& myIter,myThid) |
227 |
CALL WRITE_FLD_XY_RL('MYhbl-T.', suff,MYhblTave, |
228 |
& myIter,myThid) |
229 |
#endif /* MULTIPLE_RECORD_MY82_STATE_FILES */ |
230 |
ENDIF |
231 |
|
232 |
#ifdef ALLOW_MNC |
233 |
IF (MYwriteState .AND. useMNC .AND. timeave_mnc) THEN |
234 |
CALL MNC_CW_SET_UDIM('my_timeave', -1, myThid) |
235 |
CALL MNC_CW_RL_W_S('D','my_timeave',0,0,'T',myCurrentTime,myThid) |
236 |
CALL MNC_CW_SET_UDIM('my_timeave', 0, myThid) |
237 |
CALL MNC_CW_I_W_S('I','my_timeave',0,0,'iter',myIter,myThid) |
238 |
CALL MNC_CW_RL_W(pf,'my_timeave',0,0, |
239 |
& 'MYviscAr', MYviscArTave, myThid) |
240 |
CALL MNC_CW_RL_W(pf,'my_timeave',0,0, |
241 |
& 'MYdiffKr', MYdiffKrTave, myThid) |
242 |
CALL MNC_CW_RL_W(pf,'my_timeave',0,0, |
243 |
& 'MYhbl', MYhblTave, myThid) |
244 |
ENDIF |
245 |
#endif /* ALLOW_MNC */ |
246 |
|
247 |
C Reset averages to zero |
248 |
DO bj = myByLo(myThid), myByHi(myThid) |
249 |
DO bi = myBxLo(myThid), myBxHi(myThid) |
250 |
CALL TIMEAVE_RESET(MYviscArtave,Nr,bi,bj,myThid) |
251 |
CALL TIMEAVE_RESET(MYdiffKrtave,Nr,bi,bj,myThid) |
252 |
CALL TIMEAVE_RESET(MYhbltave, 1,bi,bj,myThid) |
253 |
DO k=1,Nr |
254 |
my_TimeAve(k,bi,bj)=0. |
255 |
ENDDO |
256 |
ENDDO |
257 |
ENDDO |
258 |
|
259 |
C Time Average MY fields |
260 |
DDTT=0.5*deltaTclock |
261 |
DO bj = myByLo(myThid), myByHi(myThid) |
262 |
DO bi = myBxLo(myThid), myBxHi(myThid) |
263 |
CALL TIMEAVE_CUMULATE( |
264 |
& MYviscArtave,MYviscAr,Nr,DDTT,bi,bj,myThid) |
265 |
CALL TIMEAVE_CUMULATE( |
266 |
& MYdiffKrtave,MYdiffKr,Nr,DDTT,bi,bj,myThid) |
267 |
CALL TIMEAVE_CUMULATE( |
268 |
& MYhbltave, MYhbl, 1, DDTT,bi,bj,myThid) |
269 |
C Keep record of how much time has been integrated over |
270 |
DO k=1,Nr |
271 |
my_TimeAve(k,bi,bj)=my_TimeAve(k,bi,bj)+DDTT |
272 |
ENDDO |
273 |
ENDDO |
274 |
ENDDO |
275 |
ENDIF |
276 |
|
277 |
#endif /* ALLOW_TIMEAVE */ |
278 |
|
279 |
#ifdef ALLOW_DIAGNOSTICS |
280 |
IF ( useDiagnostics ) THEN |
281 |
CALL DIAGNOSTICS_FILL(MYviscAr,'MYVISCAR',0,Nr,0,1,1,myThid) |
282 |
CALL DIAGNOSTICS_FILL(MYdiffKr,'MYDIFFKR',0,Nr,0,1,1,myThid) |
283 |
CALL DIAGNOSTICS_FILL(MYhbl ,'MYHBL ',0,1 ,0,1,1,myThid) |
284 |
ENDIF |
285 |
#endif /* ALLOW_DIAGNOSTICS */ |
286 |
|
287 |
#endif /* ALLOW_MY82 */ |
288 |
|
289 |
RETURN |
290 |
END |