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

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

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


Revision 1.13 - (hide annotations) (download)
Mon Jan 11 19:44:07 2010 UTC (14 years, 4 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.12: +6 -4 lines
update printed message (writing vertical integral case)

1 jmc 1.13 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_set_pointers.F,v 1.12 2009/06/08 14:40:47 jmc Exp $
2 jmc 1.1 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 jmc 1.13 C myThid :: my Thread Id. number
30 jmc 1.1 INTEGER myThid
31     CEOP
32    
33     C !LOCAL VARIABLES:
34     C == Local variables ==
35 jmc 1.7 INTEGER ndiagcount, ndCount
36 jmc 1.5 INTEGER md,ld,nd
37 jmc 1.1 INTEGER mate, nActiveMax
38 jmc 1.5 INTEGER i, j, k, k1, k2, mm, kLev
39 jmc 1.1 LOGICAL found
40     CHARACTER*(MAX_LEN_MBUF) msgBuf
41 jmc 1.13 CHARACTER*12 suffix
42 jmc 1.1
43     _BEGIN_MASTER( myThid)
44    
45 jmc 1.4 C-- Initialize pointer arrays to zero:
46 jmc 1.5 DO ld=1,numlists
47     DO md=1,numperlist
48     idiag(md,ld) = 0
49     jdiag(md,ld) = 0
50     mdiag(md,ld) = 0
51     ENDDO
52 jmc 1.4 ENDDO
53    
54 jmc 1.6 C-- Calculate pointers for diagnostics in active output-stream
55     C (i.e., with defined filename)
56 jmc 1.4
57 jmc 1.1 ndiagcount = 0
58     nActiveMax = 0
59 jmc 1.5 DO ld=1,nlists
60     nActive(ld) = nfields(ld)
61     DO md=1,nfields(ld)
62 jmc 1.1
63     found = .FALSE.
64     C Search all possible model diagnostics
65 jmc 1.5 DO nd=1,ndiagt
66     IF ( flds(md,ld).EQ.cdiag(nd) ) THEN
67     CALL DIAGNOSTICS_SETDIAG(mate,ndiagcount,md,ld,nd,myThid)
68 jmc 1.1 found = .TRUE.
69 jmc 1.5 jdiag(md,ld) = nd
70 jmc 1.1 ENDIF
71     ENDDO
72     IF ( .NOT.found ) THEN
73 jmc 1.7 CALL DIAGNOSTICS_LIST_CHECK(
74     O ndCount,
75 dfer 1.11 I ld, md, nlists, nfields, flds, myThid )
76 jmc 1.7 IF ( ndCount.EQ.0 ) THEN
77     WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_SET_POINTERS: ',
78 jmc 1.5 & flds(md,ld),' is not a Diagnostic'
79 jmc 1.7 CALL PRINT_ERROR( msgBuf , myThid )
80     ENDIF
81 jmc 1.1 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
82     ENDIF
83     IF ( found .AND. mate.GE.1 ) THEN
84 jmc 1.5 mm = nActive(ld) + 1
85     IF ( mm.LE.numperlist ) THEN
86     jdiag(mm,ld) = mate
87     idiag(mm,ld) = mdiag(md,ld)
88     flds (mm,ld) = cdiag(mate)
89 jmc 1.1 ENDIF
90 jmc 1.5 nActive(ld) = mm
91 jmc 1.1 ENDIF
92    
93     ENDDO
94 jmc 1.5 nActiveMax = MAX(nActive(ld),nActiveMax)
95 jmc 1.1 ENDDO
96    
97 jmc 1.10 IF ( ndiagcount.LE.numDiags .AND.
98 jmc 1.1 & nActiveMax.LE.numperlist ) THEN
99 jmc 1.10 WRITE(msgBuf,'(A,I8,A)')
100 jmc 1.5 & ' space allocated for all diagnostics:',
101 jmc 1.1 & ndiagcount, ' levels'
102     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
103 jmc 1.2 & SQUEEZE_RIGHT , myThid)
104 jmc 1.1 ELSE
105 jmc 1.10 IF ( ndiagcount.GT.numDiags ) THEN
106 jmc 1.1 WRITE(msgBuf,'(2A)')
107     & 'DIAGNOSTICS_SET_POINTERS: Not enough space',
108     & ' for all active diagnostics (from data.diagnostics)'
109     CALL PRINT_ERROR( msgBuf , myThid )
110 jmc 1.10 WRITE(msgBuf,'(A,I8,A,I8)')
111     & 'DIAGNOSTICS_SET_POINTERS: numDiags=', numDiags,
112 jmc 1.1 & ' but needs at least', ndiagcount
113     CALL PRINT_ERROR( msgBuf , myThid )
114     ENDIF
115     IF ( nActiveMax.GT.numperlist ) THEN
116     WRITE(msgBuf,'(2A)')
117     & 'DIAGNOSTICS_SET_POINTERS: Not enough space',
118     & ' for all active diagnostics (from data.diagnostics)'
119     CALL PRINT_ERROR( msgBuf , myThid )
120     WRITE(msgBuf,'(A,I6,A,I6)')
121     & 'DIAGNOSTICS_SET_POINTERS: numperlist=', numperlist,
122     & ' but needs at least', nActiveMax
123     CALL PRINT_ERROR( msgBuf , myThid )
124     ENDIF
125     STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
126     ENDIF
127    
128 jmc 1.3 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
129 jmc 1.5 C-- Set pointer for mate (e.g.vector component mate) if not already done
130     C and if it exists. Note: for now, only used to print message.
131     DO ld=1,nlists
132     DO md=1,nActive(ld)
133     IF (mdiag(md,ld).EQ.0 ) THEN
134    
135     nd = jdiag(md,ld)
136 jmc 1.10 mate = hdiag(nd)
137     IF ( mate.GT.0 ) THEN
138 jmc 1.5 DO j=1,nlists
139     DO i=1,nActive(j)
140     IF ( mdiag(md,ld).EQ.0 .AND. jdiag(i,j).EQ.mate ) THEN
141     mdiag(md,ld) = ABS(idiag(i,j))
142     ENDIF
143     ENDDO
144     ENDDO
145     ENDIF
146     IF ( mdiag(md,ld).NE.0 ) THEN
147 jmc 1.10 WRITE(msgBuf,'(A,I6,5A,I6)') ' set mate pointer for diag #',
148     & nd, ' ', cdiag(nd), ' , Parms: ', gdiag(nd)(1:10),
149     & ' , mate:', hdiag(nd)
150 jmc 1.5 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
151     & SQUEEZE_RIGHT , myThid)
152     ENDIF
153    
154     ENDIF
155     ENDDO
156     ENDDO
157    
158     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
159 jmc 1.3 C-- Set list of levels to write (if not specified in data.diagnostics)
160    
161 jmc 1.5 DO ld=1,nlists
162     IF ( nlevels(ld).EQ.-1 ) THEN
163 jmc 1.3 C- set Nb of levels to the minimum size of all diag of this list:
164 jmc 1.12 kLev = numLevels*10
165 jmc 1.5 DO md=1,nfields(ld)
166     nd = jdiag(md,ld)
167     kLev = MIN(kdiag(nd),kLev)
168 jmc 1.3 ENDDO
169     IF ( kLev.LE.0 ) THEN
170 jmc 1.12 WRITE(msgBuf,'(2A,I4,2A)')
171     & 'DIAGNOSTICS_SET_POINTERS: kLev < 1 in',
172     & ' setting levs of list l=',ld,', fnames=', fnames(ld)
173     CALL PRINT_ERROR( msgBuf , myThid )
174     STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
175     ELSEIF ( kLev.GT.numLevels ) THEN
176     WRITE(msgBuf,'(A,2(I6,A))')
177     & 'DIAGNOSTICS_SET_POINTERS: kLev=', kLev,
178     & ' >', numLevels, ' =numLevels'
179     CALL PRINT_ERROR( msgBuf , myThid )
180     WRITE(msgBuf,'(2A,I4,2A)') 'DIAGNOSTICS_SET_POINTERS: in',
181     & ' setting levs of list l=',ld,', fnames=', fnames(ld)
182 jmc 1.3 CALL PRINT_ERROR( msgBuf , myThid )
183     STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
184     ENDIF
185 jmc 1.5 nlevels(ld) = kLev
186 jmc 1.3 DO k=1,kLev
187 jmc 1.5 levs(k,ld) = k
188 jmc 1.3 ENDDO
189     WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_SET_POINTERS: ',
190 jmc 1.5 & 'Set levels for Outp.Stream: ',fnames(ld)
191 jmc 1.3 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
192     & SQUEEZE_RIGHT, myThid)
193 jmc 1.13 suffix = ' Levels: '
194     IF ( fflags(ld)(2:2).EQ.'I' ) suffix = ' Sum Levels:'
195 jmc 1.5 DO k1=1,nlevels(ld),20
196     k2 = MIN(nlevels(ld),k1+19)
197 jmc 1.13 WRITE(msgBuf,'(A,20F5.0)') suffix, (levs(k,ld),k=k1,k2)
198 jmc 1.3 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
199     & SQUEEZE_RIGHT, myThid)
200     ENDDO
201 jmc 1.8 ELSEIF ( fflags(ld)(2:2).NE.'P' ) THEN
202     C- if no Vert.Interpolation, check for levels out of range ( > kdiag):
203 jmc 1.3 kLev = 0
204 jmc 1.5 DO k=1,nlevels(ld)
205     kLev = MAX(NINT(levs(k,ld)),kLev)
206 jmc 1.3 ENDDO
207 jmc 1.5 DO md=1,nfields(ld)
208     nd = jdiag(md,ld)
209     IF ( kLev.GT.kdiag(nd) ) THEN
210     C- Note: diagnostics_out take care (in some way) of this case
211 jmc 1.3 C so that it does not cause "index out-off bounds" error.
212     C However, the output file looks strange.
213     C- For now, choose to stop, but could change it to just a warning
214 jmc 1.10 WRITE(msgBuf,'(A,I4,A,I6,2A)')
215 jmc 1.3 & 'DIAGNOSTICS_SET_POINTERS: Ask for level=',kLev,
216 jmc 1.5 & ' in list l=', ld, ', filename: ', fnames(ld)
217 jmc 1.3 CALL PRINT_ERROR( msgBuf , myThid )
218 jmc 1.10 WRITE(msgBuf,'(2A,I4,A,I6,2A)')
219 jmc 1.3 & 'DIAGNOSTICS_SET_POINTERS: ==> exceed Max.Nb of lev.',
220 jmc 1.5 & '(=',kdiag(nd),') for Diag. #', nd, ' : ',cdiag(nd)
221 jmc 1.3 CALL PRINT_ERROR( msgBuf , myThid )
222     WRITE(msgBuf,'(4A)') 'DIAGNOSTICS_SET_POINTERS: ',
223 jmc 1.5 & ' parsing code >>',gdiag(nd),'<<'
224 jmc 1.3 CALL PRINT_ERROR( msgBuf , myThid )
225     STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
226     ENDIF
227     ENDDO
228     ENDIF
229     ENDDO
230    
231     WRITE(msgBuf,'(A)') 'DIAGNOSTICS_SET_POINTERS: done'
232     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
233     & SQUEEZE_RIGHT , myThid)
234     WRITE(msgBuf,'(2A)')
235     & '------------------------------------------------------------'
236     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
237     & SQUEEZE_RIGHT , myThid)
238    
239 jmc 1.1 _END_MASTER( myThid )
240    
241     RETURN
242     END

  ViewVC Help
Powered by ViewVC 1.1.22