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

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

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


Revision 1.6 - (show annotations) (download)
Wed Jun 15 13:44:43 2011 UTC (12 years, 10 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62z
Changes since 1.5: +5 -7 lines
- turn a warning (in STDERR) to just a simple "-NOTE-" (in STDOUT)
- always check counter diagnostics: a) does not hurt if already set
   b) needed even if current diag was already set but was added as a mate (no output);
    in this case, it's counter mate is needed but has not yet been set.

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_setdiag.F,v 1.5 2008/02/05 15:13:01 jmc Exp $
2 C $Name: $
3
4 #include "DIAG_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: DIAGNOSTICS_SETDIAG
8 C !INTERFACE:
9 SUBROUTINE DIAGNOSTICS_SETDIAG(
10 O mate,
11 U ndiagmx,
12 I mId, listId, ndId, myThid )
13
14 C !DESCRIPTION: \bv
15 C *==================================================================
16 C | S/R DIAGNOSTICS_SETDIAG
17 C | o activate diagnostic "ndId":
18 C | set pointer locations for this diagnostic ;
19 C | look for a counter mate and set it
20 C *==================================================================
21 C \ev
22
23 C !USES:
24 IMPLICIT NONE
25
26 C == Global variables ===
27 #include "EEPARAMS.h"
28 #include "SIZE.h"
29 #include "DIAGNOSTICS_SIZE.h"
30 #include "DIAGNOSTICS.h"
31
32 C !INPUT/OUTPUT PARAMETERS:
33 C == Routine arguments ==
34 C mate :: counter-mate number in available diagnostics list
35 C ndiagmx :: current space allocated in storage array
36 C mId :: current field index in list "listId"
37 C listId :: current list number that contains field "mId"
38 C ndId :: diagnostic number in available diagnostics list
39 C myThid :: Thread number for this instance of the routine.
40 INTEGER mate
41 INTEGER ndiagmx
42 INTEGER mId, listId, ndId
43 INTEGER myThid
44 CEOP
45
46 C !LOCAL VARIABLES:
47 C == Local variables ==
48 INTEGER stdUnit, errUnit
49 INTEGER k, l
50 LOGICAL flag
51
52 CHARACTER*10 gcode
53 CHARACTER*(MAX_LEN_MBUF) msgBuf
54
55
56 C **********************************************************************
57 C **** SET POINTERS FOR DIAGNOSTIC ndId ****
58 C **********************************************************************
59
60 gcode = gdiag(ndId)(1:10)
61 stdUnit = standardMessageUnit
62 errUnit = errorMessageUnit
63
64 C-- Seach for the same diag (with same freq) to see if already set
65 flag = .TRUE.
66 DO l=1,listId
67 IF (flag .AND. freq(l) .EQ. freq(listId)
68 & .AND. phase(l).EQ.phase(listId)
69 & .AND. averageFreq(l) .EQ.averageFreq(listId)
70 & .AND. averagePhase(l).EQ.averagePhase(listId)
71 & .AND. averageCycle(l).EQ.averageCycle(listId) ) THEN
72 DO k=1,MIN(nActive(l),numperlist)
73 IF (flag .AND. jdiag(k,l).GT.0) THEN
74 IF ( cdiag(ndId).EQ.cdiag(jdiag(k,l)) ) THEN
75 C- diagnostics already set ; use the same slot:
76 flag = .FALSE.
77 idiag(mId,listId) = -ABS(idiag(k,l))
78 mdiag(mId,listId) = mdiag(k,l)
79 ENDIF
80 ENDIF
81 ENDDO
82 ENDIF
83 ENDDO
84
85 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
86
87 IF ( flag ) THEN
88 idiag(mId,listId) = ndiagmx + 1
89 ndiagmx = ndiagmx + kdiag(ndId)*averageCycle(listId)
90 IF ( ndiagmx.GT.numDiags ) THEN
91 WRITE(msgBuf,'(A,I6,1X,A)')
92 & 'SETDIAG: Not enough space for Diagnostic #',ndId,cdiag(ndId)
93 CALL PRINT_MESSAGE(msgBuf, errUnit, SQUEEZE_RIGHT, myThid)
94 ELSE
95 WRITE(msgBuf,'(A,2(I3,A),I6,1X,A)') 'SETDIAG: Allocate',
96 & kdiag(ndId), ' x', averageCycle(listId),
97 & ' Levels for Diagnostic #', ndId, cdiag(ndId)
98 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
99 ENDIF
100 ELSE
101 WRITE(msgBuf,'(A,I6,1X,2A)')
102 & '- NOTE - SETDIAG: Diagnostic #', ndId, cdiag(ndId),
103 & ' has already been set'
104 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
105 ENDIF
106
107 C Check for Counter Diagnostic
108
109 mate = 0
110 IF ( gcode(5:5).EQ.'C') THEN
111 mate = hdiag(ndId)
112
113 C-- Seach for the same diag (with same freq) to see if already set
114 flag = .TRUE.
115 DO l=1,listId
116 IF (flag .AND. freq(l) .EQ.freq(listId)
117 & .AND. phase(l).EQ.phase(listId)
118 & .AND. averageFreq(l) .EQ.averageFreq(listId)
119 & .AND. averagePhase(l).EQ.averagePhase(listId)
120 & .AND. averageCycle(l).EQ.averageCycle(listId) ) THEN
121 DO k=1,MIN(nActive(l),numperlist)
122 IF (flag .AND. jdiag(k,l).GT.0) THEN
123 IF (cdiag(mate).EQ.cdiag(jdiag(k,l)) ) THEN
124 C- diagnostics already set ; use the same slot:
125 flag = .FALSE.
126 mdiag(mId,listId) = ABS(idiag(k,l))
127 ENDIF
128 ENDIF
129 ENDDO
130 ENDIF
131 ENDDO
132
133 IF ( flag ) THEN
134 mdiag(mId,listId) = ndiagmx + 1
135 ndiagmx = ndiagmx + kdiag(mate)*averageCycle(listId)
136 IF ( ndiagmx.GT.numDiags ) THEN
137 WRITE(msgBuf,'(A,I6,1X,A)')
138 & 'SETDIAG: Not enough space for Counter Diagnostic #',
139 & mate, cdiag(mate)
140 CALL PRINT_MESSAGE(msgBuf, errUnit, SQUEEZE_RIGHT, myThid)
141 ELSE
142 WRITE(msgBuf,'(A,2(I3,A),I6,1X,A)') 'SETDIAG: Allocate',
143 & kdiag(mate), ' x', averageCycle(listId),
144 & ' Levels for Count.Diag #', mate, cdiag(mate)
145 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
146 ENDIF
147 ELSE
148 WRITE(msgBuf,'(A,I6,1X,2A)')
149 & '- NOTE - SETDIAG: Counter Diagnostic #', mate, cdiag(mate),
150 & ' has already been set'
151 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
152 mate = 0
153 ENDIF
154 ENDIF
155
156 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
157 RETURN
158 END

  ViewVC Help
Powered by ViewVC 1.1.22