*IF DEF,A03_7A SFMELT7A.2
C *****************************COPYRIGHT****************************** SFMELT7A.3
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved. SFMELT7A.4
C SFMELT7A.5
C Use, duplication or disclosure of this code is subject to the SFMELT7A.6
C restrictions as set forth in the contract. SFMELT7A.7
C SFMELT7A.8
C Meteorological Office SFMELT7A.9
C London Road SFMELT7A.10
C BRACKNELL SFMELT7A.11
C Berkshire UK SFMELT7A.12
C RG12 2SZ SFMELT7A.13
C SFMELT7A.14
C If no contract has been raised with this copy of the code, the use, SFMELT7A.15
C duplication or disclosure of it is strictly prohibited. Permission SFMELT7A.16
C to do so must first be obtained in writing from the Head of Numerical SFMELT7A.17
C Modelling at the above address. SFMELT7A.18
C ******************************COPYRIGHT****************************** SFMELT7A.19
C SUBROUTINE SF_MELT---------------------------------------------------- SFMELT7A.20
C Purpose : Calculates surface melting (snow and sea-ice) and increments SFMELT7A.21
C surface fluxes to satisfy energy balance. SFMELT7A.22
C Sub-surface snowmelt is calculated and snowdepth incremented SFMELT7A.23
C by melt and sublimation in P251. SFMELT7A.24
C R.Essery 19/1/95 SFMELT7A.25
C----------------------------------------------------------------------- SFMELT7A.26
SUBROUTINE SF_MELT ( 3,6SFMELT7A.27
& POINTS,P_FIELD,P1,LAND_FIELD,LAND_INDEX SFMELT7A.28
&,SNOW_INDEX,NSNOW,LAND_MASK,LTIMER,SIMLT,SMLT SFMELT7A.29
&,ALPHA1,ALPHA1_SICE,ASHTF,ASHTF_SNOW,DTRDZ_1,ICE_FRACT SFMELT7A.30
&,LYING_SNOW,RHOKH_1,RHOKH_1_SICE,SNOW_FRAC,TIMESTEP SFMELT7A.31
&,FQW_1,FQW_ICE,FQW_SNOW,FTL_1,FTL_SNOW,QW_1 SFMELT7A.32
&,TL_1,TSTAR,TSTAR_SNOW,TI SFMELT7A.33
&,EI,SICE_MLT_HTF,SNOMLT_SURF_HTF,SNOWMELT SFMELT7A.34
& ) SFMELT7A.35
SFMELT7A.36
IMPLICIT NONE SFMELT7A.37
SFMELT7A.38
INTEGER SFMELT7A.39
& POINTS ! IN Number of P-grid points to be SFMELT7A.40
! ! processed. SFMELT7A.41
&,P_FIELD ! IN Total number of P-grid points. SFMELT7A.42
&,P1 ! IN First P-point to be processed. SFMELT7A.43
&,LAND_FIELD ! IN Total number of land points.. SFMELT7A.44
&,LAND_INDEX(P_FIELD) !IN Index of land points. SFMELT7A.45
&,SNOW_INDEX(LAND_FIELD)!IN Index of snow points. SFMELT7A.46
&,NSNOW !IN Number of snow points. SFMELT7A.47
SFMELT7A.48
LOGICAL SFMELT7A.49
& LAND_MASK(P_FIELD) ! IN T for land points, F otherwise. SFMELT7A.50
&,LTIMER ! IN Logical for TIMER. SFMELT7A.51
&,SIMLT ! IN STASH flag for sea-ice melting ht flux. SFMELT7A.52
&,SMLT ! IN STASH flag for snow melting ht flux. SFMELT7A.53
SFMELT7A.54
REAL SFMELT7A.55
& ALPHA1(LAND_FIELD) ! IN Gradient of saturated specific SFMELT7A.56
! ! humidity with respect to temp. SFMELT7A.57
! ! between the bottom model layer SFMELT7A.58
! ! and the snow surface. SFMELT7A.59
&,ALPHA1_SICE(P_FIELD) ! IN ALPHA1 for sea-ice. SFMELT7A.60
&,ASHTF(P_FIELD) ! IN Coefficient to calculate surface SFMELT7A.61
! ! heat flux into sea-ice (W/m2/K). SFMELT7A.62
&,ASHTF_SNOW(P_FIELD) ! IN Coefficient to calculate surface SFMELT7A.63
! ! heat flux into snow (W/m2/K). SFMELT7A.64
&,DTRDZ_1(P_FIELD) ! IN -g.dt/dp for surface layer SFMELT7A.65
&,ICE_FRACT(P_FIELD) ! IN Fraction of gridbox which is covered SFMELT7A.66
! ! by sea-ice. SFMELT7A.67
&,LYING_SNOW(P_FIELD) ! IN Lying snow (kg/m2). SFMELT7A.68
&,RHOKH_1(LAND_FIELD) ! IN Surface exchange coefficient for snow. SFMELT7A.69
&,RHOKH_1_SICE(P_FIELD)! IN Surface exchange coefficient for SFMELT7A.70
! ! sea-ice. SFMELT7A.71
&,SNOW_FRAC(LAND_FIELD)! IN Fraction of gridbox which is covered SFMELT7A.72
! ! by snow. SFMELT7A.73
&,TIMESTEP ! IN Timestep (sec). SFMELT7A.74
SFMELT7A.75
REAL SFMELT7A.76
& FQW_1(P_FIELD) ! INOUT GBM surface moisture flux (kg/m2/s). SFMELT7A.77
&,FQW_ICE(P_FIELD) ! INOUT FQW for sea-ice. SFMELT7A.78
&,FQW_SNOW(LAND_FIELD) ! INOUT FQW for snow. SFMELT7A.79
&,FTL_1(P_FIELD) ! INOUT GBM surface sens. heat flux (W/m2). SFMELT7A.80
&,FTL_SNOW(LAND_FIELD) ! INOUT FTL for snow. SFMELT7A.81
&,QW_1(P_FIELD) ! INOUT Total water content of lowest SFMELT7A.82
! ! atmospheric layer (kg per kg air). SFMELT7A.83
&,TL_1(P_FIELD) ! INOUT Liquid/frozen water temperature for SFMELT7A.84
! ! lowest atmospheric layer (K). SFMELT7A.85
&,TSTAR(P_FIELD) ! INOUT GBM surface temperature (K). SFMELT7A.86
&,TSTAR_SNOW(LAND_FIELD)!INOUT Snow surface temperature (K). SFMELT7A.87
&,TI(P_FIELD) ! INOUT Sea-ice surface layer temp. (K). SFMELT7A.88
SFMELT7A.89
REAL SFMELT7A.90
& EI(P_FIELD) ! OUT Sublimation from lying snow or SFMELT7A.91
! ! sea-ice (kg/m2/s). SFMELT7A.92
&,SICE_MLT_HTF(P_FIELD)! OUT Heat flux due to melting of sea-ice SFMELT7A.93
! ! (W/m2). SFMELT7A.94
&,SNOMLT_SURF_HTF(P_FIELD) SFMELT7A.95
! ! OUT Heat flux due to surface melting SFMELT7A.96
! ! of snow (W/m2). SFMELT7A.97
&,SNOWMELT(P_FIELD) ! OUT Surface snowmelt (kg/m2/s). SFMELT7A.98
SFMELT7A.99
*CALL C_0_DG_C
SFMELT7A.100
*CALL C_SICEHC
SFMELT7A.101
*CALL C_LHEAT
SFMELT7A.102
*CALL C_R_CP
SFMELT7A.103
*CALL C_GAMMA
SFMELT7A.104
SFMELT7A.105
REAL SFMELT7A.106
& DFQW ! Moisture flux increment. SFMELT7A.107
&,DFTL ! Sensible heat flux increment. SFMELT7A.108
&,DTSTAR ! Surface temperature increment. SFMELT7A.109
&,LCMELT ! Temporary in melt calculations. SFMELT7A.110
&,LSMELT ! Temporary in melt calculations. SFMELT7A.111
&,RHOKH1_PRIME ! Modified forward time-weighted SFMELT7A.112
! ! transfer coefficient. SFMELT7A.113
&,SNOW_MAX ! Snow available for melting. SFMELT7A.114
&,TSTARMAX ! Maximum gridbox mean surface temperature SFMELT7A.115
! ! at sea points with ice. SFMELT7A.116
INTEGER SFMELT7A.117
& I ! Loop counter - full horizontal field. SFMELT7A.118
&,J ! SFMELT7A.119
&,L ! Loop counter - land field. SFMELT7A.120
C SFMELT7A.121
IF (LTIMER) THEN SFMELT7A.122
CALL TIMER
('SFMELT ',3) SFMELT7A.123
ENDIF SFMELT7A.124
SFMELT7A.125
DO I=P1,P1+POINTS-1 SFMELT7A.126
IF (SIMLT) SICE_MLT_HTF(I) = 0.0 SFMELT7A.127
IF (SMLT) SNOMLT_SURF_HTF(I) = 0.0 SFMELT7A.128
SNOWMELT(I) = 0.0 SFMELT7A.129
EI(I) = 0.0 SFMELT7A.130
ENDDO SFMELT7A.131
SFMELT7A.132
DO J=1,NSNOW SFMELT7A.133
L = SNOW_INDEX(J) SFMELT7A.134
I = LAND_INDEX(L) SFMELT7A.135
!----------------------------------------------------------------------- SFMELT7A.136
! Melt snow if TSTAR_SNOW is greater than TM. SFMELT7A.137
!----------------------------------------------------------------------- SFMELT7A.138
EI(I) = SNOW_FRAC(L)*FQW_SNOW(L) SFMELT7A.139
SNOW_MAX = MAX( 0.0, SFMELT7A.140
& LYING_SNOW(I)/SNOW_FRAC(L) - FQW_SNOW(L)*TIMESTEP ) SFMELT7A.141
IF ( SNOW_MAX.GT.0.0 .AND. TSTAR_SNOW(L).GT.TM ) THEN SFMELT7A.142
RHOKH1_PRIME = 1. / ( 1. / RHOKH_1(L) + SFMELT7A.143
& GAMMA(1)*SNOW_FRAC(L)*DTRDZ_1(I) ) SFMELT7A.144
LCMELT = (CP + LC*ALPHA1(L))*RHOKH1_PRIME + ASHTF_SNOW(I) SFMELT7A.145
LSMELT = (CP + (LC+LF)*ALPHA1(L))*RHOKH1_PRIME + ASHTF_SNOW(I) SFMELT7A.146
SNOWMELT(I) = LSMELT * MIN( (TSTAR_SNOW(L) - TM)/LF , SFMELT7A.147
& SNOW_MAX/(LCMELT*TIMESTEP) ) SFMELT7A.148
DFTL = - CP*RHOKH1_PRIME*LF*SNOWMELT(I) / LSMELT SFMELT7A.149
DFQW = - ALPHA1(L)*RHOKH1_PRIME*LF*SNOWMELT(I) / LSMELT SFMELT7A.150
FTL_SNOW(L) = FTL_SNOW(L) + DFTL SFMELT7A.151
FQW_SNOW(L) = FQW_SNOW(L) + DFQW SFMELT7A.152
TSTAR_SNOW(L) = TM SFMELT7A.153
!----------------------------------------------------------------------- SFMELT7A.154
! Update gridbox-mean quantities SFMELT7A.155
!----------------------------------------------------------------------- SFMELT7A.156
SNOWMELT(I) = SNOW_FRAC(L)*SNOWMELT(I) SFMELT7A.157
IF (SMLT) SNOMLT_SURF_HTF(I) = LF*SNOWMELT(I) SFMELT7A.158
DFTL = SNOW_FRAC(L)*DFTL SFMELT7A.159
DFQW = SNOW_FRAC(L)*DFQW SFMELT7A.160
TL_1(I) = TL_1(I) + DTRDZ_1(I) * DFTL / CP SFMELT7A.161
QW_1(I) = QW_1(I) + DTRDZ_1(I) * DFQW SFMELT7A.162
FTL_1(I) = FTL_1(I) + DFTL SFMELT7A.163
FQW_1(I) = FQW_1(I) + DFQW SFMELT7A.164
EI(I) = EI(I) + DFQW SFMELT7A.165
ENDIF SFMELT7A.166
ENDDO SFMELT7A.167
SFMELT7A.168
DO I=P1,P1+POINTS-1 SFMELT7A.169
IF ( .NOT.LAND_MASK(I) .AND. ICE_FRACT(I).GT.0.0 ) THEN SFMELT7A.170
!----------------------------------------------------------------------- SFMELT7A.171
! Melt sea-ice if TSTAR > TSTARMAX or TI > TM. SFMELT7A.172
!----------------------------------------------------------------------- SFMELT7A.173
EI(I) = FQW_ICE(I) SFMELT7A.174
TSTARMAX = ICE_FRACT(I)*TM + (1.0 - ICE_FRACT(I))*TFS SFMELT7A.175
IF ( TSTAR(I) .GT. TSTARMAX ) THEN SFMELT7A.176
RHOKH1_PRIME = 1. / ( 1. / RHOKH_1_SICE(I) SFMELT7A.177
& + ICE_FRACT(I)*GAMMA(1)*DTRDZ_1(I) ) SFMELT7A.178
DTSTAR = TSTARMAX - TSTAR(I) SFMELT7A.179
LSMELT = (CP + (LC + LF)*ALPHA1_SICE(I))*RHOKH1_PRIME SFMELT7A.180
& + ASHTF(I) SFMELT7A.181
DFTL = CP * RHOKH1_PRIME * DTSTAR SFMELT7A.182
DFQW = ALPHA1_SICE(I) * RHOKH1_PRIME * DTSTAR SFMELT7A.183
TI(I) =TI(I) + AI*ASHTF(I)*DTSTAR*TIMESTEP / ICE_FRACT(I) SFMELT7A.184
TSTAR(I) = TSTARMAX SFMELT7A.185
IF (SIMLT) SICE_MLT_HTF(I) = - LSMELT * DTSTAR SFMELT7A.186
TL_1(I) = TL_1(I) + DTRDZ_1(I) * DFTL / CP SFMELT7A.187
QW_1(I) = QW_1(I) + DTRDZ_1(I) * DFQW SFMELT7A.188
FTL_1(I) = FTL_1(I) + DFTL SFMELT7A.189
FQW_1(I) = FQW_1(I) + DFQW SFMELT7A.190
EI(I) = EI(I) + DFQW SFMELT7A.191
ENDIF SFMELT7A.192
IF ( TI(I) .GT. TM ) THEN SFMELT7A.193
IF (SIMLT) SICE_MLT_HTF(I) = SICE_MLT_HTF(I) + SFMELT7A.194
& ICE_FRACT(I)*(TI(I) - TM)/(AI*TIMESTEP) SFMELT7A.195
TI(I) = TM SFMELT7A.196
ENDIF SFMELT7A.197
ENDIF SFMELT7A.198
ENDDO SFMELT7A.199
SFMELT7A.200
IF (LTIMER) THEN SFMELT7A.201
CALL TIMER
('SFMELT ',4) SFMELT7A.202
ENDIF SFMELT7A.203
SFMELT7A.204
RETURN SFMELT7A.205
END SFMELT7A.206
*ENDIF SFMELT7A.207