File indexing completed on 2018-03-02 18:38:55 UTC
view on githubraw file Latest commit add29e06 on 2018-01-31 20:35:05 UTC
088ca933b6 Andr*0001 #include "DIAG_OPTIONS.h"
0002
0003
0004
0005
6ff64991c4 Jean*0006 SUBROUTINE DIAG_VEGTILE_FILL(
0007 & field,indx,chfr,ib,numpts,npeice,
0008 & check, chardiag, kLev, nLevs, bi, bj, myThid )
088ca933b6 Andr*0009
0010
0011
0012
0013
0014 IMPLICIT NONE
0015
0016
0017 #include "EEPARAMS.h"
0018 #include "SIZE.h"
0019 #include "DIAGNOSTICS_SIZE.h"
0020 #include "DIAGNOSTICS.h"
0021
0022
0023
6ff64991c4 Jean*0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
088ca933b6 Andr*0036
6ff64991c4 Jean*0037
0038
0039
0040
0041
0042
088ca933b6 Andr*0043
0044 CHARACTER*8 chardiag
0045 INTEGER kLev, nLevs, bi, bj
0046 INTEGER myThid
6ff64991c4 Jean*0047 INTEGER ib,numpts,npeice
0048 INTEGER indx(numpts)
088ca933b6 Andr*0049 _RL field(ib,nlevs), chfr(ib)
6ff64991c4 Jean*0050 LOGICAL check
088ca933b6 Andr*0051
0052
0053
0054
e129400813 Jean*0055 INTEGER m, n
088ca933b6 Andr*0056 INTEGER ndiagnum, ipointer
0057 INTEGER k, kFirst, kLast
0058 INTEGER kd, kd0, ksgn, kStore
0059 CHARACTER*(MAX_LEN_MBUF) msgBuf
6ff64991c4 Jean*0060 INTEGER offset, Lena
0061 INTEGER ivt, ij, i
f8e6aa21ed Jean*0062 _RL undef
ad4d037731 Jean*0063 INTEGER iSp, ndId, j,l
0064 INTEGER region2fill(0:nRegions)
0065 _RL scaleFact
0066 _RL gridField(sNx*sNy,nlevs), gridFrac(sNx*sNy)
0d603ffc5e Jean*0067 #ifndef REAL4_IS_SLOW
2d87091177 Jean*0068 _RS dummyRS(1)
0d603ffc5e Jean*0069 #endif
088ca933b6 Andr*0070
f8e6aa21ed Jean*0071 #ifdef ALLOW_FIZHI
0072 _RL getcon
0073 EXTERNAL getcon
0074 #endif
0075
088ca933b6 Andr*0076
0077
0078
f8e6aa21ed Jean*0079 undef = UNSET_RL
6ff64991c4 Jean*0080 #ifdef ALLOW_FIZHI
0081 IF ( check ) undef = getcon('UNDEF')
0082 #endif
088ca933b6 Andr*0083 ndiagnum = 0
0084 ipointer = 0
0085 DO n=1,nlists
0086 DO m=1,nActive(n)
3ae5f90260 Jean*0087 IF ( chardiag.EQ.flds(m,n) .AND. idiag(m,n).GT.0 ) THEN
b38beaf3c1 Jean*0088 ndiagnum = ABS(jdiag(m,n))
3ae5f90260 Jean*0089 ipointer = idiag(m,n)
0090 IF ( ndiagnum.NE.0 .AND. ndiag(ipointer,1,1).GE.0 ) THEN
0091
088ca933b6 Andr*0092
6ff64991c4 Jean*0093 IF ( (ABS(kLev).LE.1) .AND. (npeice.EQ.1) ) THEN
3ae5f90260 Jean*0094
6ff64991c4 Jean*0095 ndiag(ipointer,bi,bj) = ndiag(ipointer,bi,bj) + 1
0096 ENDIF
088ca933b6 Andr*0097
6ff64991c4 Jean*0098 offset = ib*(npeice-1)
0099 Lena = MIN(ib,numpts-offset)
088ca933b6 Andr*0100
0101
0102
6ff64991c4 Jean*0103 IF (kLev.LE.0) THEN
0104 kFirst = 1
0105 kLast = nLevs
0106 ELSEIF ( nLevs.EQ.1 ) THEN
0107 kFirst = 1
0108 kLast = 1
0109 ELSEIF ( kLev.LE.nLevs ) THEN
0110 kFirst = kLev
0111 kLast = kLev
0112 ELSE
0113 STOP 'ABNORMAL END: S/R DIAGNOSTICS_FILL kLev > nLevs > 0'
0114 ENDIF
e129400813 Jean*0115
088ca933b6 Andr*0116
6ff64991c4 Jean*0117 IF ( kLev.EQ.-1 ) THEN
0118 ksgn = -1
0119 kd0 = ipointer + nLevs
0120 ELSEIF ( kLev.EQ.0 ) THEN
0121 ksgn = 1
0122 kd0 = ipointer - 1
0123 ELSE
0124 ksgn = 0
0125 kd0 = ipointer + kLev - 1
0126 ENDIF
088ca933b6 Andr*0127
0128
6ff64991c4 Jean*0129 kStore = kd0 + MAX(ksgn*kFirst,ksgn*kLast) - ipointer + 1
0130 IF ( kStore.GT.kdiag(ndiagnum) ) THEN
0131 _BEGIN_MASTER(myThid)
0132 WRITE(msgBuf,'(2A,I4,A)') 'DIAGNOSTICS_FILL: ',
0133 & 'exceed Nb of levels(=',kdiag(ndiagnum),' ) reserved '
0134 CALL PRINT_ERROR( msgBuf , myThid )
0135 WRITE(msgBuf,'(2A,I6,2A)') 'DIAGNOSTICS_FILL: ',
0136 & 'for Diagnostics #', ndiagnum, ' : ', chardiag
0137 CALL PRINT_ERROR( msgBuf , myThid )
0138 WRITE(msgBuf,'(2A,2I4,I3)') 'calling DIAGNOSTICS_FILL ',
0139 & 'with kLev,nLevs=', kLev,nLevs
0140 CALL PRINT_ERROR( msgBuf , myThid )
0141 WRITE(msgBuf,'(2A,I6,A)') 'DIAGNOSTICS_FILL: ',
0142 & '==> trying to store up to ', kStore, ' levels'
0143 CALL PRINT_ERROR( msgBuf , myThid )
0144 STOP 'ABNORMAL END: S/R DIAGNOSTICS_FILL'
0145 _END_MASTER(myThid)
0146 ENDIF
088ca933b6 Andr*0147
6ff64991c4 Jean*0148 DO k = kFirst,kLast
0149 kd = kd0 + ksgn*k
0150 IF ( check ) THEN
0151 DO ivt = 1,Lena
0152 ij = indx(ivt+offset) - 1
0153 j = 1 + INT(ij/sNx)
0154 i = 1 + MOD(ij,sNx)
0155 IF ( field(ivt,k).EQ.undef ) THEN
0156 qdiag(i,j,kd,bi,bj) = undef
0157 ELSEIF ( qdiag(i,j,kd,bi,bj).NE.undef ) THEN
0158 qdiag(i,j,kd,bi,bj) = qdiag(i,j,kd,bi,bj)
0159 & + field(ivt,k)*chfr(ivt)
0160 ENDIF
0161 ENDDO
0162 ELSE
0163 DO ivt = 1,Lena
0164 ij = indx(ivt+offset) - 1
0165 j = 1 + INT(ij/sNx)
0166 i = 1 + MOD(ij,sNx)
0167 qdiag(i,j,kd,bi,bj) = qdiag(i,j,kd,bi,bj)
0168 & + field(ivt,k)*chfr(ivt)
0169 ENDDO
0170 ENDIF
0171 ENDDO
088ca933b6 Andr*0172
3ae5f90260 Jean*0173
0174 ENDIF
0175 ENDIF
0176 ENDDO
0177 ENDDO
088ca933b6 Andr*0178
ad4d037731 Jean*0179
0180
0181 scaleFact = 1. _d 0
0182
0183
0184
0185
0186 DO n=1,diagSt_nbLists
0187 DO m=1,diagSt_nbActv(n)
0188 IF ( chardiag.EQ.diagSt_Flds(m,n) .AND. iSdiag(m,n).GT.0 ) THEN
0189 iSp = iSdiag(m,n)
0190 IF ( qSdiag(0,0,iSp,bi,bj).GE.0. ) THEN
0191 ndId = jSdiag(m,n)
0192
0193 DO j=0,nRegions
0194 region2fill(j) = diagSt_region(j,n)
0195 ENDDO
0196
0197
0198 DO l=1,diagSt_nbLists
0199 DO k=1,diagSt_nbActv(l)
0200 IF ( iSdiag(k,l).EQ.-iSp ) THEN
0201 DO j=0,nRegions
0202 region2fill(j) = MAX(region2fill(j),diagSt_region(j,l))
0203 ENDDO
0204 ENDIF
0205 ENDDO
0206 ENDDO
0207
0208
0209
6ff64991c4 Jean*0210 IF (kLev.LE.0) THEN
0211 kFirst = 1
0212 kLast = nLevs
0213 ELSE
0214 kFirst = 1
0215 kLast = 1
0216 ENDIF
ad4d037731 Jean*0217
0218
6ff64991c4 Jean*0219 offset = ib*(npeice-1)
0220 Lena = MIN(ib,numpts-offset)
ad4d037731 Jean*0221
6ff64991c4 Jean*0222 DO ij = 1,sNx*sNy
0223 gridFrac(ij)= 0.
0224 ENDDO
0225 DO ivt = 1,Lena
0226 ij = indx(ivt+offset)
0227 gridFrac(ij)=gridFrac(ij)+chfr(ivt)
0228 ENDDO
ad4d037731 Jean*0229
6ff64991c4 Jean*0230 DO k = kFirst,kLast
0231 DO ij = 1,sNx*sNy
0232 gridField(ij,k)= 0.
0233 ENDDO
0234 IF ( check ) THEN
0235 DO ivt = 1,Lena
0236 ij = indx(ivt+offset)
0237 IF ( field(ivt,k).EQ.undef ) THEN
0238 gridField(ij,k) = undef
0239 ELSEIF ( gridFrac(ij).GT.0. _d 0 ) THEN
0240 gridField(ij,k) = gridField(ij,k)
0241 & + field(ivt,k)*chfr(ivt)/gridFrac(ij)
0242 ENDIF
0243 ENDDO
0244 ELSE
0245 DO ivt = 1,Lena
0246 ij = indx(ivt+offset)
0247 IF ( gridFrac(ij).GT.0. _d 0 ) THEN
0248 gridField(ij,k) = gridField(ij,k)
0249 & + field(ivt,k)*chfr(ivt)/gridFrac(ij)
0250 ENDIF
0251 ENDDO
0252 ENDIF
0253 ENDDO
ad4d037731 Jean*0254
0255
0256 CALL DIAGSTATS_FILL(
2d87091177 Jean*0257 I gridField, gridFrac,
0258 #ifndef REAL4_IS_SLOW
0259 I dummyRS, dummyRS,
0260 #endif
0261 I scaleFact, 1, 0, 1,
ad4d037731 Jean*0262 I ndId, iSp, region2fill, kLev, nLevs,
0263 I 3, bi, bj, myThid )
0264 ENDIF
0265 ENDIF
0266 ENDDO
0267 ENDDO
0268
e129400813 Jean*0269 RETURN
088ca933b6 Andr*0270 END