*IF DEF,C92_1A BOXBND1.2 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.15303 C GTS2F400.15304 C Use, duplication or disclosure of this code is subject to the GTS2F400.15305 C restrictions as set forth in the contract. GTS2F400.15306 C GTS2F400.15307 C Meteorological Office GTS2F400.15308 C London Road GTS2F400.15309 C BRACKNELL GTS2F400.15310 C Berkshire UK GTS2F400.15311 C RG12 2SZ GTS2F400.15312 C GTS2F400.15313 C If no contract has been raised with this copy of the code, the use, GTS2F400.15314 C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.15315 C to do so must first be obtained in writing from the Head of Numerical GTS2F400.15316 C Modelling at the above address. GTS2F400.15317 C ******************************COPYRIGHT****************************** GTS2F400.15318 C GTS2F400.15319 CLL SUBROUTINE BOX_BND BOXBND1.3 CLL BOXBND1.4 CLL Routine sets up arrays of indexes and boundaries of target grid BOXBND1.5 CLL boxes relative to a source grid for use by BOX_SUM so that BOXBND1.6 CLL area weighted means can be calculated. BOXBND1.7 CLL BOXBND1.8 CLL NOT SUITABLE FOR SINGLE COLUMN USE BOXBND1.9 CLL BOXBND1.10 CLL SUITABLE FOR ROTATED GRIDS BOXBND1.11 CLL BOXBND1.12 CLL ORIGINAL VERSION FOR CRAY Y-MP/IBM BOXBND1.13 CLL WRITTEN 06/09/91 BY C. WILSON BOXBND1.14 CLL BOXBND1.15 CLL CODE REVIEWED BY R.SMITH ??/??/?? BOXBND1.16 CLL BOXBND1.17 CLL VERSION NO. 1 DATED 06/09/91 BOXBND1.18 CLL COSMOS DSN MS15.CWUM.JOBS(BOXBND1) BOXBND1.19 CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, BOXBND1.20 CLL VERSION 1, DATED 12/09/89 BOXBND1.21 ! History: UDG2F401.120 ! Version Date Comment UDG2F401.121 ! ------- ---- ------- UDG2F401.122 ! 4.0 12/04/95 Imported into Unified model. D.M. Goddard UDG2F401.123 ! 4.1 12/06/96 Corrections to longitude indexes at boundary. UDG2F401.124 ! D.M. Goddard UDG2F401.125 ! 4.5 12/10/98 Stops LONG_L and COLAT_T becoming negative in UDG6F405.134 ! top row, preventing out of bound in index array. UDG6F405.135 ! Author D.M Goddard UDG6F405.136 CLL BOXBND1.22 CLL SYSTEM TASK: S1 (part,extension for area mean interpolation) BOXBND1.23 CLL BOXBND1.24 CLL PURPOSE: To set up for grid-boxes on a target grid the longitude, BOXBND1.25 CLL colatitude,and indexes of the overlapping source grid- BOXBND1.26 CLL boxes at left hand side and top of target grid-boxes. BOXBND1.27 CLL Both grids are regular lat-long with the same pole BOXBND1.28 CLL and orientation. Either may be a 'p-grid' (ie with BOXBND1.29 CLL half-size boxes at the poles) or a 'u-grid' (ie with BOXBND1.30 CLL regular size boxes everywhere.) BOXBND1.31 CLL BOXBND1.32 CLL NB The units used are "source grid-box lengths" BOXBND1.33 CLL The area of the target grid_boxes in squared "source BOXBND1.34 CLL grid-box units" is also returned. BOXBND1.35 CLL BOXBND1.36 CLL DOCUMENTATION: UNIFIED MODEL DOCUMENTATION S1 BOXBND1.37 CLL BY A.DICKINSON/C WILSON VERSION ??DATED ??/??/91 BOXBND1.38 CLL BOXBND1.39 CLL BOXBND1.40 CLLEND------------------------------------------------------------- BOXBND1.41 BOXBND1.42 C BOXBND1.43 C*L ARGUMENTS:--------------------------------------------------- BOXBND1.44SUBROUTINE BOX_BND 3BOXBND1.45 1 (I_L,LONG_L,J_T,COLAT_T,AREA_BOX, BOXBND1.46 2 ROW_LENGTH,ROWS,ROW_LENGTH_SRCE,ROWS_SRCE, BOXBND1.47 3 DELTA_LONG,DELTA_LAT,START_LONG,START_LAT, BOXBND1.48 4 DELTA_LONG_SRCE,DELTA_LAT_SRCE,START_LONG_SRCE,START_LAT_SRCE, BOXBND1.49 5 IGRID,IGRID_SRCE,GLOBAL) BOXBND1.50 BOXBND1.51 IMPLICIT NONE BOXBND1.52 BOXBND1.53 INTEGER BOXBND1.54 * ROW_LENGTH !IN Number of points per row target area BOXBND1.55 *, ROWS !IN Number of rows of target area BOXBND1.56 *, ROW_LENGTH_SRCE !IN Number of points per row source area BOXBND1.57 *, ROWS_SRCE !IN Number of rows of source area BOXBND1.58 C BOXBND1.59 INTEGER BOXBND1.60 1 I_L(ROW_LENGTH+1)!OUT Index of source box overlapping lhs of BOXBND1.61 & ! target grid-box BOXBND1.62 2,J_T(ROWS+1) !OUT Index of source box overlapping top of BOXBND1.63 & ! target grid-box BOXBND1.64 C BOXBND1.65 REAL BOXBND1.66 1 LONG_L(ROW_LENGTH +1) !OUT Left longitude of target grid-box (in BOXBND1.67 + ! units of DELTA_LONG_SRCE) BOXBND1.68 2,COLAT_T(ROWS+1) !OUT Colatitude of top of target grid-box BOXBND1.69 + ! (in units of DELTA_LAT_SRCE) BOXBND1.70 3, AREA_BOX !OUT area of grid box in sq units of source grid BOXBND1.71 BOXBND1.72 REAL BOXBND1.73 1 DELTA_LONG !IN Longitude increment of target grid (deg) BOXBND1.74 2,DELTA_LAT !IN Latitude increment of target grid (deg) BOXBND1.75 3,START_LONG !IN start longitude of centre of first grid- BOXBND1.76 + ! box in target area BOXBND1.77 4,START_LAT !IN start latitude of centre of first grid- BOXBND1.78 + ! box in target area BOXBND1.79 5,DELTA_LAT_SRCE !IN Latitude increment of source grid BOXBND1.80 6,DELTA_LONG_SRCE !IN Longitude increment of source grid BOXBND1.81 7,START_LONG_SRCE !IN start longitude of centre of first grid- BOXBND1.82 + ! box in source area BOXBND1.83 8,START_LAT_SRCE !IN start latitude of centre of first grid BOXBND1.84 + ! box in source area BOXBND1.85 BOXBND1.86 INTEGER BOXBND1.87 1 IGRID !IN Grid indicator 1=p-grid,2=u-grid BOXBND1.88 2,IGRID_SRCE !IN Grid indicator 1=p-grid,2=u-grid BOXBND1.89 BOXBND1.90 LOGICAL GLOBAL !IN true if global area required BOXBND1.91 C*--------------------------------------------------------------------- BOXBND1.92 BOXBND1.93 C*L WORKSPACE USAGE:------------------------------------------------- BOXBND1.94 C NONE BOXBND1.95 C*--------------------------------------------------------------------- BOXBND1.96 C BOXBND1.97 C*L EXTERNAL SUBROUTINES CALLED--------------------------------------- BOXBND1.98 C EXTERNAL NONE BOXBND1.99 C*------------------------------------------------------------------ BOXBND1.100 C---------------------------------------------------------------------- BOXBND1.101 C DEFINE LOCAL VARIABLES BOXBND1.102 REAL EW_BOX ! length of grid box in units of source BOXBND1.103 + ! (DELTA_LONG_SRCE) BOXBND1.104 1, NS_BOX ! height of grid box in units of source BOXBND1.105 + ! (DELTA_LAT_SRCE) BOXBND1.106 2,START_LONG_BOX ! start longitude of first grid box left edge BOXBND1.107 3,START_COLAT_BOX! start colatitude of first grid box top edge BOXBND1.108 4,START_LONG_BOX_SRCE ! start longitude of first grid box left BOXBND1.109 + ! edge ( source) BOXBND1.110 5,START_COLAT_BOX_SRCE! start colatitude of first grid box top BOXBND1.111 + ! edge ( source) BOXBND1.112 6,LONG_OFFSET ! start longitude difference BOXBND1.113 7,COLAT_OFFSET ! start colatitude difference BOXBND1.114 BOXBND1.115 INTEGER I,J ! loop counters BOXBND1.116 REAL P1,P2 BOXBND1.117 LOGICAL LNER BOXBND1.118 LNER(P1,P2) = ((ABS(P1-P2)) .GT. (1.E-5*ABS(P1+P2))) BOXBND1.119 BOXBND1.120 CL ********************************************************************* BOXBND1.121 CL 1.0 Set target gridbox length,height and area in units of source grid BOXBND1.122 CL Set start 'longitude' and 'colatitude' of first grid box BOXBND1.123 CL also in source units. BOXBND1.124 CL ********************************************************************* BOXBND1.125 BOXBND1.126 EW_BOX= DELTA_LONG/DELTA_LONG_SRCE BOXBND1.127 NS_BOX= DELTA_LAT/DELTA_LAT_SRCE BOXBND1.128 AREA_BOX= EW_BOX*NS_BOX BOXBND1.129 BOXBND1.130 CL ********************************************************************* BOXBND1.131 CL 1.1 Set start colatitude of top and start longitude of LHS of first BOXBND1.132 CL boxes on both target and source grids. BOXBND1.133 CL ********************************************************************* BOXBND1.134 write(6,*) DELTA_LAT_SRCE,DELTA_LAT BOXBND1.135 write(6,*) DELTA_LONG_SRCE,DELTA_LONG BOXBND1.136 write(6,*) START_LAT_SRCE,START_LAT BOXBND1.137 write(6,*) START_LONG_SRCE,START_LONG BOXBND1.138 START_LONG_BOX = START_LONG - 0.5*DELTA_LONG BOXBND1.139 START_COLAT_BOX = (90. - START_LAT) - 0.5*DELTA_LAT BOXBND1.140 START_LONG_BOX_SRCE = START_LONG_SRCE - 0.5*DELTA_LONG_SRCE BOXBND1.141 START_COLAT_BOX_SRCE = (90. - START_LAT_SRCE) - 0.5*DELTA_LAT_SRCE BOXBND1.142 BOXBND1.143 C## START_LONG_BOX = START_LONG/DELTA_LONG_SRCE - 0.5*EW_BOX BOXBND1.144 C## START_COLAT_BOX = (90. - START_LAT)/DELTA_LAT_SRCE - 0.5*NS_BOX BOXBND1.145 C## START_LONG_BOX_SRCE = START_LONG_SRCE/DELTA_LONG_SRCE - 0.5 BOXBND1.146 C## START_COLAT_BOX_SRCE = (90. - START_LAT_SRCE)/DELTA_LAT_SRCE - 0.5 BOXBND1.147 BOXBND1.148 IF(GLOBAL) THEN BOXBND1.149 IF(IGRID_SRCE.EQ.1.AND.LNER(START_LAT_SRCE,90.)) THEN BOXBND1.150 WRITE(6,*)' BOX_BND: source grid not global' GIE0F403.92 STOP BOXBND1.152 ENDIF BOXBND1.153 IF(IGRID_SRCE.EQ.2.AND. BOXBND1.154 & LNER(START_LAT_SRCE,(90.-DELTA_LAT_SRCE*0.5))) THEN BOXBND1.155 WRITE(6,*)' BOX_BND: source grid not global' GIE0F403.93 ENDIF BOXBND1.158 ELSE BOXBND1.159 WRITE (6,*) 'BOX_BND' BOXBND1.160 WRITE (6,*) 'start_colat_box ',START_COLAT_BOX BOXBND1.161 WRITE (6,*) 'start_colat_box_srce ',START_COLAT_BOX_SRCE BOXBND1.162 IF(LNER(START_COLAT_BOX,START_COLAT_BOX_SRCE)) THEN BOXBND1.163 WRITE(6,*)' BOX_BND: target area larger than source area' GIE0F403.94 STOP BOXBND1.165 ENDIF BOXBND1.166 ENDIF BOXBND1.167 BOXBND1.168 LONG_OFFSET =(START_LONG_BOX-START_LONG_BOX_SRCE)/ BOXBND1.169 & DELTA_LONG_SRCE BOXBND1.170 COLAT_OFFSET = (START_COLAT_BOX - START_COLAT_BOX_SRCE)/ BOXBND1.171 & DELTA_LAT_SRCE BOXBND1.172 BOXBND1.173 IF (.NOT.GLOBAL) THEN BOXBND1.174 IF (LONG_OFFSET.LT.0.0) THEN BOXBND1.175 WRITE (6,*) ' LONG_OFFSET = ',LONG_OFFSET,' ; Reset to 0.0' BOXBND1.176 LONG_OFFSET = 0.0 BOXBND1.177 ENDIF BOXBND1.178 IF (COLAT_OFFSET.LT.0.0) THEN BOXBND1.179 WRITE (6,*) ' COLAT_OFFSET = ',COLAT_OFFSET,' ; Reset to 0.0' BOXBND1.180 COLAT_OFFSET = 0.0 BOXBND1.181 ENDIF BOXBND1.182 ENDIF BOXBND1.183 CL ********************************************************************* BOXBND1.184 CL 2.0 Set grid box left longitudes, top colatitudes and indices BOXBND1.185 CL ********************************************************************* BOXBND1.186 BOXBND1.187 DO 220 I=1,ROW_LENGTH + 1 BOXBND1.188 LONG_L(I) = LONG_OFFSET + (I-1)*EW_BOX BOXBND1.189 IF(GLOBAL.AND.LONG_L(I).LT.0.0)THEN UDG2F401.126 LONG_L(I)=LONG_L(I)+REAL(ROW_LENGTH_SRCE) UDG2F401.127 ELSE IF(GLOBAL.AND.LONG_L(I).GE.ROW_LENGTH_SRCE)THEN UDG2F401.128 LONG_L(I)=LONG_L(I)-REAL(ROW_LENGTH_SRCE) UDG2F401.129 END IF UDG2F401.130 I_L(I) = LONG_L(I) +1 BOXBND1.192 220 CONTINUE BOXBND1.193 IF(LONG_L(1).LT.0.0)LONG_L(1)=0.0 UDG6F405.137 BOXBND1.194 WRITE(6,*) ' I_L' GIE0F403.95 WRITE(6,*) I_L GIE0F403.96 WRITE(6,*) ' LONG_L' GIE0F403.97 WRITE(6,*) LONG_L GIE0F403.98 BOXBND1.199 C## COLAT_T(1) = START_COLAT_BOX - START_COLAT_BOX_SRCE BOXBND1.200 COLAT_T(1) = COLAT_OFFSET BOXBND1.201 IF(GLOBAL.AND.IGRID.EQ.1)THEN BOXBND1.202 C## COLAT_T(1) = 0.0 - START_COLAT_BOX_SRCE BOXBND1.203 COLAT_T(1) = (0.0 - START_COLAT_BOX_SRCE)/DELTA_LAT_SRCE BOXBND1.204 ENDIF BOXBND1.205 IF(COLAT_T(1).LT.0.0)COLAT_T(1)=0.0 UDG6F405.138 J_T(1) = COLAT_T(1) + 1 BOXBND1.206 DO 230 J=2,ROWS+1 BOXBND1.207 COLAT_T(J) = COLAT_OFFSET + (J-1)*NS_BOX BOXBND1.208 J_T(J) = COLAT_T(J) + 1 BOXBND1.209 230 CONTINUE BOXBND1.210 C ROWS+1 ie bottom boundary BOXBND1.211 IF(GLOBAL) THEN BOXBND1.212 IF(IGRID.EQ.1)COLAT_T(ROWS+1) = COLAT_T(ROWS+1)-0.5*NS_BOX BOXBND1.213 J_T(ROWS+1) = ROWS_SRCE BOXBND1.214 ELSE BOXBND1.215 IF(J_T(ROWS+1).GT.ROWS_SRCE) THEN BOXBND1.216 IF(COLAT_T(ROWS+1).GT.REAL(ROWS_SRCE)) THEN BOXBND1.217 WRITE(6,*)' BOX_BND: target area larger than source area' GIE0F403.99 STOP BOXBND1.219 ELSE BOXBND1.220 J_T(ROWS+1) = ROWS_SRCE BOXBND1.221 ENDIF BOXBND1.222 ENDIF BOXBND1.223 ENDIF BOXBND1.224 BOXBND1.225 WRITE(6,*) ' J_T' GIE0F403.100 WRITE(6,*) J_T GIE0F403.101 WRITE(6,*) ' COLAT_T' GIE0F403.102 WRITE(6,*) COLAT_T GIE0F403.103 BOXBND1.230 RETURN BOXBND1.231 END BOXBND1.232 *ENDIF BOXBND1.233