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

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

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


Revision 1.33 - (show annotations) (download)
Fri Jul 18 22:04:10 2014 UTC (9 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65o, checkpoint65l, checkpoint65m, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e
Changes since 1.32: +25 -2 lines
modify DIAGS_MK_UNITS: try to make diag-units shorter if it exceeds
 the 16.c length of diagUnits.

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_utils.F,v 1.32 2013/08/14 00:54:06 jmc Exp $
2 C $Name: $
3
4 #include "DIAG_OPTIONS.h"
5
6 C-- File diagnostics_utils.F: General purpose support routines
7 C-- Contents:
8 C-- o DIAGNOSTICS_COUNT
9 C-- o DIAGNOSTICS_GET_DIAG
10 C-- o DIAGNOSTICS_GET_POINTERS
11 C-- o DIAGNOSTICS_SETKLEV
12 C-- o DIAGS_GET_PARMS_I (Function)
13 C-- o DIAGS_MK_UNITS (Function)
14 C-- o DIAGS_MK_TITLE (Function)
15
16 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
17
18 CBOP 0
19 C !ROUTINE: DIAGNOSTICS_COUNT
20 C !INTERFACE:
21 SUBROUTINE DIAGNOSTICS_COUNT( diagName,
22 I biArg, bjArg, myThid )
23
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 C diagName :: name of diagnostic to increment the counter
42 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 CHARACTER*8 diagName
47 INTEGER biArg, bjArg
48 INTEGER myThid
49 CEOP
50
51 C !LOCAL VARIABLES:
52 C ===============
53 INTEGER m, n
54 INTEGER bi, bj
55 INTEGER ipt, ndId
56 c CHARACTER*(MAX_LEN_MBUF) msgBuf
57
58 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 C-- Run through list of active diagnostics to find which counter
67 C to increment (needs to be a valid & active diagnostic-counter)
68 DO n=1,nLists
69 DO m=1,nActive(n)
70 IF ( diagName.EQ.flds(m,n) .AND. idiag(m,n).GT.0 ) THEN
71 ipt = idiag(m,n)
72 IF (ndiag(ipt,bi,bj).GE.0) THEN
73 ndId = jdiag(m,n)
74 ipt = ipt + pdiag(n,bi,bj)*kdiag(ndId)
75 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 ENDIF
88 ENDDO
89 ENDDO
90
91 RETURN
92 END
93
94 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
95
96 CBOP 0
97 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 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 DO n=1,nLists
258 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 ELSEIF ( listId.LE.nLists ) THEN
268 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 DO n=1,nLists
272 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 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 _BEGIN_MASTER( myThid)
344
345 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 IF ( diag_pkgStatus.NE.ready2setDiags ) THEN
348 CALL DIAGNOSTICS_STATUS_ERROR( 'DIAGNOSTICS_SETKLEV',
349 & ' ', diagName, ready2setDiags, myThid )
350 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 _END_MASTER( myThid)
406
407 RETURN
408 END
409
410 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
411
412 CBOP 0
413 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 C !ROUTINE: DIAGS_MK_UNITS
466
467 C !INTERFACE:
468 CHARACTER*16 FUNCTION DIAGS_MK_UNITS(
469 I diagUnitsInPieces, myThid )
470
471 C !DESCRIPTION:
472 C *==========================================================*
473 C | FUNCTION DIAGS_MK_UNITS
474 C | o Return the diagnostic units string (16c) removing
475 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 C diagUnitsInPieces :: string for diagnostic units: in several
484 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,nbc
493
494 DIAGS_MK_UNITS = ' '
495 n = LEN(diagUnitsInPieces)
496
497 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 nbc = j
505
506 IF ( nbc.GT.16 ) THEN
507 C- try to reduce length by changing m^2 & m^3 to m2 & m3:
508 DIAGS_MK_UNITS = ' '
509 j = 0
510 DO i=1,n
511 IF ( diagUnitsInPieces(i:i) .NE. ' ' ) THEN
512 IF ( j.GE.1 .AND. nbc.GT.16 .AND.
513 & diagUnitsInPieces(i:i).EQ.'^' ) THEN
514 IF ( diagUnitsInPieces(i-1:i-1).EQ.'m' ) THEN
515 nbc = nbc - 1
516 ELSE
517 j = j+1
518 IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
519 ENDIF
520 ELSE
521 j = j+1
522 IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
523 ENDIF
524 ENDIF
525 ENDDO
526 ENDIF
527
528 IF ( j.GT.16 ) THEN
529 WRITE(msgBuf,'(2A,I4,A)') '** WARNING ** ',
530 & 'DIAGS_MK_UNITS: too long (',j,' >16) input string'
531 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
532 & SQUEEZE_RIGHT , myThid)
533 WRITE(msgBuf,'(3A)') '** WARNING ** ',
534 & 'DIAGS_MK_UNITS: input=', diagUnitsInPieces
535 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
536 & SQUEEZE_RIGHT , myThid)
537 ENDIF
538
539 RETURN
540 END
541
542 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
543
544 CBOP 0
545 C !ROUTINE: DIAGS_MK_TITLE
546
547 C !INTERFACE:
548 CHARACTER*80 FUNCTION DIAGS_MK_TITLE(
549 I diagTitleInPieces, myThid )
550
551 C !DESCRIPTION:
552 C *==========================================================*
553 C | FUNCTION DIAGS_MK_TITLE
554 C | o Return the diagnostic title string (80c) removing
555 C | consecutive blanks from the input string
556 C *==========================================================*
557
558 C !USES:
559 IMPLICIT NONE
560 #include "EEPARAMS.h"
561
562 C !INPUT PARAMETERS:
563 C diagTitleInPieces :: string for diagnostic units: in several
564 C pieces, with blanks in between
565 C myThid :: my Thread Id number
566 CHARACTER*(*) diagTitleInPieces
567 INTEGER myThid
568 CEOP
569
570 C !LOCAL VARIABLES:
571 CHARACTER*(MAX_LEN_MBUF) msgBuf
572 LOGICAL flag
573 INTEGER i,j,n
574
575 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
576
577 DIAGS_MK_TITLE = ' '
578 & //' '
579 n = LEN(diagTitleInPieces)
580
581 j = 0
582 flag = .FALSE.
583 DO i=1,n
584 IF (diagTitleInPieces(i:i) .NE. ' ' ) THEN
585 IF ( flag ) THEN
586 j = j+1
587 IF (j.LE.80) DIAGS_MK_TITLE(j:j) = ' '
588 ENDIF
589 j = j+1
590 IF ( j.LE.80 ) DIAGS_MK_TITLE(j:j) = diagTitleInPieces(i:i)
591 flag = .FALSE.
592 ELSE
593 flag = j.GE.1
594 ENDIF
595 ENDDO
596
597 IF ( j.GT.80 ) THEN
598 WRITE(msgBuf,'(2A,I4,A)') '** WARNING ** ',
599 & 'DIAGS_MK_TITLE: too long (',j,' >80) input string'
600 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
601 & SQUEEZE_RIGHT , myThid)
602 WRITE(msgBuf,'(3A)') '** WARNING ** ',
603 & 'DIAGS_MK_TITLE: input=', diagTitleInPieces
604 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
605 & SQUEEZE_RIGHT , myThid)
606 ENDIF
607
608 RETURN
609 END

  ViewVC Help
Powered by ViewVC 1.1.22