/[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.30 - (show 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 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_utils.F,v 1.29 2010/01/15 00:25:58 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 GETDIAG
9 C-- o DIAGNOSTICS_COUNT
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 CBOP 0
18 C !ROUTINE: GETDIAG
19
20 C !INTERFACE:
21 SUBROUTINE GETDIAG(
22 I levreal, undef,
23 O qtmp,
24 I ndId, mate, ip, im, bi, bj, myThid )
25
26 C !DESCRIPTION:
27 C Retrieve averaged model diagnostic
28
29 C !USES:
30 IMPLICIT NONE
31 #include "EEPARAMS.h"
32 #include "SIZE.h"
33 #include "DIAGNOSTICS_SIZE.h"
34 #include "DIAGNOSTICS.h"
35
36 C !INPUT PARAMETERS:
37 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 _RL levreal
47 _RL undef
48 INTEGER ndId, mate, ip, im
49 INTEGER bi,bj, myThid
50
51 C !OUTPUT PARAMETERS:
52 C qtmp ..... AVERAGED DIAGNOSTIC QUANTITY
53 _RL qtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
54 CEOP
55
56 C !LOCAL VARIABLES:
57 _RL factor
58 INTEGER i, j, ipnt,ipCt
59 INTEGER lev, levCt, klev
60
61 IF (ndId.GE.1) THEN
62 lev = NINT(levreal)
63 klev = kdiag(ndId)
64 IF (lev.LE.klev) THEN
65
66 IF ( mate.EQ.0 ) THEN
67 C- No counter diagnostics => average = Sum / ndiag :
68
69 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
73 #ifdef ALLOW_FIZHI
74 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 #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
91 ELSE
92 C- With counter diagnostics => average = Sum / counter:
93
94 ipnt = ip + lev - 1
95 levCt= MIN(lev,kdiag(mate))
96 ipCt = im + levCt - 1
97 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
108 ENDIF
109 ENDIF
110 ENDIF
111
112 RETURN
113 END
114
115 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
116
117 CBOP 0
118 C !ROUTINE: DIAGNOSTICS_COUNT
119 C !INTERFACE:
120 SUBROUTINE DIAGNOSTICS_COUNT (chardiag,
121 I biArg, bjArg, myThid)
122
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 INTEGER m, n
153 INTEGER bi, bj
154 INTEGER ipt, ndId
155 c CHARACTER*(MAX_LEN_MBUF) msgBuf
156
157 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 C-- Run through list of active diagnostics to find which counter
166 C to increment (needs to be a valid & active diagnostic-counter)
167 DO n=1,nlists
168 DO m=1,nActive(n)
169 IF ( chardiag.EQ.flds(m,n) .AND. idiag(m,n).GT.0 ) THEN
170 ipt = idiag(m,n)
171 IF (ndiag(ipt,bi,bj).GE.0) THEN
172 ndId = jdiag(m,n)
173 ipt = ipt + pdiag(n,bi,bj)*kdiag(ndId)
174 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 ENDIF
187 ENDDO
188 ENDDO
189
190 RETURN
191 END
192
193 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
194
195 CBOP 0
196 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 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 _BEGIN_MASTER( myThid)
337
338 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 _END_MASTER( myThid)
410
411 RETURN
412 END
413
414 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
415
416 CBOP 0
417 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 C !ROUTINE: DIAGS_MK_UNITS
470
471 C !INTERFACE:
472 CHARACTER*16 FUNCTION DIAGS_MK_UNITS(
473 I diagUnitsInPieces, myThid )
474
475 C !DESCRIPTION:
476 C *==========================================================*
477 C | FUNCTION DIAGS_MK_UNITS
478 C | o Return the diagnostic units string (16c) removing
479 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 C diagUnitsInPieces :: string for diagnostic units: in several
488 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 DIAGS_MK_UNITS = ' '
499 n = LEN(diagUnitsInPieces)
500
501 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 WRITE(msgBuf,'(2A,I4,A)') '** WARNING ** ',
511 & 'DIAGS_MK_UNITS: too long (',j,' >16) input string'
512 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
513 & SQUEEZE_RIGHT , myThid)
514 WRITE(msgBuf,'(3A)') '** WARNING ** ',
515 & 'DIAGS_MK_UNITS: input=', diagUnitsInPieces
516 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
517 & SQUEEZE_RIGHT , myThid)
518 ENDIF
519
520 RETURN
521 END
522
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 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
557
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 WRITE(msgBuf,'(2A,I4,A)') '** WARNING ** ',
580 & 'DIAGS_MK_TITLE: too long (',j,' >80) input string'
581 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
582 & SQUEEZE_RIGHT , myThid)
583 WRITE(msgBuf,'(3A)') '** WARNING ** ',
584 & '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