/[MITgcm]/MITgcm/pkg/diagnostics/diagnostics_utils.F
ViewVC logotype

Annotation of /MITgcm/pkg/diagnostics/diagnostics_utils.F

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


Revision 1.36 - (hide annotations) (download)
Sun Jul 23 00:24:18 2017 UTC (6 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, HEAD
Changes since 1.35: +5 -5 lines
allows for negative "jdiag" (interpret |jdiag| instead)

1 jmc 1.36 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_utils.F,v 1.35 2017/05/26 08:33:03 mlosch Exp $
2 edhill 1.8 C $Name: $
3    
4 edhill 1.9 #include "DIAG_OPTIONS.h"
5    
6 jmc 1.25 C-- File diagnostics_utils.F: General purpose support routines
7     C-- Contents:
8     C-- o DIAGNOSTICS_COUNT
9 jmc 1.31 C-- o DIAGNOSTICS_GET_DIAG
10 jmc 1.26 C-- o DIAGNOSTICS_GET_POINTERS
11 jmc 1.29 C-- o DIAGNOSTICS_SETKLEV
12 jmc 1.26 C-- o DIAGS_GET_PARMS_I (Function)
13 jmc 1.25 C-- o DIAGS_MK_UNITS (Function)
14     C-- o DIAGS_MK_TITLE (Function)
15 jmc 1.34 C-- o DIAGS_RENAMED (Function)
16 jmc 1.25
17 edhill 1.12 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
18    
19 jmc 1.15 CBOP 0
20 jmc 1.19 C !ROUTINE: DIAGNOSTICS_COUNT
21     C !INTERFACE:
22 jmc 1.31 SUBROUTINE DIAGNOSTICS_COUNT( diagName,
23     I biArg, bjArg, myThid )
24 jmc 1.19
25     C !DESCRIPTION:
26     C***********************************************************************
27     C routine to increment the diagnostic counter only
28     C***********************************************************************
29     C !USES:
30     IMPLICIT NONE
31    
32     C == Global variables ===
33     #include "EEPARAMS.h"
34     #include "SIZE.h"
35     #include "DIAGNOSTICS_SIZE.h"
36     #include "DIAGNOSTICS.h"
37    
38     C !INPUT PARAMETERS:
39     C***********************************************************************
40     C Arguments Description
41     C ----------------------
42 jmc 1.31 C diagName :: name of diagnostic to increment the counter
43 jmc 1.19 C biArg :: X-direction tile number, or 0 if called outside bi,bj loops
44     C bjArg :: Y-direction tile number, or 0 if called outside bi,bj loops
45     C myThid :: my thread Id number
46     C***********************************************************************
47 jmc 1.31 CHARACTER*8 diagName
48 jmc 1.19 INTEGER biArg, bjArg
49     INTEGER myThid
50     CEOP
51    
52     C !LOCAL VARIABLES:
53     C ===============
54 jmc 1.21 INTEGER m, n
55     INTEGER bi, bj
56 jmc 1.28 INTEGER ipt, ndId
57 jmc 1.19 c CHARACTER*(MAX_LEN_MBUF) msgBuf
58    
59 jmc 1.28 IF ( biArg.EQ.0 .AND. bjArg.EQ.0 ) THEN
60     bi = myBxLo(myThid)
61     bj = myByLo(myThid)
62     ELSE
63     bi = MIN(biArg,nSx)
64     bj = MIN(bjArg,nSy)
65     ENDIF
66    
67 jmc 1.21 C-- Run through list of active diagnostics to find which counter
68     C to increment (needs to be a valid & active diagnostic-counter)
69 jmc 1.31 DO n=1,nLists
70 jmc 1.19 DO m=1,nActive(n)
71 jmc 1.31 IF ( diagName.EQ.flds(m,n) .AND. idiag(m,n).GT.0 ) THEN
72 jmc 1.21 ipt = idiag(m,n)
73 jmc 1.28 IF (ndiag(ipt,bi,bj).GE.0) THEN
74 jmc 1.36 ndId = ABS(jdiag(m,n))
75 jmc 1.28 ipt = ipt + pdiag(n,bi,bj)*kdiag(ndId)
76 jmc 1.21 C- Increment the counter for the diagnostic
77     IF ( biArg.EQ.0 .AND. bjArg.EQ.0 ) THEN
78     DO bj=myByLo(myThid), myByHi(myThid)
79     DO bi=myBxLo(myThid), myBxHi(myThid)
80     ndiag(ipt,bi,bj) = ndiag(ipt,bi,bj) + 1
81     ENDDO
82     ENDDO
83     ELSE
84     ndiag(ipt,bi,bj) = ndiag(ipt,bi,bj) + 1
85     ENDIF
86     C- Increment is done
87     ENDIF
88 jmc 1.19 ENDIF
89     ENDDO
90     ENDDO
91    
92 jmc 1.21 RETURN
93 jmc 1.19 END
94    
95     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
96    
97     CBOP 0
98 jmc 1.31 C !ROUTINE: DIAGNOSTICS_GET_DIAG
99    
100     C !INTERFACE:
101     SUBROUTINE DIAGNOSTICS_GET_DIAG(
102     I kl, undefRL,
103     O qtmp,
104     I ndId, mate, ip, im, bi, bj, myThid )
105    
106     C !DESCRIPTION:
107     C Retrieve time-averaged (or snap-shot) diagnostic field
108    
109     C !USES:
110     IMPLICIT NONE
111     #include "EEPARAMS.h"
112     #include "SIZE.h"
113     #include "DIAGNOSTICS_SIZE.h"
114     #include "DIAGNOSTICS.h"
115    
116     C !INPUT PARAMETERS:
117     C kl :: level selection: >0 : single selected lev ; =0 : all kdiag levels
118     C undefRL :: undefined "_RL" type value
119     C ndId :: diagnostic Id number (in available diagnostics list)
120     C mate :: counter diagnostic number if any ; 0 otherwise
121     C ip :: pointer to storage array location for diag.
122     C im :: pointer to storage array location for mate
123     C bi :: X-direction tile number
124     C bj :: Y-direction tile number
125     C myThid :: my thread Id number
126     INTEGER kl
127     _RL undefRL
128     INTEGER ndId, mate, ip, im
129     INTEGER bi, bj, myThid
130    
131     C !OUTPUT PARAMETERS:
132     C qtmp :: time-averaged (or snap-shot) diagnostic field
133     _RL qtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy,*)
134     CEOP
135    
136     C !LOCAL VARIABLES:
137     _RL factor
138     INTEGER i, j, ipnt, ipCt
139     INTEGER k, kd, km, kLev
140    
141     IF (ndId.GE.1) THEN
142     kLev = kdiag(ndId)
143     IF ( kl.GE.1 .AND. kl.LE.kLev ) THEN
144     kLev = 1
145     ELSEIF ( kl.NE.0 ) THEN
146     kLev = 0
147     ENDIF
148    
149     DO k = 1,kLev
150     kd = k
151     IF ( kl.GE.1 ) kd = kl
152    
153     IF ( mate.EQ.0 ) THEN
154     C- No counter diagnostics => average = Sum / ndiag :
155    
156     ipnt = ip + kd - 1
157     factor = FLOAT(ndiag(ip,bi,bj))
158     IF (ndiag(ip,bi,bj).NE.0) factor = 1. _d 0 / factor
159    
160     #ifdef ALLOW_FIZHI
161     DO j = 1,sNy+1
162     DO i = 1,sNx+1
163     IF ( qdiag(i,j,ipnt,bi,bj) .LE. undefRL ) THEN
164     qtmp(i,j,k) = qdiag(i,j,ipnt,bi,bj)*factor
165     ELSE
166     qtmp(i,j,k) = undefRL
167     ENDIF
168     ENDDO
169     ENDDO
170     #else /* ALLOW_FIZHI */
171     DO j = 1,sNy+1
172     DO i = 1,sNx+1
173     qtmp(i,j,k) = qdiag(i,j,ipnt,bi,bj)*factor
174     ENDDO
175     ENDDO
176     #endif /* ALLOW_FIZHI */
177    
178     ELSE
179     C- With counter diagnostics => average = Sum / counter:
180    
181     ipnt = ip + kd - 1
182     km = MIN(kd,kdiag(mate))
183     ipCt = im + km - 1
184     DO j = 1,sNy+1
185     DO i = 1,sNx+1
186     IF ( qdiag(i,j,ipCt,bi,bj) .NE. 0. ) THEN
187     qtmp(i,j,k) = qdiag(i,j,ipnt,bi,bj)
188     & / qdiag(i,j,ipCt,bi,bj)
189     ELSE
190     qtmp(i,j,k) = undefRL
191     ENDIF
192     ENDDO
193     ENDDO
194    
195     ENDIF
196     ENDDO
197     ENDIF
198    
199     RETURN
200     END
201    
202     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
203    
204     CBOP 0
205 jmc 1.26 C !ROUTINE: DIAGNOSTICS_GET_POINTERS
206     C !INTERFACE:
207     SUBROUTINE DIAGNOSTICS_GET_POINTERS(
208     I diagName, listId,
209     O ndId, ip,
210     I myThid )
211    
212     C !DESCRIPTION:
213     C *================================================================*
214     C | o Returns the diagnostic Id number and diagnostic
215     C | pointer to storage array for a specified diagnostic.
216     C *================================================================*
217     C | Note: A diagnostics field can be stored multiple times
218     C | (for different output frequency,phase, ...).
219     C | operates in 2 ways:
220     C | o listId =0 => find 1 diagnostics Id & pointer which name matches.
221     C | o listId >0 => find the unique diagnostic Id & pointer with
222     C | the right name and same output time as "listId" output-list
223     C | o return ip=0 if did not find the right diagnostic;
224     C | (ndId <>0 if diagnostic exist but output time does not match)
225     C *================================================================*
226    
227     C !USES:
228     IMPLICIT NONE
229     #include "EEPARAMS.h"
230     #include "SIZE.h"
231     #include "DIAGNOSTICS_SIZE.h"
232     #include "DIAGNOSTICS.h"
233    
234     C !INPUT PARAMETERS:
235     C diagName :: diagnostic identificator name (8 characters long)
236     C listId :: list number that specify the output frequency
237     C myThid :: my Thread Id number
238     C !OUTPUT PARAMETERS:
239     C ndId :: diagnostics Id number (in available diagnostics list)
240     C ip :: diagnostics pointer to storage array
241    
242     CHARACTER*8 diagName
243     INTEGER listId
244     INTEGER ndId, ip
245     INTEGER myThid
246     CEOP
247    
248     C !LOCAL VARIABLES:
249     INTEGER n,m
250    
251     ip = 0
252     ndId = 0
253    
254     IF ( listId.LE.0 ) THEN
255     C-- select the 1rst one which name matches:
256    
257     C- search for this diag. in the active 2D/3D diagnostics list
258 jmc 1.31 DO n=1,nLists
259 jmc 1.26 DO m=1,nActive(n)
260     IF ( ip.EQ.0 .AND. diagName.EQ.flds(m,n)
261     & .AND. idiag(m,n).NE.0 ) THEN
262     ip = ABS(idiag(m,n))
263 jmc 1.36 ndId = ABS(jdiag(m,n))
264 jmc 1.26 ENDIF
265     ENDDO
266     ENDDO
267    
268 jmc 1.31 ELSEIF ( listId.LE.nLists ) THEN
269 jmc 1.26 C-- select the unique diagnostic with output-time identical to listId
270    
271     C- search for this diag. in the active 2D/3D diagnostics list
272 jmc 1.31 DO n=1,nLists
273 jmc 1.26 IF ( ip.EQ.0
274     & .AND. freq(n) .EQ. freq(listId)
275     & .AND. phase(n).EQ.phase(listId)
276     & .AND. averageFreq(n) .EQ.averageFreq(listId)
277     & .AND. averagePhase(n).EQ.averagePhase(listId)
278     & .AND. averageCycle(n).EQ.averageCycle(listId)
279     & ) THEN
280     DO m=1,nActive(n)
281     IF ( ip.EQ.0 .AND. diagName.EQ.flds(m,n)
282     & .AND. idiag(m,n).NE.0 ) THEN
283     ip = ABS(idiag(m,n))
284 jmc 1.36 ndId = ABS(jdiag(m,n))
285 jmc 1.26 ENDIF
286     ENDDO
287     ELSEIF ( ip.EQ.0 ) THEN
288     DO m=1,nActive(n)
289     IF ( ip.EQ.0 .AND. diagName.EQ.flds(m,n)
290     & .AND. idiag(m,n).NE.0 ) THEN
291 jmc 1.36 ndId = ABS(jdiag(m,n))
292 jmc 1.26 ENDIF
293     ENDDO
294     ENDIF
295     ENDDO
296    
297     ELSE
298     STOP 'DIAGNOSTICS_GET_POINTERS: invalid listId number'
299     ENDIF
300    
301     RETURN
302     END
303    
304     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
305    
306     CBOP 0
307 jmc 1.29 C !ROUTINE: DIAGNOSTICS_SETKLEV
308    
309     C !INTERFACE:
310     SUBROUTINE DIAGNOSTICS_SETKLEV(
311     I diagName, nLevDiag, myThid )
312    
313     C !DESCRIPTION:
314     C *==========================================================*
315     C | S/R DIAGNOSTICS_SETKLEV
316     C | o Define explicitly the number of level (stored in kdiag)
317     C | of a diagnostic field. For most diagnostics, the number
318     C | of levels is derived (in S/R SET_LEVELS) from gdiag(10)
319     C | but occasionally one may want to set it explicitly.
320     C *==========================================================*
321    
322     C !USES:
323     IMPLICIT NONE
324     #include "EEPARAMS.h"
325     #include "SIZE.h"
326     #include "DIAGNOSTICS_SIZE.h"
327     #include "DIAGNOSTICS.h"
328    
329     C !INPUT PARAMETERS:
330     C diagName :: diagnostic identificator name (8 characters long)
331     C nLevDiag :: number of level to set for this diagnostics field
332     C myThid :: my Thread Id number
333     CHARACTER*8 diagName
334     INTEGER nLevDiag
335     INTEGER myThid
336     CEOP
337    
338     C !LOCAL VARIABLES:
339     CHARACTER*(MAX_LEN_MBUF) msgBuf
340     INTEGER n, ndId
341    
342     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
343    
344 jmc 1.30 _BEGIN_MASTER( myThid)
345    
346 jmc 1.29 C-- Check if this S/R is called from the right place ;
347     C needs to be after DIAGNOSTICS_INIT_EARLY and before DIAGNOSTICS_INIT_FIXED
348 jmc 1.32 IF ( diag_pkgStatus.NE.ready2setDiags ) THEN
349     CALL DIAGNOSTICS_STATUS_ERROR( 'DIAGNOSTICS_SETKLEV',
350     & ' ', diagName, ready2setDiags, myThid )
351 jmc 1.29 ENDIF
352    
353     C-- Find this diagnostics in the list of available diag.
354     ndId = 0
355     DO n = 1,ndiagt
356     IF ( diagName.EQ.cdiag(n) ) THEN
357     ndId = n
358     ENDIF
359     ENDDO
360     IF ( ndId.EQ.0 ) THEN
361     WRITE(msgBuf,'(4A)') 'DIAGNOSTICS_SETKLEV: ',
362     & 'diagName="', diagName, '" not known.'
363     CALL PRINT_ERROR( msgBuf, myThid )
364     STOP 'ABNORMAL END: S/R DIAGNOSTICS_SETKLEV'
365     ENDIF
366    
367     C- Optional level number diagnostics (X): set number of levels
368     IF ( kdiag(ndId).EQ.0
369     & .AND. gdiag(ndId)(10:10).EQ.'X' ) THEN
370     kdiag(ndId) = nLevDiag
371     ELSEIF ( kdiag(ndId).EQ.nLevDiag
372     & .AND. gdiag(ndId)(10:10).EQ.'X' ) THEN
373     C- level number already set to same value: send warning
374     WRITE(msgBuf,'(4A,I5)') '** WARNING ** DIAGNOSTICS_SETKLEV: ',
375     & 'diagName="', diagName, '" , nLevDiag=', nLevDiag
376     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
377     & SQUEEZE_RIGHT , myThid )
378     WRITE(msgBuf,'(2A,I5,A)')'** WARNING ** DIAGNOSTICS_SETKLEV:',
379     & ' level Nb (=', kdiag(ndId), ') already set.'
380     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
381     & SQUEEZE_RIGHT , myThid )
382     ELSEIF ( gdiag(ndId)(10:10).EQ.'X' ) THEN
383     C- level number already set to a different value: do not reset but stop
384     WRITE(msgBuf,'(4A,I5)') 'DIAGNOSTICS_SETKLEV: ',
385     & 'diagName="', diagName, '" , nLevDiag=', nLevDiag
386     CALL PRINT_ERROR( msgBuf, myThid )
387     WRITE(msgBuf,'(2A,I5,3A)') 'DIAGNOSTICS_SETKLEV: ',
388     & 'level Nb already set to', kdiag(ndId), ' => STOP'
389     CALL PRINT_ERROR( msgBuf, myThid )
390     ELSE
391     C- for now, do nothing but just send a warning
392     WRITE(msgBuf,'(4A,I5)') '** WARNING ** DIAGNOSTICS_SETKLEV: ',
393     & 'diagName="', diagName, '" , nLevDiag=', nLevDiag
394     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
395     & SQUEEZE_RIGHT , myThid )
396     WRITE(msgBuf,'(2A,I5,3A)') '** WARNING ** will set level Nb',
397     & ' from diagCode(ndId=', ndId, ')="', gdiag(ndId)(1:10), '"'
398     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
399     & SQUEEZE_RIGHT , myThid )
400     WRITE(msgBuf,'(4A)') '** WARNING ** DIAGNOSTICS_SETKLEV',
401     & '("', diagName, '") <== Ignore this call.'
402     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
403     & SQUEEZE_RIGHT , myThid )
404     ENDIF
405    
406 jmc 1.30 _END_MASTER( myThid)
407    
408 jmc 1.29 RETURN
409     END
410    
411     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
412    
413     CBOP 0
414 jmc 1.26 C !ROUTINE: DIAGS_GET_PARMS_I
415    
416     C !INTERFACE:
417     INTEGER FUNCTION DIAGS_GET_PARMS_I(
418     I parName, myThid )
419    
420     C !DESCRIPTION:
421     C *==========================================================*
422     C | FUNCTION DIAGS_GET_PARMS_I
423     C | o Return the value of integer parameter
424     C | from one of the DIAGNOSTICS.h common blocs
425     C *==========================================================*
426    
427     C !USES:
428     IMPLICIT NONE
429     #include "EEPARAMS.h"
430     #include "SIZE.h"
431     #include "DIAGNOSTICS_SIZE.h"
432     #include "DIAGNOSTICS.h"
433    
434     C !INPUT PARAMETERS:
435     C parName :: string used to identify which parameter to get
436     C myThid :: my Thread Id number
437     CHARACTER*(*) parName
438     INTEGER myThid
439     CEOP
440    
441     C !LOCAL VARIABLES:
442     CHARACTER*(MAX_LEN_MBUF) msgBuf
443     INTEGER n
444    
445     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
446    
447     n = LEN(parName)
448     c write(0,'(3A,I4)')
449     c & 'DIAGS_GET_PARMS_I: parName="',parName,'" , length=',n
450    
451     IF ( parName.EQ.'LAST_DIAG_ID' ) THEN
452     DIAGS_GET_PARMS_I = ndiagt
453     ELSE
454     WRITE(msgBuf,'(4A)') 'DIAGS_GET_PARMS_I: ',
455     & ' parName="', parName, '" not known.'
456     CALL PRINT_ERROR( msgBuf, myThid )
457     STOP 'ABNORMAL END: S/R DIAGS_GET_PARMS_I'
458     ENDIF
459    
460     RETURN
461     END
462    
463     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
464    
465     CBOP 0
466 jmc 1.17 C !ROUTINE: DIAGS_MK_UNITS
467    
468     C !INTERFACE:
469 jmc 1.21 CHARACTER*16 FUNCTION DIAGS_MK_UNITS(
470 jmc 1.17 I diagUnitsInPieces, myThid )
471    
472     C !DESCRIPTION:
473     C *==========================================================*
474     C | FUNCTION DIAGS_MK_UNITS
475 jmc 1.21 C | o Return the diagnostic units string (16c) removing
476 jmc 1.17 C | blanks from the input string
477     C *==========================================================*
478    
479     C !USES:
480     IMPLICIT NONE
481     #include "EEPARAMS.h"
482    
483     C !INPUT PARAMETERS:
484 jmc 1.21 C diagUnitsInPieces :: string for diagnostic units: in several
485 jmc 1.17 C pieces, with blanks in between
486     C myThid :: my thread Id number
487     CHARACTER*(*) diagUnitsInPieces
488     INTEGER myThid
489     CEOP
490    
491     C !LOCAL VARIABLES:
492     CHARACTER*(MAX_LEN_MBUF) msgBuf
493 jmc 1.33 INTEGER i,j,n,nbc
494 jmc 1.17
495 jmc 1.29 DIAGS_MK_UNITS = ' '
496 jmc 1.17 n = LEN(diagUnitsInPieces)
497 jmc 1.21
498 jmc 1.17 j = 0
499     DO i=1,n
500     IF (diagUnitsInPieces(i:i) .NE. ' ' ) THEN
501     j = j+1
502     IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
503     ENDIF
504     ENDDO
505 jmc 1.33 nbc = j
506    
507     IF ( nbc.GT.16 ) THEN
508     C- try to reduce length by changing m^2 & m^3 to m2 & m3:
509     DIAGS_MK_UNITS = ' '
510     j = 0
511     DO i=1,n
512     IF ( diagUnitsInPieces(i:i) .NE. ' ' ) THEN
513     IF ( j.GE.1 .AND. nbc.GT.16 .AND.
514     & diagUnitsInPieces(i:i).EQ.'^' ) THEN
515     IF ( diagUnitsInPieces(i-1:i-1).EQ.'m' ) THEN
516     nbc = nbc - 1
517     ELSE
518     j = j+1
519     IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
520     ENDIF
521     ELSE
522     j = j+1
523     IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
524     ENDIF
525     ENDIF
526     ENDDO
527     ENDIF
528 jmc 1.17
529     IF ( j.GT.16 ) THEN
530 jmc 1.29 WRITE(msgBuf,'(2A,I4,A)') '** WARNING ** ',
531 jmc 1.17 & 'DIAGS_MK_UNITS: too long (',j,' >16) input string'
532     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
533     & SQUEEZE_RIGHT , myThid)
534 jmc 1.29 WRITE(msgBuf,'(3A)') '** WARNING ** ',
535 jmc 1.17 & 'DIAGS_MK_UNITS: input=', diagUnitsInPieces
536     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
537     & SQUEEZE_RIGHT , myThid)
538     ENDIF
539    
540     RETURN
541     END
542 jmc 1.23
543     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
544    
545     CBOP 0
546     C !ROUTINE: DIAGS_MK_TITLE
547    
548     C !INTERFACE:
549     CHARACTER*80 FUNCTION DIAGS_MK_TITLE(
550     I diagTitleInPieces, myThid )
551    
552     C !DESCRIPTION:
553     C *==========================================================*
554     C | FUNCTION DIAGS_MK_TITLE
555     C | o Return the diagnostic title string (80c) removing
556     C | consecutive blanks from the input string
557     C *==========================================================*
558    
559     C !USES:
560     IMPLICIT NONE
561     #include "EEPARAMS.h"
562    
563     C !INPUT PARAMETERS:
564     C diagTitleInPieces :: string for diagnostic units: in several
565     C pieces, with blanks in between
566     C myThid :: my Thread Id number
567     CHARACTER*(*) diagTitleInPieces
568     INTEGER myThid
569     CEOP
570    
571     C !LOCAL VARIABLES:
572     CHARACTER*(MAX_LEN_MBUF) msgBuf
573     LOGICAL flag
574     INTEGER i,j,n
575    
576 molod 1.22 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
577 jmc 1.23
578     DIAGS_MK_TITLE = ' '
579     & //' '
580     n = LEN(diagTitleInPieces)
581    
582     j = 0
583     flag = .FALSE.
584     DO i=1,n
585     IF (diagTitleInPieces(i:i) .NE. ' ' ) THEN
586     IF ( flag ) THEN
587     j = j+1
588     IF (j.LE.80) DIAGS_MK_TITLE(j:j) = ' '
589     ENDIF
590     j = j+1
591     IF ( j.LE.80 ) DIAGS_MK_TITLE(j:j) = diagTitleInPieces(i:i)
592     flag = .FALSE.
593     ELSE
594     flag = j.GE.1
595     ENDIF
596     ENDDO
597    
598     IF ( j.GT.80 ) THEN
599 jmc 1.29 WRITE(msgBuf,'(2A,I4,A)') '** WARNING ** ',
600 jmc 1.23 & 'DIAGS_MK_TITLE: too long (',j,' >80) input string'
601     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
602     & SQUEEZE_RIGHT , myThid)
603 jmc 1.29 WRITE(msgBuf,'(3A)') '** WARNING ** ',
604 jmc 1.23 & 'DIAGS_MK_TITLE: input=', diagTitleInPieces
605     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
606     & SQUEEZE_RIGHT , myThid)
607     ENDIF
608    
609     RETURN
610     END
611 jmc 1.34
612     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
613    
614     CBOP 0
615     C !ROUTINE: DIAGS_RENAMED
616    
617     C !INTERFACE:
618     CHARACTER*8 FUNCTION DIAGS_RENAMED(
619     I diagName, myThid )
620    
621     C !DESCRIPTION:
622     C *==========================================================*
623     C | FUNCTION DIAGS_RENAMED
624     C | o In case of an old diagnostics name,
625     C | provides the corresponding new name
626     C *==========================================================*
627    
628     C !USES:
629     IMPLICIT NONE
630     #include "EEPARAMS.h"
631     #include "SIZE.h"
632     #include "PARAMS.h"
633     #include "DIAGNOSTICS_SIZE.h"
634     #include "DIAGNOSTICS.h"
635    
636     C !INPUT PARAMETERS:
637     C diagName :: name of diagnostic to rename (or not)
638     C myThid :: my Thread Id number
639     CHARACTER*8 diagName
640     INTEGER myThid
641     CEOP
642    
643     C !LOCAL VARIABLES:
644     CHARACTER*8 newName
645     CHARACTER*(MAX_LEN_MBUF) msgBuf
646    
647     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
648    
649     newName = blkName
650    
651     IF ( useSEAICE ) THEN
652     IF ( diagName .EQ. 'SIfu ' ) newName = 'oceTAUX '
653     IF ( diagName .EQ. 'SIfv ' ) newName = 'oceTAUY '
654     IF ( diagName .EQ. 'SIuwind ' ) newName = 'EXFuwind'
655     IF ( diagName .EQ. 'SIvwind ' ) newName = 'EXFvwind'
656 mlosch 1.35 IF ( diagName .EQ. 'SIsigI ' ) newName = 'SIsig1 '
657     IF ( diagName .EQ. 'SIsigII ' ) newName = 'SIsig2 '
658 jmc 1.34 ENDIF
659    
660     IF ( newName.EQ.blkName ) THEN
661     DIAGS_RENAMED = diagName
662     ELSE
663     DIAGS_RENAMED = newName
664     WRITE(msgBuf,'(6A)') '** WARNING ** (DIAGS_RENAMED):',
665     & ' diagnostics "', diagName, '" replaced by "', newName, '"'
666     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
667     & SQUEEZE_RIGHT , myThid )
668     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
669     & SQUEEZE_RIGHT , myThid )
670     ENDIF
671    
672     RETURN
673     END

  ViewVC Help
Powered by ViewVC 1.1.22