1 |
C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_fill_field.F,v 1.7 2010/04/03 17:34:39 jmc Exp $ |
2 |
C $Name: $ |
3 |
|
4 |
#include "DIAG_OPTIONS.h" |
5 |
|
6 |
C-- File diagnostics_fill_field.F: |
7 |
C-- Contents: |
8 |
C-- o DIAGNOSTICS_FILL_FIELD |
9 |
C-- o DIAGNOSTICS_HF_CUMUL |
10 |
C-- o DIAGNOSTICS_CUMULATE |
11 |
|
12 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
13 |
CBOP |
14 |
C !ROUTINE: DIAGNOSTICS_FILL_FIELD |
15 |
C !INTERFACE: |
16 |
SUBROUTINE DIAGNOSTICS_FILL_FIELD( |
17 |
I inpFldRL, fracFldRL, inpFldRS, fracFldRS, |
18 |
I scaleFact, power, arrType, nLevFrac, |
19 |
I ndId, ipointer, kLev, nLevs, |
20 |
I bibjFlg, biArg, bjArg, myThid ) |
21 |
|
22 |
C !DESCRIPTION: |
23 |
C*********************************************************************** |
24 |
C Increment the diagnostics array with a 2D/3D field |
25 |
C using a scaling factor & square option (power=2), |
26 |
C and with the option to use a fraction-weight (assumed |
27 |
C to be the counter-mate of the current diagnostics) |
28 |
C*********************************************************************** |
29 |
C !USES: |
30 |
IMPLICIT NONE |
31 |
|
32 |
C == Global variables === |
33 |
#include "EEPARAMS.h" |
34 |
#include "SIZE.h" |
35 |
#include "DIAGNOSTICS_SIZE.h" |
36 |
#include "DIAGNOSTICS.h" |
37 |
|
38 |
C !INPUT PARAMETERS: |
39 |
C*********************************************************************** |
40 |
C Arguments Description |
41 |
C ---------------------- |
42 |
C inpFldRL :: Field to increment diagnostics array (arrType=0,1) |
43 |
C fracFldRL :: fraction used for weighted average diagnostics (arrType=0,2) |
44 |
C inpFldRS :: Field to increment diagnostics array (arrType=2,3) |
45 |
C fracFldRS :: fraction used for weighted average diagnostics (arrType=1,3) |
46 |
C scaleFact :: scaling factor |
47 |
C power :: option to fill-in with the field square (power=2) |
48 |
C arrType :: select which array & fraction (RL/RS) to process: |
49 |
C 0: both RL ; 1: inpRL & fracRS ; 2: inpRS,fracRL ; 3: both RS |
50 |
C nLevFrac :: >0: number of levels of the fraction field ; =0: no fraction |
51 |
C :: used ; =-1: use thickness factor "hFac" |
52 |
C ndId :: Diagnostics Id number (in available diag list) of diag to process |
53 |
C ipointer :: Pointer to the slot in qdiag to fill |
54 |
C kLev :: Integer flag for vertical levels: |
55 |
C > 0 (any integer): WHICH single level to increment in qdiag. |
56 |
C 0,-1 to increment "nLevs" levels in qdiag, |
57 |
C 0 : fill-in in the same order as the input array |
58 |
C -1: fill-in in reverse order. |
59 |
C nLevs :: indicates Number of levels of the input field array |
60 |
C (whether to fill-in all the levels (kLev<1) or just one (kLev>0)) |
61 |
C bibjFlg :: Integer flag to indicate instructions for bi bj loop |
62 |
C 0 indicates that the bi-bj loop must be done here |
63 |
C 1 indicates that the bi-bj loop is done OUTSIDE |
64 |
C 2 indicates that the bi-bj loop is done OUTSIDE |
65 |
C AND that we have been sent a local array (with overlap regions) |
66 |
C 3 indicates that the bi-bj loop is done OUTSIDE |
67 |
C AND that we have been sent a local array |
68 |
C AND that the array has no overlap region (interior only) |
69 |
C NOTE - bibjFlg can be NEGATIVE to indicate not to increment counter |
70 |
C biArg :: X-direction tile number - used for bibjFlg=1-3 |
71 |
C bjArg :: Y-direction tile number - used for bibjFlg=1-3 |
72 |
C myThid :: my thread Id number |
73 |
C*********************************************************************** |
74 |
C NOTE: User beware! If a local (1 tile only) array |
75 |
C is sent here, bibjFlg MUST NOT be set to 0 |
76 |
C or there will be out of bounds problems! |
77 |
C*********************************************************************** |
78 |
_RL inpFldRL(*) |
79 |
_RL fracFldRL(*) |
80 |
_RS inpFldRS(*) |
81 |
_RS fracFldRS(*) |
82 |
_RL scaleFact |
83 |
INTEGER power |
84 |
INTEGER arrType |
85 |
INTEGER nLevFrac |
86 |
INTEGER ndId, ipointer |
87 |
INTEGER kLev, nLevs, bibjFlg, biArg, bjArg |
88 |
INTEGER myThid |
89 |
CEOP |
90 |
|
91 |
C !LOCAL VARIABLES: |
92 |
C =============== |
93 |
C useFract :: flag to increment (or not) with fraction-weighted inpFld |
94 |
C thickFac :: if > 0, to increment with thickness-weighted inpFld |
95 |
LOGICAL useFract |
96 |
INTEGER sizF, thickFac |
97 |
INTEGER sizI1,sizI2,sizJ1,sizJ2 |
98 |
INTEGER sizTx,sizTy |
99 |
INTEGER iRun, jRun, k, bi, bj |
100 |
INTEGER kFirst, kLast |
101 |
INTEGER kd, kd0, ksgn, km, kStore |
102 |
CHARACTER*8 parms1 |
103 |
CHARACTER*(MAX_LEN_MBUF) msgBuf |
104 |
|
105 |
C If-sequence to see if we are a valid and an active diagnostic |
106 |
c IF ( ndId.NE.0 .AND. ipointer.NE.0 ) THEN |
107 |
|
108 |
IF ( bibjFlg.GE.0 .AND. ABS(kLev).LE.1 ) THEN |
109 |
C Increment the counter for the diagnostic |
110 |
IF ( bibjFlg.EQ.0 ) THEN |
111 |
DO bj=myByLo(myThid), myByHi(myThid) |
112 |
DO bi=myBxLo(myThid), myBxHi(myThid) |
113 |
ndiag(ipointer,bi,bj) = ndiag(ipointer,bi,bj) + 1 |
114 |
ENDDO |
115 |
ENDDO |
116 |
ELSE |
117 |
bi = MIN(biArg,nSx) |
118 |
bj = MIN(bjArg,nSy) |
119 |
ndiag(ipointer,bi,bj) = ndiag(ipointer,bi,bj) + 1 |
120 |
ENDIF |
121 |
ENDIF |
122 |
|
123 |
C- select range for 1rst & 2nd indices to accumulate |
124 |
C depending on variable location on C-grid, |
125 |
thickFac = 0 |
126 |
parms1 = gdiag(ndId)(1:8) |
127 |
IF ( parms1(2:2).EQ.'M' ) THEN |
128 |
iRun = sNx |
129 |
jRun = sNy |
130 |
thickFac = 1 |
131 |
ELSEIF ( parms1(2:2).EQ.'U' ) THEN |
132 |
iRun = sNx+1 |
133 |
jRun = sNy |
134 |
thickFac = 2 |
135 |
ELSEIF ( parms1(2:2).EQ.'V' ) THEN |
136 |
iRun = sNx |
137 |
jRun = sNy+1 |
138 |
thickFac = 3 |
139 |
ELSEIF ( parms1(2:2).EQ.'Z' ) THEN |
140 |
iRun = sNx+1 |
141 |
jRun = sNy+1 |
142 |
ELSE |
143 |
iRun = sNx |
144 |
jRun = sNy |
145 |
ENDIF |
146 |
|
147 |
C- Dimension of the input array: |
148 |
IF (ABS(bibjFlg).EQ.3) THEN |
149 |
sizI1 = 1 |
150 |
sizI2 = sNx |
151 |
sizJ1 = 1 |
152 |
sizJ2 = sNy |
153 |
iRun = sNx |
154 |
jRun = sNy |
155 |
ELSE |
156 |
sizI1 = 1-OLx |
157 |
sizI2 = sNx+OLx |
158 |
sizJ1 = 1-OLy |
159 |
sizJ2 = sNy+OLy |
160 |
ENDIF |
161 |
IF (ABS(bibjFlg).GE.2) THEN |
162 |
sizTx = 1 |
163 |
sizTy = 1 |
164 |
ELSE |
165 |
sizTx = nSx |
166 |
sizTy = nSy |
167 |
ENDIF |
168 |
C- Which part of inpFld to add : k = 3rd index, |
169 |
C and do the loop >> do k=kFirst,kLast << |
170 |
IF (kLev.LE.0) THEN |
171 |
kFirst = 1 |
172 |
kLast = nLevs |
173 |
ELSEIF ( nLevs.EQ.1 ) THEN |
174 |
kFirst = 1 |
175 |
kLast = 1 |
176 |
ELSEIF ( kLev.LE.nLevs ) THEN |
177 |
kFirst = kLev |
178 |
kLast = kLev |
179 |
ELSE |
180 |
STOP 'ABNORMAL END in DIAGNOSTICS_FILL_FIELD: kLev > nLevs >0' |
181 |
ENDIF |
182 |
C- Which part of qdiag to update: kd = 3rd index, |
183 |
C and do the loop >> do k=kFirst,kLast ; kd = kd0 + k*ksgn << |
184 |
IF ( kLev.EQ.-1 ) THEN |
185 |
ksgn = -1 |
186 |
kd0 = ipointer + nLevs |
187 |
ELSEIF ( kLev.EQ.0 ) THEN |
188 |
ksgn = 1 |
189 |
kd0 = ipointer - 1 |
190 |
ELSE |
191 |
ksgn = 0 |
192 |
kd0 = ipointer + kLev - 1 |
193 |
ENDIF |
194 |
C- Set thickness and fraction-weight option : |
195 |
IF ( nLevFrac.GE.0 ) thickFac = 0 |
196 |
useFract = nLevFrac.GT.0 |
197 |
IF ( useFract ) THEN |
198 |
sizF = nLevFrac |
199 |
ELSE |
200 |
sizF = 1 |
201 |
ENDIF |
202 |
|
203 |
C- Check for consistency with Nb of levels reserved in storage array |
204 |
kStore = kd0 + MAX(ksgn*kFirst,ksgn*kLast) - ipointer + 1 |
205 |
IF ( kStore.GT.kdiag(ndId) ) THEN |
206 |
_BEGIN_MASTER(myThid) |
207 |
WRITE(msgBuf,'(2A,I4,A)') 'DIAGNOSTICS_FILL_FIELD: ', |
208 |
& 'exceed Nb of levels(=',kdiag(ndId),' ) reserved ' |
209 |
CALL PRINT_ERROR( msgBuf , myThid ) |
210 |
WRITE(msgBuf,'(2A,I6,2A)') 'DIAGNOSTICS_FILL_FIELD: ', |
211 |
& 'for Diagnostics #', ndId, ' : ', cdiag(ndId) |
212 |
CALL PRINT_ERROR( msgBuf , myThid ) |
213 |
WRITE(msgBuf,'(2A,2I4,I3)') 'calling DIAGNOSTICS_FILL_FIELD ', |
214 |
I 'with kLev,nLevs,bibjFlg=', kLev,nLevs,bibjFlg |
215 |
CALL PRINT_ERROR( msgBuf , myThid ) |
216 |
WRITE(msgBuf,'(2A,I6,A)') 'DIAGNOSTICS_FILL_FIELD: ', |
217 |
I '==> trying to store up to ', kStore, ' levels' |
218 |
CALL PRINT_ERROR( msgBuf , myThid ) |
219 |
STOP 'ABNORMAL END: S/R DIAGNOSTICS_FILL_FIELD' |
220 |
_END_MASTER(myThid) |
221 |
ENDIF |
222 |
|
223 |
IF ( bibjFlg.EQ.0 ) THEN |
224 |
|
225 |
DO bj=myByLo(myThid), myByHi(myThid) |
226 |
DO bi=myBxLo(myThid), myBxHi(myThid) |
227 |
DO k = kFirst,kLast |
228 |
kd = kd0 + ksgn*k |
229 |
IF ( thickFac.EQ.0 ) THEN |
230 |
CALL DIAGNOSTICS_CUMULATE( |
231 |
U qdiag(1-OLx,1-OLy,kd,bi,bj), |
232 |
I inpFldRL, fracFldRL, inpFldRS, fracFldRS, |
233 |
I scaleFact, power, arrType, useFract, sizF, |
234 |
I sizI1,sizI2,sizJ1,sizJ2,nLevs,sizTx,sizTy, |
235 |
I iRun, jRun, k, bi, bj, |
236 |
I myThid ) |
237 |
ELSE |
238 |
km = kd - ipointer + 1 |
239 |
CALL DIAGNOSTICS_HF_CUMUL( |
240 |
U qdiag(1-OLx,1-OLy,kd,bi,bj), |
241 |
I inpFldRL, inpFldRS, |
242 |
I scaleFact, power, arrType, thickFac, |
243 |
I sizI1,sizI2,sizJ1,sizJ2,nLevs,sizTx,sizTy, |
244 |
I iRun, jRun, k, km, |
245 |
I bi, bj, myThid ) |
246 |
ENDIF |
247 |
ENDDO |
248 |
ENDDO |
249 |
ENDDO |
250 |
ELSE |
251 |
bi = MIN(biArg,sizTx) |
252 |
bj = MIN(bjArg,sizTy) |
253 |
DO k = kFirst,kLast |
254 |
kd = kd0 + ksgn*k |
255 |
IF ( thickFac.EQ.0 ) THEN |
256 |
CALL DIAGNOSTICS_CUMULATE( |
257 |
U qdiag(1-OLx,1-OLy,kd,biArg,bjArg), |
258 |
I inpFldRL, fracFldRL, inpFldRS, fracFldRS, |
259 |
I scaleFact, power, arrType, useFract, sizF, |
260 |
I sizI1,sizI2,sizJ1,sizJ2,nLevs,sizTx,sizTy, |
261 |
I iRun, jRun, k, bi, bj, |
262 |
I myThid ) |
263 |
ELSE |
264 |
km = kd - ipointer + 1 |
265 |
CALL DIAGNOSTICS_HF_CUMUL( |
266 |
U qdiag(1-OLx,1-OLy,kd,biArg,bjArg), |
267 |
I inpFldRL, inpFldRS, |
268 |
I scaleFact, power, arrType, thickFac, |
269 |
I sizI1,sizI2,sizJ1,sizJ2,nLevs,sizTx,sizTy, |
270 |
I iRun, jRun, k, km, |
271 |
I biArg, bjArg, myThid ) |
272 |
ENDIF |
273 |
ENDDO |
274 |
ENDIF |
275 |
|
276 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
277 |
c ELSE |
278 |
c IF (myThid.EQ.1) WRITE(6,1000) cdiag(ndId) |
279 |
|
280 |
c ENDIF |
281 |
|
282 |
c1000 format(' ',' Warning: Trying to write to diagnostic ',a8, |
283 |
c & ' But it is not a valid (or active) name ') |
284 |
RETURN |
285 |
END |
286 |
|
287 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
288 |
|
289 |
CBOP |
290 |
C !ROUTINE: DIAGNOSTICS_HF_CUMUL |
291 |
C !INTERFACE: |
292 |
SUBROUTINE DIAGNOSTICS_HF_CUMUL( |
293 |
U cumFld, |
294 |
I inpFldRL, inpFldRS, |
295 |
I scaleFact, power, arrType, thickFac, |
296 |
I sizI1,sizI2,sizJ1,sizJ2,sizK,sizTx,sizTy, |
297 |
I iRun, jRun, k, km, |
298 |
I bi, bj, myThid ) |
299 |
|
300 |
C !DESCRIPTION: |
301 |
C Update array cumFld |
302 |
C by adding content of input field array inpFld |
303 |
C weighted by thickness factor "hFac" |
304 |
C over the range [1:iRun],[1:jRun] |
305 |
|
306 |
C !USES: |
307 |
IMPLICIT NONE |
308 |
|
309 |
#include "EEPARAMS.h" |
310 |
#include "SIZE.h" |
311 |
#include "GRID.h" |
312 |
|
313 |
C !INPUT/OUTPUT PARAMETERS: |
314 |
C == Routine Arguments == |
315 |
C cumFld :: cumulative array (updated) |
316 |
C inpFldRL :: input field array to add to cumFld (arrType=0,1) |
317 |
C inpFldRS :: input field array to add to cumFld (arrType=2,3) |
318 |
C scaleFact :: scaling factor |
319 |
C power :: option to fill-in with the field square (power=2) |
320 |
C arrType :: select which array & fraction (RL/RS) to process: |
321 |
C 0: both RL ; 1: inpRL & fracRS ; 2: inpRS,fracRL ; 3: both RS |
322 |
C thickFac :: which hFac array to use: 1,2,3 = hFacC,W,S |
323 |
C sizI1,sizI2 :: size of inpFld array: 1rst index range (min,max) |
324 |
C sizJ1,sizJ2 :: size of inpFld array: 2nd index range (min,max) |
325 |
C sizK :: size of inpFld array: 3rd dimension |
326 |
C sizTx,sizTy :: size of inpFld array: tile dimensions |
327 |
C iRun,jRun :: range of 1rst & 2nd index |
328 |
C k :: level of inpFld array to add to cumFld array |
329 |
C km :: level of hFac array to use as weight for inpFld |
330 |
C bi, bj :: indices of tile to process (cumulate in qdiag) |
331 |
C myThid :: my Thread Id number |
332 |
_RL cumFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
333 |
INTEGER sizI1,sizI2,sizJ1,sizJ2 |
334 |
INTEGER sizK,sizTx,sizTy |
335 |
_RL inpFldRL(sizI1:sizI2,sizJ1:sizJ2,sizK,sizTx,sizTy) |
336 |
_RS inpFldRS(sizI1:sizI2,sizJ1:sizJ2,sizK,sizTx,sizTy) |
337 |
_RL scaleFact |
338 |
INTEGER power |
339 |
INTEGER arrType, thickFac |
340 |
INTEGER iRun, jRun, k, km, bi, bj |
341 |
INTEGER myThid |
342 |
CEOP |
343 |
|
344 |
C !LOCAL VARIABLES: |
345 |
C i, j :: loop indices |
346 |
C ti, tj :: tile indices of inpFld to process |
347 |
INTEGER i, j |
348 |
INTEGER ti, tj |
349 |
_RL tmpFld(sNx+1,sNy+1) |
350 |
|
351 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
352 |
|
353 |
ti = MIN(bi,sizTx) |
354 |
tj = MIN(bj,sizTy) |
355 |
IF ( arrType.EQ.0 .OR. arrType.EQ.1 ) THEN |
356 |
DO j = 1,jRun |
357 |
DO i = 1,iRun |
358 |
tmpFld(i,j) = scaleFact*inpFldRL(i,j,k,ti,tj) |
359 |
ENDDO |
360 |
ENDDO |
361 |
ELSEIF ( arrType.EQ.2 .OR. arrType.EQ.3 ) THEN |
362 |
DO j = 1,jRun |
363 |
DO i = 1,iRun |
364 |
tmpFld(i,j) = scaleFact*inpFldRS(i,j,k,ti,tj) |
365 |
ENDDO |
366 |
ENDDO |
367 |
ELSE |
368 |
STOP 'DIAGNOSTICS_HF_CUMUL: invalid arrType' |
369 |
ENDIF |
370 |
|
371 |
IF ( power.EQ.2 ) THEN |
372 |
DO j = 1,jRun |
373 |
DO i = 1,iRun |
374 |
tmpFld(i,j) = tmpFld(i,j)*tmpFld(i,j) |
375 |
ENDDO |
376 |
ENDDO |
377 |
ENDIF |
378 |
|
379 |
IF ( thickFac.EQ.1 ) THEN |
380 |
DO j = 1,jRun |
381 |
DO i = 1,iRun |
382 |
cumFld(i,j) = cumFld(i,j) |
383 |
& + tmpFld(i,j)*hFacC(i,j,km,bi,bj) |
384 |
ENDDO |
385 |
ENDDO |
386 |
ELSEIF ( thickFac.EQ.2 ) THEN |
387 |
DO j = 1,jRun |
388 |
DO i = 1,iRun |
389 |
cumFld(i,j) = cumFld(i,j) |
390 |
& + tmpFld(i,j)*hFacW(i,j,km,bi,bj) |
391 |
ENDDO |
392 |
ENDDO |
393 |
ELSEIF ( thickFac.EQ.3 ) THEN |
394 |
DO j = 1,jRun |
395 |
DO i = 1,iRun |
396 |
cumFld(i,j) = cumFld(i,j) |
397 |
& + tmpFld(i,j)*hFacS(i,j,km,bi,bj) |
398 |
ENDDO |
399 |
ENDDO |
400 |
ELSE |
401 |
DO j = 1,jRun |
402 |
DO i = 1,iRun |
403 |
cumFld(i,j) = cumFld(i,j) + tmpFld(i,j) |
404 |
ENDDO |
405 |
ENDDO |
406 |
ENDIF |
407 |
|
408 |
RETURN |
409 |
END |
410 |
|
411 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
412 |
|
413 |
CBOP |
414 |
C !ROUTINE: DIAGNOSTICS_CUMULATE |
415 |
C !INTERFACE: |
416 |
SUBROUTINE DIAGNOSTICS_CUMULATE( |
417 |
U cumFld, |
418 |
I inpFldRL, frcFldRL, inpFldRS, frcFldRS, |
419 |
I scaleFact, power, arrType, useFract, sizF, |
420 |
I sizI1,sizI2,sizJ1,sizJ2,sizK,sizTx,sizTy, |
421 |
I iRun, jRun, k, bi, bj, |
422 |
I myThid ) |
423 |
|
424 |
C !DESCRIPTION: |
425 |
C Update array cumFld |
426 |
C by adding content of input field array inpFld |
427 |
C over the range [1:iRun],[1:jRun] |
428 |
|
429 |
C !USES: |
430 |
IMPLICIT NONE |
431 |
|
432 |
#include "EEPARAMS.h" |
433 |
#include "SIZE.h" |
434 |
|
435 |
C !INPUT/OUTPUT PARAMETERS: |
436 |
C == Routine Arguments == |
437 |
C cumFld :: cumulative array (updated) |
438 |
C inpFldRL :: input field array to add to cumFld (arrType=0,1) |
439 |
C frcFldRL :: fraction used for weighted-average diagnostics (arrType=0,2) |
440 |
C inpFldRS :: input field array to add to cumFld (arrType=2,3) |
441 |
C frcFldRS :: fraction used for weighted-average diagnostics (arrType=1,3) |
442 |
C scaleFact :: scaling factor |
443 |
C power :: option to fill-in with the field square (power=2) |
444 |
C arrType :: select which array & fraction (RL/RS) to process: |
445 |
C 0: both RL ; 1: inpRL & fracRS ; 2: inpRS,fracRL ; 3: both RS |
446 |
C useFract :: if True, use fraction-weight |
447 |
C sizF :: size of frcFld array: 3rd dimension |
448 |
C sizI1,sizI2 :: size of inpFld array: 1rst index range (min,max) |
449 |
C sizJ1,sizJ2 :: size of inpFld array: 2nd index range (min,max) |
450 |
C sizK :: size of inpFld array: 3rd dimension |
451 |
C sizTx,sizTy :: size of inpFld array: tile dimensions |
452 |
C iRun,jRun :: range of 1rst & 2nd index |
453 |
C k,bi,bj :: level and tile indices of inpFld array to add to cumFld array |
454 |
C myThid :: my Thread Id number |
455 |
_RL cumFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
456 |
INTEGER sizI1,sizI2,sizJ1,sizJ2 |
457 |
INTEGER sizF,sizK,sizTx,sizTy |
458 |
_RL inpFldRL(sizI1:sizI2,sizJ1:sizJ2,sizK,sizTx,sizTy) |
459 |
_RL frcFldRL(sizI1:sizI2,sizJ1:sizJ2,sizF,sizTx,sizTy) |
460 |
_RS inpFldRS(sizI1:sizI2,sizJ1:sizJ2,sizK,sizTx,sizTy) |
461 |
_RS frcFldRS(sizI1:sizI2,sizJ1:sizJ2,sizF,sizTx,sizTy) |
462 |
_RL scaleFact |
463 |
INTEGER power |
464 |
INTEGER arrType |
465 |
LOGICAL useFract |
466 |
INTEGER iRun, jRun, k, bi, bj |
467 |
INTEGER myThid |
468 |
CEOP |
469 |
|
470 |
C !LOCAL VARIABLES: |
471 |
C i,j :: loop indices |
472 |
INTEGER i, j, l |
473 |
_RL tmpFact |
474 |
|
475 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
476 |
|
477 |
tmpFact = scaleFact |
478 |
IF ( power.EQ.2 ) tmpFact = scaleFact*scaleFact |
479 |
|
480 |
IF ( useFract .AND. power.EQ.2 ) THEN |
481 |
l = MIN(k,sizF) |
482 |
|
483 |
IF ( arrType.EQ.0 ) THEN |
484 |
DO j = 1,jRun |
485 |
DO i = 1,iRun |
486 |
cumFld(i,j) = cumFld(i,j) |
487 |
& + tmpFact*inpFldRL(i,j,k,bi,bj) |
488 |
& *inpFldRL(i,j,k,bi,bj) |
489 |
& *frcFldRL(i,j,l,bi,bj) |
490 |
ENDDO |
491 |
ENDDO |
492 |
ELSEIF ( arrType.EQ.1 ) THEN |
493 |
DO j = 1,jRun |
494 |
DO i = 1,iRun |
495 |
cumFld(i,j) = cumFld(i,j) |
496 |
& + tmpFact*inpFldRL(i,j,k,bi,bj) |
497 |
& *inpFldRL(i,j,k,bi,bj) |
498 |
& *frcFldRS(i,j,l,bi,bj) |
499 |
ENDDO |
500 |
ENDDO |
501 |
ELSEIF ( arrType.EQ.2 ) THEN |
502 |
DO j = 1,jRun |
503 |
DO i = 1,iRun |
504 |
cumFld(i,j) = cumFld(i,j) |
505 |
& + tmpFact*inpFldRS(i,j,k,bi,bj) |
506 |
& *inpFldRS(i,j,k,bi,bj) |
507 |
& *frcFldRL(i,j,l,bi,bj) |
508 |
ENDDO |
509 |
ENDDO |
510 |
ELSEIF ( arrType.EQ.3 ) THEN |
511 |
DO j = 1,jRun |
512 |
DO i = 1,iRun |
513 |
cumFld(i,j) = cumFld(i,j) |
514 |
& + tmpFact*inpFldRS(i,j,k,bi,bj) |
515 |
& *inpFldRS(i,j,k,bi,bj) |
516 |
& *frcFldRS(i,j,l,bi,bj) |
517 |
ENDDO |
518 |
ENDDO |
519 |
ELSE |
520 |
STOP 'DIAGNOSTICS_CUMULATE: invalid arrType' |
521 |
ENDIF |
522 |
|
523 |
ELSEIF ( useFract ) THEN |
524 |
l = MIN(k,sizF) |
525 |
|
526 |
IF ( arrType.EQ.0 ) THEN |
527 |
DO j = 1,jRun |
528 |
DO i = 1,iRun |
529 |
cumFld(i,j) = cumFld(i,j) |
530 |
& + tmpFact*inpFldRL(i,j,k,bi,bj) |
531 |
& *frcFldRL(i,j,l,bi,bj) |
532 |
ENDDO |
533 |
ENDDO |
534 |
ELSEIF ( arrType.EQ.1 ) THEN |
535 |
DO j = 1,jRun |
536 |
DO i = 1,iRun |
537 |
cumFld(i,j) = cumFld(i,j) |
538 |
& + tmpFact*inpFldRL(i,j,k,bi,bj) |
539 |
& *frcFldRS(i,j,l,bi,bj) |
540 |
ENDDO |
541 |
ENDDO |
542 |
ELSEIF ( arrType.EQ.2 ) THEN |
543 |
DO j = 1,jRun |
544 |
DO i = 1,iRun |
545 |
cumFld(i,j) = cumFld(i,j) |
546 |
& + tmpFact*inpFldRS(i,j,k,bi,bj) |
547 |
& *frcFldRL(i,j,l,bi,bj) |
548 |
ENDDO |
549 |
ENDDO |
550 |
ELSEIF ( arrType.EQ.3 ) THEN |
551 |
DO j = 1,jRun |
552 |
DO i = 1,iRun |
553 |
cumFld(i,j) = cumFld(i,j) |
554 |
& + tmpFact*inpFldRS(i,j,k,bi,bj) |
555 |
& *frcFldRS(i,j,l,bi,bj) |
556 |
ENDDO |
557 |
ENDDO |
558 |
ELSE |
559 |
STOP 'DIAGNOSTICS_CUMULATE: invalid arrType' |
560 |
ENDIF |
561 |
|
562 |
ELSEIF ( power.EQ.2 ) THEN |
563 |
|
564 |
IF ( arrType.EQ.0 .OR. arrType.EQ.1 ) THEN |
565 |
DO j = 1,jRun |
566 |
DO i = 1,iRun |
567 |
cumFld(i,j) = cumFld(i,j) |
568 |
& + tmpFact*inpFldRL(i,j,k,bi,bj) |
569 |
& *inpFldRL(i,j,k,bi,bj) |
570 |
ENDDO |
571 |
ENDDO |
572 |
ELSEIF ( arrType.EQ.2 .OR. arrType.EQ.3 ) THEN |
573 |
DO j = 1,jRun |
574 |
DO i = 1,iRun |
575 |
cumFld(i,j) = cumFld(i,j) |
576 |
& + tmpFact*inpFldRS(i,j,k,bi,bj) |
577 |
& *inpFldRS(i,j,k,bi,bj) |
578 |
ENDDO |
579 |
ENDDO |
580 |
ELSE |
581 |
STOP 'DIAGNOSTICS_CUMULATE: invalid arrType' |
582 |
ENDIF |
583 |
|
584 |
ELSE |
585 |
|
586 |
IF ( arrType.EQ.0 .OR. arrType.EQ.1 ) THEN |
587 |
DO j = 1,jRun |
588 |
DO i = 1,iRun |
589 |
C- jmc: try with fixed ranges, that are known at compiling stage |
590 |
C (might produce a better cash optimisation ?) |
591 |
c DO j = 1,sNy |
592 |
c DO i = 1,sNx |
593 |
cumFld(i,j) = cumFld(i,j) |
594 |
& + tmpFact*inpFldRL(i,j,k,bi,bj) |
595 |
ENDDO |
596 |
ENDDO |
597 |
ELSEIF ( arrType.EQ.2 .OR. arrType.EQ.3 ) THEN |
598 |
DO j = 1,jRun |
599 |
DO i = 1,iRun |
600 |
cumFld(i,j) = cumFld(i,j) |
601 |
& + tmpFact*inpFldRS(i,j,k,bi,bj) |
602 |
ENDDO |
603 |
ENDDO |
604 |
ELSE |
605 |
STOP 'DIAGNOSTICS_CUMULATE: invalid arrType' |
606 |
ENDIF |
607 |
|
608 |
ENDIF |
609 |
|
610 |
RETURN |
611 |
END |