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

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

  ViewVC Help
Powered by ViewVC 1.1.22