*IF DEF,A03_6A FCDCH6A.2
C ******************************COPYRIGHT****************************** FCDCH6A.3
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved. FCDCH6A.4
C FCDCH6A.5
C Use, duplication or disclosure of this code is subject to the FCDCH6A.6
C restrictions as set forth in the contract. FCDCH6A.7
C FCDCH6A.8
C Meteorological Office FCDCH6A.9
C London Road FCDCH6A.10
C BRACKNELL FCDCH6A.11
C Berkshire UK FCDCH6A.12
C RG12 2SZ FCDCH6A.13
C FCDCH6A.14
C If no contract has been raised with this copy of the code, the use, FCDCH6A.15
C duplication or disclosure of it is strictly prohibited. Permission FCDCH6A.16
C to do so must first be obtained in writing from the Head of Numerical FCDCH6A.17
C Modelling at the above address. FCDCH6A.18
C ******************************COPYRIGHT****************************** FCDCH6A.19
C FCDCH6A.20
!!! SUBROUTINE FCDCH-------------------------------------------------- FCDCH6A.21
!!! FCDCH6A.22
!!! Purpose: Calculate surface transfer coefficients at one or more FCDCH6A.23
!!! gridpoints. FCDCH6A.24
!!! FCDCH6A.25
!!! Model Modification history: FCDCH6A.26
!!! version Date FCDCH6A.27
!!! FCDCH6A.28
!!! 4.4 08/05/97 New version of subroutine using Monin-Obukhov FCDCH6A.29
!!! stability functions created. FCDCH6A.30
!!! R.N.B.Smith FCDCH6A.31
!!! FCDCH6A.32
!!! Programming standard: FCDCH6A.33
!!! FCDCH6A.34
!!! System component covered: Part of P243. FCDCH6A.35
!!! FCDCH6A.36
!!! Documentation: UM Documentation Paper No 24, section P243. FCDCH6A.37
!!! FCDCH6A.38
!! Arguments:--------------------------------------------------------- FCDCH6A.39
SUBROUTINE FCDCH( 9,6FCDCH6A.40
& P_POINTS,P_FIELD,P1,L_LAND,LAND_MASK, FCDCH6A.41
& DB,VSHR,Z0M,Z0H,ZH,Z1_UV,Z1_TQ,WIND_PROFILE_FACTOR, FCDCH6A.42
& CDV,CHV,CDV_STD,V_S,V_S_STD,RECIP_L_MO,LTIMER FCDCH6A.43
&) FCDCH6A.44
IMPLICIT NONE FCDCH6A.45
FCDCH6A.46
INTEGER FCDCH6A.47
& P_POINTS ! IN Number of gridpoints treated. FCDCH6A.48
&,P_FIELD ! IN Size of field on p-grid. FCDCH6A.49
&,P1 ! IN First p-point to be treated. FCDCH6A.50
FCDCH6A.51
LOGICAL FCDCH6A.52
& LTIMER FCDCH6A.53
&,L_LAND ! IN If true, treat land points only. FCDCH6A.54
&,LAND_MASK(P_FIELD) ! IN Land mask FCDCH6A.55
FCDCH6A.56
FCDCH6A.57
REAL FCDCH6A.58
& DB(P_FIELD) ! IN Buoyancy difference between surface and lowest FCDCH6A.59
! ! temperature and humidity level in the FCDCH6A.60
! ! atmosphere (m/s^2). FCDCH6A.61
&,VSHR(P_FIELD) ! IN Wind speed difference between the surface and FCDCH6A.62
! ! the lowest wind level in the atmosphere (m/s). FCDCH6A.63
+,Z0M(P_FIELD) ! IN Roughness length for momentum transport (m). FCDCH6A.64
+,Z0H(P_FIELD) ! IN Roughness length for heat and moisture (m). FCDCH6A.65
+,ZH(P_FIELD) ! IN Depth of boundary layer (m). FCDCH6A.66
+,Z1_UV(P_FIELD)! IN Height of lowest wind level (m). FCDCH6A.67
+,Z1_TQ(P_FIELD)! IN Height of lowest temperature and humidity FCDCH6A.68
! ! level (m). FCDCH6A.69
&,WIND_PROFILE_FACTOR(P_FIELD) FCDCH6A.70
! ! IN for adjusting the surface transfer FCDCH6A.71
! ! coefficients to remove form drag effects. FCDCH6A.72
FCDCH6A.73
REAL FCDCH6A.74
& CDV(P_FIELD) ! OUT Surface transfer coefficient for momentum FCDCH6A.75
! ! including orographic form drag (m/s). FCDCH6A.76
+,CHV(P_FIELD) ! OUT Surface transfer coefficient for FCDCH6A.77
! ! heat, moisture & other scalars (m/s). FCDCH6A.78
&,CDV_STD(P_FIELD) FCDCH6A.79
! ! OUT Surface transfer coefficient for momentum FCDCH6A.80
! ! excluding orographic form drag (m/s). FCDCH6A.81
&,V_S(P_FIELD) ! OUT Surface layer scaling velocity FCDCH6A.82
! ! including orographic form drag (m/s). FCDCH6A.83
&,V_S_STD(P_FIELD) FCDCH6A.84
! ! OUT Surface layer scaling velocity FCDCH6A.85
! ! excluding orographic form drag (m/s). FCDCH6A.86
&,RECIP_L_MO(P_FIELD) FCDCH6A.87
! ! OUT Reciprocal of the Monin-Obukhov length FCDCH6A.88
! ! (m^-1). FCDCH6A.89
FCDCH6A.90
!*L Workspace usage---------------------------------------------------- FCDCH6A.91
! FCDCH6A.92
! Local work arrays. FCDCH6A.93
! FCDCH6A.94
REAL FCDCH6A.95
& PHI_M(P_FIELD) ! Monin-Obukhov stability function for momentum FCDCH6A.96
! ! integrated to the model's lowest wind level. FCDCH6A.97
&,PHI_H(P_FIELD) ! Monin-Obukhov stability function for scalars FCDCH6A.98
! ! integrated to the model's lowest temperature FCDCH6A.99
! ! and humidity level. FCDCH6A.100
! FCDCH6A.101
!*---------------------------------------------------------------------- FCDCH6A.102
FCDCH6A.103
EXTERNAL TIMER,PHI_M_H FCDCH6A.104
FCDCH6A.105
!*---------------------------------------------------------------------- FCDCH6A.106
! Common and local constants. FCDCH6A.107
*CALL C_VKMAN
FCDCH6A.108
REAL BETA,THIRD FCDCH6A.109
PARAMETER ( FCDCH6A.110
& BETA=0.08, ! Tunable parameter in the surface layer scaling FCDCH6A.111
! ! velocity formula (multiplying the turbulent FCDCH6A.112
! ! convective scaling velocity). FCDCH6A.113
+ THIRD=1./3. ! One third. FCDCH6A.114
+) FCDCH6A.115
INTEGER N_ITS ! Number of iterations for Monin-Obukhov length FCDCH6A.116
! ! and stability functions. FCDCH6A.117
PARAMETER ( FCDCH6A.118
& N_ITS=5 FCDCH6A.119
&) FCDCH6A.120
! FCDCH6A.121
! Define local variables FCDCH6A.122
! FCDCH6A.123
INTEGER I,L ! Loop counter; horizontal field index. FCDCH6A.124
INTEGER IT ! Iteration loop counter. FCDCH6A.125
FCDCH6A.126
REAL FCDCH6A.127
& B_FLUX ! Surface bouyancy flux over air density. FCDCH6A.128
&,U_S ! Surface friction velocity (effective value). FCDCH6A.129
&,U_S_STD ! Surface friction velocity (standard value). FCDCH6A.130
&,W_S ! Surface turbulent convective scaling velocity. FCDCH6A.131
FCDCH6A.132
IF (LTIMER) THEN FCDCH6A.133
CALL TIMER
('FCDCH ',3) FCDCH6A.134
ENDIF FCDCH6A.135
FCDCH6A.136
! FCDCH6A.137
!----------------------------------------------------------------------- FCDCH6A.138
!! 1. Set initial values for the iteration. FCDCH6A.139
!----------------------------------------------------------------------- FCDCH6A.140
! FCDCH6A.141
I=0 ! Reset loop counter FCDCH6A.142
FCDCH6A.143
DO L=P1,P1+P_POINTS-1 FCDCH6A.144
! IF (L_LAND.AND.LAND_MASK(L)) THEN FCDCH6A.145
! I=I+1 FCDCH6A.146
! ELSEIF (.NOT.L_LAND) THEN FCDCH6A.147
I=L FCDCH6A.148
! ENDIF FCDCH6A.149
FCDCH6A.150
! IF(.NOT.L_LAND.OR.(L_LAND.AND.LAND_MASK(L))) THEN FCDCH6A.151
FCDCH6A.152
IF (DB(I) .LT. 0.0 .AND. VSHR(I) .LT. 2.0) THEN FCDCH6A.153
!----------------------------------------------------------------------- FCDCH6A.154
! Start the iteration from the convective limit. FCDCH6A.155
!----------------------------------------------------------------------- FCDCH6A.156
RECIP_L_MO(I) = -VKMAN/(BETA*BETA*BETA*ZH(I)) FCDCH6A.157
ELSE FCDCH6A.158
!----------------------------------------------------------------------- FCDCH6A.159
! Start the iteration from neutral values. FCDCH6A.160
!----------------------------------------------------------------------- FCDCH6A.161
RECIP_L_MO(I) = 0.0 FCDCH6A.162
ENDIF FCDCH6A.163
! ENDIF ! L_LAND and LAND_MASK FCDCH6A.164
ENDDO FCDCH6A.165
CALL PHI_M_H
(P_POINTS,P_FIELD,P1,L_LAND,LAND_MASK, FCDCH6A.166
& RECIP_L_MO,Z1_UV,Z1_TQ,Z0M,Z0H, FCDCH6A.167
& PHI_M,PHI_H, FCDCH6A.168
& LTIMER) FCDCH6A.169
! FCDCH6A.170
I=0 ! Reset loop counter FCDCH6A.171
FCDCH6A.172
DO L=P1,P1+P_POINTS-1 FCDCH6A.173
! IF (L_LAND.AND.LAND_MASK(L)) THEN FCDCH6A.174
! I=I+1 FCDCH6A.175
! ELSEIF (.NOT.L_LAND) THEN FCDCH6A.176
I=L FCDCH6A.177
! ENDIF FCDCH6A.178
FCDCH6A.179
! IF(.NOT.L_LAND.OR.(L_LAND.AND.LAND_MASK(L))) THEN FCDCH6A.180
FCDCH6A.181
IF (DB(I) .LT. 0.0 .AND. VSHR(I) .LT. 2.0) THEN FCDCH6A.182
!----------------------------------------------------------------------- FCDCH6A.183
! Start the iteration from the convective limit. FCDCH6A.184
!----------------------------------------------------------------------- FCDCH6A.185
V_S_STD(I) = BETA * FCDCH6A.186
& SQRT( BETA * ( VKMAN / PHI_H(I) ) * ZH(I) * (-DB(I)) ) FCDCH6A.187
V_S(I) = V_S_STD(I) FCDCH6A.188
ELSE FCDCH6A.189
!----------------------------------------------------------------------- FCDCH6A.190
! Start the iteration from neutral values. FCDCH6A.191
!----------------------------------------------------------------------- FCDCH6A.192
V_S(I) = ( VKMAN / PHI_M(I) ) * VSHR(I) FCDCH6A.193
V_S_STD(I) = V_S(I) * WIND_PROFILE_FACTOR(I) FCDCH6A.194
ENDIF FCDCH6A.195
CHV(I) = ( VKMAN / PHI_H(I) ) * V_S_STD(I) FCDCH6A.196
CDV(I) = ( VKMAN / PHI_M(I) ) * V_S(I) FCDCH6A.197
CDV_STD(I) = CDV(I) * ( V_S_STD(I) / V_S(I) ) * FCDCH6A.198
& WIND_PROFILE_FACTOR(I) FCDCH6A.199
! ENDIF ! L_LAND and LAND_MASK FCDCH6A.200
ENDDO FCDCH6A.201
!----------------------------------------------------------------------- FCDCH6A.202
!! 2. Iterate to obtain sucessively better approximations for CD & CH. FCDCH6A.203
!----------------------------------------------------------------------- FCDCH6A.204
DO IT = 1,N_ITS FCDCH6A.205
! FCDCH6A.206
I=0 ! Reset loop counter FCDCH6A.207
FCDCH6A.208
DO L=P1,P1+P_POINTS-1 FCDCH6A.209
! IF (L_LAND.AND.LAND_MASK(L)) THEN FCDCH6A.210
! I=I+1 FCDCH6A.211
! ELSEIF (.NOT.L_LAND) THEN FCDCH6A.212
I=L FCDCH6A.213
! ENDIF FCDCH6A.214
FCDCH6A.215
! IF(.NOT.L_LAND.OR.(L_LAND.AND.LAND_MASK(L))) THEN FCDCH6A.216
FCDCH6A.217
B_FLUX = -CHV(I) * DB(I) FCDCH6A.218
U_S = SQRT( CDV(I) * VSHR(I) ) FCDCH6A.219
U_S_STD = SQRT( CDV_STD(I) * VSHR(I) ) FCDCH6A.220
IF (DB(I) .LT. 0.0) THEN FCDCH6A.221
W_S = (ZH(I) * B_FLUX)**THIRD FCDCH6A.222
V_S(I) = SQRT(U_S*U_S + BETA*BETA*W_S*W_S) FCDCH6A.223
V_S_STD(I) = SQRT(U_S_STD*U_S_STD + BETA*BETA*W_S*W_S) FCDCH6A.224
ELSE FCDCH6A.225
V_S(I) = U_S FCDCH6A.226
V_S_STD(I) = U_S_STD FCDCH6A.227
ENDIF FCDCH6A.228
RECIP_L_MO(I) = -VKMAN * B_FLUX / FCDCH6A.229
& (V_S(I)*V_S(I)*V_S(I)) ARN0F405.874
! ENDIF ! L_LAND and LAND_MASK FCDCH6A.231
ENDDO FCDCH6A.232
CALL PHI_M_H
(P_POINTS,P_FIELD,P1,L_LAND,LAND_MASK, FCDCH6A.233
& RECIP_L_MO,Z1_UV,Z1_TQ,Z0M,Z0H, FCDCH6A.234
& PHI_M,PHI_H, FCDCH6A.235
& LTIMER) FCDCH6A.236
! FCDCH6A.237
I=0 ! Reset loop counter FCDCH6A.238
FCDCH6A.239
DO L=P1,P1+P_POINTS-1 FCDCH6A.240
! IF (L_LAND.AND.LAND_MASK(L)) THEN FCDCH6A.241
! I=I+1 FCDCH6A.242
! ELSEIF (.NOT.L_LAND) THEN FCDCH6A.243
I=L FCDCH6A.244
! ENDIF FCDCH6A.245
FCDCH6A.246
! IF(.NOT.L_LAND.OR.(L_LAND.AND.LAND_MASK(L))) THEN FCDCH6A.247
FCDCH6A.248
CHV(I) = ( VKMAN / PHI_H(I) ) * V_S_STD(I) FCDCH6A.249
CDV(I) = ( VKMAN / PHI_M(I) ) * V_S(I) FCDCH6A.250
CDV_STD(I) = CDV(I) * ( V_S_STD(I) / V_S(I) ) * FCDCH6A.251
& WIND_PROFILE_FACTOR(I) FCDCH6A.252
! ENDIF ! L_LAND and LAND_MASK FCDCH6A.253
ENDDO FCDCH6A.254
ENDDO ! Iteration loop FCDCH6A.255
FCDCH6A.256
IF (LTIMER) THEN FCDCH6A.257
CALL TIMER
('FCDCH ',4) FCDCH6A.258
ENDIF FCDCH6A.259
FCDCH6A.260
RETURN FCDCH6A.261
END FCDCH6A.262
*ENDIF FCDCH6A.263