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

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

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

revision 1.1 by molod, Thu Feb 12 15:56:38 2004 UTC revision 1.18 by jmc, Mon Feb 7 03:07:49 2005 UTC
# Line 1  Line 1 
1        subroutine getdiag (qdiag,lev,ipoint,qtmp,im,jm,nd,undef)  C $Header$
2  C***********************************************************************          C $Name$
 C                                                                                
 C  PURPOSE                                                                        
 C     Retrieve averaged model diagnostic  
 C  INPUT:                                                                        
 C     lev ..... Model LEVEL                                                      
 C  ipoint ..... DIAGNOSTIC NUMBER FROM MENU                                      
 C   undef ..... UNDEFINED VALUE                                                  
 C      im ..... X-DIMENSION  
 C      jm ..... Y-DIMENSION  
 C      nd ..... Number of 2-D Diagnostics  
 C                                                                                
 C  OUTPUT:                                                                        
 C    qtmp ..... AVERAGED DIAGNOSTIC QUANTITY                                              
 C                                                                                
 C***********************************************************************          
       implicit none  
   
 #include "SIZE.h"  
 #include "fizhi_SIZE.h"  
 #include "diagnostics_SIZE.h"  
 #include "diagnostics.h"  
   
       integer    im,jm,nd  
       real qdiag(im,jm,nd)  
   
       integer lev,ipoint  
       integer i,j,ipnt,klev  
       real    undef, factor  
       real    qtmp(im,jm)  
   
       do j = 1,jm  
       do i = 1,im  
       qtmp(i,j) = undef  
       enddo  
       enddo  
   
       IF (IPOINT.LT.1) GO TO 999  
3    
4        KLEV = KDIAG(IPOINT)  #include "DIAG_OPTIONS.h"
       IF(KLEV.GE.LEV) THEN  
       IPNT = IDIAG(IPOINT) + LEV - 1  
                                 FACTOR = 1.0  
       IF( NDIAG(IPOINT).NE.0 )  FACTOR = 1.0   / NDIAG(IPOINT)  
       do j = 1,jm  
       do i = 1,im  
       if( qdiag(i,j,ipnt).ne.undef ) qtmp(i,j) = qdiag(i,j,ipnt)*factor  
       enddo  
       enddo  
       ENDIF  
5    
6   999  RETURN  C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7        END  CBOP 0
8    C     !ROUTINE: GETDIAG
9    
10    C     !INTERFACE:
11          SUBROUTINE GETDIAG(
12         I                    levreal, undef,
13         O                    qtmp,
14         I                    ipoint, mate, bi, bj, myThid )
15    
16        subroutine getdiag2 (qdiag,lev,ipoint,qtmp,im,jm,nd,undef)  C     !DESCRIPTION:
17  C***********************************************************************          C     Retrieve averaged model diagnostic
 C                                                                                
 C  PURPOSE                                                                        
 C     Retrieve model diagnostic (No Averaging)  
 C  INPUT:                                                                        
 C     lev ..... Model LEVEL                                                      
 C  ipoint ..... DIAGNOSTIC NUMBER FROM MENU                                      
 C   undef ..... UNDEFINED VALUE                                                  
 C      im ..... X-DIMENSION  
 C      jm ..... Y-DIMENSION  
 C      nd ..... Number of 2-D Diagnostics  
 C                                                                                
 C  OUTPUT:                                                                        
 C    qtmp ..... DIAGNOSTIC QUANTITY                                              
 C                                                                                
 C***********************************************************************          
                                                                                   
       implicit none  
18    
19    C     !USES:
20          IMPLICIT NONE
21    #include "EEPARAMS.h"
22  #include "SIZE.h"  #include "SIZE.h"
23  #include "fizhi_SIZE.h"  #include "DIAGNOSTICS_SIZE.h"
24  #include "diagnostics_SIZE.h"  #include "DIAGNOSTICS.h"
 #include "diagnostics.h"  
   
       integer    im,jm,nd  
       real qdiag(im,jm,nd)  
   
       integer lev,ipoint  
       integer i,j,ipnt,klev  
       real    undef, factor  
       real    qtmp(im,jm)  
   
       do j = 1,jm  
       do i = 1,im  
       qtmp(i,j) = undef  
       enddo  
       enddo  
25    
26        IF (IPOINT.LT.1) GO TO 999  C     !INPUT PARAMETERS:
27    C     levreal .... Diagnostic LEVEL
28    C     undef  ..... UNDEFINED VALUE
29    C     ipoint ..... DIAGNOSTIC NUMBER FROM MENU
30    C     mate   ..... counter DIAGNOSTIC NUMBER if any ; 0 otherwise
31    C     bi     ..... X-direction tile number
32    C     bj     ..... Y-direction tile number
33    C     myThid ..... my thread Id number
34          _RL levreal
35          _RL undef
36          INTEGER ipoint, mate
37          INTEGER bi,bj, myThid
38    
39    C     !OUTPUT PARAMETERS:
40    C     qtmp    ..... AVERAGED DIAGNOSTIC QUANTITY
41          _RL qtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
42    CEOP
43    
44    C     !LOCAL VARIABLES:
45          _RL factor
46          INTEGER i, j, ipnt,ipCt
47          INTEGER lev, levCt, klev
48    
49          IF (ipoint.GE.1) THEN
50           lev = NINT(levreal)
51           klev = kdiag(ipoint)
52           IF (lev.LE.klev) THEN
53    
54            IF ( mate.EQ.0 ) THEN
55    C-      No counter diagnostics => average = Sum / ndiag :
56    
57              ipnt = idiag(ipoint) + lev - 1
58    c         factor = 1.0
59    c         if (ndiag(ipoint).ne.0) factor = 1.0/ndiag(ipoint)
60              factor = FLOAT(ndiag(ipoint))
61              IF (ndiag(ipoint).NE.0) factor = 1. _d 0 / factor
62    
63              DO j = 1,sNy+1
64                DO i = 1,sNx+1
65                  IF ( qdiag(i,j,ipnt,bi,bj) .LE. undef ) THEN
66                    qtmp(i,j) = qdiag(i,j,ipnt,bi,bj)*factor
67                  ELSE
68                    qtmp(i,j) = undef
69                  ENDIF
70                ENDDO
71              ENDDO
72    
73            ELSE
74    C-      With counter diagnostics => average = Sum / counter:
75    
76              ipnt = idiag(ipoint) + lev - 1
77              levCt= MIN(lev,kdiag(mate))
78              ipCt = idiag(mate) + levCt - 1
79              DO j = 1,sNy+1
80                DO i = 1,sNx+1
81                  IF ( qdiag(i,j,ipCt,bi,bj) .NE. 0. ) THEN
82                    qtmp(i,j) = qdiag(i,j,ipnt,bi,bj)
83         &                    / qdiag(i,j,ipCt,bi,bj)
84                  ELSE
85                    qtmp(i,j) = undef
86                  ENDIF
87                ENDDO
88              ENDDO
89    
90        KLEV = KDIAG(IPOINT)          ENDIF
91        IF(KLEV.GE.LEV) THEN         ENDIF
       IPNT = IDIAG(IPOINT) + LEV - 1  
       do j = 1,jm  
       do i = 1,im  
       qtmp(i,j) = qdiag(i,j,ipnt)  
       enddo  
       enddo  
92        ENDIF        ENDIF
93    
94   999  RETURN        RETURN
95        END        END
96        subroutine  clrindx ( diag,indxlist )  
97    C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
98    
99          subroutine clrindx (listnum, myThid)
100  C***********************************************************************  C***********************************************************************
101  C  C
102  C  PURPOSE  C  PURPOSE
103  C     DRIVER TO CLEAR DIAGNOSTICS SPECIFIED IN DIAGNOSTIC INDEX LIST  C     DRIVER TO CLEAR DIAGNOSTICS SPECIFIED IN DIAGNOSTIC INDEX LIST
104  C  C
105  C  ARGUMENT DESCRIPTION  C  ARGUMENT DESCRIPTION
106  C     INDXLIST.. INTEGER DIAGNOSTIC INDEX LIST  C     listnum ....  diagnostics list number
107  C  C
108  C***********************************************************************  C***********************************************************************
109    
110        implicit none        implicit none
111    #include "EEPARAMS.h"
112  #include "SIZE.h"  #include "SIZE.h"
113  #include "fizhi_SIZE.h"  #include "DIAGNOSTICS_SIZE.h"
114  #include "diagnostics_SIZE.h"  #include "DIAGNOSTICS.h"
 #include "diagnostics.h"  
   
       integer indxlist (ndiagt)  
       integer index, n  
   
       character*8 parms1  
       character*1 parse1(8)  
       character*3 mate_index  
       integer     mate  
115    
116        equivalence (     parms1 , parse1(1) )        integer myThid, listnum
       equivalence ( mate_index , parse1(6) )  
117    
118        DO  INDEX=1,NDIAGT        integer m, n
119        N = INDXLIST (index)        character*8 parms1
120          character*3 mate_index
121          integer mate
122    
123        IF( N.NE.0 .AND. IDIAG(N).NE.0 ) THEN        do n=1,nfields(listnum)
124        call clrdiag (diag,n)         do m=1,ndiagt
125            if( flds(n,listnum).eq.cdiag(m) .and. idiag(m).ne.0 ) then
126             call clrdiag (m, myThid)
127    
128  c Check for Counter Diagnostic  c Check for Counter Diagnostic
129  c ----------------------------  c ----------------------------
130        parms1 =  gdiag(n)           parms1 =  gdiag(m)(1:8)
131        if( parse1(5).eq.'C' ) then           if ( parms1(5:5).eq.'C' ) then
132         read (mate_index,100) mate            mate_index = parms1(6:8)
133         call clrdiag (diag,mate)            read (mate_index,'(I3)') mate
134        endif            call clrdiag (mate, myThid)
135             endif
136            endif
137           enddo
138          enddo
139    
140        ENDIF                RETURN
141        ENDDO        END
                     
   100 format(i3)  
       RETURN        
       END            
142    
143    
144        subroutine clrdiag (diag,n)        subroutine clrdiag (index, myThid)
145  C***********************************************************************          C***********************************************************************
146  C                                                                                C  PURPOSE
147  C  PURPOSE                                                                        C     ZERO OUT MODEL DIAGNOSTIC ARRAY ELEMENTS
148  C     INITIALIZE MODEL DIAGNOSTIC QUANTITIES                                      C***********************************************************************
149  C                                                                                
 C***********************************************************************          
                                                                                   
150        implicit none        implicit none
151    #include "EEPARAMS.h"
152  #include "SIZE.h"  #include "SIZE.h"
153  #include "fizhi_SIZE.h"  #include "DIAGNOSTICS_SIZE.h"
154  #include "diagnostics_SIZE.h"  #include "DIAGNOSTICS.h"
 #include "diagnostics.h"  
155    
156        integer n        integer myThid, index
157    
158          integer bi,bj
159        integer i,j,k        integer i,j,k
160    
161  C **********************************************************************          C **********************************************************************
162  C ****              SET DIAGNOSTIC AND COUNTER TO ZERO              ****          C ****              SET DIAGNOSTIC AND COUNTER TO ZERO              ****
163  C **********************************************************************          C **********************************************************************
164                                                                                    
165        IF( IDIAG(N).NE.0 ) THEN                                                          do bj=myByLo(myThid), myByHi(myThid)
166           do bi=myBxLo(myThid), myBxHi(myThid)
167          do k=1,kdiag(n)          do k = 1,kdiag(index)
168          do j=1,sNx           do j = 1-OLy,sNy+OLy
169          do i=1,sNy            do i = 1-OLx,sNx+OLx
170          qdiag(i,j,idiag(n)+k-1) = 0.0             qdiag(i,j,idiag(index)+k-1,bi,bj) = 0.0
171          enddo            enddo
172          enddo           enddo
173          enddo          enddo
174           enddo
175          enddo
176    
177          ndiag(index) = 0
178    
179          RETURN
180          END
181    
182    C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
183    
184    CBOP 0
185    C     !ROUTINE: DIAGNOSTICS_IS_ON
186    
187    C     !INTERFACE:
188          LOGICAL FUNCTION DIAGNOSTICS_IS_ON( diagName, myThid )
189    
190        NDIAG(N) = 0                                                            C     !DESCRIPTION:
191        ENDIF                                                                      C     *==========================================================*
192                                                                                    C     | FUNCTION DIAGNOSTIC_IS_ON
193        RETURN                                                                      C     | o Return TRUE if diagnostics "diagName" is Active
194        END                                                                        C     *==========================================================*
195    
196    C     !USES:
197          IMPLICIT NONE
198    #include "EEPARAMS.h"
199    #include "SIZE.h"
200    #include "DIAGNOSTICS_SIZE.h"
201    #include "DIAGNOSTICS.h"
202    
203    C     !INPUT PARAMETERS:
204    C     diagName   ::  diagnostic identificator name (8 characters long)
205    C     myThid     ::  my thread Id number
206          CHARACTER*8  diagName
207          INTEGER      myThid
208    CEOP
209    
210    C     !LOCAL VARIABLES:
211          INTEGER j,n,m
212    
213          DIAGNOSTICS_IS_ON = .FALSE.
214          DO n=1,nlists
215           DO m=1,nActive(n)
216            IF ( diagName.EQ.flds(m,n) ) THEN
217              j = jdiag(m,n)    
218              IF ( idiag(j).NE.0 .AND. ndiag(j).GE.0 )
219         &         DIAGNOSTICS_IS_ON = .TRUE.
220            ENDIF
221           ENDDO
222          ENDDO
223    
224          RETURN
225          END
226    
227    C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
228    
229    CBOP 0
230    C     !ROUTINE: DIAGS_MK_UNITS
231    
232    C     !INTERFACE:
233          CHARACTER*16 FUNCTION DIAGS_MK_UNITS(
234         I                            diagUnitsInPieces, myThid )
235    
236    C     !DESCRIPTION:
237    C     *==========================================================*
238    C     | FUNCTION DIAGS_MK_UNITS
239    C     | o Return the diagnostic units string (16c) removing
240    C     |   blanks from the input string
241    C     *==========================================================*
242    
243    C     !USES:
244          IMPLICIT NONE
245    #include "EEPARAMS.h"
246    
247    C     !INPUT PARAMETERS:
248    C     diagUnitsInPieces :: string for diagnostic units: in several
249    C                          pieces, with blanks in between
250    C     myThid            ::  my thread Id number
251          CHARACTER*(*) diagUnitsInPieces
252          INTEGER      myThid
253    CEOP
254    
255    C     !LOCAL VARIABLES:
256          CHARACTER*(MAX_LEN_MBUF) msgBuf
257          INTEGER i,j,n
258    
259          DIAGS_MK_UNITS = '          '
260          n = LEN(diagUnitsInPieces)
261          
262          j = 0
263          DO i=1,n
264           IF (diagUnitsInPieces(i:i) .NE. ' ' ) THEN
265             j = j+1
266             IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
267           ENDIF
268          ENDDO
269    
270          IF ( j.GT.16 ) THEN
271             WRITE(msgBuf,'(2A,I4,A)') '**WARNING** ',
272         &   'DIAGS_MK_UNITS: too long (',j,' >16) input string'
273            CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
274         &       SQUEEZE_RIGHT , myThid)
275             WRITE(msgBuf,'(3A)') '**WARNING** ',
276         &   'DIAGS_MK_UNITS: input=', diagUnitsInPieces
277            CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
278         &       SQUEEZE_RIGHT , myThid)
279          ENDIF
280    
281          RETURN
282          END

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.18

  ViewVC Help
Powered by ViewVC 1.1.22