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

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

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


Revision 1.4 - (show annotations) (download)
Mon May 16 15:07:45 2005 UTC (19 years ago) by jmc
Branch: MAIN
CVS Tags: checkpoint57i_post, checkpoint57h_done
Changes since 1.3: +8 -2 lines
move initialization of idiag from _init_early to _set_pointers

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_set_pointers.F,v 1.3 2004/12/20 01:52:58 jmc Exp $
2 C $Name: $
3
4 #include "DIAG_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: DIAGNOSTICS_SET_POINTERS
8 C !INTERFACE:
9 SUBROUTINE DIAGNOSTICS_SET_POINTERS( myThid )
10
11 C !DESCRIPTION: \bv
12 C *==================================================================
13 C | S/R DIAGNOSTICS_SET_POINTERS
14 C | o set pointers for active diagnostics
15 C *==================================================================
16 C \ev
17
18 C !USES:
19 IMPLICIT NONE
20
21 C == Global variables ===
22 #include "EEPARAMS.h"
23 #include "SIZE.h"
24 #include "DIAGNOSTICS_SIZE.h"
25 #include "DIAGNOSTICS.h"
26
27 C !INPUT/OUTPUT PARAMETERS:
28 C == Routine arguments ==
29 C myThid - Thread number for this instance of the routine.
30 INTEGER myThid
31 CEOP
32
33 C !LOCAL VARIABLES:
34 C == Local variables ==
35 INTEGER ndiagcount
36 INTEGER m,mm,n
37 INTEGER mate, nActiveMax
38 INTEGER l, k, kLev
39 LOGICAL found
40 CHARACTER*(MAX_LEN_MBUF) msgBuf
41
42
43 _BEGIN_MASTER( myThid)
44
45 C-- Initialize pointer arrays to zero:
46 DO n=1,ndiagMax
47 idiag(n) = 0
48 ENDDO
49
50 C-- Calculate pointers for diagnostics set to non-zero frequency
51
52 ndiagcount = 0
53 nActiveMax = 0
54 DO n=1,nlists
55 nActive(n) = nfields(n)
56 DO m=1,nfields(n)
57
58 found = .FALSE.
59 C Search all possible model diagnostics
60 DO mm=1,ndiagt
61 IF ( flds(m,n).EQ.cdiag(mm) ) THEN
62 CALL DIAGNOSTICS_SETDIAG (mate,ndiagcount,mm,myThid)
63 found = .TRUE.
64 jdiag(m,n) = mm
65 ENDIF
66 ENDDO
67 IF ( .NOT.found ) THEN
68 WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_SET_POINTERS: ',
69 & flds(m,n),' is not a Diagnostic'
70 CALL PRINT_ERROR( msgBuf , myThid )
71 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
72 ENDIF
73 IF ( found .AND. mate.GE.1 ) THEN
74 nActive(n) = nActive(n) + 1
75 IF ( nActive(n).LE.numperlist ) THEN
76 jdiag(nActive(n),n) = mate
77 flds( nActive(n),n) = cdiag(mate)
78 ENDIF
79 ENDIF
80
81 ENDDO
82 nActiveMax = MAX(nActive(n),nActiveMax)
83 ENDDO
84
85 IF ( ndiagcount.LE.numdiags .AND.
86 & nActiveMax.LE.numperlist ) THEN
87 WRITE(msgBuf,'(A,I6,A)')
88 & ' space allocated for all diagnostics:',
89 & ndiagcount, ' levels'
90 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
91 & SQUEEZE_RIGHT , myThid)
92 ELSE
93 IF ( ndiagcount.GT.numdiags ) THEN
94 WRITE(msgBuf,'(2A)')
95 & 'DIAGNOSTICS_SET_POINTERS: Not enough space',
96 & ' for all active diagnostics (from data.diagnostics)'
97 CALL PRINT_ERROR( msgBuf , myThid )
98 WRITE(msgBuf,'(A,I6,A,I6)')
99 & 'DIAGNOSTICS_SET_POINTERS: numdiags=', numdiags,
100 & ' but needs at least', ndiagcount
101 CALL PRINT_ERROR( msgBuf , myThid )
102 ENDIF
103 IF ( nActiveMax.GT.numperlist ) THEN
104 WRITE(msgBuf,'(2A)')
105 & 'DIAGNOSTICS_SET_POINTERS: Not enough space',
106 & ' for all active diagnostics (from data.diagnostics)'
107 CALL PRINT_ERROR( msgBuf , myThid )
108 WRITE(msgBuf,'(A,I6,A,I6)')
109 & 'DIAGNOSTICS_SET_POINTERS: numperlist=', numperlist,
110 & ' but needs at least', nActiveMax
111 CALL PRINT_ERROR( msgBuf , myThid )
112 ENDIF
113 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
114 ENDIF
115
116 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
117 C-- Set list of levels to write (if not specified in data.diagnostics)
118
119 DO n=1,nlists
120 IF ( nlevels(n).EQ.-1 ) THEN
121 C- set Nb of levels to the minimum size of all diag of this list:
122 kLev = numLevels
123 DO m=1,nfields(n)
124 mm = jdiag(m,n)
125 kLev = MIN(kdiag(mm),kLev)
126 ENDDO
127 IF ( kLev.LE.0 ) THEN
128 WRITE(msgBuf,'(2A,I4,2A)')
129 & 'DIAGNOSTICS_SET_POINTERS: kLev < 1 in ',
130 & ' setting levs of list n=',n,', fnames: ', fnames(n)
131 CALL PRINT_ERROR( msgBuf , myThid )
132 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
133 ENDIF
134 nlevels(n) = kLev
135 DO k=1,kLev
136 levs(k,n) = k
137 ENDDO
138 WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_SET_POINTERS: ',
139 & 'Set levels for Outp.Stream: ',fnames(n)
140 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
141 & SQUEEZE_RIGHT, myThid)
142 DO l=1,nlevels(n),20
143 m = MIN(nlevels(n),l+19)
144 WRITE(msgBuf,'(A,20F5.0)')' Levels: ',(levs(k,n),k=l,m)
145 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
146 & SQUEEZE_RIGHT, myThid)
147 ENDDO
148 ELSE
149 C- Check for levels out of range ( > kdiag)
150 kLev = 0
151 DO k=1,nlevels(n)
152 kLev = MAX(NINT(levs(k,n)),kLev)
153 ENDDO
154 DO m=1,nfields(n)
155 mm = jdiag(m,n)
156 IF ( kLev.GT.kdiag(mm) ) THEN
157 C- Note: diagnostics_out take care (in some way) of this case
158 C so that it does not cause "index out-off bounds" error.
159 C However, the output file looks strange.
160 C- For now, choose to stop, but could change it to just a warning
161 WRITE(msgBuf,'(A,I3,A,I3,2A)')
162 & 'DIAGNOSTICS_SET_POINTERS: Ask for level=',kLev,
163 & ' in list n=', n, ', filename: ', fnames(n)
164 CALL PRINT_ERROR( msgBuf , myThid )
165 WRITE(msgBuf,'(2A,I3,A,I3,2A)')
166 & 'DIAGNOSTICS_SET_POINTERS: ==> exceed Max.Nb of lev.',
167 & '(=',kdiag(mm),') for Diag. #', mm, ' : ',cdiag(mm)
168 CALL PRINT_ERROR( msgBuf , myThid )
169 WRITE(msgBuf,'(4A)') 'DIAGNOSTICS_SET_POINTERS: ',
170 & ' parsing code >>',gdiag(mm),'<<'
171 CALL PRINT_ERROR( msgBuf , myThid )
172 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
173 ENDIF
174 ENDDO
175 ENDIF
176 ENDDO
177
178 WRITE(msgBuf,'(A)') 'DIAGNOSTICS_SET_POINTERS: done'
179 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
180 & SQUEEZE_RIGHT , myThid)
181 WRITE(msgBuf,'(2A)')
182 & '------------------------------------------------------------'
183 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
184 & SQUEEZE_RIGHT , myThid)
185
186 _END_MASTER( myThid )
187
188 RETURN
189 END

  ViewVC Help
Powered by ViewVC 1.1.22