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

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

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

revision 1.4 by jmc, Mon May 16 15:07:45 2005 UTC revision 1.6 by jmc, Mon Jun 5 18:05:48 2006 UTC
# Line 33  CEOP Line 33  CEOP
33  C     !LOCAL VARIABLES:  C     !LOCAL VARIABLES:
34  C     == Local variables ==  C     == Local variables ==
35        INTEGER ndiagcount        INTEGER ndiagcount
36        INTEGER m,mm,n        INTEGER md,ld,nd
37        INTEGER mate, nActiveMax        INTEGER mate, nActiveMax
38        INTEGER l, k, kLev        INTEGER i, j, k, k1, k2, mm, kLev
39        LOGICAL found        LOGICAL found
40        CHARACTER*(MAX_LEN_MBUF) msgBuf        CHARACTER*(MAX_LEN_MBUF) msgBuf
41          CHARACTER*3 mate_index
42    
43    
44        _BEGIN_MASTER( myThid)        _BEGIN_MASTER( myThid)
45    
46  C--   Initialize pointer arrays to zero:  C--   Initialize pointer arrays to zero:
47        DO n=1,ndiagMax        DO ld=1,numlists
48          idiag(n) = 0         DO md=1,numperlist
49            idiag(md,ld) = 0
50            jdiag(md,ld) = 0
51            mdiag(md,ld) = 0
52           ENDDO
53        ENDDO        ENDDO
54    
55  C--   Calculate pointers for diagnostics set to non-zero frequency  C--   Calculate pointers for diagnostics in active output-stream
56    C                                   (i.e., with defined filename)
57    
58        ndiagcount = 0        ndiagcount = 0
59        nActiveMax = 0        nActiveMax = 0
60        DO n=1,nlists        DO ld=1,nlists
61         nActive(n) = nfields(n)         nActive(ld) = nfields(ld)
62         DO m=1,nfields(n)         DO md=1,nfields(ld)
63    
64           found = .FALSE.           found = .FALSE.
65  C        Search all possible model diagnostics  C        Search all possible model diagnostics
66           DO mm=1,ndiagt           DO nd=1,ndiagt
67            IF ( flds(m,n).EQ.cdiag(mm) ) THEN            IF ( flds(md,ld).EQ.cdiag(nd) ) THEN
68              CALL DIAGNOSTICS_SETDIAG (mate,ndiagcount,mm,myThid)              CALL DIAGNOSTICS_SETDIAG(mate,ndiagcount,md,ld,nd,myThid)
69              found = .TRUE.              found = .TRUE.
70              jdiag(m,n) = mm              jdiag(md,ld) = nd
71            ENDIF            ENDIF
72           ENDDO           ENDDO
73           IF ( .NOT.found ) THEN           IF ( .NOT.found ) THEN
74             WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_SET_POINTERS: ',             WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_SET_POINTERS: ',
75       &                      flds(m,n),' is not a Diagnostic'       &                      flds(md,ld),' is not a Diagnostic'
76             CALL PRINT_ERROR( msgBuf , myThid )             CALL PRINT_ERROR( msgBuf , myThid )
77             STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'             STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
78           ENDIF           ENDIF
79           IF ( found .AND. mate.GE.1 ) THEN           IF ( found .AND. mate.GE.1 ) THEN
80              nActive(n) = nActive(n) + 1             mm = nActive(ld) + 1
81              IF ( nActive(n).LE.numperlist ) THEN             IF ( mm.LE.numperlist ) THEN
82               jdiag(nActive(n),n) = mate               jdiag(mm,ld) = mate
83               flds( nActive(n),n) = cdiag(mate)               idiag(mm,ld) = mdiag(md,ld)
84                 flds (mm,ld) = cdiag(mate)
85             ENDIF             ENDIF
86               nActive(ld) = mm
87           ENDIF           ENDIF
88    
89         ENDDO         ENDDO
90         nActiveMax = MAX(nActive(n),nActiveMax)         nActiveMax = MAX(nActive(ld),nActiveMax)
91        ENDDO        ENDDO
92    
93        IF (  ndiagcount.LE.numdiags .AND.        IF (  ndiagcount.LE.numdiags .AND.
94       &      nActiveMax.LE.numperlist ) THEN       &      nActiveMax.LE.numperlist ) THEN
95          WRITE(msgBuf,'(A,I6,A)')          WRITE(msgBuf,'(A,I6,A)')
96       &    '  space allocated for all diagnostics:',       &    '  space allocated for all diagnostics:',
97       &    ndiagcount, ' levels'       &    ndiagcount, ' levels'
98          CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,          CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
99       &                      SQUEEZE_RIGHT , myThid)       &                      SQUEEZE_RIGHT , myThid)
# Line 114  C        Search all possible model diagn Line 122  C        Search all possible model diagn
122        ENDIF        ENDIF
123    
124  C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|  C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
125    C--   Set pointer for mate (e.g.vector component mate) if not already done
126    C     and if it exists. Note: for now, only used to print message.
127          DO ld=1,nlists
128           DO md=1,nActive(ld)
129            IF (mdiag(md,ld).EQ.0 ) THEN
130    
131             nd = jdiag(md,ld)
132             mate_index = gdiag(nd)(6:8)
133             IF ( mate_index.NE.'   ' ) THEN
134              READ(mate_index,'(I3)') mate
135              DO j=1,nlists
136               DO i=1,nActive(j)
137                IF ( mdiag(md,ld).EQ.0 .AND. jdiag(i,j).EQ.mate ) THEN
138                  mdiag(md,ld) = ABS(idiag(i,j))
139                ENDIF
140               ENDDO
141              ENDDO
142             ENDIF
143             IF ( mdiag(md,ld).NE.0 ) THEN
144              WRITE(msgBuf,'(A,I4,4A)') '  set mate pointer for diag #',
145         &         nd, '  ', cdiag(nd), ' , Parms: ', gdiag(nd)
146              CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
147         &                        SQUEEZE_RIGHT , myThid)
148             ENDIF
149    
150            ENDIF
151           ENDDO
152          ENDDO
153    
154    C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
155  C--   Set list of levels to write (if not specified in data.diagnostics)  C--   Set list of levels to write (if not specified in data.diagnostics)
156    
157        DO n=1,nlists        DO ld=1,nlists
158          IF ( nlevels(n).EQ.-1 ) THEN          IF ( nlevels(ld).EQ.-1 ) THEN
159  C-      set Nb of levels to the minimum size of all diag of this list:  C-      set Nb of levels to the minimum size of all diag of this list:
160            kLev = numLevels            kLev = numLevels
161            DO m=1,nfields(n)            DO md=1,nfields(ld)
162              mm = jdiag(m,n)              nd = jdiag(md,ld)
163              kLev = MIN(kdiag(mm),kLev)              kLev = MIN(kdiag(nd),kLev)
164            ENDDO            ENDDO
165            IF ( kLev.LE.0 ) THEN            IF ( kLev.LE.0 ) THEN
166              WRITE(msgBuf,'(2A,I4,2A)')              WRITE(msgBuf,'(2A,I4,2A)')
167       &      'DIAGNOSTICS_SET_POINTERS: kLev < 1 in ',       &      'DIAGNOSTICS_SET_POINTERS: kLev < 1 in ',
168       &      ' setting levs of list n=',n,', fnames: ', fnames(n)       &      ' setting levs of list l=',ld,', fnames: ', fnames(ld)
169              CALL PRINT_ERROR( msgBuf , myThid )              CALL PRINT_ERROR( msgBuf , myThid )
170              STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'              STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
171            ENDIF            ENDIF
172            nlevels(n) = kLev            nlevels(ld) = kLev
173            DO k=1,kLev            DO k=1,kLev
174             levs(k,n) = k             levs(k,ld) = k
175            ENDDO            ENDDO
176            WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_SET_POINTERS: ',            WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_SET_POINTERS: ',
177       &      'Set levels for Outp.Stream: ',fnames(n)       &      'Set levels for Outp.Stream: ',fnames(ld)
178            CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,            CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
179       &                        SQUEEZE_RIGHT, myThid)       &                        SQUEEZE_RIGHT, myThid)
180            DO l=1,nlevels(n),20            DO k1=1,nlevels(ld),20
181              m = MIN(nlevels(n),l+19)              k2 = MIN(nlevels(ld),k1+19)
182              WRITE(msgBuf,'(A,20F5.0)')' Levels:    ',(levs(k,n),k=l,m)              WRITE(msgBuf,'(A,20F5.0)')
183         &         ' Levels:    ', (levs(k,ld),k=k1,k2)
184              CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,              CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
185       &                          SQUEEZE_RIGHT, myThid)       &                          SQUEEZE_RIGHT, myThid)
186            ENDDO            ENDDO
187          ELSE          ELSE
188  C-      Check for levels out of range ( > kdiag)  C-      Check for levels out of range ( > kdiag)
189            kLev = 0            kLev = 0
190            DO k=1,nlevels(n)            DO k=1,nlevels(ld)
191              kLev = MAX(NINT(levs(k,n)),kLev)              kLev = MAX(NINT(levs(k,ld)),kLev)
192            ENDDO            ENDDO
193            DO m=1,nfields(n)            DO md=1,nfields(ld)
194              mm = jdiag(m,n)              nd = jdiag(md,ld)
195              IF ( kLev.GT.kdiag(mm) ) THEN              IF ( kLev.GT.kdiag(nd) ) THEN
196  C- Note: diagnostics_out take care (in some way) of this case  C- Note: diagnostics_out take care (in some way) of this case
197  C        so that it does not cause "index out-off bounds" error.  C        so that it does not cause "index out-off bounds" error.
198  C        However, the output file looks strange.  C        However, the output file looks strange.
199  C- For now, choose to stop, but could change it to just a warning  C- For now, choose to stop, but could change it to just a warning
200               WRITE(msgBuf,'(A,I3,A,I3,2A)')               WRITE(msgBuf,'(A,I3,A,I3,2A)')
201       &       'DIAGNOSTICS_SET_POINTERS: Ask for level=',kLev,       &       'DIAGNOSTICS_SET_POINTERS: Ask for level=',kLev,
202       &         ' in list n=', n, ', filename: ', fnames(n)       &         ' in list l=', ld, ', filename: ', fnames(ld)
203               CALL PRINT_ERROR( msgBuf , myThid )               CALL PRINT_ERROR( msgBuf , myThid )
204               WRITE(msgBuf,'(2A,I3,A,I3,2A)')               WRITE(msgBuf,'(2A,I3,A,I3,2A)')
205       &       'DIAGNOSTICS_SET_POINTERS: ==> exceed Max.Nb of lev.',       &       'DIAGNOSTICS_SET_POINTERS: ==> exceed Max.Nb of lev.',
206       &       '(=',kdiag(mm),') for Diag. #', mm, ' : ',cdiag(mm)       &       '(=',kdiag(nd),') for Diag. #', nd, ' : ',cdiag(nd)
207               CALL PRINT_ERROR( msgBuf , myThid )               CALL PRINT_ERROR( msgBuf , myThid )
208               WRITE(msgBuf,'(4A)') 'DIAGNOSTICS_SET_POINTERS: ',               WRITE(msgBuf,'(4A)') 'DIAGNOSTICS_SET_POINTERS: ',
209       &       ' parsing code >>',gdiag(mm),'<<'       &       ' parsing code >>',gdiag(nd),'<<'
210               CALL PRINT_ERROR( msgBuf , myThid )               CALL PRINT_ERROR( msgBuf , myThid )
211               STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'               STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
212              ENDIF              ENDIF

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.6

  ViewVC Help
Powered by ViewVC 1.1.22