/[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.30 - (hide annotations) (download)
Fri Jan 15 18:57:07 2010 UTC (14 years, 3 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62c, checkpoint62b, checkpoint62a, checkpoint62g, checkpoint62f, checkpoint62e, checkpoint62d, checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62o, checkpoint62n, checkpoint62m, checkpoint62l, checkpoint62s, checkpoint62r, checkpoint62q, checkpoint62p, checkpoint62w, checkpoint62v, checkpoint62u, checkpoint62t, checkpoint62y, checkpoint62x
Changes since 1.29: +5 -1 lines
fix S/R DIAGNOSTICS_SETKLEV for multi-threaded

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

  ViewVC Help
Powered by ViewVC 1.1.22