*IF DEF,A03_6A PHIMH6A.2
C ******************************COPYRIGHT****************************** PHIMH6A.3
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved. PHIMH6A.4
C PHIMH6A.5
C Use, duplication or disclosure of this code is subject to the PHIMH6A.6
C restrictions as set forth in the contract. PHIMH6A.7
C PHIMH6A.8
C Meteorological Office PHIMH6A.9
C London Road PHIMH6A.10
C BRACKNELL PHIMH6A.11
C Berkshire UK PHIMH6A.12
C RG12 2SZ PHIMH6A.13
C PHIMH6A.14
C If no contract has been raised with this copy of the code, the use, PHIMH6A.15
C duplication or disclosure of it is strictly prohibited. Permission PHIMH6A.16
C to do so must first be obtained in writing from the Head of Numerical PHIMH6A.17
C Modelling at the above address. PHIMH6A.18
C ******************************COPYRIGHT****************************** PHIMH6A.19
C PHIMH6A.20
!!! SUBROUTINE PHI_M_H ---------------------------------------------- PHIMH6A.21
!!! PHIMH6A.22
!!! Purpose: Calculate the integrated froms of the Monin-Obukhov PHIMH6A.23
!!! stability functions for surface exchanges. PHIMH6A.24
!!! PHIMH6A.25
!!! PHIMH6A.26
!!! Model Modification history: PHIMH6A.27
!!! version Date PHIMH6A.28
!!! PHIMH6A.29
!!! 4.4 12/05/97 *DECK created by R.N.B.Smith PHIMH6A.30
!!! PHIMH6A.31
!!! Programming standard: PHIMH6A.32
!!! PHIMH6A.33
!!! System component covered: Part of P243. PHIMH6A.34
!!! PHIMH6A.35
!!! Documentation: UM Documentation Paper No 24. PHIMH6A.36
!!! PHIMH6A.37
!*L Arguments:--------------------------------------------------------- PHIMH6A.38
SUBROUTINE PHI_M_H( 4,2PHIMH6A.39
& P_POINTS,P_FIELD,P1,L_LAND,LAND_MASK, PHIMH6A.40
& RECIP_L_MO,Z_UV,Z_TQ,Z0M,Z0H,PHI_M,PHI_H,LTIMER PHIMH6A.41
&) PHIMH6A.42
IMPLICIT NONE PHIMH6A.43
PHIMH6A.44
INTEGER PHIMH6A.45
& P_POINTS ! IN Number of gridpoints treated. PHIMH6A.46
&,P_FIELD ! IN Size of field on p-grid. PHIMH6A.47
&,P1 ! IN First p-point to be treated. PHIMH6A.48
PHIMH6A.49
LOGICAL PHIMH6A.50
& LTIMER PHIMH6A.51
&,L_LAND ! IN If true, treat land points only. PHIMH6A.52
&,LAND_MASK(P_FIELD) ! IN Land mask PHIMH6A.53
PHIMH6A.54
PHIMH6A.55
REAL PHIMH6A.56
& RECIP_L_MO(P_FIELD) PHIMH6A.57
! ! IN Reciprocal of the Monin-Obukhov length (m^-1). PHIMH6A.58
&,Z_UV(P_FIELD) ! IN Height of wind level above roughness height (m PHIMH6A.59
&,Z_TQ(P_FIELD) ! IN Height of temperature, moisture and scalar lev PHIMH6A.60
! ! above the roughness height (m). PHIMH6A.61
&,Z0M(P_FIELD) ! IN Roughness length for momentum (m). PHIMH6A.62
&,Z0H(P_FIELD) ! IN Roughness length for heat/moisture/scalars (m) PHIMH6A.63
! PHIMH6A.64
REAL PHIMH6A.65
& PHI_M(P_FIELD)! OUT Stability function for momentum. PHIMH6A.66
&,PHI_H(P_FIELD)! OUT Stability function for heat/moisture/scalars. PHIMH6A.67
! PHIMH6A.68
!*L Workspace usage---------------------------------------------------- PHIMH6A.69
! No work areas are required. PHIMH6A.70
! PHIMH6A.71
!*---------------------------------------------------------------------- PHIMH6A.72
!*L External subprograms called: PHIMH6A.73
PHIMH6A.74
EXTERNAL TIMER PHIMH6A.75
PHIMH6A.76
!*---------------------------------------------------------------------- PHIMH6A.77
! Common and local physical constants. PHIMH6A.78
! PHIMH6A.79
! None. PHIMH6A.80
! PHIMH6A.81
! Define local variables. PHIMH6A.82
! PHIMH6A.83
INTEGER I,L ! Loop counter; horizontal field index. PHIMH6A.84
! PHIMH6A.85
REAL PHIMH6A.86
& PHI_MN ! Neutral value of stability function for momentum PHIMH6A.87
&,PHI_HN ! Neutral value of stability function for scalars. PHIMH6A.88
&,ZETA_UV ! Temporary in calculation of PHI_M. PHIMH6A.89
&,ZETA_0M ! Temporary in calculation of PHI_M. PHIMH6A.90
&,ZETA_TQ ! Temporary in calculation of PHI_H. PHIMH6A.91
&,ZETA_0H ! Temporary in calculation of PHI_H. PHIMH6A.92
&,X_UV_SQ ! Temporary in calculation of PHI_M. PHIMH6A.93
&,X_0M_SQ ! Temporary in calculation of PHI_M. PHIMH6A.94
&,X_UV ! Temporary in calculation of PHI_M. PHIMH6A.95
&,X_0M ! Temporary in calculation of PHI_M. PHIMH6A.96
&,Y_TQ ! Temporary in calculation of PHI_H. PHIMH6A.97
&,Y_0H ! Temporary in calculation of PHI_H. PHIMH6A.98
PHIMH6A.99
IF (LTIMER) THEN PHIMH6A.100
CALL TIMER
('PHI_M_H ',3) PHIMH6A.101
ENDIF PHIMH6A.102
PHIMH6A.103
I=0 ! Reset loop counter PHIMH6A.104
PHIMH6A.105
DO L=P1,P1+P_POINTS-1 PHIMH6A.106
! IF (L_LAND.AND.LAND_MASK(L)) THEN PHIMH6A.107
! I=I+1 PHIMH6A.108
! ELSEIF (.NOT.L_LAND) THEN PHIMH6A.109
I=L PHIMH6A.110
! ENDIF PHIMH6A.111
PHIMH6A.112
! IF(.NOT.L_LAND.OR.(L_LAND.AND.LAND_MASK(L))) THEN PHIMH6A.113
PHIMH6A.114
! PHIMH6A.115
!----------------------------------------------------------------------- PHIMH6A.116
!! 1. Calculate neutral values of PHI_M and PHI_H. PHIMH6A.117
!----------------------------------------------------------------------- PHIMH6A.118
! PHIMH6A.119
PHI_MN = LOG( (Z_UV(I) + Z0M(I)) / Z0M(I) ) PHIMH6A.120
PHI_HN = LOG( (Z_TQ(I) + Z0M(I)) / Z0H(I) ) PHIMH6A.121
! PHIMH6A.122
!----------------------------------------------------------------------- PHIMH6A.123
!! 2. Calculate stability parameters. PHIMH6A.124
!----------------------------------------------------------------------- PHIMH6A.125
! PHIMH6A.126
ZETA_UV = (Z_UV(I) + Z0M(I)) * RECIP_L_MO(I) PHIMH6A.127
ZETA_TQ = (Z_TQ(I) + Z0M(I)) * RECIP_L_MO(I) PHIMH6A.128
ZETA_0M = Z0M(I) * RECIP_L_MO(I) PHIMH6A.129
ZETA_0H = Z0H(I) * RECIP_L_MO(I) PHIMH6A.130
! PHIMH6A.131
!----------------------------------------------------------------------- PHIMH6A.132
!! 3. Calculate PHI_M and PHI_H for neutral and stable conditions. PHIMH6A.133
!----------------------------------------------------------------------- PHIMH6A.134
! PHIMH6A.135
IF (RECIP_L_MO(I) .GE. 0.0) THEN PHIMH6A.136
PHI_M(I) = PHI_MN + 4.0 * (ZETA_UV - ZETA_0M) PHIMH6A.137
PHI_H(I) = PHI_HN + PHIMH6A.138
& (1.0 + 2.0*ZETA_TQ) * (1.0 + 2.0*ZETA_TQ) - PHIMH6A.139
& (1.0 + 2.0*ZETA_0H) * (1.0 + 2.0*ZETA_0H) PHIMH6A.140
! PHIMH6A.141
!----------------------------------------------------------------------- PHIMH6A.142
!! 4. Calculate PHI_M and PHI_H for unstable conditions. PHIMH6A.143
!----------------------------------------------------------------------- PHIMH6A.144
! PHIMH6A.145
ELSE PHIMH6A.146
PHIMH6A.147
X_UV_SQ = SQRT(1.0 - 16.0*ZETA_UV) PHIMH6A.148
X_0M_SQ = SQRT(1.0 - 16.0*ZETA_0M) PHIMH6A.149
X_UV = SQRT(X_UV_SQ) PHIMH6A.150
X_0M = SQRT(X_0M_SQ) PHIMH6A.151
PHI_M(I) = PHI_MN - 2.0*LOG( (1.0+X_UV) / (1.0+X_0M) ) PHIMH6A.152
& - LOG( (1.0+X_UV_SQ) / (1.0+X_0M_SQ) ) PHIMH6A.153
& + 2.0*( ATAN(X_UV) - ATAN(X_0M) ) PHIMH6A.154
PHIMH6A.155
Y_TQ = SQRT(1.0 - 16.0*ZETA_TQ) PHIMH6A.156
Y_0H = SQRT(1.0 - 16.0*ZETA_0H) PHIMH6A.157
PHI_H(I) = PHI_HN - 2.0*LOG( (1.0+Y_TQ) / (1.0+Y_0H) ) PHIMH6A.158
PHIMH6A.159
ENDIF PHIMH6A.160
PHIMH6A.161
! ENDIF ! L_LAND and LAND_MASK PHIMH6A.162
PHIMH6A.163
ENDDO PHIMH6A.164
PHIMH6A.165
IF (LTIMER) THEN PHIMH6A.166
CALL TIMER
('PHI_M_H ',4) PHIMH6A.167
ENDIF PHIMH6A.168
PHIMH6A.169
RETURN PHIMH6A.170
END PHIMH6A.171
*ENDIF PHIMH6A.172