/[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.32 - (hide annotations) (download)
Wed Aug 14 00:54:06 2013 UTC (10 years, 8 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64o, checkpoint64n, checkpoint65
Changes since 1.31: +4 -16 lines
add a parameter (diag_pkgSatus) to track the status of the pkg activation;
this replace/extend the use of logical param "settingDiags" (to check
when adding diag to the list) to also check any DIAGNOSTICS_[]FILL* call.

1 jmc 1.32 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_utils.F,v 1.31 2011/06/12 19:08:21 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     CHARACTER*8 diagName
242     INTEGER listId
243     INTEGER ndId, ip
244     INTEGER myThid
245     CEOP
246    
247     C !LOCAL VARIABLES:
248     INTEGER n,m
249    
250     ip = 0
251     ndId = 0
252    
253     IF ( listId.LE.0 ) THEN
254     C-- select the 1rst one which name matches:
255    
256     C- search for this diag. in the active 2D/3D diagnostics list
257 jmc 1.31 DO n=1,nLists
258 jmc 1.26 DO m=1,nActive(n)
259     IF ( ip.EQ.0 .AND. diagName.EQ.flds(m,n)
260     & .AND. idiag(m,n).NE.0 ) THEN
261     ip = ABS(idiag(m,n))
262     ndId = jdiag(m,n)
263     ENDIF
264     ENDDO
265     ENDDO
266    
267 jmc 1.31 ELSEIF ( listId.LE.nLists ) THEN
268 jmc 1.26 C-- select the unique diagnostic with output-time identical to listId
269    
270     C- search for this diag. in the active 2D/3D diagnostics list
271 jmc 1.31 DO n=1,nLists
272 jmc 1.26 IF ( ip.EQ.0
273     & .AND. freq(n) .EQ. freq(listId)
274     & .AND. phase(n).EQ.phase(listId)
275     & .AND. averageFreq(n) .EQ.averageFreq(listId)
276     & .AND. averagePhase(n).EQ.averagePhase(listId)
277     & .AND. averageCycle(n).EQ.averageCycle(listId)
278     & ) THEN
279     DO m=1,nActive(n)
280     IF ( ip.EQ.0 .AND. diagName.EQ.flds(m,n)
281     & .AND. idiag(m,n).NE.0 ) THEN
282     ip = ABS(idiag(m,n))
283     ndId = jdiag(m,n)
284     ENDIF
285     ENDDO
286     ELSEIF ( ip.EQ.0 ) THEN
287     DO m=1,nActive(n)
288     IF ( ip.EQ.0 .AND. diagName.EQ.flds(m,n)
289     & .AND. idiag(m,n).NE.0 ) THEN
290     ndId = jdiag(m,n)
291     ENDIF
292     ENDDO
293     ENDIF
294     ENDDO
295    
296     ELSE
297     STOP 'DIAGNOSTICS_GET_POINTERS: invalid listId number'
298     ENDIF
299    
300     RETURN
301     END
302    
303     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
304    
305     CBOP 0
306 jmc 1.29 C !ROUTINE: DIAGNOSTICS_SETKLEV
307    
308     C !INTERFACE:
309     SUBROUTINE DIAGNOSTICS_SETKLEV(
310     I diagName, nLevDiag, myThid )
311    
312     C !DESCRIPTION:
313     C *==========================================================*
314     C | S/R DIAGNOSTICS_SETKLEV
315     C | o Define explicitly the number of level (stored in kdiag)
316     C | of a diagnostic field. For most diagnostics, the number
317     C | of levels is derived (in S/R SET_LEVELS) from gdiag(10)
318     C | but occasionally one may want to set it explicitly.
319     C *==========================================================*
320    
321     C !USES:
322     IMPLICIT NONE
323     #include "EEPARAMS.h"
324     #include "SIZE.h"
325     #include "DIAGNOSTICS_SIZE.h"
326     #include "DIAGNOSTICS.h"
327    
328     C !INPUT PARAMETERS:
329     C diagName :: diagnostic identificator name (8 characters long)
330     C nLevDiag :: number of level to set for this diagnostics field
331     C myThid :: my Thread Id number
332     CHARACTER*8 diagName
333     INTEGER nLevDiag
334     INTEGER myThid
335     CEOP
336    
337     C !LOCAL VARIABLES:
338     CHARACTER*(MAX_LEN_MBUF) msgBuf
339     INTEGER n, ndId
340    
341     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
342    
343 jmc 1.30 _BEGIN_MASTER( myThid)
344    
345 jmc 1.29 C-- Check if this S/R is called from the right place ;
346     C needs to be after DIAGNOSTICS_INIT_EARLY and before DIAGNOSTICS_INIT_FIXED
347 jmc 1.32 IF ( diag_pkgStatus.NE.ready2setDiags ) THEN
348     CALL DIAGNOSTICS_STATUS_ERROR( 'DIAGNOSTICS_SETKLEV',
349     & ' ', diagName, ready2setDiags, myThid )
350 jmc 1.29 ENDIF
351    
352     C-- Find this diagnostics in the list of available diag.
353     ndId = 0
354     DO n = 1,ndiagt
355     IF ( diagName.EQ.cdiag(n) ) THEN
356     ndId = n
357     ENDIF
358     ENDDO
359     IF ( ndId.EQ.0 ) THEN
360     WRITE(msgBuf,'(4A)') 'DIAGNOSTICS_SETKLEV: ',
361     & 'diagName="', diagName, '" not known.'
362     CALL PRINT_ERROR( msgBuf, myThid )
363     STOP 'ABNORMAL END: S/R DIAGNOSTICS_SETKLEV'
364     ENDIF
365    
366     C- Optional level number diagnostics (X): set number of levels
367     IF ( kdiag(ndId).EQ.0
368     & .AND. gdiag(ndId)(10:10).EQ.'X' ) THEN
369     kdiag(ndId) = nLevDiag
370     ELSEIF ( kdiag(ndId).EQ.nLevDiag
371     & .AND. gdiag(ndId)(10:10).EQ.'X' ) THEN
372     C- level number already set to same value: send warning
373     WRITE(msgBuf,'(4A,I5)') '** WARNING ** DIAGNOSTICS_SETKLEV: ',
374     & 'diagName="', diagName, '" , nLevDiag=', nLevDiag
375     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
376     & SQUEEZE_RIGHT , myThid )
377     WRITE(msgBuf,'(2A,I5,A)')'** WARNING ** DIAGNOSTICS_SETKLEV:',
378     & ' level Nb (=', kdiag(ndId), ') already set.'
379     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
380     & SQUEEZE_RIGHT , myThid )
381     ELSEIF ( gdiag(ndId)(10:10).EQ.'X' ) THEN
382     C- level number already set to a different value: do not reset but stop
383     WRITE(msgBuf,'(4A,I5)') 'DIAGNOSTICS_SETKLEV: ',
384     & 'diagName="', diagName, '" , nLevDiag=', nLevDiag
385     CALL PRINT_ERROR( msgBuf, myThid )
386     WRITE(msgBuf,'(2A,I5,3A)') 'DIAGNOSTICS_SETKLEV: ',
387     & 'level Nb already set to', kdiag(ndId), ' => STOP'
388     CALL PRINT_ERROR( msgBuf, myThid )
389     ELSE
390     C- for now, do nothing but just send a warning
391     WRITE(msgBuf,'(4A,I5)') '** WARNING ** DIAGNOSTICS_SETKLEV: ',
392     & 'diagName="', diagName, '" , nLevDiag=', nLevDiag
393     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
394     & SQUEEZE_RIGHT , myThid )
395     WRITE(msgBuf,'(2A,I5,3A)') '** WARNING ** will set level Nb',
396     & ' from diagCode(ndId=', ndId, ')="', gdiag(ndId)(1:10), '"'
397     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
398     & SQUEEZE_RIGHT , myThid )
399     WRITE(msgBuf,'(4A)') '** WARNING ** DIAGNOSTICS_SETKLEV',
400     & '("', diagName, '") <== Ignore this call.'
401     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
402     & SQUEEZE_RIGHT , myThid )
403     ENDIF
404    
405 jmc 1.30 _END_MASTER( myThid)
406    
407 jmc 1.29 RETURN
408     END
409    
410     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
411    
412     CBOP 0
413 jmc 1.26 C !ROUTINE: DIAGS_GET_PARMS_I
414    
415     C !INTERFACE:
416     INTEGER FUNCTION DIAGS_GET_PARMS_I(
417     I parName, myThid )
418    
419     C !DESCRIPTION:
420     C *==========================================================*
421     C | FUNCTION DIAGS_GET_PARMS_I
422     C | o Return the value of integer parameter
423     C | from one of the DIAGNOSTICS.h common blocs
424     C *==========================================================*
425    
426     C !USES:
427     IMPLICIT NONE
428     #include "EEPARAMS.h"
429     #include "SIZE.h"
430     #include "DIAGNOSTICS_SIZE.h"
431     #include "DIAGNOSTICS.h"
432    
433     C !INPUT PARAMETERS:
434     C parName :: string used to identify which parameter to get
435     C myThid :: my Thread Id number
436     CHARACTER*(*) parName
437     INTEGER myThid
438     CEOP
439    
440     C !LOCAL VARIABLES:
441     CHARACTER*(MAX_LEN_MBUF) msgBuf
442     INTEGER n
443    
444     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
445    
446     n = LEN(parName)
447     c write(0,'(3A,I4)')
448     c & 'DIAGS_GET_PARMS_I: parName="',parName,'" , length=',n
449    
450     IF ( parName.EQ.'LAST_DIAG_ID' ) THEN
451     DIAGS_GET_PARMS_I = ndiagt
452     ELSE
453     WRITE(msgBuf,'(4A)') 'DIAGS_GET_PARMS_I: ',
454     & ' parName="', parName, '" not known.'
455     CALL PRINT_ERROR( msgBuf, myThid )
456     STOP 'ABNORMAL END: S/R DIAGS_GET_PARMS_I'
457     ENDIF
458    
459     RETURN
460     END
461    
462     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
463    
464     CBOP 0
465 jmc 1.17 C !ROUTINE: DIAGS_MK_UNITS
466    
467     C !INTERFACE:
468 jmc 1.21 CHARACTER*16 FUNCTION DIAGS_MK_UNITS(
469 jmc 1.17 I diagUnitsInPieces, myThid )
470    
471     C !DESCRIPTION:
472     C *==========================================================*
473     C | FUNCTION DIAGS_MK_UNITS
474 jmc 1.21 C | o Return the diagnostic units string (16c) removing
475 jmc 1.17 C | blanks from the input string
476     C *==========================================================*
477    
478     C !USES:
479     IMPLICIT NONE
480     #include "EEPARAMS.h"
481    
482     C !INPUT PARAMETERS:
483 jmc 1.21 C diagUnitsInPieces :: string for diagnostic units: in several
484 jmc 1.17 C pieces, with blanks in between
485     C myThid :: my thread Id number
486     CHARACTER*(*) diagUnitsInPieces
487     INTEGER myThid
488     CEOP
489    
490     C !LOCAL VARIABLES:
491     CHARACTER*(MAX_LEN_MBUF) msgBuf
492     INTEGER i,j,n
493    
494 jmc 1.29 DIAGS_MK_UNITS = ' '
495 jmc 1.17 n = LEN(diagUnitsInPieces)
496 jmc 1.21
497 jmc 1.17 j = 0
498     DO i=1,n
499     IF (diagUnitsInPieces(i:i) .NE. ' ' ) THEN
500     j = j+1
501     IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
502     ENDIF
503     ENDDO
504    
505     IF ( j.GT.16 ) THEN
506 jmc 1.29 WRITE(msgBuf,'(2A,I4,A)') '** WARNING ** ',
507 jmc 1.17 & 'DIAGS_MK_UNITS: too long (',j,' >16) input string'
508     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
509     & SQUEEZE_RIGHT , myThid)
510 jmc 1.29 WRITE(msgBuf,'(3A)') '** WARNING ** ',
511 jmc 1.17 & 'DIAGS_MK_UNITS: input=', diagUnitsInPieces
512     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
513     & SQUEEZE_RIGHT , myThid)
514     ENDIF
515    
516     RETURN
517     END
518 jmc 1.23
519     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
520    
521     CBOP 0
522     C !ROUTINE: DIAGS_MK_TITLE
523    
524     C !INTERFACE:
525     CHARACTER*80 FUNCTION DIAGS_MK_TITLE(
526     I diagTitleInPieces, myThid )
527    
528     C !DESCRIPTION:
529     C *==========================================================*
530     C | FUNCTION DIAGS_MK_TITLE
531     C | o Return the diagnostic title string (80c) removing
532     C | consecutive blanks from the input string
533     C *==========================================================*
534    
535     C !USES:
536     IMPLICIT NONE
537     #include "EEPARAMS.h"
538    
539     C !INPUT PARAMETERS:
540     C diagTitleInPieces :: string for diagnostic units: in several
541     C pieces, with blanks in between
542     C myThid :: my Thread Id number
543     CHARACTER*(*) diagTitleInPieces
544     INTEGER myThid
545     CEOP
546    
547     C !LOCAL VARIABLES:
548     CHARACTER*(MAX_LEN_MBUF) msgBuf
549     LOGICAL flag
550     INTEGER i,j,n
551    
552 molod 1.22 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
553 jmc 1.23
554     DIAGS_MK_TITLE = ' '
555     & //' '
556     n = LEN(diagTitleInPieces)
557    
558     j = 0
559     flag = .FALSE.
560     DO i=1,n
561     IF (diagTitleInPieces(i:i) .NE. ' ' ) THEN
562     IF ( flag ) THEN
563     j = j+1
564     IF (j.LE.80) DIAGS_MK_TITLE(j:j) = ' '
565     ENDIF
566     j = j+1
567     IF ( j.LE.80 ) DIAGS_MK_TITLE(j:j) = diagTitleInPieces(i:i)
568     flag = .FALSE.
569     ELSE
570     flag = j.GE.1
571     ENDIF
572     ENDDO
573    
574     IF ( j.GT.80 ) THEN
575 jmc 1.29 WRITE(msgBuf,'(2A,I4,A)') '** WARNING ** ',
576 jmc 1.23 & 'DIAGS_MK_TITLE: too long (',j,' >80) input string'
577     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
578     & SQUEEZE_RIGHT , myThid)
579 jmc 1.29 WRITE(msgBuf,'(3A)') '** WARNING ** ',
580 jmc 1.23 & 'DIAGS_MK_TITLE: input=', diagTitleInPieces
581     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
582     & SQUEEZE_RIGHT , myThid)
583     ENDIF
584    
585     RETURN
586     END

  ViewVC Help
Powered by ViewVC 1.1.22