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

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

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


Revision 1.1 - (hide annotations) (download)
Thu May 19 01:23:39 2005 UTC (19 years, 1 month ago) by jmc
Branch: MAIN
CVS Tags: checkpoint57i_post, checkpoint57h_done
DIAGNOSTICS_FILL is just calling DIAGNOSTICS_FILL_FIELD if needed
 (preparing for Global/Regional statistics ability)

1 jmc 1.1 C $Header: $
2     C $Name: $
3    
4     #include "DIAG_OPTIONS.h"
5    
6     CBOP
7     C !ROUTINE: DIAGNOSTICS_FILL_FIELD
8     C !INTERFACE:
9     SUBROUTINE DIAGNOSTICS_FILL_FIELD( inpFld, ndiagnum, ipointer,
10     I kLev, nLevs, bibjflg, biArg, bjArg, myThid )
11    
12     C !DESCRIPTION:
13     C***********************************************************************
14     C routine to increment the diagnostics array with a field
15     C***********************************************************************
16     C !USES:
17     IMPLICIT NONE
18    
19     C == Global variables ===
20     #include "EEPARAMS.h"
21     #include "SIZE.h"
22     #include "DIAGNOSTICS_SIZE.h"
23     #include "DIAGNOSTICS.h"
24    
25     C !INPUT PARAMETERS:
26     C***********************************************************************
27     C Arguments Description
28     C ----------------------
29     C inpFld ..... Field to increment diagnostics array
30     C ndiagnum ... Diagnostics Number (in available diag list) of diag to process
31     C ipointer ... Pointer to the slot in qdiag to fill
32     C kLev ..... Integer flag for vertical levels:
33     C > 0 (any integer): WHICH single level to increment in qdiag.
34     C 0,-1 to increment "nLevs" levels in qdiag,
35     C 0 : fill-in in the same order as the input array
36     C -1: fill-in in reverse order.
37     C nLevs ...... indicates Number of levels of the input field array
38     C (whether to fill-in all the levels (kLev<1) or just one (kLev>0))
39     C bibjflg .... Integer flag to indicate instructions for bi bj loop
40     C 0 indicates that the bi-bj loop must be done here
41     C 1 indicates that the bi-bj loop is done OUTSIDE
42     C 2 indicates that the bi-bj loop is done OUTSIDE
43     C AND that we have been sent a local array (with overlap regions)
44     C 3 indicates that the bi-bj loop is done OUTSIDE
45     C AND that we have been sent a local array
46     C AND that the array has no overlap region (interior only)
47     C NOTE - bibjflg can be NEGATIVE to indicate not to increment counter
48     C biArg ...... X-direction tile number - used for bibjflg=1-3
49     C bjArg ...... Y-direction tile number - used for bibjflg=1-3
50     C myThid :: my thread Id number
51     C***********************************************************************
52     C NOTE: User beware! If a local (1 tile only) array
53     C is sent here, bibjflg MUST NOT be set to 0
54     C or there will be out of bounds problems!
55     C***********************************************************************
56     _RL inpFld(*)
57     INTEGER ndiagnum, ipointer
58     INTEGER kLev, nLevs, bibjflg, biArg, bjArg
59     INTEGER myThid
60     CEOP
61    
62     C !LOCAL VARIABLES:
63     C ===============
64     INTEGER sizI1,sizI2,sizJ1,sizJ2
65     INTEGER sizTx,sizTy
66     INTEGER iRun, jRun, k, bi, bj
67     INTEGER kFirst, kLast
68     INTEGER kd, kd0, ksgn, kStore
69     CHARACTER*8 parms1
70     CHARACTER*(MAX_LEN_MBUF) msgBuf
71    
72     C If-sequence to see if we are a valid and an active diagnostic
73     c IF ( ndiagnum.NE.0 .AND. ipointer.NE.0 ) THEN
74    
75     C Increment the counter for the diagnostic (if we are at bi=bj=myThid=1)
76     _BEGIN_MASTER(myThid)
77     IF((biArg.EQ.1).AND.(bjArg.EQ.1).AND.(ABS(kLev).LE.1).and.
78     . (bibjflg.ge.0) ) ndiag(ndiagnum) = ndiag(ndiagnum) + 1
79     _END_MASTER(myThid)
80    
81     C- select range for 1rst & 2nd indices to accumulate
82     C depending on variable location on C-grid,
83     parms1 = gdiag(ndiagnum)(1:8)
84     IF ( parms1(2:2).EQ.'M' ) THEN
85     iRun = sNx
86     jRun = sNy
87     ELSEIF ( parms1(2:2).EQ.'U' ) THEN
88     iRun = sNx+1
89     jRun = sNy
90     ELSEIF ( parms1(2:2).EQ.'V' ) THEN
91     iRun = sNx
92     jRun = sNy+1
93     ELSEIF ( parms1(2:2).EQ.'Z' ) THEN
94     iRun = sNx+1
95     jRun = sNy+1
96     ELSE
97     iRun = sNx
98     jRun = sNy
99     ENDIF
100    
101     C- Dimension of the input array:
102     IF (abs(bibjflg).EQ.3) THEN
103     sizI1 = 1
104     sizI2 = sNx
105     sizJ1 = 1
106     sizJ2 = sNy
107     iRun = sNx
108     jRun = sNy
109     ELSE
110     sizI1 = 1-OLx
111     sizI2 = sNx+OLx
112     sizJ1 = 1-OLy
113     sizJ2 = sNy+OLy
114     ENDIF
115     IF (abs(bibjflg).GE.2) THEN
116     sizTx = 1
117     sizTy = 1
118     ELSE
119     sizTx = nSx
120     sizTy = nSy
121     ENDIF
122     C- Which part of inpFld to add : k = 3rd index,
123     C and do the loop >> do k=kFirst,kLast <<
124     IF (kLev.LE.0) THEN
125     kFirst = 1
126     kLast = nLevs
127     ELSEIF ( nLevs.EQ.1 ) THEN
128     kFirst = 1
129     kLast = 1
130     ELSEIF ( kLev.LE.nLevs ) THEN
131     kFirst = kLev
132     kLast = kLev
133     ELSE
134     STOP 'ABNORMAL END in DIAGNOSTICS_FILL_FIELD: kLev > nLevs >0'
135     ENDIF
136     C- Which part of qdiag to update: kd = 3rd index,
137     C and do the loop >> do k=kFirst,kLast ; kd = kd0 + k*ksgn <<
138     IF ( kLev.EQ.-1 ) THEN
139     ksgn = -1
140     kd0 = ipointer + nLevs
141     ELSEIF ( kLev.EQ.0 ) THEN
142     ksgn = 1
143     kd0 = ipointer - 1
144     ELSE
145     ksgn = 0
146     kd0 = ipointer + kLev - 1
147     ENDIF
148    
149     C- Check for consistency with Nb of levels reserved in storage array
150     kStore = kd0 + MAX(ksgn*kFirst,ksgn*kLast) - ipointer + 1
151     IF ( kStore.GT.kdiag(ndiagnum) ) THEN
152     _BEGIN_MASTER(myThid)
153     WRITE(msgBuf,'(2A,I3,A)') 'DIAGNOSTICS_FILL_FIELD: ',
154     & 'exceed Nb of levels(=',kdiag(ndiagnum),' ) reserved '
155     CALL PRINT_ERROR( msgBuf , myThid )
156     WRITE(msgBuf,'(2A,I4,2A)') 'DIAGNOSTICS_FILL_FIELD: ',
157     & 'for Diagnostics #', ndiagnum, ' : ', cdiag(ndiagnum)
158     CALL PRINT_ERROR( msgBuf , myThid )
159     WRITE(msgBuf,'(2A,2I4,I3)') 'calling DIAGNOSTICS_FILL_FIELD ',
160     I 'with kLev,nLevs,bibjFlg=', kLev,nLevs,bibjFlg
161     CALL PRINT_ERROR( msgBuf , myThid )
162     WRITE(msgBuf,'(2A,I6,A)') 'DIAGNOSTICS_FILL_FIELD: ',
163     I '==> trying to store up to ', kStore, ' levels'
164     CALL PRINT_ERROR( msgBuf , myThid )
165     STOP 'ABNORMAL END: S/R DIAGNOSTICS_FILL_FIELD'
166     _END_MASTER(myThid)
167     ENDIF
168    
169     IF ( bibjflg.EQ.0 ) THEN
170    
171     DO bj=myByLo(myThid), myByHi(myThid)
172     DO bi=myBxLo(myThid), myBxHi(myThid)
173     DO k = kFirst,kLast
174     kd = kd0 + ksgn*k
175     CALL DIAGNOSTICS_DO_FILL(
176     U qdiag(1-OLx,1-OLy,kd,bi,bj),
177     I inpFld,
178     I sizI1,sizI2,sizJ1,sizJ2,nLevs,sizTx,sizTy,
179     I iRun,jRun,k,bi,bj,
180     I myThid)
181     ENDDO
182     ENDDO
183     ENDDO
184     ELSE
185     bi = MIN(biArg,sizTx)
186     bj = MIN(bjArg,sizTy)
187     DO k = kFirst,kLast
188     kd = kd0 + ksgn*k
189     CALL DIAGNOSTICS_DO_FILL(
190     U qdiag(1-OLx,1-OLy,kd,biArg,bjArg),
191     I inpFld,
192     I sizI1,sizI2,sizJ1,sizJ2,nLevs,sizTx,sizTy,
193     I iRun,jRun,k,bi,bj,
194     I myThid)
195     ENDDO
196     ENDIF
197    
198     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
199     c ELSE
200     c IF (myThid.EQ.1) WRITE(6,1000) cdiag(ndiagnum)
201    
202     c ENDIF
203    
204     1000 format(' ',' Warning: Trying to write to diagnostic ',a8,
205     & ' But it is not a valid (or active) name ')
206     RETURN
207     END
208    
209     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
210    
211     CBOP
212     C !ROUTINE: DIAGNOSTICS_DO_FILL
213     C !INTERFACE:
214     SUBROUTINE DIAGNOSTICS_DO_FILL(
215     U cumFld,
216     I inpFld,
217     I sizI1,sizI2,sizJ1,sizJ2,sizK,sizTx,sizTy,
218     I iRun,jRun,k,bi,bj,
219     I myThid)
220    
221     C !DESCRIPTION:
222     C Update array cumFld
223     C by adding content of input field array inpFld
224     C over the range [1:iRun],[1:jRun]
225    
226     C !USES:
227     IMPLICIT NONE
228    
229     #include "EEPARAMS.h"
230     #include "SIZE.h"
231    
232     C !INPUT/OUTPUT PARAMETERS:
233     C == Routine Arguments ==
234     C cumFld :: cumulative array (updated)
235     C inpFld :: input field array to add to cumFld
236     C sizI1,sizI2 :: size of inpFld array: 1rst index range (min,max)
237     C sizJ1,sizJ2 :: size of inpFld array: 2nd index range (min,max)
238     C sizK :: size of inpFld array: 3rd dimension
239     C sizTx,sizTy :: size of inpFld array: tile dimensions
240     C iRun,jRun :: range of 1rst & 2nd index
241     C k,bi,bj :: level and tile indices of inFld array
242     C to add to cumFld array
243     C myThid :: my Thread Id number
244     _RL cumFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
245     INTEGER sizI1,sizI2,sizJ1,sizJ2
246     INTEGER sizK,sizTx,sizTy
247     _RL inpFld(sizI1:sizI2,sizJ1:sizJ2,sizK,sizTx,sizTy)
248     INTEGER iRun, jRun, k, bi, bj
249     INTEGER myThid
250     CEOP
251    
252     C !LOCAL VARIABLES:
253     C i,j :: loop indices
254     INTEGER i, j
255    
256     DO j = 1,jRun
257     DO i = 1,iRun
258     C- jmc: try with fixed ranges, that are known at compiling stage
259     C (might produce a better cash optimisation ?)
260     c DO j = 1,sNy
261     c DO i = 1,sNx
262     cumFld(i,j) = cumFld(i,j) + inpFld(i,j,k,bi,bj)
263     ENDDO
264     ENDDO
265    
266     RETURN
267     END

  ViewVC Help
Powered by ViewVC 1.1.22