*IF DEF,A09_2B CALRHC2B.2
C ******************************COPYRIGHT****************************** CALRHC2B.3
C (c) CROWN COPYRIGHT 1998, METEOROLOGICAL OFFICE, All Rights Reserved. CALRHC2B.4
C CALRHC2B.5
C Use, duplication or disclosure of this code is subject to the CALRHC2B.6
C restrictions as set forth in the contract. CALRHC2B.7
C CALRHC2B.8
C Meteorological Office CALRHC2B.9
C London Road CALRHC2B.10
C BRACKNELL CALRHC2B.11
C Berkshire UK CALRHC2B.12
C RG12 2SZ CALRHC2B.13
C CALRHC2B.14
C If no contract has been raised with this copy of the code, the use, CALRHC2B.15
C duplication or disclosure of it is strictly prohibited. Permission CALRHC2B.16
C to do so must first be obtained in writing from the Head of Numerical CALRHC2B.17
C Modelling at the above address. CALRHC2B.18
C ******************************COPYRIGHT****************************** CALRHC2B.19
C CALRHC2B.20
! CALRHC2B.21
SUBROUTINE RHCRIT_CALC(AK,BK,AKH,BKH,PSTAR,RHCPT,LEVELS, 3,2CALRHC2B.22
& POINTS,PFIELD,T,Q,QCF,ROW_LENGTH,LAND,ICE_FRAC,BL_LEVELS) CALRHC2B.23
! CALRHC2B.24
IMPLICIT NONE CALRHC2B.25
! CALRHC2B.26
! CALRHC2B.27
! Purpose: To calculate the critical relative humidity in every CALRHC2B.28
! grid-box. CALRHC2B.29
! CALRHC2B.30
! Method : The critical relative humidity of a certain grid-box is CALRHC2B.31
! determined from the variance in a 3*3 set of boxes centred CALRHC2B.32
! on it. A fit, dependent on pressure, relates the variance CALRHC2B.33
! of the 3*3 region to the variance within the one grid-box. CALRHC2B.34
! This variance is converted to a critical relative humidity CALRHC2B.35
! in a straightforward fashion. CALRHC2B.36
! Some points in the 3*3 region may be excluded from the CALRHC2B.37
! variance calculation in the BL layers, if their CALRHC2B.38
! surfaces do not 'match'. The criterion for matching is that CALRHC2B.39
! land and sea-ice match, but that open ocean does not match CALRHC2B.40
! with either of these. CALRHC2B.41
! In all layers, points in the 3*3 region which lie outside 3 CALRHC2B.42
! std devs of the mean are excluded in a second iteration of CALRHC2B.43
! the main calculation. CALRHC2B.44
! Notice that RHc is not the same at all points on the polar CALRHC2B.45
! row, which gives different values of T, q and qcl at the CALRHC2B.46
! polar row. However, these polar values are never used by CALRHC2B.47
! the physics, so this polar discrepancy does not affect CALRHC2B.48
! model evolution. CALRHC2B.49
! CALRHC2B.50
! Compatible with version 2B of LS_CLD CALRHC2B.51
! CALRHC2B.52
! CALRHC2B.53
! Current Owner of Code: S. Cusack CALRHC2B.54
! CALRHC2B.55
! History: CALRHC2B.56
! Version Date Comment CALRHC2B.57
! 4.5 15/09/98 Original Code S. Cusack CALRHC2B.58
! CALRHC2B.59
! Description of Code: CALRHC2B.60
! FORTRAN 77 + common extensions also in Fortran90. CALRHC2B.61
! This code is written to UMDP3 version 6 programming standards. CALRHC2B.62
! CALRHC2B.63
! System component covered: P292 CALRHC2B.64
! CALRHC2B.65
! Documentation: CALRHC2B.66
! CALRHC2B.67
! Global Variables:---------------------------------------------------- CALRHC2B.68
! CALRHC2B.69
*CALL C_R_CP
CALRHC2B.70
*CALL C_EPSLON
CALRHC2B.71
*CALL C_LHEAT
CALRHC2B.72
*CALL C_0_DG_C
CALRHC2B.73
! CALRHC2B.74
! Subroutine arguments CALRHC2B.75
!----------------------------------------------------------------------- CALRHC2B.76
! IN variables CALRHC2B.77
!----------------------------------------------------------------------- CALRHC2B.78
INTEGER LEVELS ! No. of levels being processed. CALRHC2B.79
! CALRHC2B.80
INTEGER BL_LEVELS ! No. of BL levels being processed. CALRHC2B.81
! CALRHC2B.82
INTEGER POINTS ! No. of gridpoints being processed. CALRHC2B.83
! CALRHC2B.84
INTEGER PFIELD ! No. of points in global field (at one CALRHC2B.85
! vertical level). CALRHC2B.86
INTEGER ROW_LENGTH CALRHC2B.87
! CALRHC2B.88
REAL PSTAR(PFIELD) ! Surface pressure (Pa). CALRHC2B.89
REAL ICE_FRAC(PFIELD) ! Ice fraction. CALRHC2B.90
! CALRHC2B.91
REAL AK(LEVELS) ! Hybrid "A" co-ordinate. CALRHC2B.92
REAL BK(LEVELS) ! Hybrid "B" co-ordinate. CALRHC2B.93
REAL AKH(LEVELS+1) ! Hybrid "A" co-ordinate. CALRHC2B.94
REAL BKH(LEVELS+1) ! Hybrid "B" co-ordinate. CALRHC2B.95
REAL Q(PFIELD,LEVELS) ! Total water content (Q+QCL,kg per kg) CALRHC2B.96
REAL QCF(PFIELD,LEVELS) ! Ice water content (kg per kg air) CALRHC2B.97
REAL T(PFIELD,LEVELS) ! Liquid/frozen water temperature (TL,K) CALRHC2B.98
LOGICAL LAND(PFIELD) ! The model land mask CALRHC2B.99
!----------------------------------------------------------------------- CALRHC2B.100
! OUT variables CALRHC2B.101
!----------------------------------------------------------------------- CALRHC2B.102
REAL RHCPT(PFIELD,LEVELS) ! Critical relative humidity at every CALRHC2B.103
! grid cell. CALRHC2B.104
! CALRHC2B.105
! Local Parameters CALRHC2B.106
! CALRHC2B.107
*CALL RHCCON2B
CALRHC2B.108
! CALRHC2B.109
REAL INV9, LS, LSRCP, ERCPR CALRHC2B.110
PARAMETER ( INV9 = 1./9. CALRHC2B.111
& , LS = LC+LF CALRHC2B.112
& , LSRCP = (LC+LF)/CP CALRHC2B.113
& , ERCPR = EPSILON/(CP*R)) CALRHC2B.114
! CALRHC2B.115
! Local Variables CALRHC2B.116
! CALRHC2B.117
REAL CALRHC2B.118
& MEAN_SUPSAT ! MEAN RH OF 3*3 REGION CALRHC2B.119
& ,P_LEV(POINTS,LEVELS)! Pressure at model levels CALRHC2B.120
& ,TL(POINTS,LEVELS) ! Conserved temperature (P292.1, UMDP29) CALRHC2B.121
& ,QT(POINTS,LEVELS) ! Conserved WATER(P292.2, UMDP29) CALRHC2B.122
& , TOT_VAR ! TOTAL VARIANCE OF 3*3 REGION CALRHC2B.123
& , QST(POINTS) ! SATURATION VAPOUR PRESSURE IN GRID-BOX CALRHC2B.124
& , SUPSAT(POINTS,LEVELS)! 'RELATIVE HUMIDITY' OF GRID-BOX CALRHC2B.125
& , SUPSAT_SD_1 ! STANDARD DEVIATION OF 'R.H.' IN GRID-BOX CALRHC2B.126
& , SUPSAT_SD_3 ! RESOLVED STD DEV OF 'R.H.' IN 3*3 REGION CALRHC2B.127
& , P_GRAD(POINTS,LEVELS)! CONSTANT WHICH RELATES RH_SD_3 TO CALRHC2B.128
! RH_SD_1 CALRHC2B.129
& , ROOT_6 ! =sqrt(6.) CALRHC2B.130
& , LATHT ! =Lc if T>Tm, ELSE = Lc+Lf CALRHC2B.131
& , AL(POINTS) ! Variable defined in P292.6 in UMDP 29 CALRHC2B.132
& , SURF_MULT(POINTS,8)! A multiplier to take into account CALRHC2B.133
! surface matching. CALRHC2B.134
& , THREE_SIGMA ! Three times sigma CALRHC2B.135
& , SUPSAT1 ! Temporary variable CALRHC2B.136
& , SUPSAT2 ! Temporary variable CALRHC2B.137
& , SUPSAT3 ! Temporary variable CALRHC2B.138
& , SUPSAT4 ! Temporary variable CALRHC2B.139
& , SUPSAT5 ! Temporary variable CALRHC2B.140
& , SUPSAT6 ! Temporary variable CALRHC2B.141
& , SUPSAT7 ! Temporary variable CALRHC2B.142
& , SUPSAT8 ! Temporary variable CALRHC2B.143
! CALRHC2B.144
INTEGER CALRHC2B.145
& I, K, J ! Simple loop variables CALRHC2B.146
& , ICOUNT(POINTS) ! Counter of points CALRHC2B.147
& , COUNT ! Counter of points CALRHC2B.148
& , RL, RLM1, RLP1 ! CALRHC2B.149
! CALRHC2B.150
LOGICAL CALRHC2B.151
& OCEAN(POINTS) ! Those points which are not land, and have CALRHC2B.152
! a sea-ice fraction less than 0.25. CALRHC2B.153
! CALRHC2B.154
! External subroutine calls: ------------------------------------------ CALRHC2B.155
EXTERNAL QSAT CALRHC2B.156
!- End of Header CALRHC2B.157
! CALRHC2B.158
! CALRHC2B.159
ROOT_6=SQRT(6.) CALRHC2B.160
RL=ROW_LENGTH CALRHC2B.161
RLP1=ROW_LENGTH+1 CALRHC2B.162
RLM1=ROW_LENGTH-1 CALRHC2B.163
! CALRHC2B.164
DO K=1,LEVELS CALRHC2B.165
DO I=1,POINTS CALRHC2B.166
P_LEV(I,K)=AK(K)+PSTAR(I)*BK(K) CALRHC2B.167
P_GRAD(I,K)=RHC_CON1+RHC_CON2*(P_LEV(I,K)-RHC_CON4)/ CALRHC2B.168
& (RHC_CON3+ABS(P_LEV(I,K)-RHC_CON4)) CALRHC2B.169
! Calculate Tl and QT as in P292.1, P292.2 in UMDP 29. CALRHC2B.170
! (Assumes version 3A onwards of Section 4) CALRHC2B.171
TL(I,K)=T(I,K)-LSRCP*QCF(I,K) CALRHC2B.172
QT(I,K)=Q(I,K)+QCF(I,K) CALRHC2B.173
ENDDO CALRHC2B.174
ENDDO CALRHC2B.175
! CALRHC2B.176
! Ocean points defined now as not land and where ice fraction LT 0.25 CALRHC2B.177
DO I=1,POINTS CALRHC2B.178
OCEAN(I)=(.NOT.LAND(I)).AND.(ICE_FRAC(I).LT.2.5E-1) CALRHC2B.179
ENDDO CALRHC2B.180
! CALRHC2B.181
! A real no. is now assigned to every neighbouring point of every point CALRHC2B.182
! on the grid, if their surfaces match it has the value one, else it is CALRHC2B.183
! zero. CALRHC2B.184
DO J=1,8 CALRHC2B.185
DO I=(ROW_LENGTH+2),(POINTS-ROW_LENGTH) CALRHC2B.186
SURF_MULT(I,J)=0. CALRHC2B.187
ENDDO CALRHC2B.188
ENDDO CALRHC2B.189
DO I=(ROW_LENGTH+2),(POINTS-ROW_LENGTH) CALRHC2B.190
ICOUNT(I)=1 CALRHC2B.191
IF ((OCEAN(I).AND.OCEAN(I-RLP1)).OR. CALRHC2B.192
& (.NOT.OCEAN(I).AND..NOT.OCEAN(I-RLP1))) THEN CALRHC2B.193
SURF_MULT(I,1)=1. CALRHC2B.194
ICOUNT(I)=ICOUNT(I)+1 CALRHC2B.195
ENDIF CALRHC2B.196
IF ((OCEAN(I).AND.OCEAN(I-RL)).OR. CALRHC2B.197
& (.NOT.OCEAN(I).AND..NOT.OCEAN(I-RL))) THEN CALRHC2B.198
SURF_MULT(I,2)=1. CALRHC2B.199
ICOUNT(I)=ICOUNT(I)+1 CALRHC2B.200
ENDIF CALRHC2B.201
IF ((OCEAN(I).AND.OCEAN(I-RLM1)).OR. CALRHC2B.202
& (.NOT.OCEAN(I).AND..NOT.OCEAN(I-RLM1))) THEN CALRHC2B.203
SURF_MULT(I,3)=1. CALRHC2B.204
ICOUNT(I)=ICOUNT(I)+1 CALRHC2B.205
ENDIF CALRHC2B.206
IF ((OCEAN(I).AND.OCEAN(I-1)).OR. CALRHC2B.207
& (.NOT.OCEAN(I).AND..NOT.OCEAN(I-1))) THEN CALRHC2B.208
SURF_MULT(I,4)=1. CALRHC2B.209
ICOUNT(I)=ICOUNT(I)+1 CALRHC2B.210
ENDIF CALRHC2B.211
IF ((OCEAN(I).AND.OCEAN(I+1)).OR. CALRHC2B.212
& (.NOT.OCEAN(I).AND..NOT.OCEAN(I+1))) THEN CALRHC2B.213
SURF_MULT(I,5)=1. CALRHC2B.214
ICOUNT(I)=ICOUNT(I)+1 CALRHC2B.215
ENDIF CALRHC2B.216
IF ((OCEAN(I).AND.OCEAN(I+RLM1)).OR. CALRHC2B.217
& (.NOT.OCEAN(I).AND..NOT.OCEAN(I+RLM1))) THEN CALRHC2B.218
SURF_MULT(I,6)=1. CALRHC2B.219
ICOUNT(I)=ICOUNT(I)+1 CALRHC2B.220
ENDIF CALRHC2B.221
IF ((OCEAN(I).AND.OCEAN(I+RL)).OR. CALRHC2B.222
& (.NOT.OCEAN(I).AND..NOT.OCEAN(I+RL))) THEN CALRHC2B.223
SURF_MULT(I,7)=1. CALRHC2B.224
ICOUNT(I)=ICOUNT(I)+1 CALRHC2B.225
ENDIF CALRHC2B.226
IF ((OCEAN(I).AND.OCEAN(I+RLP1)).OR. CALRHC2B.227
& (.NOT.OCEAN(I).AND..NOT.OCEAN(I+RLP1))) THEN CALRHC2B.228
SURF_MULT(I,8)=1. CALRHC2B.229
ICOUNT(I)=ICOUNT(I)+1 CALRHC2B.230
ENDIF CALRHC2B.231
ENDDO CALRHC2B.232
! CALRHC2B.233
! An initial sweep is done for all grid-cells, obtaining an initial CALRHC2B.234
! estimate of the variance of the 3*3 grid. CALRHC2B.235
! CALRHC2B.236
DO K=1,BL_LEVELS CALRHC2B.237
CALL QSAT
(QST,TL(1,K),P_LEV(1,K),POINTS) CALRHC2B.238
DO I=1,POINTS CALRHC2B.239
IF (TL(I,K).GT.TM) THEN CALRHC2B.240
LATHT=LC/TL(I,K) CALRHC2B.241
ELSE CALRHC2B.242
LATHT=LS/TL(I,K) CALRHC2B.243
ENDIF CALRHC2B.244
AL(I)=1./(1.+LATHT*LATHT*ERCPR*QST(I)) CALRHC2B.245
! SUPSAT given by P292.3 of UMDP 29. CALRHC2B.246
SUPSAT(I,K)=AL(I)*(QT(I,K)-QST(I)) CALRHC2B.247
ENDDO CALRHC2B.248
DO I=(ROW_LENGTH+2),(POINTS-ROW_LENGTH-1) CALRHC2B.249
SUPSAT1=SURF_MULT(I,1)*SUPSAT(I-RLP1,K) CALRHC2B.250
SUPSAT2=SURF_MULT(I,2)*SUPSAT(I-RL,K) CALRHC2B.251
SUPSAT3=SURF_MULT(I,3)*SUPSAT(I-RLM1,K) CALRHC2B.252
SUPSAT4=SURF_MULT(I,4)*SUPSAT(I-1,K) CALRHC2B.253
SUPSAT5=SURF_MULT(I,5)*SUPSAT(I+1,K) CALRHC2B.254
SUPSAT6=SURF_MULT(I,6)*SUPSAT(I+RLM1,K) CALRHC2B.255
SUPSAT7=SURF_MULT(I,7)*SUPSAT(I+RL,K) CALRHC2B.256
SUPSAT8=SURF_MULT(I,8)*SUPSAT(I+RLP1,K) CALRHC2B.257
MEAN_SUPSAT=(SUPSAT1 + SUPSAT2 + SUPSAT3 + SUPSAT4 CALRHC2B.258
& + SUPSAT5 + SUPSAT6 + SUPSAT7 + SUPSAT8 CALRHC2B.259
& + SUPSAT(I,K)) / ICOUNT(I) CALRHC2B.260
TOT_VAR=SUPSAT1*SUPSAT1 + SUPSAT2*SUPSAT2 CALRHC2B.261
& + SUPSAT3*SUPSAT3 + SUPSAT4*SUPSAT4 CALRHC2B.262
& + SUPSAT5*SUPSAT5 + SUPSAT6*SUPSAT6 CALRHC2B.263
& + SUPSAT7*SUPSAT7 + SUPSAT8*SUPSAT8 CALRHC2B.264
& + SUPSAT(I,K)*SUPSAT(I,K) CALRHC2B.265
& - ICOUNT(I)*MEAN_SUPSAT*MEAN_SUPSAT CALRHC2B.266
! CALRHC2B.267
! Now remove the statistical outliers from the 3*3 region, so that CALRHC2B.268
! sigma, and hence RHcrit, is not biased by extreme values. CALRHC2B.269
! Points outside 3*sigma of the mean are considered outliers and are CALRHC2B.270
! rejected. CALRHC2B.271
IF (ICOUNT(I).GT.1) THEN CALRHC2B.272
THREE_SIGMA=3.*SQRT(TOT_VAR/ICOUNT(I)) CALRHC2B.273
ELSE CALRHC2B.274
THREE_SIGMA=QST(I)*0.01 CALRHC2B.275
ENDIF CALRHC2B.276
COUNT=1 CALRHC2B.277
IF (ABS(SUPSAT(I-RLP1,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.278
SUPSAT1=0. CALRHC2B.279
ELSE IF (SURF_MULT(I,1).GT.0.5) THEN CALRHC2B.280
COUNT=COUNT+1 CALRHC2B.281
ENDIF CALRHC2B.282
IF (ABS(SUPSAT(I-RL,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.283
SUPSAT2=0. CALRHC2B.284
ELSE IF (SURF_MULT(I,2).GT.0.5) THEN CALRHC2B.285
COUNT=COUNT+1 CALRHC2B.286
ENDIF CALRHC2B.287
IF (ABS(SUPSAT(I-RLM1,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.288
SUPSAT3=0. CALRHC2B.289
ELSE IF (SURF_MULT(I,3).GT.0.5) THEN CALRHC2B.290
COUNT=COUNT+1 CALRHC2B.291
ENDIF CALRHC2B.292
IF (ABS(SUPSAT(I-1,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.293
SUPSAT4=0. CALRHC2B.294
ELSE IF (SURF_MULT(I,4).GT.0.5) THEN CALRHC2B.295
COUNT=COUNT+1 CALRHC2B.296
ENDIF CALRHC2B.297
IF (ABS(SUPSAT(I+1,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.298
SUPSAT5=0. CALRHC2B.299
ELSE IF (SURF_MULT(I,5).GT.0.5) THEN CALRHC2B.300
COUNT=COUNT+1 CALRHC2B.301
ENDIF CALRHC2B.302
IF (ABS(SUPSAT(I+RLM1,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.303
SUPSAT6=0. CALRHC2B.304
ELSE IF (SURF_MULT(I,6).GT.0.5) THEN CALRHC2B.305
COUNT=COUNT+1 CALRHC2B.306
ENDIF CALRHC2B.307
IF (ABS(SUPSAT(I+RL,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.308
SUPSAT7=0. CALRHC2B.309
ELSE IF (SURF_MULT(I,7).GT.0.5) THEN CALRHC2B.310
COUNT=COUNT+1 CALRHC2B.311
ENDIF CALRHC2B.312
IF (ABS(SUPSAT(I+RLP1,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.313
SUPSAT8=0. CALRHC2B.314
ELSE IF (SURF_MULT(I,8).GT.0.5) THEN CALRHC2B.315
COUNT=COUNT+1 CALRHC2B.316
ENDIF CALRHC2B.317
IF (COUNT.GT.1) THEN CALRHC2B.318
MEAN_SUPSAT=(SUPSAT1 + SUPSAT2 + SUPSAT3 + SUPSAT4 CALRHC2B.319
& + SUPSAT5 + SUPSAT6 + SUPSAT7 + SUPSAT8 CALRHC2B.320
& + SUPSAT(I,K)) / COUNT CALRHC2B.321
TOT_VAR=SUPSAT1*SUPSAT1 + SUPSAT2*SUPSAT2 CALRHC2B.322
& + SUPSAT3*SUPSAT3 + SUPSAT4*SUPSAT4 CALRHC2B.323
& + SUPSAT5*SUPSAT5 + SUPSAT6*SUPSAT6 CALRHC2B.324
& + SUPSAT7*SUPSAT7 + SUPSAT8*SUPSAT8 CALRHC2B.325
& + SUPSAT(I,K)*SUPSAT(I,K) CALRHC2B.326
& - COUNT*MEAN_SUPSAT*MEAN_SUPSAT CALRHC2B.327
SUPSAT_SD_3=SQRT(TOT_VAR/COUNT) CALRHC2B.328
ELSE CALRHC2B.329
SUPSAT_SD_3=QST(I)*0.01 CALRHC2B.330
ENDIF CALRHC2B.331
! CALRHC2B.332
! P_GRAD determines the relation between 3*3 and sub-grid variance. CALRHC2B.333
SUPSAT_SD_1=P_GRAD(I,K)*SUPSAT_SD_3 CALRHC2B.334
! RHCPT defined from P292.14 in UMDP 29 CALRHC2B.335
RHCPT(I,K)=1.-ROOT_6*SUPSAT_SD_1/(AL(I)*QST(I)) CALRHC2B.336
! RHcrit is now limited to lie between a range defined in RHCCON2B CALRHC2B.337
RHCPT(I,K)=MAX(RHCPT(I,K),RHC_MIN) CALRHC2B.338
RHCPT(I,K)=MIN(RHCPT(I,K),RHC_MAX) CALRHC2B.339
ENDDO CALRHC2B.340
! North and south haloes not determined above, now they are filled in. CALRHC2B.341
! Call to SWAPBOUNDS after this subroutine fills the haloes in properly. CALRHC2B.342
RHCPT(ROW_LENGTH+1,K)=RHCPT(ROW_LENGTH+2,K) CALRHC2B.343
DO I=1,ROW_LENGTH CALRHC2B.344
RHCPT(I,K)=RHCPT(I+ROW_LENGTH,K) CALRHC2B.345
ENDDO CALRHC2B.346
RHCPT(POINTS-ROW_LENGTH,K)=RHCPT(POINTS-ROW_LENGTH-1,K) CALRHC2B.347
DO I=(POINTS-ROW_LENGTH+1),POINTS CALRHC2B.348
RHCPT(I,K)=RHCPT(I-ROW_LENGTH,K) CALRHC2B.349
ENDDO CALRHC2B.350
ENDDO CALRHC2B.351
! CALRHC2B.352
! The same calculations as above are performed, but the 'surface match' CALRHC2B.353
! criterion is now dropped (atmosphere less influenced by surface at CALRHC2B.354
! greater heights). CALRHC2B.355
IF (LEVELS.GT.BL_LEVELS) THEN CALRHC2B.356
! CALRHC2B.357
DO K=(BL_LEVELS+1),LEVELS CALRHC2B.358
CALL QSAT
(QST,TL(1,K),P_LEV(1,K),POINTS) CALRHC2B.359
DO I=1,POINTS CALRHC2B.360
IF (TL(I,K).GT.TM) THEN CALRHC2B.361
LATHT=LC/TL(I,K) CALRHC2B.362
ELSE CALRHC2B.363
LATHT=LS/TL(I,K) CALRHC2B.364
ENDIF CALRHC2B.365
AL(I)=1./(1.+LATHT*LATHT*ERCPR*QST(I)) CALRHC2B.366
SUPSAT(I,K)=AL(I)*(QT(I,K)-QST(I)) CALRHC2B.367
ENDDO CALRHC2B.368
DO I=(ROW_LENGTH+2),(POINTS-ROW_LENGTH-1) CALRHC2B.369
SUPSAT1=SUPSAT(I-RLP1,K) CALRHC2B.370
SUPSAT2=SUPSAT(I-RL,K) CALRHC2B.371
SUPSAT3=SUPSAT(I-RLM1,K) CALRHC2B.372
SUPSAT4=SUPSAT(I-1,K) CALRHC2B.373
SUPSAT5=SUPSAT(I+1,K) CALRHC2B.374
SUPSAT6=SUPSAT(I+RLM1,K) CALRHC2B.375
SUPSAT7=SUPSAT(I+RL,K) CALRHC2B.376
SUPSAT8=SUPSAT(I+RLP1,K) CALRHC2B.377
MEAN_SUPSAT=(SUPSAT1 + SUPSAT2 + SUPSAT3 + SUPSAT4 CALRHC2B.378
& + SUPSAT5 + SUPSAT6 + SUPSAT7 + SUPSAT8 CALRHC2B.379
& + SUPSAT(I,K)) * INV9 CALRHC2B.380
TOT_VAR=SUPSAT1*SUPSAT1 + SUPSAT2*SUPSAT2 CALRHC2B.381
& + SUPSAT3*SUPSAT3 + SUPSAT4*SUPSAT4 CALRHC2B.382
& + SUPSAT5*SUPSAT5 + SUPSAT6*SUPSAT6 CALRHC2B.383
& + SUPSAT7*SUPSAT7 + SUPSAT8*SUPSAT8 CALRHC2B.384
& + SUPSAT(I,K)*SUPSAT(I,K) CALRHC2B.385
& - 9. * MEAN_SUPSAT*MEAN_SUPSAT CALRHC2B.386
! CALRHC2B.387
! Now remove the statistical outliers from the 3*3 region, so that CALRHC2B.388
! sigma, and hence RHcrit, is not biased by extreme values. CALRHC2B.389
! Points outside 3*sigma of the mean are considered outliers and are CALRHC2B.390
! rejected. CALRHC2B.391
THREE_SIGMA=3.*SQRT(TOT_VAR*INV9) CALRHC2B.392
COUNT=1 CALRHC2B.393
IF (ABS(SUPSAT(I-RLP1,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.394
SUPSAT1=0. CALRHC2B.395
ELSE CALRHC2B.396
COUNT=COUNT+1 CALRHC2B.397
ENDIF CALRHC2B.398
IF (ABS(SUPSAT(I-RL,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.399
SUPSAT2=0. CALRHC2B.400
ELSE CALRHC2B.401
COUNT=COUNT+1 CALRHC2B.402
ENDIF CALRHC2B.403
IF (ABS(SUPSAT(I-RLM1,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.404
SUPSAT3=0. CALRHC2B.405
ELSE CALRHC2B.406
COUNT=COUNT+1 CALRHC2B.407
ENDIF CALRHC2B.408
IF (ABS(SUPSAT(I-1,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.409
SUPSAT4=0. CALRHC2B.410
ELSE CALRHC2B.411
COUNT=COUNT+1 CALRHC2B.412
ENDIF CALRHC2B.413
IF (ABS(SUPSAT(I+1,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.414
SUPSAT5=0. CALRHC2B.415
ELSE CALRHC2B.416
COUNT=COUNT+1 CALRHC2B.417
ENDIF CALRHC2B.418
IF (ABS(SUPSAT(I+RLM1,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.419
SUPSAT6=0. CALRHC2B.420
ELSE CALRHC2B.421
COUNT=COUNT+1 CALRHC2B.422
ENDIF CALRHC2B.423
IF (ABS(SUPSAT(I+RL,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.424
SUPSAT7=0. CALRHC2B.425
ELSE CALRHC2B.426
COUNT=COUNT+1 CALRHC2B.427
ENDIF CALRHC2B.428
IF (ABS(SUPSAT(I+RLP1,K)-MEAN_SUPSAT).GT.THREE_SIGMA) THEN CALRHC2B.429
SUPSAT8=0. CALRHC2B.430
ELSE CALRHC2B.431
COUNT=COUNT+1 CALRHC2B.432
ENDIF CALRHC2B.433
IF (COUNT.GT.1) THEN CALRHC2B.434
MEAN_SUPSAT=(SUPSAT1 + SUPSAT2 + SUPSAT3 + SUPSAT4 CALRHC2B.435
& + SUPSAT5 + SUPSAT6 + SUPSAT7 + SUPSAT8 CALRHC2B.436
& + SUPSAT(I,K)) / COUNT CALRHC2B.437
TOT_VAR=SUPSAT1*SUPSAT1 + SUPSAT2*SUPSAT2 CALRHC2B.438
& + SUPSAT3*SUPSAT3 + SUPSAT4*SUPSAT4 CALRHC2B.439
& + SUPSAT5*SUPSAT5 + SUPSAT6*SUPSAT6 CALRHC2B.440
& + SUPSAT7*SUPSAT7 + SUPSAT8*SUPSAT8 CALRHC2B.441
& + SUPSAT(I,K)*SUPSAT(I,K) CALRHC2B.442
& - COUNT*MEAN_SUPSAT*MEAN_SUPSAT CALRHC2B.443
SUPSAT_SD_3=SQRT(TOT_VAR/COUNT) CALRHC2B.444
ELSE CALRHC2B.445
SUPSAT_SD_3=QST(I)*0.01 CALRHC2B.446
ENDIF CALRHC2B.447
! CALRHC2B.448
SUPSAT_SD_1=P_GRAD(I,K)*SUPSAT_SD_3 CALRHC2B.449
RHCPT(I,K)=1.-ROOT_6*SUPSAT_SD_1/(AL(I)*QST(I)) CALRHC2B.450
! RHcrit is now limited to lie between a range defined in RHCCON2B CALRHC2B.451
RHCPT(I,K)=MAX(RHCPT(I,K),RHC_MIN) CALRHC2B.452
RHCPT(I,K)=MIN(RHCPT(I,K),RHC_MAX) CALRHC2B.453
ENDDO CALRHC2B.454
! North and south haloes not determined above, now they are filled in. CALRHC2B.455
! Call to SWAPBOUNDS after this subroutine fills the haloes in properly. CALRHC2B.456
RHCPT(ROW_LENGTH+1,K)=RHCPT(ROW_LENGTH+2,K) CALRHC2B.457
DO I=1,ROW_LENGTH CALRHC2B.458
RHCPT(I,K)=RHCPT(I+ROW_LENGTH,K) CALRHC2B.459
ENDDO CALRHC2B.460
RHCPT(POINTS-ROW_LENGTH,K)=RHCPT(POINTS-ROW_LENGTH-1,K) CALRHC2B.461
DO I=(POINTS-ROW_LENGTH+1),POINTS CALRHC2B.462
RHCPT(I,K)=RHCPT(I-ROW_LENGTH,K) CALRHC2B.463
ENDDO CALRHC2B.464
ENDDO CALRHC2B.465
ENDIF ! LEVELS GT BL_LEVELS CALRHC2B.466
! CALRHC2B.467
RETURN CALRHC2B.468
END CALRHC2B.469
*ENDIF CALRHC2B.470