*IF DEF,A03_6A SFRUGH6A.2
C *****************************COPYRIGHT****************************** SFRUGH6A.3
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved. SFRUGH6A.4
C SFRUGH6A.5
C Use, duplication or disclosure of this code is subject to the SFRUGH6A.6
C restrictions as set forth in the contract. SFRUGH6A.7
C SFRUGH6A.8
C Meteorological Office SFRUGH6A.9
C London Road SFRUGH6A.10
C BRACKNELL SFRUGH6A.11
C Berkshire UK SFRUGH6A.12
C RG12 2SZ SFRUGH6A.13
C SFRUGH6A.14
C If no contract has been raised with this copy of the code, the use, SFRUGH6A.15
C duplication or disclosure of it is strictly prohibited. Permission SFRUGH6A.16
C to do so must first be obtained in writing from the Head of Numerical SFRUGH6A.17
C Modelling at the above address. SFRUGH6A.18
C ******************************COPYRIGHT****************************** SFRUGH6A.19
! SFRUGH6A.20
!!! SUBROUTINE SF_ROUGH----------------------------------------------- SFRUGH6A.21
!!! SFRUGH6A.22
!!! Purpose: Calculate roughness lengths, blending height and wind SFRUGH6A.23
!!! profile factor SFRUGH6A.24
!!! SFRUGH6A.25
!!! SJ <- programmerof some or all of previous code changes SFRUGH6A.26
C Modification History: AJC1F405.47
C Version Date Change AJC1F405.48
C 4.5 Jul. 98 Kill the IBM specific lines (JCThil) AJC1F405.49
!!! SFRUGH6A.27
!!!-------------------------------------------------------------------- SFRUGH6A.28
SFRUGH6A.29
! Arguaments -------------------------------------------------------- SFRUGH6A.30
SFRUGH6A.31
SUBROUTINE SF_ROUGH ( 6,4SFRUGH6A.32
& P_FIELD,P_POINTS,LAND_FIELD,LAND_PTS,LAND_MASK,L_LAND,P1,LAND1, SFRUGH6A.33
& LAND_INDEX, SFRUGH6A.35
& L_Z0_OROG,Z1_UV,Z0MSEA,ICE_FRACT, SFRUGH6A.37
& LYING_SNOW,Z0V,SIL_OROG,HO2R2_OROG,RIB,Z0M_EFF,Z0M,Z0H, SFRUGH6A.38
& WIND_PROFILE_FACTOR,H_BLEND_OROG,MIZ_RUF,Z0HS,LTIMER SFRUGH6A.39
& ) SFRUGH6A.40
SFRUGH6A.41
IMPLICIT NONE SFRUGH6A.42
SFRUGH6A.43
INTEGER ! Variables defining grid. SFRUGH6A.44
& P_POINTS ! IN Number of P-grid points to be processed SFRUGH6A.45
&,P_FIELD ! IN Number of points on P-grid. SFRUGH6A.46
&,P1 ! IN First P-point to be processed. SFRUGH6A.47
&,LAND1 ! IN First land point to be processed. SFRUGH6A.48
&,LAND_PTS ! IN Number of land points to be processed. SFRUGH6A.49
&,LAND_FIELD ! IN Number of land points. SFRUGH6A.50
SFRUGH6A.51
&,LAND_INDEX(LAND_FIELD)!IN Index for compressed land point array; SFRUGH6A.53
! i'th element holds position in the FULL SFRUGH6A.54
! field of the ith land pt to be SFRUGH6A.55
! processed SFRUGH6A.56
LOGICAL SFRUGH6A.58
& LAND_MASK(P_FIELD) ! IN .TRUE. for land; .FALSE. elsewhere. F60 SFRUGH6A.59
&,L_LAND ! IN .TRUE. to calculate land points only SFRUGH6A.60
! This saves time when tiling SFRUGH6A.61
&,L_Z0_OROG ! IN .TRUE. to use orographic roughness. SFRUGH6A.62
&,LTIMER ! IN .TRUE. for timer diagnostics SFRUGH6A.63
SFRUGH6A.64
REAL SFRUGH6A.65
& HO2R2_OROG(LAND_FIELD)!IN Peak to trough height of unresolved SFRUGH6A.66
! orography devided by 2SQRT(2) (m). SFRUGH6A.67
&,ICE_FRACT(P_FIELD) ! IN Fraction of gridbox which is sea-ice. SFRUGH6A.68
&,LYING_SNOW(P_FIELD) ! IN Lying snow amount (kg per sq metre). SFRUGH6A.69
&,RIB(P_FIELD) ! IN Bulk Richardson number for lowest layer SFRUGH6A.70
&,SIL_OROG(LAND_FIELD) ! IN Silhouette area of unresolved orography SFRUGH6A.71
! per unit horizontal area SFRUGH6A.72
&,Z0V(P_FIELD) ! IN Vegetative roughness length (m). F6418 SFRUGH6A.73
&,Z1_UV(P_FIELD) ! IN Height of lowest atmospheric level (m). SFRUGH6A.74
SFRUGH6A.75
! Modified (INOUT) variables. SFRUGH6A.76
SFRUGH6A.77
REAL SFRUGH6A.78
& Z0MSEA(P_FIELD) ! INOUT Sea-surface roughness length for SFRUGH6A.79
! momentum (m). F617. SFRUGH6A.80
SFRUGH6A.81
! Output variables. SFRUGH6A.82
SFRUGH6A.83
REAL SFRUGH6A.84
& MIZ_RUF(P_FIELD) ! OUT Surface roughness length for the SFRUGH6A.85
! marginal ice zone at sea-ice points. SFRUGH6A.86
&,H_BLEND_OROG(P_FIELD)!OUT Blending height SFRUGH6A.87
&,WIND_PROFILE_FACTOR(P_FIELD) SFRUGH6A.88
! ! OUT For transforming effective surface SFRUGH6A.89
! transfer coefficients to those excluding SFRUGH6A.90
! form drag. SFRUGH6A.91
&,Z0M_EFF(P_FIELD) ! OUT Effective roughness length for SFRUGH6A.92
! momentum (m) SFRUGH6A.93
&,Z0H(P_FIELD) ! OUT Roughness length for heat and moisture SFRUGH6A.94
&,Z0M(P_FIELD) ! OUT Roughness length for momentum (m). SFRUGH6A.95
&,Z0HS(P_FIELD) ! OUT Roughness length for heat and moisture SFRUGH6A.96
! transport over sea. SFRUGH6A.97
SFRUGH6A.98
! Work Variables SFRUGH6A.99
SFRUGH6A.100
INTEGER SFRUGH6A.101
& I ! Loop counter SFRUGH6A.102
&,L ! Another loop counter - this time for land points SFRUGH6A.103
SFRUGH6A.104
REAL SFRUGH6A.105
& RIB_FN ! Interpolation coefficient for 0 < RIB < RI_CRIT SFRUGH6A.106
&,ZETA1 ! Work space SFRUGH6A.107
&,Z0 ! yet more workspace SFRUGH6A.108
SFRUGH6A.109
! Common parameters SFRUGH6A.110
SFRUGH6A.111
*CALL C_MDI
SFRUGH6A.112
*CALL C_VKMAN
SFRUGH6A.113
*CALL C_ROUGH
SFRUGH6A.114
*CALL C_SURF
SFRUGH6A.115
SFRUGH6A.116
! Local parameters SFRUGH6A.117
SFRUGH6A.118
REAL H_BLEND_MIN,H_BLEND_MAX SFRUGH6A.119
PARAMETER ( SFRUGH6A.120
& H_BLEND_MIN=0.0 ! Minimun value of blending height SFRUGH6A.121
&,H_BLEND_MAX=1000.0 ! Maximum value of blending height SFRUGH6A.122
& ) SFRUGH6A.123
SFRUGH6A.124
SFRUGH6A.125
EXTERNAL TIMER SFRUGH6A.126
SFRUGH6A.127
!----------------------------------------------------------------------- SFRUGH6A.128
!! 1 Fix roughness lengths for the various surface types. SFRUGH6A.129
!----------------------------------------------------------------------- SFRUGH6A.130
IF (LTIMER) THEN SFRUGH6A.131
CALL TIMER
('SF_ROUGH',3) SFRUGH6A.132
ENDIF SFRUGH6A.133
SFRUGH6A.134
IF(.NOT.L_LAND) THEN ! sea points as well as land points SFRUGH6A.135
DO I = P1,P1+P_POINTS-1 SFRUGH6A.136
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFRUGH6A.137
!! 1.1 Liquid sea. Overwrite sea-ice and land in 3.1.2, 3.1.3. SFRUGH6A.138
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFRUGH6A.139
Z0M(I) = Z0MSEA(I) ! P243.B5 SFRUGH6A.140
Z0H(I) = Z0HSEA ! " SFRUGH6A.141
Z0M_EFF(I) = Z0MSEA(I) SFRUGH6A.142
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFRUGH6A.143
!! 1.2 Sea ice: Z0MIZ set on all points for input to FCDCH routine SFRUGH6A.144
!! in CD_MIZ,CH_MIZ calculations. Similarily Z0HSEA SFRUGH6A.145
!! CD_LEAD,CH_LEAD calculations. Z0SICE for CD,CH over sea-ice. SFRUGH6A.146
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFRUGH6A.147
MIZ_RUF(I) = Z0MIZ SFRUGH6A.148
Z0HS(I) = Z0HSEA SFRUGH6A.149
IF (ICE_FRACT(I).GT.0.0 .AND. .NOT.LAND_MASK(I)) THEN SFRUGH6A.150
Z0M(I) = Z0SICE ! P243.B4 SFRUGH6A.151
Z0H(I) = Z0SICE ! " SFRUGH6A.152
Z0M_EFF(I) = Z0SICE SFRUGH6A.153
ENDIF SFRUGH6A.154
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFRUGH6A.155
!! 1.2a Specify blending height for all points. Set to minimum value SFRUGH6A.156
!! so that LAMBDA_EFF = LAMBDA over the sea in KMKH. SFRUGH6A.157
!! This avoids having to pass land-sea mask into KMKH. SFRUGH6A.158
!! Also set the wind profile factor to the default value of 1.0 SFRUGH6A.159
!! for non-land points. SFRUGH6A.160
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFRUGH6A.161
SFRUGH6A.162
H_BLEND_OROG(I) = H_BLEND_MIN SFRUGH6A.163
WIND_PROFILE_FACTOR(I) = 1.0 SFRUGH6A.164
SFRUGH6A.165
ENDDO SFRUGH6A.166
ENDIF ! End of L_LAND block SFRUGH6A.167
SFRUGH6A.168
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFRUGH6A.169
!! 1.3 Land. Reduce roughness if there is any snow lying. SFRUGH6A.170
!! Eqns P243.B1, B2. SFRUGH6A.171
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFRUGH6A.172
SFRUGH6A.173
SFRUGH6A.179
CDIR$ IVDEP SFRUGH6A.180
! Fujitsu vectorization directive GRB0F405.517
!OCL NOVREC GRB0F405.518
DO L = LAND1,LAND1+LAND_PTS-1 SFRUGH6A.181
I = LAND_INDEX(L) SFRUGH6A.182
SFRUGH6A.184
! Only reduce non-orographic roughness for land points without permanent SFRUGH6A.185
! snow. SFRUGH6A.186
IF (LYING_SNOW(I) .LT. 5.0E3) THEN SFRUGH6A.187
SFRUGH6A.188
Z0 = Z0V(I) - 4.0E-4 * LYING_SNOW(I) SFRUGH6A.189
ZETA1 = MIN( 5.0E-4 , Z0V(I) ) SFRUGH6A.190
Z0M(I) = MAX( ZETA1 , Z0 ) SFRUGH6A.191
Z0H(I) = MIN( 0.1*Z0V(I) , Z0M(I) ) ARN0F405.1849
ELSE ! for permanent land-ice Z0V is appropriate SFRUGH6A.193
Z0M(I) = Z0V(I) ! P243.B1, based on P243.B2 (2nd case) SFRUGH6A.194
Z0H(I) = Z0V(I) ! " , " " " ( " " ) SFRUGH6A.195
ENDIF SFRUGH6A.196
SFRUGH6A.197
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFRUGH6A.198
!! 1.4 Orographic roughness. Calculate Z0M_EFF in neutral case. SFRUGH6A.199
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFRUGH6A.200
IF (L_Z0_OROG) THEN SFRUGH6A.201
SFRUGH6A.202
! Set blending height, effective roughness length and SFRUGH6A.203
! wind profile factor at land points. SFRUGH6A.204
SFRUGH6A.205
H_BLEND_OROG(I) = MAX ( Z1_UV(I) + Z0M(I) , SFRUGH6A.206
& HO2R2_OROG(L) * SQRT(2.0) ) SFRUGH6A.207
H_BLEND_OROG(I) = MIN ( H_BLEND_MAX, H_BLEND_OROG(I) ) SFRUGH6A.208
SFRUGH6A.209
SFRUGH6A.210
! Apply simple stability correction to form drag if RIB is stable SFRUGH6A.211
SFRUGH6A.212
IF (SIL_OROG(L) .EQ. RMDI) THEN SFRUGH6A.213
ZETA1 = 0.0 SFRUGH6A.214
ELSE SFRUGH6A.215
RIB_FN = ( 1.0 - RIB(I) / RI_CRIT ) SFRUGH6A.216
IF (RIB_FN.GT.1.0) RIB_FN = 1.0 SFRUGH6A.217
IF (RIB_FN.LT.0.0) RIB_FN = 0.0 SFRUGH6A.218
ZETA1 = 0.5 * OROG_DRAG_PARAM * SIL_OROG(L) * RIB_FN SFRUGH6A.219
ENDIF SFRUGH6A.220
SFRUGH6A.221
Z0M_EFF(I) = H_BLEND_OROG(I) / EXP ( VKMAN / SQRT ( ZETA1 + SFRUGH6A.222
& (VKMAN / LOG ( H_BLEND_OROG(I) / Z0M(I) ) ) * SFRUGH6A.223
& (VKMAN / LOG ( H_BLEND_OROG(I) / Z0M(I) ) ) ) ) SFRUGH6A.224
SFRUGH6A.225
SFRUGH6A.226
IF (RIB(I).GT.RI_CRIT) Z0M_EFF(I)=Z0M(I) SFRUGH6A.227
SFRUGH6A.228
WIND_PROFILE_FACTOR(I) = LOG( H_BLEND_OROG(I) / Z0M_EFF(I) ) / SFRUGH6A.229
& LOG( H_BLEND_OROG(I) / Z0M(I) ) SFRUGH6A.230
SFRUGH6A.231
ELSE SFRUGH6A.232
! Orographic roughness not represented so leave blending height and SFRUGH6A.233
! wind profile factor at their default values and set effective SFRUGH6A.234
! roughness length to its value based on land type. SFRUGH6A.235
SFRUGH6A.236
Z0M_EFF(I) = Z0M(I) SFRUGH6A.237
ENDIF SFRUGH6A.238
SFRUGH6A.239
ENDDO SFRUGH6A.244
SFRUGH6A.246
IF (LTIMER) THEN SFRUGH6A.247
CALL TIMER
('SF_ROUGH',4) SFRUGH6A.248
ENDIF SFRUGH6A.249
SFRUGH6A.250
RETURN SFRUGH6A.251
END SFRUGH6A.252
SFRUGH6A.253
*ENDIF SFRUGH6A.254