*IF DEF,C72_1A,AND,DEF,ATMOS,AND,DEF,OCEAN GLW1F404.19 C ******************************COPYRIGHT****************************** GTS2F400.2251 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.2252 C GTS2F400.2253 C Use, duplication or disclosure of this code is subject to the GTS2F400.2254 C restrictions as set forth in the contract. GTS2F400.2255 C GTS2F400.2256 C Meteorological Office GTS2F400.2257 C London Road GTS2F400.2258 C BRACKNELL GTS2F400.2259 C Berkshire UK GTS2F400.2260 C RG12 2SZ GTS2F400.2261 C GTS2F400.2262 C If no contract has been raised with this copy of the code, the use, GTS2F400.2263 C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.2264 C to do so must first be obtained in writing from the Head of Numerical GTS2F400.2265 C Modelling at the above address. GTS2F400.2266 C ******************************COPYRIGHT****************************** GTS2F400.2267 C GTS2F400.2268SUBROUTINE DO_AREAVER(GAPS_LAMBDA_SRCE,GAPS_PHI_SRCE,LROW_SRCE 24DOARAV1.3 &,INVERT_SRCE,DATA_SRCE,GAPS_LAMBDA_TARG,GAPS_PHI_TARG,COUNT_TARG OJG1F403.1 &,BASE_TARG,LROW_TARG,WANT,MASK_TARG,INDEX_SRCE,WEIGHT,ADJUST OJG1F403.2 &,DATA_TARG,ICODE,CMESSAGE) OJG1F403.3 CLL Subroutine DO_AREAVER ------------------------------------------- DOARAV1.7 CLL DOARAV1.8 CLL Purpose: OJG1F403.4 CLL OJG1F403.5 CLL Perform area-averaging to transform data from the source grid to DOARAV1.10 CLL the target grid, or adjust the values on the source grid to have OJG1F403.6 CLL the area-averages supplied on the target grid. The latter mode OJG1F403.7 CLL is intended for adjusting values obtained by interpolating from OJG1F403.8 CLL "target" to "source" in order to conserve the area-averages. OJG1F403.9 CLL This mode should be used ONLY if each source box belongs in OJG1F403.10 CLL exactly one target box. ADJUST=0 selects normal area-averaging, OJG1F403.11 CLL ADJUST=1 selects adjustment by addition (use this mode for fields OJG1F403.12 CLL which may have either sign), ADJUST=2 selects adjustment by OJG1F403.13 CLL multiplication (for fields which are positive-definite or OJG1F403.14 CLL negative-definite). OJG1F403.15 CLL OJG1F403.16 CLL The shape of the source and target grids are specified by their DOARAV1.12 CLL dimensions GAPS_aa_bb, which give the number of gaps in the DOARAV1.13 CLL aa=LAMBDA,PHI coordinate in the bb=SRCE,TARG grid. (The product DOARAV1.14 CLL of GAPS_LAMBDA_bb and GAPS_PHI_bb is the number of boxes in the DOARAV1.15 CLL bb grid.) DOARAV1.16 CLL DOARAV1.17 CLL The input and output data are supplied as 2D arrays DATA_SRCE and DOARAV1.18 CLL DATA_TARG, whose first dimensions should also be supplied. Speci- DOARAV1.19 CLL fying these sizes separately from the actual dimensions of the DOARAV1.20 CLL grids allows for columns and rows in the arrays to be ignored. DOARAV1.21 CLL A target land/sea mask should be supplied in MASK_TARG, with the DOARAV1.22 CLL value indicating wanted points specified in WANT. Points which DOARAV1.23 CLL are unwanted or which lie outside the source grid are not altered DOARAV1.24 CLL in DATA_TARG. DATA_SRCE can optionally be supplied with its rows OJG1F403.17 CLL in reverse order (i.e. with the first row corresponding to OJG1F403.18 CLL minimum LAMBDA). OJG1F403.19 CLL DOARAV1.26 CLL The arrays COUNT_TARG, BASE_TARG, INDEX_SRCE and WEIGHT should be DOARAV1.27 CLL supplied as returned by PRE_AREAVER q.v. DOARAV1.28 CLL DOARAV1.29 CLL Programming Standard, paper 4 version 4 (14.12.90) DOARAV1.33 CLL DOARAV1.34 CLL Modification history: OJG1F403.20 CLL OJG1F403.21 CLL Logical components covered : DOARAV1.35 CLL DOARAV1.36 CLL Project task : DOARAV1.37 CLL DOARAV1.38 CLL External documentation: Unified Model documentation paper No: DOARAV1.39 CLL Version: DOARAV1.40 CLL DOARAV1.41 CLLEND ----------------------------------------------------------------- DOARAV1.42 C DOARAV1.43 IMPLICIT NONE DOARAV1.44 C*L DOARAV1.45 INTEGER DOARAV1.46 & GAPS_LAMBDA_SRCE !IN number lambda gaps in source grid DOARAV1.47 &,GAPS_PHI_SRCE !IN number phi gaps in source grid DOARAV1.48 &,LROW_SRCE !IN first dimension of source arrays DOARAV1.49 &,GAPS_LAMBDA_TARG !IN number lambda gaps in target grid DOARAV1.50 &,GAPS_PHI_TARG !IN number phi gaps in target grid DOARAV1.51 &,LROW_TARG !IN first dimension of target arrays DOARAV1.52 &,COUNT_TARG(GAPS_LAMBDA_TARG,GAPS_PHI_TARG) DOARAV1.53 C !IN no. of source boxes in target box DOARAV1.54 &,BASE_TARG(GAPS_LAMBDA_TARG,GAPS_PHI_TARG) DOARAV1.55 C !IN first index in list for target box OJG1F403.22 &,INDEX_SRCE(*) !IN list of source box indices DOARAV1.57 &,ADJUST !IN selects normal or adjust mode OJG1F403.23 &,ICODE !OUT return code DOARAV1.58 LOGICAL DOARAV1.59 & INVERT_SRCE !IN DATA_SRCE rows in reverse order OJG1F403.24 &,WANT !IN indicator of wanted points in mask OJG1F403.25 &,MASK_TARG(LROW_TARG,*) !IN land/sea mask for target grid DOARAV1.61 C NB alternative intents below apply for normal/adjust mode OJG1F403.26 REAL DOARAV1.62 & DATA_SRCE(LROW_SRCE,*) !IN/INOUT data on source grid OJG1F403.27 &,WEIGHT(*) !IN list of weights for source boxes DOARAV1.64 &,DATA_TARG(LROW_TARG,*) !INOUT/IN data on target grid OJG1F403.28 CHARACTER DOARAV1.66 & CMESSAGE*(*) !OUT error message DOARAV1.67 C* DOARAV1.68 INTEGER DOARAV1.69 & IP ! pointer into lists DOARAV1.70 &,I ! loop index DOARAV1.72 &,IX1(GAPS_LAMBDA_SRCE*GAPS_PHI_SRCE) OJG1F403.29 C ! working SRCE LAMBDA indices OJG1F403.30 &,IY1(GAPS_LAMBDA_SRCE*GAPS_PHI_SRCE) OJG1F403.31 C ! working SRCE PHI indices OJG1F403.32 &,IX2,IY2 ! working TARG LAMBDA/PHI indices OJG1F403.33 REAL OJG1F403.34 & TEMP_TARG ! workspace for area-average OJG1F403.35 &,DELTA ! additive adjustment OJG1F403.36 &,RATIO ! multiplicative adjustment OJG1F403.37 C DOARAV1.73 CL Loop over all target boxes and calculate values as required. DOARAV1.74 C DOARAV1.75 C The weights and source box indices are recorded in continuous DOARAV1.76 C lists. COUNT_TARG indicates how many consecutive entries in these DOARAV1.77 C lists apply to each target box. DOARAV1.78 C DOARAV1.79 DO IY2=1,GAPS_PHI_TARG DOARAV1.80 DO IX2=1,GAPS_LAMBDA_TARG DOARAV1.81 IF ((MASK_TARG(IX2,IY2).EQV.WANT) DOARAV1.82 & .AND.COUNT_TARG(IX2,IY2).NE.0) THEN DOARAV1.83 TEMP_TARG=0. OJG1F403.38 DO I=1,COUNT_TARG(IX2,IY2) DOARAV1.85 IP=BASE_TARG(IX2,IY2)+I DOARAV1.86 IX1(I)=MOD(INDEX_SRCE(IP)-1,GAPS_LAMBDA_SRCE)+1 OJG1F403.39 IY1(I)=(INDEX_SRCE(IP)-1)/GAPS_LAMBDA_SRCE+1 OJG1F403.40 IF (INVERT_SRCE) IY1(I)=GAPS_PHI_SRCE-IY1(I)+1 OJG1F403.41 TEMP_TARG=TEMP_TARG+WEIGHT(IP)*DATA_SRCE(IX1(I),IY1(I)) OJG1F403.42 ENDDO DOARAV1.91 IF (ADJUST.EQ.0) THEN OJG1F403.43 DATA_TARG(IX2,IY2)=TEMP_TARG OJG1F403.44 ELSEIF (ADJUST.EQ.1) THEN OJG1F403.45 DELTA=DATA_TARG(IX2,IY2)-TEMP_TARG OJG1F403.46 DO I=1,COUNT_TARG(IX2,IY2) OJG1F403.47 DATA_SRCE(IX1(I),IY1(I))=DATA_SRCE(IX1(I),IY1(I))+DELTA OJG1F403.48 ENDDO OJG1F403.49 ELSEIF (ADJUST.EQ.2.AND.TEMP_TARG.NE.0.) THEN OJG1F403.50 RATIO=DATA_TARG(IX2,IY2)/TEMP_TARG OJG1F403.51 DO I=1,COUNT_TARG(IX2,IY2) OJG1F403.52 DATA_SRCE(IX1(I),IY1(I))=DATA_SRCE(IX1(I),IY1(I))*RATIO OJG1F403.53 ENDDO OJG1F403.54 ENDIF OJG1F403.55 ENDIF DOARAV1.92 ENDDO DOARAV1.93 ENDDO DOARAV1.94 C DOARAV1.95 ICODE=0 DOARAV1.96 CMESSAGE=' ' DOARAV1.97 RETURN DOARAV1.98 END DOARAV1.99 *ENDIF DOARAV1.100