/[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.31 - (hide annotations) (download)
Sun Jun 12 19:08:21 2011 UTC (12 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63g, checkpoint63a, checkpoint63b, checkpoint63c, checkpoint64, checkpoint63, checkpoint62z
Changes since 1.30: +118 -110 lines
rename S/R GETDIAG to DIAGNOSTICS_GET_DIAG and change type of 1rst argument
 (was _RL, now integer) with option = 0 to retrieve all levels

1 jmc 1.31 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_utils.F,v 1.30 2010/01/15 18:57:07 jmc 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    
16 edhill 1.12 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
17    
18 jmc 1.15 CBOP 0
19 jmc 1.19 C !ROUTINE: DIAGNOSTICS_COUNT
20     C !INTERFACE:
21 jmc 1.31 SUBROUTINE DIAGNOSTICS_COUNT( diagName,
22     I biArg, bjArg, myThid )
23 jmc 1.19
24     C !DESCRIPTION:
25     C***********************************************************************
26     C routine to increment the diagnostic counter only
27     C***********************************************************************
28     C !USES:
29     IMPLICIT NONE
30    
31     C == Global variables ===
32     #include "EEPARAMS.h"
33     #include "SIZE.h"
34     #include "DIAGNOSTICS_SIZE.h"
35     #include "DIAGNOSTICS.h"
36    
37     C !INPUT PARAMETERS:
38     C***********************************************************************
39     C Arguments Description
40     C ----------------------
41 jmc 1.31 C diagName :: name of diagnostic to increment the counter
42 jmc 1.19 C biArg :: X-direction tile number, or 0 if called outside bi,bj loops
43     C bjArg :: Y-direction tile number, or 0 if called outside bi,bj loops
44     C myThid :: my thread Id number
45     C***********************************************************************
46 jmc 1.31 CHARACTER*8 diagName
47 jmc 1.19 INTEGER biArg, bjArg
48     INTEGER myThid
49     CEOP
50    
51     C !LOCAL VARIABLES:
52     C ===============
53 jmc 1.21 INTEGER m, n
54     INTEGER bi, bj
55 jmc 1.28 INTEGER ipt, ndId
56 jmc 1.19 c CHARACTER*(MAX_LEN_MBUF) msgBuf
57    
58 jmc 1.28 IF ( biArg.EQ.0 .AND. bjArg.EQ.0 ) THEN
59     bi = myBxLo(myThid)
60     bj = myByLo(myThid)
61     ELSE
62     bi = MIN(biArg,nSx)
63     bj = MIN(bjArg,nSy)
64     ENDIF
65    
66 jmc 1.21 C-- Run through list of active diagnostics to find which counter
67     C to increment (needs to be a valid & active diagnostic-counter)
68 jmc 1.31 DO n=1,nLists
69 jmc 1.19 DO m=1,nActive(n)
70 jmc 1.31 IF ( diagName.EQ.flds(m,n) .AND. idiag(m,n).GT.0 ) THEN
71 jmc 1.21 ipt = idiag(m,n)
72 jmc 1.28 IF (ndiag(ipt,bi,bj).GE.0) THEN
73     ndId = jdiag(m,n)
74     ipt = ipt + pdiag(n,bi,bj)*kdiag(ndId)
75 jmc 1.21 C- Increment the counter for the diagnostic
76     IF ( biArg.EQ.0 .AND. bjArg.EQ.0 ) THEN
77     DO bj=myByLo(myThid), myByHi(myThid)
78     DO bi=myBxLo(myThid), myBxHi(myThid)
79     ndiag(ipt,bi,bj) = ndiag(ipt,bi,bj) + 1
80     ENDDO
81     ENDDO
82     ELSE
83     ndiag(ipt,bi,bj) = ndiag(ipt,bi,bj) + 1
84     ENDIF
85     C- Increment is done
86     ENDIF
87 jmc 1.19 ENDIF
88     ENDDO
89     ENDDO
90    
91 jmc 1.21 RETURN
92 jmc 1.19 END
93    
94     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
95    
96     CBOP 0
97 jmc 1.31 C !ROUTINE: DIAGNOSTICS_GET_DIAG
98    
99     C !INTERFACE:
100     SUBROUTINE DIAGNOSTICS_GET_DIAG(
101     I kl, undefRL,
102     O qtmp,
103     I ndId, mate, ip, im, bi, bj, myThid )
104    
105     C !DESCRIPTION:
106     C Retrieve time-averaged (or snap-shot) diagnostic field
107    
108     C !USES:
109     IMPLICIT NONE
110     #include "EEPARAMS.h"
111     #include "SIZE.h"
112     #include "DIAGNOSTICS_SIZE.h"
113     #include "DIAGNOSTICS.h"
114    
115     C !INPUT PARAMETERS:
116     C kl :: level selection: >0 : single selected lev ; =0 : all kdiag levels
117     C undefRL :: undefined "_RL" type value
118     C ndId :: diagnostic Id number (in available diagnostics list)
119     C mate :: counter diagnostic number if any ; 0 otherwise
120     C ip :: pointer to storage array location for diag.
121     C im :: pointer to storage array location for mate
122     C bi :: X-direction tile number
123     C bj :: Y-direction tile number
124     C myThid :: my thread Id number
125     INTEGER kl
126     _RL undefRL
127     INTEGER ndId, mate, ip, im
128     INTEGER bi, bj, myThid
129    
130     C !OUTPUT PARAMETERS:
131     C qtmp :: time-averaged (or snap-shot) diagnostic field
132     _RL qtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy,*)
133     CEOP
134    
135     C !LOCAL VARIABLES:
136     _RL factor
137     INTEGER i, j, ipnt, ipCt
138     INTEGER k, kd, km, kLev
139    
140     IF (ndId.GE.1) THEN
141     kLev = kdiag(ndId)
142     IF ( kl.GE.1 .AND. kl.LE.kLev ) THEN
143     kLev = 1
144     ELSEIF ( kl.NE.0 ) THEN
145     kLev = 0
146     ENDIF
147    
148     DO k = 1,kLev
149     kd = k
150     IF ( kl.GE.1 ) kd = kl
151    
152     IF ( mate.EQ.0 ) THEN
153     C- No counter diagnostics => average = Sum / ndiag :
154    
155     ipnt = ip + kd - 1
156     factor = FLOAT(ndiag(ip,bi,bj))
157     IF (ndiag(ip,bi,bj).NE.0) factor = 1. _d 0 / factor
158    
159     #ifdef ALLOW_FIZHI
160     DO j = 1,sNy+1
161     DO i = 1,sNx+1
162     IF ( qdiag(i,j,ipnt,bi,bj) .LE. undefRL ) THEN
163     qtmp(i,j,k) = qdiag(i,j,ipnt,bi,bj)*factor
164     ELSE
165     qtmp(i,j,k) = undefRL
166     ENDIF
167     ENDDO
168     ENDDO
169     #else /* ALLOW_FIZHI */
170     DO j = 1,sNy+1
171     DO i = 1,sNx+1
172     qtmp(i,j,k) = qdiag(i,j,ipnt,bi,bj)*factor
173     ENDDO
174     ENDDO
175     #endif /* ALLOW_FIZHI */
176    
177     ELSE
178     C- With counter diagnostics => average = Sum / counter:
179    
180     ipnt = ip + kd - 1
181     km = MIN(kd,kdiag(mate))
182     ipCt = im + km - 1
183     DO j = 1,sNy+1
184     DO i = 1,sNx+1
185     IF ( qdiag(i,j,ipCt,bi,bj) .NE. 0. ) THEN
186     qtmp(i,j,k) = qdiag(i,j,ipnt,bi,bj)
187     & / qdiag(i,j,ipCt,bi,bj)
188     ELSE
189     qtmp(i,j,k) = undefRL
190     ENDIF
191     ENDDO
192     ENDDO
193    
194     ENDIF
195     ENDDO
196     ENDIF
197    
198     RETURN
199     END
200    
201     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
202    
203     CBOP 0
204 jmc 1.26 C !ROUTINE: DIAGNOSTICS_GET_POINTERS
205     C !INTERFACE:
206     SUBROUTINE DIAGNOSTICS_GET_POINTERS(
207     I diagName, listId,
208     O ndId, ip,
209     I myThid )
210    
211     C !DESCRIPTION:
212     C *================================================================*
213     C | o Returns the diagnostic Id number and diagnostic
214     C | pointer to storage array for a specified diagnostic.
215     C *================================================================*
216     C | Note: A diagnostics field can be stored multiple times
217     C | (for different output frequency,phase, ...).
218     C | operates in 2 ways:
219     C | o listId =0 => find 1 diagnostics Id & pointer which name matches.
220     C | o listId >0 => find the unique diagnostic Id & pointer with
221     C | the right name and same output time as "listId" output-list
222     C | o return ip=0 if did not find the right diagnostic;
223     C | (ndId <>0 if diagnostic exist but output time does not match)
224     C *================================================================*
225    
226     C !USES:
227     IMPLICIT NONE
228     #include "EEPARAMS.h"
229     #include "SIZE.h"
230     #include "DIAGNOSTICS_SIZE.h"
231     #include "DIAGNOSTICS.h"
232    
233     C !INPUT PARAMETERS:
234     C diagName :: diagnostic identificator name (8 characters long)
235     C listId :: list number that specify the output frequency
236     C myThid :: my Thread Id number
237     C !OUTPUT PARAMETERS:
238     C ndId :: diagnostics Id number (in available diagnostics list)
239     C ip :: diagnostics pointer to storage array
240    
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     ndId = jdiag(m,n)
264     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     ndId = jdiag(m,n)
285     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     ndId = jdiag(m,n)
292     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     IF ( .NOT.settingDiags ) THEN
349     WRITE(msgBuf,'(4A,I5)') 'DIAGNOSTICS_SETKLEV: ',
350     & 'diagName="', diagName, '" , nLevDiag=', nLevDiag
351     CALL PRINT_ERROR( msgBuf, myThid )
352     WRITE(msgBuf,'(2A)') 'DIAGNOSTICS_SETKLEV: ',
353     & '<== called from the WRONG place, i.e.'
354     CALL PRINT_ERROR( msgBuf, myThid )
355     WRITE(msgBuf,'(2A)') 'DIAGNOSTICS_SETKLEV: ',
356     & 'outside diagnostics setting section = from'
357     CALL PRINT_ERROR( msgBuf, myThid )
358     WRITE(msgBuf,'(2A)') 'DIAGNOSTICS_SETKLEV: ',
359     & ' Diag_INIT_EARLY down to Diag_INIT_FIXED'
360     CALL PRINT_ERROR( msgBuf, myThid )
361     STOP 'ABNORMAL END: S/R DIAGNOSTICS_SETKLEV'
362     ENDIF
363    
364     C-- Find this diagnostics in the list of available diag.
365     ndId = 0
366     DO n = 1,ndiagt
367     IF ( diagName.EQ.cdiag(n) ) THEN
368     ndId = n
369     ENDIF
370     ENDDO
371     IF ( ndId.EQ.0 ) THEN
372     WRITE(msgBuf,'(4A)') 'DIAGNOSTICS_SETKLEV: ',
373     & 'diagName="', diagName, '" not known.'
374     CALL PRINT_ERROR( msgBuf, myThid )
375     STOP 'ABNORMAL END: S/R DIAGNOSTICS_SETKLEV'
376     ENDIF
377    
378     C- Optional level number diagnostics (X): set number of levels
379     IF ( kdiag(ndId).EQ.0
380     & .AND. gdiag(ndId)(10:10).EQ.'X' ) THEN
381     kdiag(ndId) = nLevDiag
382     ELSEIF ( kdiag(ndId).EQ.nLevDiag
383     & .AND. gdiag(ndId)(10:10).EQ.'X' ) THEN
384     C- level number already set to same value: send warning
385     WRITE(msgBuf,'(4A,I5)') '** WARNING ** DIAGNOSTICS_SETKLEV: ',
386     & 'diagName="', diagName, '" , nLevDiag=', nLevDiag
387     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
388     & SQUEEZE_RIGHT , myThid )
389     WRITE(msgBuf,'(2A,I5,A)')'** WARNING ** DIAGNOSTICS_SETKLEV:',
390     & ' level Nb (=', kdiag(ndId), ') already set.'
391     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
392     & SQUEEZE_RIGHT , myThid )
393     ELSEIF ( gdiag(ndId)(10:10).EQ.'X' ) THEN
394     C- level number already set to a different value: do not reset but stop
395     WRITE(msgBuf,'(4A,I5)') 'DIAGNOSTICS_SETKLEV: ',
396     & 'diagName="', diagName, '" , nLevDiag=', nLevDiag
397     CALL PRINT_ERROR( msgBuf, myThid )
398     WRITE(msgBuf,'(2A,I5,3A)') 'DIAGNOSTICS_SETKLEV: ',
399     & 'level Nb already set to', kdiag(ndId), ' => STOP'
400     CALL PRINT_ERROR( msgBuf, myThid )
401     ELSE
402     C- for now, do nothing but just send a warning
403     WRITE(msgBuf,'(4A,I5)') '** WARNING ** DIAGNOSTICS_SETKLEV: ',
404     & 'diagName="', diagName, '" , nLevDiag=', nLevDiag
405     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
406     & SQUEEZE_RIGHT , myThid )
407     WRITE(msgBuf,'(2A,I5,3A)') '** WARNING ** will set level Nb',
408     & ' from diagCode(ndId=', ndId, ')="', gdiag(ndId)(1:10), '"'
409     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
410     & SQUEEZE_RIGHT , myThid )
411     WRITE(msgBuf,'(4A)') '** WARNING ** DIAGNOSTICS_SETKLEV',
412     & '("', diagName, '") <== Ignore this call.'
413     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
414     & SQUEEZE_RIGHT , myThid )
415     ENDIF
416    
417 jmc 1.30 _END_MASTER( myThid)
418    
419 jmc 1.29 RETURN
420     END
421    
422     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
423    
424     CBOP 0
425 jmc 1.26 C !ROUTINE: DIAGS_GET_PARMS_I
426    
427     C !INTERFACE:
428     INTEGER FUNCTION DIAGS_GET_PARMS_I(
429     I parName, myThid )
430    
431     C !DESCRIPTION:
432     C *==========================================================*
433     C | FUNCTION DIAGS_GET_PARMS_I
434     C | o Return the value of integer parameter
435     C | from one of the DIAGNOSTICS.h common blocs
436     C *==========================================================*
437    
438     C !USES:
439     IMPLICIT NONE
440     #include "EEPARAMS.h"
441     #include "SIZE.h"
442     #include "DIAGNOSTICS_SIZE.h"
443     #include "DIAGNOSTICS.h"
444    
445     C !INPUT PARAMETERS:
446     C parName :: string used to identify which parameter to get
447     C myThid :: my Thread Id number
448     CHARACTER*(*) parName
449     INTEGER myThid
450     CEOP
451    
452     C !LOCAL VARIABLES:
453     CHARACTER*(MAX_LEN_MBUF) msgBuf
454     INTEGER n
455    
456     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
457    
458     n = LEN(parName)
459     c write(0,'(3A,I4)')
460     c & 'DIAGS_GET_PARMS_I: parName="',parName,'" , length=',n
461    
462     IF ( parName.EQ.'LAST_DIAG_ID' ) THEN
463     DIAGS_GET_PARMS_I = ndiagt
464     ELSE
465     WRITE(msgBuf,'(4A)') 'DIAGS_GET_PARMS_I: ',
466     & ' parName="', parName, '" not known.'
467     CALL PRINT_ERROR( msgBuf, myThid )
468     STOP 'ABNORMAL END: S/R DIAGS_GET_PARMS_I'
469     ENDIF
470    
471     RETURN
472     END
473    
474     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
475    
476     CBOP 0
477 jmc 1.17 C !ROUTINE: DIAGS_MK_UNITS
478    
479     C !INTERFACE:
480 jmc 1.21 CHARACTER*16 FUNCTION DIAGS_MK_UNITS(
481 jmc 1.17 I diagUnitsInPieces, myThid )
482    
483     C !DESCRIPTION:
484     C *==========================================================*
485     C | FUNCTION DIAGS_MK_UNITS
486 jmc 1.21 C | o Return the diagnostic units string (16c) removing
487 jmc 1.17 C | blanks from the input string
488     C *==========================================================*
489    
490     C !USES:
491     IMPLICIT NONE
492     #include "EEPARAMS.h"
493    
494     C !INPUT PARAMETERS:
495 jmc 1.21 C diagUnitsInPieces :: string for diagnostic units: in several
496 jmc 1.17 C pieces, with blanks in between
497     C myThid :: my thread Id number
498     CHARACTER*(*) diagUnitsInPieces
499     INTEGER myThid
500     CEOP
501    
502     C !LOCAL VARIABLES:
503     CHARACTER*(MAX_LEN_MBUF) msgBuf
504     INTEGER i,j,n
505    
506 jmc 1.29 DIAGS_MK_UNITS = ' '
507 jmc 1.17 n = LEN(diagUnitsInPieces)
508 jmc 1.21
509 jmc 1.17 j = 0
510     DO i=1,n
511     IF (diagUnitsInPieces(i:i) .NE. ' ' ) THEN
512     j = j+1
513     IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
514     ENDIF
515     ENDDO
516    
517     IF ( j.GT.16 ) THEN
518 jmc 1.29 WRITE(msgBuf,'(2A,I4,A)') '** WARNING ** ',
519 jmc 1.17 & 'DIAGS_MK_UNITS: too long (',j,' >16) input string'
520     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
521     & SQUEEZE_RIGHT , myThid)
522 jmc 1.29 WRITE(msgBuf,'(3A)') '** WARNING ** ',
523 jmc 1.17 & 'DIAGS_MK_UNITS: input=', diagUnitsInPieces
524     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
525     & SQUEEZE_RIGHT , myThid)
526     ENDIF
527    
528     RETURN
529     END
530 jmc 1.23
531     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
532    
533     CBOP 0
534     C !ROUTINE: DIAGS_MK_TITLE
535    
536     C !INTERFACE:
537     CHARACTER*80 FUNCTION DIAGS_MK_TITLE(
538     I diagTitleInPieces, myThid )
539    
540     C !DESCRIPTION:
541     C *==========================================================*
542     C | FUNCTION DIAGS_MK_TITLE
543     C | o Return the diagnostic title string (80c) removing
544     C | consecutive blanks from the input string
545     C *==========================================================*
546    
547     C !USES:
548     IMPLICIT NONE
549     #include "EEPARAMS.h"
550    
551     C !INPUT PARAMETERS:
552     C diagTitleInPieces :: string for diagnostic units: in several
553     C pieces, with blanks in between
554     C myThid :: my Thread Id number
555     CHARACTER*(*) diagTitleInPieces
556     INTEGER myThid
557     CEOP
558    
559     C !LOCAL VARIABLES:
560     CHARACTER*(MAX_LEN_MBUF) msgBuf
561     LOGICAL flag
562     INTEGER i,j,n
563    
564 molod 1.22 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
565 jmc 1.23
566     DIAGS_MK_TITLE = ' '
567     & //' '
568     n = LEN(diagTitleInPieces)
569    
570     j = 0
571     flag = .FALSE.
572     DO i=1,n
573     IF (diagTitleInPieces(i:i) .NE. ' ' ) THEN
574     IF ( flag ) THEN
575     j = j+1
576     IF (j.LE.80) DIAGS_MK_TITLE(j:j) = ' '
577     ENDIF
578     j = j+1
579     IF ( j.LE.80 ) DIAGS_MK_TITLE(j:j) = diagTitleInPieces(i:i)
580     flag = .FALSE.
581     ELSE
582     flag = j.GE.1
583     ENDIF
584     ENDDO
585    
586     IF ( j.GT.80 ) THEN
587 jmc 1.29 WRITE(msgBuf,'(2A,I4,A)') '** WARNING ** ',
588 jmc 1.23 & 'DIAGS_MK_TITLE: too long (',j,' >80) input string'
589     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
590     & SQUEEZE_RIGHT , myThid)
591 jmc 1.29 WRITE(msgBuf,'(3A)') '** WARNING ** ',
592 jmc 1.23 & 'DIAGS_MK_TITLE: input=', diagTitleInPieces
593     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
594     & SQUEEZE_RIGHT , myThid)
595     ENDIF
596    
597     RETURN
598     END

  ViewVC Help
Powered by ViewVC 1.1.22