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

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

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


Revision 1.9 - (hide annotations) (download)
Fri Jul 1 18:26:54 2011 UTC (12 years, 10 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63g, checkpoint63a, checkpoint63b, checkpoint63c, checkpoint64, checkpoint65, checkpoint63, checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66i, checkpoint66h, 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.8: +7 -6 lines
minor changes to printed messages

1 jmc 1.9 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_setdiag.F,v 1.8 2011/06/29 22:03:56 jmc Exp $
2 jmc 1.1 C $Name: $
3    
4     #include "DIAG_OPTIONS.h"
5    
6     CBOP
7     C !ROUTINE: DIAGNOSTICS_SETDIAG
8     C !INTERFACE:
9 jmc 1.2 SUBROUTINE DIAGNOSTICS_SETDIAG(
10 jmc 1.1 O mate,
11 jmc 1.2 U ndiagmx,
12     I mId, listId, ndId, myThid )
13 jmc 1.1
14     C !DESCRIPTION: \bv
15     C *==================================================================
16     C | S/R DIAGNOSTICS_SETDIAG
17 jmc 1.2 C | o activate diagnostic "ndId":
18 jmc 1.1 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 jmc 1.2 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 jmc 1.1 INTEGER mate
41     INTEGER ndiagmx
42 jmc 1.2 INTEGER mId, listId, ndId
43 jmc 1.1 INTEGER myThid
44     CEOP
45    
46     C !LOCAL VARIABLES:
47     C == Local variables ==
48     INTEGER stdUnit, errUnit
49 jmc 1.7 INTEGER nn, k, l
50     LOGICAL diagIsPP, flagD, flagP, flagM
51 jmc 1.1
52 jmc 1.5 CHARACTER*10 gcode
53 jmc 1.9 CHARACTER*12 tmpMsg
54 jmc 1.1 CHARACTER*(MAX_LEN_MBUF) msgBuf
55    
56     C **********************************************************************
57 jmc 1.5 C **** SET POINTERS FOR DIAGNOSTIC ndId ****
58 jmc 1.1 C **********************************************************************
59    
60     stdUnit = standardMessageUnit
61     errUnit = errorMessageUnit
62    
63 jmc 1.7 C- Case of Post-Procesed diag, not filled up but computed from other diags:
64     diagIsPP = gdiag(ndId)(5:5).EQ.'P'
65    
66     C--- Seach for the same diag (with same freq) to see if already set
67     C do it recursively on Post-Processed diag dependance (=mate)
68     C until we find either one already set or a non Post-Processed diag
69     flagD = .TRUE.
70     flagP = .TRUE.
71     nn = ndId
72     DO WHILE ( flagP )
73     DO l=1,listId
74     IF (flagD .AND. freq(l) .EQ. freq(listId)
75     & .AND. phase(l).EQ.phase(listId)
76     & .AND. averageFreq(l) .EQ.averageFreq(listId)
77     & .AND. averagePhase(l).EQ.averagePhase(listId)
78     & .AND. averageCycle(l).EQ.averageCycle(listId) ) THEN
79     DO k=1,MIN(nActive(l),numperList)
80     IF (flagD .AND. jdiag(k,l).GT.0) THEN
81     IF ( cdiag(nn).EQ.cdiag(jdiag(k,l)) ) THEN
82 jmc 1.2 C- diagnostics already set ; use the same slot:
83 jmc 1.7 flagD = .FALSE.
84     idiag(mId,listId) = -ABS(idiag(k,l))
85     mdiag(mId,listId) = mdiag(k,l)
86     ENDIF
87     ENDIF
88     ENDDO
89 jmc 1.2 ENDIF
90     ENDDO
91 jmc 1.7 flagP = flagD .AND. gdiag(nn)(5:5).EQ.'P'
92     IF ( flagP ) nn = hdiag(nn)
93 jmc 1.2 ENDDO
94    
95 jmc 1.7 C--- Set pointer if not already set, otherwise just print a message
96 jmc 1.2
97 jmc 1.7 IF ( diagIsPP ) THEN
98     WRITE(msgBuf,'(2(A,I6,1X,A))')
99     & 'SETDIAG: Diag #', ndId, cdiag(ndId),
100     & ' processed from Diag #',nn,cdiag(nn)
101     CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
102     ENDIF
103     gcode = gdiag(nn)(1:10)
104     IF ( flagD ) THEN
105     IF ( diagIsPP ) THEN
106 jmc 1.8 C- Add this diag with negative idiag pointer (since those 2 diags
107     C share the same pointer and "nn" will get the positive pointer).
108     idiag(mId,listId) = -(ndiagmx+1)
109 jmc 1.7 C- Also add "nn" to the Active list
110     k = nActive(listId) + 1
111     IF ( k.LE.numperList ) THEN
112     jdiag(k,listId) = nn
113     idiag(k,listId) = ndiagmx + 1
114     flds (k,listId) = cdiag(nn)
115     ENDIF
116     nActive(listId) = k
117 jmc 1.8 ELSE
118     idiag(mId,listId) = ndiagmx + 1
119 jmc 1.7 ENDIF
120     ndiagmx = ndiagmx + kdiag(nn)*averageCycle(listId)
121 jmc 1.5 IF ( ndiagmx.GT.numDiags ) THEN
122     WRITE(msgBuf,'(A,I6,1X,A)')
123 jmc 1.7 & 'SETDIAG: Not enough space for Diagnostic #',nn,cdiag(nn)
124 jmc 1.1 CALL PRINT_MESSAGE(msgBuf, errUnit, SQUEEZE_RIGHT, myThid)
125     ELSE
126 jmc 1.5 WRITE(msgBuf,'(A,2(I3,A),I6,1X,A)') 'SETDIAG: Allocate',
127 jmc 1.7 & kdiag(nn), ' x', averageCycle(listId),
128     & ' Levels for Diagnostic #', nn, cdiag(nn)
129 jmc 1.1 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
130     ENDIF
131     ELSE
132 jmc 1.9 tmpMsg = ' Diagnostic '
133     WRITE(msgBuf,'(3A,I6,1X,2A)') '- NOTE - SETDIAG: ',tmpMsg,
134     & ' #', nn, cdiag(nn), ' is already set'
135 jmc 1.6 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
136 jmc 1.1 ENDIF
137    
138 jmc 1.7 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
139 jmc 1.6
140 jmc 1.7 C--- Check for Counter Diagnostic
141 jmc 1.1 mate = 0
142 jmc 1.7
143     C- if Post-Processed diag, activate 2nd components of vector field
144 jmc 1.9 tmpMsg = ' Vector-mate'
145 jmc 1.7 IF ( diagIsPP .AND. gcode(5:5).NE.'P' .AND.
146     & (gcode(1:1).EQ.'U' .OR. gcode(1:1).EQ.'V') ) mate = hdiag(nn)
147     C- activate mate if this is a Counter Diagnostic
148 jmc 1.5 IF ( gcode(5:5).EQ.'C') THEN
149 jmc 1.7 mate = hdiag(nn)
150 jmc 1.9 tmpMsg = 'Counter-mate'
151 jmc 1.7 ENDIF
152 jmc 1.1
153 jmc 1.7 IF ( mate.GT.0 ) THEN
154 jmc 1.2 C-- Seach for the same diag (with same freq) to see if already set
155 jmc 1.7 flagM = .TRUE.
156 jmc 1.2 DO l=1,listId
157 jmc 1.7 IF (flagM .AND. freq(l) .EQ.freq(listId)
158     & .AND. phase(l).EQ.phase(listId)
159     & .AND. averageFreq(l) .EQ.averageFreq(listId)
160     & .AND. averagePhase(l).EQ.averagePhase(listId)
161     & .AND. averageCycle(l).EQ.averageCycle(listId) ) THEN
162     DO k=1,MIN(nActive(l),numperList)
163     IF (flagM .AND. jdiag(k,l).GT.0) THEN
164 jmc 1.2 IF (cdiag(mate).EQ.cdiag(jdiag(k,l)) ) THEN
165     C- diagnostics already set ; use the same slot:
166 jmc 1.7 flagM = .FALSE.
167 jmc 1.2 mdiag(mId,listId) = ABS(idiag(k,l))
168     ENDIF
169     ENDIF
170     ENDDO
171     ENDIF
172     ENDDO
173    
174 jmc 1.7 C--- Set pointer if not already set, otherwise just print a message
175     IF ( flagM ) THEN
176 jmc 1.4 mdiag(mId,listId) = ndiagmx + 1
177 jmc 1.7 k = nActive(listId) + 1
178     IF ( k.LE.numperList ) THEN
179     C- Also add mate to the Active list
180     jdiag(k,listId) = mate
181     idiag(k,listId) = ndiagmx + 1
182     flds (k,listId) = cdiag(mate)
183     ENDIF
184     nActive(listId) = k
185 jmc 1.4 ndiagmx = ndiagmx + kdiag(mate)*averageCycle(listId)
186 jmc 1.5 IF ( ndiagmx.GT.numDiags ) THEN
187 jmc 1.7 WRITE(msgBuf,'(3A,I6,1X,A)')
188     & 'SETDIAG: Not enough space for ',tmpMsg,' #',
189 jmc 1.2 & mate, cdiag(mate)
190 jmc 1.1 CALL PRINT_MESSAGE(msgBuf, errUnit, SQUEEZE_RIGHT, myThid)
191     ELSE
192 jmc 1.5 WRITE(msgBuf,'(A,2(I3,A),I6,1X,A)') 'SETDIAG: Allocate',
193 jmc 1.4 & kdiag(mate), ' x', averageCycle(listId),
194 jmc 1.7 & ' Levels for Mate Diag. #', mate, cdiag(mate)
195 jmc 1.1 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
196     ENDIF
197     ELSE
198 jmc 1.7 WRITE(msgBuf,'(3A,I6,1X,2A)') '- NOTE - SETDIAG: ',tmpMsg,
199     & ' #', mate, cdiag(mate), ' is already set'
200 jmc 1.1 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
201     ENDIF
202     ENDIF
203    
204     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
205     RETURN
206     END

  ViewVC Help
Powered by ViewVC 1.1.22