/[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.2 - (show annotations) (download)
Sun Jun 26 16:51:49 2005 UTC (18 years, 10 months ago) by jmc
Branch: MAIN
Changes since 1.1: +71 -26 lines
change pointers so that 1 diag. can be used several times (with # freq.)

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_setdiag.F,v 1.1 2004/12/13 21:43:54 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*8 parms1
53 CHARACTER*3 mate_index
54 CHARACTER*(MAX_LEN_MBUF) msgBuf
55
56
57 C **********************************************************************
58 C **** SET POINTERS FOR DIAGNOSTIC NUM ****
59 C **********************************************************************
60
61 parms1 = gdiag(ndId)(1:8)
62 stdUnit = standardMessageUnit
63 errUnit = errorMessageUnit
64
65 C-- Seach for the same diag (with same freq) to see if already set
66 flag = .TRUE.
67 DO l=1,listId
68 IF (flag .AND. freq(l) .EQ. freq(listId)
69 & .AND. phase(l).EQ.phase(listId) ) THEN
70 DO k=1,MIN(nActive(l),numperlist)
71 IF (flag .AND. jdiag(k,l).GT.0) THEN
72 IF ( cdiag(ndId).EQ.cdiag(jdiag(k,l)) ) THEN
73 C- diagnostics already set ; use the same slot:
74 flag = .FALSE.
75 idiag(mId,listId) = -ABS(idiag(k,l))
76 mdiag(mId,listId) = mdiag(k,l)
77 ENDIF
78 ENDIF
79 ENDDO
80 ENDIF
81 ENDDO
82
83 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
84
85 IF ( flag ) THEN
86 IF (ndiagmx+kdiag(ndId).GT.numdiags) THEN
87 WRITE(msgBuf,'(A,I4,1X,A)')
88 & 'SETDIAG: Not enough space for Diagnostic #',ndId,cdiag(ndId)
89 CALL PRINT_MESSAGE(msgBuf, errUnit, SQUEEZE_RIGHT, myThid)
90 ELSE
91 WRITE(msgBuf,'(A,I3,A,I4,1X,A)') 'SETDIAG: Allocate',
92 & kdiag(ndId), ' Levels for Diagnostic #', ndId, cdiag(ndId)
93 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
94 ENDIF
95 idiag(mId,listId) = ndiagmx + 1
96 ndiagmx = ndiagmx + kdiag(ndId)
97 ELSE
98 WRITE(msgBuf,'(A,I4,1X,2A)')
99 & '- WARNING - SETDIAG: Diagnostic #', ndId, cdiag(ndId),
100 & ' has already been set'
101 CALL PRINT_MESSAGE(msgBuf, errUnit, SQUEEZE_RIGHT, myThid)
102 RETURN
103 ENDIF
104
105 c Check for Counter Diagnostic
106 c ----------------------------
107 mate = 0
108 IF ( parms1(5:5).EQ.'C') THEN
109 mate_index = parms1(6:8)
110 READ (mate_index,'(I3)') mate
111
112 C-- Seach for the same diag (with same freq) to see if already set
113 flag = .TRUE.
114 DO l=1,listId
115 IF (flag .AND. freq(l).EQ.freq(listId)
116 & .AND. phase(l).EQ.phase(listId) ) THEN
117 DO k=1,MIN(nActive(l),numperlist)
118 IF (flag .AND. jdiag(k,l).GT.0) THEN
119 IF (cdiag(mate).EQ.cdiag(jdiag(k,l)) ) THEN
120 C- diagnostics already set ; use the same slot:
121 flag = .FALSE.
122 mdiag(mId,listId) = ABS(idiag(k,l))
123 ENDIF
124 ENDIF
125 ENDDO
126 ENDIF
127 ENDDO
128
129 IF ( flag ) THEN
130 IF (ndiagmx+kdiag(mate).GT.numdiags) THEN
131 WRITE(msgBuf,'(A,I4,1X,A)')
132 & 'SETDIAG: Not enough space for Counter Diagnostic #',
133 & mate, cdiag(mate)
134 CALL PRINT_MESSAGE(msgBuf, errUnit, SQUEEZE_RIGHT, myThid)
135 ELSE
136 WRITE(msgBuf,'(A,I3,A,I4,1X,A)') 'SETDIAG: Allocate',
137 & kdiag(mate), ' Levels for Count.Diag #', mate, cdiag(mate)
138 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
139 ENDIF
140 mdiag(mId,listId) = ndiagmx + 1
141 ndiagmx = ndiagmx + kdiag(mate)
142 ELSE
143 WRITE(msgBuf,'(A,I4,1X,2A)')
144 & '- NOTE - SETDIAG: Counter Diagnostic #', mate, cdiag(mate),
145 & ' has already been set'
146 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
147 mate = 0
148 ENDIF
149 ENDIF
150
151 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
152 RETURN
153 END

  ViewVC Help
Powered by ViewVC 1.1.22