*IF DEF,C92_1A BOXSUM1.2 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.15320 C GTS2F400.15321 C Use, duplication or disclosure of this code is subject to the GTS2F400.15322 C restrictions as set forth in the contract. GTS2F400.15323 C GTS2F400.15324 C Meteorological Office GTS2F400.15325 C London Road GTS2F400.15326 C BRACKNELL GTS2F400.15327 C Berkshire UK GTS2F400.15328 C RG12 2SZ GTS2F400.15329 C GTS2F400.15330 C If no contract has been raised with this copy of the code, the use, GTS2F400.15331 C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.15332 C to do so must first be obtained in writing from the Head of Numerical GTS2F400.15333 C Modelling at the above address. GTS2F400.15334 C ******************************COPYRIGHT****************************** GTS2F400.15335 C GTS2F400.15336 CLL SUBROUTINE BOX_SUM BOXSUM1.3 CLL BOXSUM1.4 CLL NOT SUITABLE FOR SINGLE COLUMN USE BOXSUM1.5 CLL BOXSUM1.6 CLL BOXSUM1.7 CLL SUITABLE FOR ROTATED GRIDS BOXSUM1.8 CLL BOXSUM1.9 CLL ORIGINAL VERSION FOR CRAY Y-MP/IBM BOXSUM1.10 CLL WRITTEN 12/07/91 BY C. WILSON BOXSUM1.11 CLL BOXSUM1.12 CLL CODE REVIEWED BY R.SMITH ??/??/?? BOXSUM1.13 CLL BOXSUM1.14 CLL VERSION NO. 2 DATED 16/09/91 BOXSUM1.15 CLL COSMOS DSN MS15.CWUM.JOBS(BOXSUM2) BOXSUM1.16 CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, BOXSUM1.17 CLL VERSION 1, DATED 12/09/89 BOXSUM1.18 ! History: UDG2F401.131 ! Version Date Comment UDG2F401.132 ! ------- ---- ------- UDG2F401.133 ! 4.0 12/04/95 Imported into Unified model. D.M. Goddard UDG2F401.134 ! 4.1 12/06/96 Corrections for zonal means. D.M. Goddard UDG2F401.135 ! 4.4 30/09/97 Corrections for portable model. D.M. Goddard UDG0F404.136 CLL BOXSUM1.19 CLL SYSTEM TASK: S1 (part,extension for area mean interpolation) BOXSUM1.20 CLL BOXSUM1.21 CLL PURPOSE: BOXSUM1.22 CLL Routine sums contributions from gridboxes for source data on a BOXSUM1.23 CLL regular lat-long grid to form means for gridboxes of a regular BOXSUM1.24 CLL lat-long grid specified as target. BOXSUM1.25 CLL Both grids are defined with the same pole and orientation; BOXSUM1.26 CLL the original data must be interpolated onto a rotated BOXSUM1.27 CLL grid ,if the target grid is a rotated grid, BEFORE calling this BOXSUM1.28 CLL routine. BOXSUM1.29 CLL The algorithms are general and will cope with either a finer BOXSUM1.30 CLL or coarser resolution source grid. BOXSUM1.31 CLL BOXSUM1.32 CLL DOCUMENTATION: UNIFIED MODEL DOCUMENTATION S1 BOXSUM1.33 CLL BY A.DICKINSON/C WILSON VERSION ??DATED ??/??/91 BOXSUM1.34 CLL BOXSUM1.35 CLL BOXSUM1.36 CLLEND------------------------------------------------------------- BOXSUM1.37 C BOXSUM1.38 C*L ARGUMENTS:--------------------------------------------------- BOXSUM1.39SUBROUTINE BOX_SUM 1BOXSUM1.40 1 (SOURCE_ROW_LENGTH,SOURCE_ROWS,ROW_LENGTH,ROWS, BOXSUM1.41 2 LONG_L,COLAT_T,I_L,J_T,GLOBAL,BOXSUM,SOURCE) BOXSUM1.42 BOXSUM1.43 IMPLICIT NONE BOXSUM1.44 BOXSUM1.45 INTEGER BOXSUM1.46 * SOURCE_ROW_LENGTH !IN Number of points per row (source data) BOXSUM1.47 * ! on rotated grid if necessary BOXSUM1.48 *, SOURCE_ROWS !IN Number of rows of source data BOXSUM1.49 * ! on rotated grid if necessary BOXSUM1.50 *, ROW_LENGTH !IN Number of points per row target area BOXSUM1.51 *, ROWS !IN Number of rows of target area BOXSUM1.52 C BOXSUM1.53 INTEGER BOXSUM1.54 1 I_L(ROW_LENGTH+1)!IN Index of first source gridbox to overlap BOXSUM1.55 * ! with left hand side of target gridbox BOXSUM1.56 2,J_T(ROWS+1) !IN Index of first source gridbox to overlap BOXSUM1.57 * ! top of target gridbox BOXSUM1.58 C BOXSUM1.59 CL N.B.I_L(I) is the first source gridbox to overlap LH side of target BOXSUM1.60 CL box I of a row BOXSUM1.61 CL I_L(I+1) is the last source gridbox to overlap RH side of target BOXSUM1.62 CL box I of a row BOXSUM1.63 CL J_T(J) is the first source gridbox to overlap top of target BOXSUM1.64 CL box on row J BOXSUM1.65 CL J_T(J+1) is the last source gridbox to overlap bottom of target BOXSUM1.66 CL box on row J BOXSUM1.67 CL BOXSUM1.68 CL REAL value of:- BOXSUM1.69 CL I_L(I) is also used to measure the 'longitude' of the RHS of the BOXSUM1.70 CL source gridbox BOXSUM1.71 CL J_T(J) is also used to measure the 'colatitude' of the bottom BOXSUM1.72 CL of the source gridbox BOXSUM1.73 C BOXSUM1.74 BOXSUM1.75 REAL BOXSUM1.76 1 SOURCE(SOURCE_ROW_LENGTH,SOURCE_ROWS)!IN source data BOXSUM1.77 REAL BOXSUM(ROW_LENGTH,ROWS) !OUT Sum of data on target grid BOXSUM1.78 2, LONG_L(ROW_LENGTH +1) !IN Left longitude of gridbox (in BOXSUM1.79 + ! units of souce gridbox EW length) BOXSUM1.80 3, COLAT_T(ROWS +1) !IN Colatitude of top of gridbox (in BOXSUM1.81 + ! units of source gridbox NS length) BOXSUM1.82 BOXSUM1.83 LOGICAL GLOBAL !IN true if global area required BOXSUM1.84 C*--------------------------------------------------------------------- BOXSUM1.85 BOXSUM1.86 C*L WORKSPACE USAGE:------------------------------------------------- BOXSUM1.87 C Define local workspace arrays: BOXSUM1.88 C 1 real of length row_length BOXSUM1.89 REAL BOXSUM1.90 1 EW_SUM(ROW_LENGTH) ! summed WE source data BOXSUM1.91 2, EW_WEIGHT(ROW_LENGTH) ! summed WE weights for source data BOXSUM1.92 3, BOX_WEIGHT(ROW_LENGTH) ! summed weights for target boxes BOXSUM1.93 C BOXSUM1.94 C*--------------------------------------------------------------------- BOXSUM1.95 C BOXSUM1.96 C*L EXTERNAL SUBROUTINES CALLED--------------------------------------- BOXSUM1.97 C None BOXSUM1.98 C*------------------------------------------------------------------ BOXSUM1.99 BOXSUM1.100 *CALL C_MDI
BOXSUM1.101 BOXSUM1.102 C DEFINE LOCAL VARIABLES BOXSUM1.103 BOXSUM1.104 INTEGER I,J,I1,I2,IT,J1,J2,JT,K ! loop counters UDG0F404.137 BOXSUM1.106 REAL RH_BOX BOXSUM1.107 BOXSUM1.108 CL ********************************************************************* BOXSUM1.109 CL 1.0 Sum source boxes (whole and partial) contributions to target box BOXSUM1.110 CL ********************************************************************* BOXSUM1.111 BOXSUM1.112 DO 150 J=1,ROWS BOXSUM1.113 J1 = J_T(J) BOXSUM1.114 J2 = J_T(J+1) BOXSUM1.115 BOXSUM1.116 DO I=1,ROW_LENGTH BOXSUM1.117 BOX_WEIGHT(I)=0.0 BOXSUM1.118 ENDDO BOXSUM1.119 BOXSUM1.120 DO 140 JT=J1,J2 BOXSUM1.121 BOXSUM1.122 CL ********************************************************************* BOXSUM1.123 CL 1.1 Sum EW (whole and partial) contributions to target grid boxes BOXSUM1.124 CL ********************************************************************* BOXSUM1.125 BOXSUM1.126 DO I=1,ROW_LENGTH BOXSUM1.127 EW_SUM(I)=0.0 BOXSUM1.128 EW_WEIGHT(I)=0.0 BOXSUM1.129 ENDDO BOXSUM1.130 BOXSUM1.131 DO 120 I=1,ROW_LENGTH BOXSUM1.132 I1 = I_L(I) BOXSUM1.133 I2 = I_L(I+1) BOXSUM1.134 IF(I1.GT.I2.AND.GLOBAL) THEN BOXSUM1.135 C If grid box spans zero longitude need to split summation BOXSUM1.136 BOXSUM1.137 DO 101 IT=I1,SOURCE_ROW_LENGTH BOXSUM1.138 IF(IT.EQ.I1) THEN BOXSUM1.139 C Left side partial contribution BOXSUM1.140 RH_BOX = LONG_L(I+1) BOXSUM1.141 IF(RH_BOX.LT.LONG_L(I)) RH_BOX=RH_BOX BOXSUM1.142 & +SOURCE_ROW_LENGTH BOXSUM1.143 CXX IF(NINT(SOURCE(I1,JT)).NE.IMDI) THEN BOXSUM1.144 IF(NINT(SOURCE(I1,JT)).NE.NINT(RMDI)) THEN BOXSUM1.145 CXX IF(SOURCE(I1,JT).GE.0.0) THEN BOXSUM1.146 EW_WEIGHT(I) = BOXSUM1.147 & EW_WEIGHT(I) + (MIN(REAL(I1),RH_BOX) - LONG_L(I)) BOXSUM1.148 EW_SUM(I) = (MIN(REAL(I1),RH_BOX) - LONG_L(I)) BOXSUM1.149 & *SOURCE(I1,JT) + EW_SUM(I) BOXSUM1.150 ELSEIF(NINT(SOURCE(I1,JT)).EQ.NINT(RMDI)) THEN BOXSUM1.151 C missing data BOXSUM1.152 ELSE BOXSUM1.153 write (6,*) '-ve source 1 ? I1 JT data',I1,JT, BOXSUM1.154 + source(i1,jt) BOXSUM1.155 ENDIF BOXSUM1.156 BOXSUM1.157 ELSE BOXSUM1.158 BOXSUM1.159 C Whole contributions BOXSUM1.160 CXX IF(NINT(SOURCE(IT,JT)).NE.IMDI) THEN BOXSUM1.161 IF(NINT(SOURCE(IT,JT)).NE.NINT(RMDI)) THEN BOXSUM1.162 CXX IF(SOURCE(IT,JT).GE.0.0) THEN BOXSUM1.163 EW_WEIGHT(I) = EW_WEIGHT(I)+ 1.0 BOXSUM1.164 EW_SUM(I) = EW_SUM(I) + SOURCE(IT,JT) BOXSUM1.165 ELSEIF(NINT(SOURCE(IT,JT)).EQ.NINT(RMDI)) THEN BOXSUM1.166 C missing data BOXSUM1.167 ELSE BOXSUM1.168 write (6,*) '-ve source 2 ? IT JT data',IT,JT, BOXSUM1.169 + source(it,jt) BOXSUM1.170 ENDIF BOXSUM1.171 BOXSUM1.172 ENDIF BOXSUM1.173 BOXSUM1.174 101 CONTINUE BOXSUM1.175 BOXSUM1.176 DO 102 IT=1,I2 BOXSUM1.177 IF(IT.EQ.I2) THEN BOXSUM1.178 C Right side partial contribution BOXSUM1.179 CXX IF(NINT(SOURCE(I2,JT)).NE.IMDI) THEN BOXSUM1.180 IF(NINT(SOURCE(I2,JT)).NE.NINT(RMDI)) THEN BOXSUM1.181 CXX IF(SOURCE(I2,JT).GE.0.0) THEN BOXSUM1.182 EW_WEIGHT(I) = EW_WEIGHT(I)+(LONG_L(I+1)-(I2-1)) BOXSUM1.183 EW_SUM(I)=EW_SUM(I) + BOXSUM1.184 & (LONG_L(I+1)-(I2-1))*SOURCE(I2,JT) BOXSUM1.185 ELSEIF(NINT(SOURCE(I2,JT)).EQ.NINT(RMDI)) THEN BOXSUM1.186 C missing data BOXSUM1.187 ELSE BOXSUM1.188 write (6,*) '-ve source 3 ? I2 JT data',I2,JT, BOXSUM1.189 + source(i2,jt) BOXSUM1.190 ENDIF BOXSUM1.191 ELSE BOXSUM1.192 BOXSUM1.193 C Whole contributions BOXSUM1.194 CXX IF(NINT(SOURCE(IT,JT)).NE.IMDI) THEN BOXSUM1.195 IF(NINT(SOURCE(IT,JT)).NE.NINT(RMDI)) THEN BOXSUM1.196 CXX IF(SOURCE(IT,JT).GE.0.0) THEN BOXSUM1.197 EW_WEIGHT(I) = EW_WEIGHT(I)+ 1.0 BOXSUM1.198 EW_SUM(I) = EW_SUM(I) + SOURCE(IT,JT) BOXSUM1.199 ELSEIF(NINT(SOURCE(IT,JT)).EQ.NINT(RMDI)) THEN BOXSUM1.200 C missing data BOXSUM1.201 ELSE BOXSUM1.202 write (6,*) '-ve source 4 ? IT JT data',IT,JT, BOXSUM1.203 + source(it,jt) BOXSUM1.204 ENDIF BOXSUM1.205 BOXSUM1.206 ENDIF BOXSUM1.207 BOXSUM1.208 102 CONTINUE BOXSUM1.209 BOXSUM1.210 ELSE IF(I1.LT.I2)THEN ! no zero meridian crossing UDG2F401.136 DO 110 IT=I1,I2 BOXSUM1.212 IF(IT.EQ.I1) THEN BOXSUM1.213 C Left side partial contribution BOXSUM1.214 CXX IF(NINT(SOURCE(I1,JT)).NE.IMDI) THEN BOXSUM1.215 IF(NINT(SOURCE(I1,JT)).NE.NINT(RMDI)) THEN BOXSUM1.216 CXX IF(SOURCE(I1,JT).GE.0.0) THEN BOXSUM1.217 EW_WEIGHT(I) = EW_WEIGHT(I) + BOXSUM1.218 & (MIN(REAL(I1),LONG_L(I+1)) - LONG_L(I)) BOXSUM1.219 EW_SUM(I) = (MIN(REAL(I1),LONG_L(I+1)) - LONG_L(I)) BOXSUM1.220 & *SOURCE(I1,JT) + EW_SUM(I) BOXSUM1.221 ELSEIF(NINT(SOURCE(I1,JT)).EQ.NINT(RMDI)) THEN BOXSUM1.222 C missing data BOXSUM1.223 ELSE BOXSUM1.224 write (6,*) '-ve source 5 ? I1 JT data',I1,JT, BOXSUM1.225 + source(i1,jt) BOXSUM1.226 ENDIF BOXSUM1.227 BOXSUM1.228 ELSE IF(IT.EQ.I2) THEN BOXSUM1.229 C Right side partial contribution BOXSUM1.230 CXX IF(NINT(SOURCE(I2,JT)).NE.IMDI) THEN BOXSUM1.231 IF(NINT(SOURCE(I2,JT)).NE.NINT(RMDI)) THEN BOXSUM1.232 CXX IF(SOURCE(I2,JT).GE.0.0) THEN BOXSUM1.233 EW_WEIGHT(I) = EW_WEIGHT(I)+ (LONG_L(I+1)-(I2-1)) BOXSUM1.234 EW_SUM(I)=EW_SUM(I)+(LONG_L(I+1)-(I2-1))*SOURCE(I2,JT) BOXSUM1.235 ELSEIF(NINT(SOURCE(I2,JT)).EQ.NINT(RMDI)) THEN BOXSUM1.236 C missing data BOXSUM1.237 ELSE BOXSUM1.238 write (6,*) '-ve source 6 ? I2 JT data',I2,JT, BOXSUM1.239 + source(i2,jt) BOXSUM1.240 ENDIF BOXSUM1.241 BOXSUM1.242 ELSE BOXSUM1.243 BOXSUM1.244 C Whole contributions BOXSUM1.245 BOXSUM1.246 CXX IF(NINT(SOURCE(IT,JT)).NE.IMDI) THEN BOXSUM1.247 IF(NINT(SOURCE(IT,JT)).NE.NINT(RMDI)) THEN BOXSUM1.248 CXX IF(SOURCE(IT,JT).GE.0.0) THEN BOXSUM1.249 EW_WEIGHT(I) = EW_WEIGHT(I)+ 1.0 BOXSUM1.250 EW_SUM(I) = EW_SUM(I) + SOURCE(IT,JT) BOXSUM1.251 ELSEIF(NINT(SOURCE(IT,JT)).EQ.NINT(RMDI)) THEN BOXSUM1.252 C missing data BOXSUM1.253 ELSE BOXSUM1.254 write (6,*) '-ve source 7 ? IT JT data',IT,JT, BOXSUM1.255 + source(it,jt) BOXSUM1.256 ENDIF BOXSUM1.257 BOXSUM1.258 ENDIF BOXSUM1.259 110 CONTINUE BOXSUM1.260 BOXSUM1.261 ELSE UDG2F401.137 !Zonal mean no need to average in EW direction UDG2F401.138 DO K=1,ROW_LENGTH UDG0F404.138 EW_WEIGHT(K)=1.0 UDG0F404.139 EW_SUM(K)=SOURCE(1,JT) UDG0F404.140 END DO UDG0F404.141 UDG0F404.142 UDG2F401.141 UDG2F401.142 ENDIF BOXSUM1.262 BOXSUM1.263 120 CONTINUE BOXSUM1.264 BOXSUM1.265 CL ********************************************************************* BOXSUM1.266 CL 1.3 Add summed EW box contributions into rows J target grid boxes BOXSUM1.267 CL ********************************************************************* BOXSUM1.268 BOXSUM1.269 IF(JT.EQ.J1) THEN BOXSUM1.270 C Top row BOXSUM1.271 DO 130 I=1,ROW_LENGTH BOXSUM1.272 BOXSUM(I,J) = (MIN(REAL(J1),COLAT_T(J+1)) - COLAT_T(J)) BOXSUM1.273 & *EW_SUM(I) BOXSUM1.274 BOX_WEIGHT(I) = (MIN(REAL(J1),COLAT_T(J+1)) - COLAT_T(J)) BOXSUM1.275 & *EW_WEIGHT(I) + BOX_WEIGHT(I) BOXSUM1.276 130 CONTINUE BOXSUM1.277 BOXSUM1.278 ELSE IF(JT.EQ.J2) THEN BOXSUM1.279 C Bottom of row J BOXSUM1.280 DO 131 I=1,ROW_LENGTH BOXSUM1.281 BOXSUM(I,J) = BOXSUM(I,J) + BOXSUM1.282 1 (1-(J2 - COLAT_T(J+1)))*EW_SUM(I) BOXSUM1.283 BOX_WEIGHT(I) = BOX_WEIGHT(I) + BOXSUM1.284 & (1-(J2 - COLAT_T(J+1)))*EW_WEIGHT(I) BOXSUM1.285 131 CONTINUE BOXSUM1.286 BOXSUM1.287 ELSE BOXSUM1.288 C Whole contributions to row J BOXSUM1.289 DO 132 I=1,ROW_LENGTH BOXSUM1.290 BOXSUM(I,J) = BOXSUM(I,J) + EW_SUM(I) BOXSUM1.291 BOX_WEIGHT(I) = BOX_WEIGHT(I) + EW_WEIGHT(I) BOXSUM1.292 132 CONTINUE BOXSUM1.293 BOXSUM1.294 ENDIF BOXSUM1.295 BOXSUM1.296 140 CONTINUE BOXSUM1.297 BOXSUM1.298 DO 142 I=1,ROW_LENGTH BOXSUM1.299 IF(BOX_WEIGHT(I).NE.0.0) THEN BOXSUM1.300 BOXSUM(I,J) = BOXSUM(I,J) / BOX_WEIGHT(I) BOXSUM1.301 ELSE BOXSUM1.302 BOXSUM(I,J) = RMDI BOXSUM1.303 ENDIF BOXSUM1.304 142 CONTINUE BOXSUM1.305 BOXSUM1.306 150 CONTINUE BOXSUM1.307 BOXSUM1.308 RETURN BOXSUM1.309 END BOXSUM1.310 *ENDIF BOXSUM1.311