*IF DEF,C92_1A COASAJ1A.2 C ******************************COPYRIGHT****************************** GTS2F400.1009 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.1010 C GTS2F400.1011 C Use, duplication or disclosure of this code is subject to the GTS2F400.1012 C restrictions as set forth in the contract. GTS2F400.1013 C GTS2F400.1014 C Meteorological Office GTS2F400.1015 C London Road GTS2F400.1016 C BRACKNELL GTS2F400.1017 C Berkshire UK GTS2F400.1018 C RG12 2SZ GTS2F400.1019 C GTS2F400.1020 C If no contract has been raised with this copy of the code, the use, GTS2F400.1021 C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.1022 C to do so must first be obtained in writing from the Head of Numerical GTS2F400.1023 C Modelling at the above address. GTS2F400.1024 C ******************************COPYRIGHT****************************** GTS2F400.1025 C GTS2F400.1026 CLL SUBROUTINE COAST_AJ----------------------------------------------- COASAJ1A.3 CLL COASAJ1A.4 CLL Written by A. Dickinson COASAJ1A.5 CLL COASAJ1A.6 CLL Purpose: COASAJ1A.7 CLL (i) To produce gather indices which map each coastal point COASAJ1A.8 CLL on the target grid onto its nearest point on the source COASAJ1A.9 CLL grid. This allows correction of those surface fields COASAJ1A.10 CLL which are non-homogeneous across land/sea boundaries COASAJ1A.11 CLL after horizontal interpolation by subroutine H_INT. COASAJ1A.12 CLL The algorithm uses linear interpolation weights and COASAJ1A.13 CLL gather indices calculated by subroutine H_INT_CO. COASAJ1A.14 CLL COASAJ1A.15 CLL (ii) If a land-sea mask for the target grid is not provided, COASAJ1A.16 CLL one is created. When a target land/sea mask is provided, COASAJ1A.17 CLL further index is output containing those points on the COASAJ1A.18 CLL target grid for which the 4 surrounding source points COASAJ1A.19 CLL are not of the same land/sea type as the target point. COASAJ1A.20 CLL These points will generally be new islands etc resolved b COASAJ1A.21 CLL a hires land/sea mask. They should be set to appropriate COASAJ1A.22 CLL values (eg climatology) as required. COASAJ1A.23 CLL COASAJ1A.24 CLL Model Modification history from model version 3.0: COASAJ1A.25 CLL version Date COASAJ1A.26 CLL AD100293.6 CLL 3.1 10/02/93 Bug removed in initialisation of variables AD100293.7 CLL Author: A. Dickinson Reviewer: F. Rawlins AD100293.8 CLL 3.4 25/10/93 Output arguments INDEX_TARG_SEA_UNRES and UDG1F304.1 CLL INDEX_TARG_LAND_UNRES declared as arrays. UDG1F304.2 CLL Although previously declared as scalars, no UDG1F304.3 CLL detremental effects were observed from the error. UDG1F304.4 CLL Author: D.M.Goddard Reviewer: UDG1F304.5 CLL COASAJ1A.27 CLL Programming standard: Unified Model Documentation Paper No 3 COASAJ1A.28 CLL Version No 1 15/1/90 COASAJ1A.29 CLL COASAJ1A.30 CLL Logical component number: S122 COASAJ1A.31 CLL COASAJ1A.32 CLL Project task: S1 COASAJ1A.33 CLL COASAJ1A.34 CLL Documentation: The interpolation formulae are described in COASAJ1A.35 CLL unified model on-line documentation paper S1. COASAJ1A.36 CLL COASAJ1A.37 CLL ------------------------------------------------------------------ COASAJ1A.38 C COASAJ1A.39 C*L Arguments:--------------------------------------------------------- COASAJ1A.40 COASAJ1A.41SUBROUTINE COAST_AJ 6COASAJ1A.42 *(INDEX_B_L,INDEX_B_R,WEIGHT_T_R,WEIGHT_B_R,WEIGHT_T_L,WEIGHT_B_L COASAJ1A.43 *,POINTS_LAMBDA_SRCE,POINTS_PHI_SRCE,POINTS,LAND_SEA_SRCE COASAJ1A.44 *,LAND_SEA_TARG,INDEX_TARG,INDEX_SRCE,COASTAL_POINTS,MASK COASAJ1A.45 *,INDEX_TARG_SEA_UNRES,SEA_POINTS_UNRES COASAJ1A.46 *,INDEX_TARG_LAND_UNRES,LAND_POINTS_UNRES) COASAJ1A.47 COASAJ1A.48 IMPLICIT NONE COASAJ1A.49 COASAJ1A.50 INTEGER COASAJ1A.51 * POINTS_LAMBDA_SRCE !IN Number of lambda points on source grid COASAJ1A.52 *,POINTS_PHI_SRCE !IN Number of phi points on source grid COASAJ1A.53 *,POINTS !IN Total number of points on target grid COASAJ1A.54 *,COASTAL_POINTS !OUT Number of coastal points on target grid COASAJ1A.55 *,LAND_POINTS_UNRES !OUT No of unresolved land pts when MASK=T COASAJ1A.56 *,SEA_POINTS_UNRES !OUT No of unresolved sea pts when MASK=T COASAJ1A.57 *,INDEX_B_L(POINTS) !IN Index of bottom lefthand corner COASAJ1A.58 * ! of source gridbox COASAJ1A.59 *,INDEX_B_R(POINTS) !IN Index of bottom righthand corner COASAJ1A.60 * ! of source gridbox COASAJ1A.61 *,LAND_SEA_TARG(POINTS)!INOUT Land/sea mask on target grid. If MASK COASAJ1A.62 * !then precalculated land/sea mask on input. COASAJ1A.63 *,LAND_SEA_SRCE(POINTS_LAMBDA_SRCE*POINTS_PHI_SRCE) COASAJ1A.64 * !IN Land/sea mask on source grid COASAJ1A.65 COASAJ1A.66 INTEGER COASAJ1A.67 * INDEX_TARG(POINTS) !OUT Index of target coastal points COASAJ1A.68 *,INDEX_SRCE(POINTS) !OUT Index of source points mapped onto COASAJ1A.69 * !target coastal points COASAJ1A.70 *,INDEX_TARG_SEA_UNRES(POINTS) UDG1F304.6 * !OUT Index of sea pts on target grid which a UDG1F304.7 * !unresolved when MASK=T COASAJ1A.72 *,INDEX_TARG_LAND_UNRES(POINTS) UDG1F304.8 * !OUT Index of land pts on target grid which UDG1F304.9 * !unresolved when MASK=T COASAJ1A.74 COASAJ1A.75 REAL COASAJ1A.76 * WEIGHT_T_R(POINTS) !IN Weight applied to value at top right COASAJ1A.77 * ! hand corner of source gridbox COASAJ1A.78 *,WEIGHT_B_L(POINTS) !IN Weight applied to value at bottom left COASAJ1A.79 * ! hand corner of source gridbox COASAJ1A.80 *,WEIGHT_B_R(POINTS) !IN Weight applied to value at bottom right COASAJ1A.81 * ! hand corner of source gridbox COASAJ1A.82 *,WEIGHT_T_L(POINTS) !IN Weight applied to value at top left COASAJ1A.83 * ! hand corner of source gridbox COASAJ1A.84 COASAJ1A.85 LOGICAL COASAJ1A.86 * MASK !IN =F, then land/sea mask estimated COASAJ1A.87 * ! =T, then land/sea mask input as LAND_SEA_TARG COASAJ1A.88 COASAJ1A.89 C Local arrays:--------------------------------------------------------- COASAJ1A.90 INTEGER COASAJ1A.91 * LAND_SEA_TEMP(POINTS) ! Array used to accumulate output land/sea COASAJ1A.92 *,INDEX_TEMP(POINTS,4) ! Index of 4 sourrounding source points COASAJ1A.93 * ! order by distance COASAJ1A.94 *,LAND_SEA_COAST(POINTS) ! Mask of coastal points on target grid COASAJ1A.95 COASAJ1A.96 REAL COASAJ1A.97 * MAX_WEIGHT(POINTS,4) ! Linear interpolation weights ordered by COASAJ1A.98 COASAJ1A.99 LOGICAL COASAJ1A.100 * LOGIC_TEST(POINTS) ! Logical string used to accumulate tests COASAJ1A.101 COASAJ1A.102 C*L External subroutines called:---------------------------------------- COASAJ1A.103 C*---------------------------------------------------------------------- COASAJ1A.105 C Local variables:------------------------------------------------------ COASAJ1A.106 REAL TEMP COASAJ1A.107 INTEGER I,J,K,START,ITEMP COASAJ1A.108 C ---------------------------------------------------------------------- COASAJ1A.109 COASAJ1A.110 CL 1. Sum of land/sea mask values on source grid surrounding each point COASAJ1A.111 CL on target grid. This assumes that the mask is integer 1's and 0's. COASAJ1A.112 COASAJ1A.113 DO 100 I=1,POINTS COASAJ1A.114 COASAJ1A.115 LAND_SEA_TEMP(I)=LAND_SEA_SRCE(INDEX_B_L(I)) COASAJ1A.116 * +LAND_SEA_SRCE(INDEX_B_R(I)) COASAJ1A.117 * +LAND_SEA_SRCE(INDEX_B_L(I)-POINTS_LAMBDA_SRCE) COASAJ1A.118 * +LAND_SEA_SRCE(INDEX_B_R(I)-POINTS_LAMBDA_SRCE) COASAJ1A.119 COASAJ1A.120 100 CONTINUE COASAJ1A.121 COASAJ1A.122 CL 2. Generate coastal gather indices and new land/sea mask COASAJ1A.123 COASAJ1A.124 C 2.1 Gather index for coastal points on target grid COASAJ1A.125 COASAJ1A.126 DO 210 I=1,POINTS COASAJ1A.127 LOGIC_TEST(I)=LAND_SEA_TEMP(I).GT.0.AND.LAND_SEA_TEMP(I).LT.4 COASAJ1A.128 210 CONTINUE COASAJ1A.129 COASAJ1A.130 COASTAL_POINTS = 0 GSS5F402.400 DO I=1,POINTS GSS5F402.401 IF(LOGIC_TEST(I))THEN GSS5F402.402 COASTAL_POINTS=COASTAL_POINTS + 1 GSS5F402.403 INDEX_TARG(COASTAL_POINTS) = I GSS5F402.404 END IF GSS5F402.405 END DO GSS5F402.406 COASAJ1A.133 COASAJ1A.134 C Set target land-sea mask to land if all 4 surrounding COASAJ1A.135 C source points are also land. COASAJ1A.136 COASAJ1A.137 DO 211 I=1,POINTS COASAJ1A.138 IF(LAND_SEA_TEMP(I).EQ.4)LAND_SEA_TEMP(I)=1 COASAJ1A.139 211 CONTINUE COASAJ1A.140 COASAJ1A.141 COASAJ1A.142 C 2.2 Gather index for points which differ between input COASAJ1A.143 C land/sea mask and first estimate and are not first COASAJ1A.144 C estimate coastal points. COASAJ1A.145 COASAJ1A.146 IF(MASK)THEN COASAJ1A.147 J=COASTAL_POINTS COASAJ1A.148 COASAJ1A.149 DO 220 I=1,POINTS COASAJ1A.150 LAND_SEA_COAST(I)=0 COASAJ1A.151 220 CONTINUE COASAJ1A.152 DO 221 I=1,COASTAL_POINTS COASAJ1A.153 LAND_SEA_COAST(INDEX_TARG(I))=1 COASAJ1A.154 221 CONTINUE COASAJ1A.155 COASAJ1A.156 DO 222 I=1,POINTS COASAJ1A.157 LOGIC_TEST(I)=LAND_SEA_TEMP(I).NE.LAND_SEA_TARG(I) COASAJ1A.158 *.AND.LAND_SEA_COAST(I).EQ.0 COASAJ1A.159 222 CONTINUE COASAJ1A.160 COASAJ1A.161 START=COASTAL_POINTS GSS5F402.407 COASTAL_POINTS = 0 GSS5F402.408 DO I=1,POINTS GSS5F402.409 IF(LOGIC_TEST(I))THEN GSS5F402.410 COASTAL_POINTS=COASTAL_POINTS + 1 GSS5F402.411 INDEX_TARG(START+COASTAL_POINTS) = I GSS5F402.412 END IF GSS5F402.413 END DO GSS5F402.414 COASTAL_POINTS=COASTAL_POINTS+J COASAJ1A.165 COASAJ1A.166 ENDIF COASAJ1A.167 COASAJ1A.168 C 2.3 Accumulate source weights and indices associated with COASAJ1A.169 C each coastal point on target grid. COASAJ1A.170 COASAJ1A.171 DO 230 I=1,COASTAL_POINTS COASAJ1A.172 COASAJ1A.173 MAX_WEIGHT(I,1)=WEIGHT_B_L(INDEX_TARG(I)) COASAJ1A.174 MAX_WEIGHT(I,2)=WEIGHT_B_R(INDEX_TARG(I)) COASAJ1A.175 MAX_WEIGHT(I,3)=WEIGHT_T_L(INDEX_TARG(I)) COASAJ1A.176 MAX_WEIGHT(I,4)=WEIGHT_T_R(INDEX_TARG(I)) COASAJ1A.177 INDEX_TEMP(I,1)=INDEX_B_L(INDEX_TARG(I)) COASAJ1A.178 INDEX_TEMP(I,2)=INDEX_B_R(INDEX_TARG(I)) COASAJ1A.179 INDEX_TEMP(I,3)=INDEX_B_L(INDEX_TARG(I)) COASAJ1A.180 * -POINTS_LAMBDA_SRCE COASAJ1A.181 INDEX_TEMP(I,4)=INDEX_B_R(INDEX_TARG(I)) COASAJ1A.182 * -POINTS_LAMBDA_SRCE COASAJ1A.183 230 CONTINUE COASAJ1A.184 COASAJ1A.185 C 2.4 Sort gather indices of the 4 surrounding source COASAJ1A.186 C gridpoints according to distance from target gridpoint; COASAJ1A.187 C arranged so that nearest point comes first in list (ie K=1). COASAJ1A.188 COASAJ1A.189 DO 240 K=1,3 COASAJ1A.190 DO 240 J=K+1,4 COASAJ1A.191 DO 241 I=1,COASTAL_POINTS COASAJ1A.192 IF(MAX_WEIGHT(I,K).LT.MAX_WEIGHT(I,J))THEN COASAJ1A.193 TEMP=MAX_WEIGHT(I,K) COASAJ1A.194 MAX_WEIGHT(I,K)=MAX_WEIGHT(I,J) COASAJ1A.195 MAX_WEIGHT(I,J)=TEMP COASAJ1A.196 ITEMP=INDEX_TEMP(I,K) COASAJ1A.197 INDEX_TEMP(I,K)=INDEX_TEMP(I,J) COASAJ1A.198 INDEX_TEMP(I,J)=ITEMP COASAJ1A.199 ENDIF COASAJ1A.200 241 CONTINUE COASAJ1A.201 240 CONTINUE COASAJ1A.202 COASAJ1A.203 COASAJ1A.204 C 2.5 Initialise source gather index as nearest point on source grid COASAJ1A.205 C to target coastal point. COASAJ1A.206 DO 250 I=1,COASTAL_POINTS COASAJ1A.207 INDEX_SRCE(I)=INDEX_TEMP(I,1) COASAJ1A.208 250 CONTINUE COASAJ1A.209 COASAJ1A.210 C 2.6 Select source gather index as nearest point of same land/sea type COASAJ1A.211 C when a land/sea mask has been input on target grid COASAJ1A.212 IF(MASK) THEN COASAJ1A.213 COASAJ1A.214 DO 260 K=4,1,-1 COASAJ1A.215 DO 261 I=1,COASTAL_POINTS COASAJ1A.216 IF(LAND_SEA_TARG(INDEX_TARG(I)).EQ.LAND_SEA_SRCE(INDEX_TEMP(I,K))) COASAJ1A.217 * INDEX_SRCE(I)=INDEX_TEMP(I,K) COASAJ1A.218 261 CONTINUE COASAJ1A.219 260 CONTINUE COASAJ1A.220 COASAJ1A.221 ENDIF COASAJ1A.222 COASAJ1A.223 C 2.7 Update coastal values of land-sea mask COASAJ1A.224 COASAJ1A.225 DO 270 I=1,COASTAL_POINTS COASAJ1A.226 LAND_SEA_TEMP(INDEX_TARG(I))=LAND_SEA_SRCE(INDEX_SRCE(I)) COASAJ1A.227 270 CONTINUE COASAJ1A.228 COASAJ1A.229 COASAJ1A.230 C 2.8 Overwrite target land/sea mask with estimate or output COASAJ1A.231 C indices of target land/sea points for which none of 4 surrounding COASAJ1A.232 C source points are of same type. COASAJ1A.233 COASAJ1A.234 IF(.NOT.MASK)THEN COASAJ1A.235 DO 280 I=1,POINTS COASAJ1A.236 LAND_SEA_TARG(I)=LAND_SEA_TEMP(I) COASAJ1A.237 280 CONTINUE COASAJ1A.238 LAND_POINTS_UNRES=0 AD100293.9 SEA_POINTS_UNRES=0 AD100293.10 COASAJ1A.239 ELSE COASAJ1A.240 COASAJ1A.241 DO 281 I=1,POINTS COASAJ1A.242 LOGIC_TEST(I)=LAND_SEA_TARG(I).EQ.0.AND. COASAJ1A.243 * (LAND_SEA_TEMP(I).NE.LAND_SEA_TARG(I)) COASAJ1A.244 281 CONTINUE COASAJ1A.245 COASAJ1A.246 SEA_POINTS_UNRES = 0 GSS5F402.415 DO I=1,POINTS GSS5F402.416 IF(LOGIC_TEST(I))THEN GSS5F402.417 SEA_POINTS_UNRES=SEA_POINTS_UNRES + 1 GSS5F402.418 INDEX_TARG_SEA_UNRES(SEA_POINTS_UNRES) = I GSS5F402.419 END IF GSS5F402.420 END DO GSS5F402.421 COASAJ1A.249 DO 282 I=1,POINTS COASAJ1A.250 LOGIC_TEST(I)=LAND_SEA_TARG(I).EQ.1.AND. COASAJ1A.251 * (LAND_SEA_TEMP(I).NE.LAND_SEA_TARG(I)) COASAJ1A.252 282 CONTINUE COASAJ1A.253 COASAJ1A.254 LAND_POINTS_UNRES = 0 GSS5F402.422 DO I=1,POINTS GSS5F402.423 IF(LOGIC_TEST(I))THEN GSS5F402.424 LAND_POINTS_UNRES=LAND_POINTS_UNRES + 1 GSS5F402.425 INDEX_TARG_LAND_UNRES(LAND_POINTS_UNRES) = I GSS5F402.426 END IF GSS5F402.427 END DO GSS5F402.428 COASAJ1A.257 ENDIF COASAJ1A.258 COASAJ1A.259 RETURN COASAJ1A.260 END COASAJ1A.261 *ENDIF COASAJ1A.262