SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
ice_sea_flux.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #########
6  SUBROUTINE ice_sea_flux(PZ0ICE, &
7  pta, pexna, prhoa, ptice, pexns, pqa, prr, prs, &
8  pvmod, pzref, puref, &
9  pps, pqsat, &
10  psfth, psftq, pustar, &
11  pcd, pcdn, pch, pri, presa, pz0hice )
12 ! #######################################################################
13 !
14 !
15 !!**** *ICE_SEA_FLUX*
16 !!
17 !! PURPOSE
18 !! -------
19 ! Calculate the surface fluxes of heat, moisture, and momentum over
20 ! sea ice. adapted from WATER_FLUX
21 !
22 !!** METHOD
23 !! ------
24 !
25 !! EXTERNAL
26 !! --------
27 !!
28 !! IMPLICIT ARGUMENTS
29 !! ------------------
30 !! XCD_ICE_CST, from MODD_SEAFLUX
31 !!
32 !!
33 !! REFERENCE
34 !! ---------
35 !!
36 !! AUTHOR
37 !! ------
38 !! S. Belair * Meteo-France *
39 !!
40 !! MODIFICATIONS
41 !! -------------
42 !! Original 01/09/95
43 !! (J.Stein) 16/11/95 use PUSLOPE and Theta to compute Ri
44 !! (P.Lacarrere) 19/03/96 bug in the ZTHVI and ZTHVIS computations
45 !! (J.Stein) 27/03/96 use only H and LE in the soil scheme
46 !! (P.Jabouille) 12/11/96 bug in the Z0 computation
47 !! (V.Masson) 01/02/00 detection of sea ice
48 !! (P. Tulet) 01/10/03 aerodynamical resistance output
49 !! (P. LeMoigne) 29/03/04 bug in the heat flux computation
50 !! (P. LeMoigne) 09/02/06 Z0H as output
51 !! B. Decharme 06/2009 limitation of Ri
52 !! Modified 09/2009 B. Decharme: limitation of Ri in surface_ri.F90
53 !! S.Senesi 01/2014 use XCD_ICE_CST (if /= 0) as value for for Cd, Cdn and Ch
54 !-------------------------------------------------------------------------------
55 !
56 !* 0. DECLARATIONS
57 ! ------------
58 !
59 USE modd_csts, ONLY : xg, xcpd
60 USE modd_surf_par, ONLY : xundef
61 USE modd_surf_atm, ONLY : ldrag_coef_arp, lrrgust_arp, xrrscale, &
62  xrrgamma, xutilgust
63 USE modd_snow_par, ONLY : xz0sn, xz0hsn
64 USE modn_seaflux_n, ONLY : xcd_ice_cst
65 !
66 USE modi_surface_ri
67 USE modi_surface_aero_cond
68 USE modi_surface_cd
69 USE modi_surface_cdch_1darp
70 USE modi_wind_threshold
71 !
72 USE mode_thermos
73 !
74 !
75 !
76 USE yomhook ,ONLY : lhook, dr_hook
77 USE parkind1 ,ONLY : jprb
78 !
79 IMPLICIT NONE
80 !
81 !* 0.1 declarations of arguments
82 !
83 !
84 REAL, DIMENSION(:), INTENT(IN) :: pta ! air temperature at atm. level
85 REAL, DIMENSION(:), INTENT(IN) :: pqa ! air humidity at atm. level (kg/kg)
86 REAL, DIMENSION(:), INTENT(IN) :: pexna ! Exner function at atm. level
87 REAL, DIMENSION(:), INTENT(IN) :: prhoa ! air density at atm. level
88 REAL, DIMENSION(:), INTENT(IN) :: pvmod ! module of wind at atm. wind level
89 REAL, DIMENSION(:), INTENT(IN) :: pzref ! atm. level for temp. and humidity
90 REAL, DIMENSION(:), INTENT(IN) :: puref ! atm. level for wind
91 REAL, DIMENSION(:), INTENT(IN) :: ptice ! Sea ice Surface Temperature
92 REAL, DIMENSION(:), INTENT(IN) :: pexns ! Exner function at sea surface
93 REAL, DIMENSION(:), INTENT(IN) :: pps ! air pressure at sea surface
94 REAL, DIMENSION(:), INTENT(IN) :: prr ! rain rate
95 REAL, DIMENSION(:), INTENT(IN) :: prs ! snow rate
96 !
97 REAL, DIMENSION(:), INTENT(INOUT) :: pz0ice! roughness length over the sea ice
98 !
99 !
100 ! surface fluxes : latent heat, sensible heat, friction fluxes
101 REAL, DIMENSION(:), INTENT(OUT) :: psfth ! heat flux (W/m2)
102 REAL, DIMENSION(:), INTENT(OUT) :: psftq ! water flux (kg/m2/s)
103 REAL, DIMENSION(:), INTENT(OUT) :: pustar! friction velocity (m/s)
104 !
105 ! diagnostics
106 REAL, DIMENSION(:), INTENT(OUT) :: pqsat ! humidity at saturation
107 REAL, DIMENSION(:), INTENT(OUT) :: pcd ! momentum drag coefficient
108 REAL, DIMENSION(:), INTENT(OUT) :: pcdn ! neutral momentum drag coefficient
109 REAL, DIMENSION(:), INTENT(OUT) :: pch ! heat drag coefficient
110 REAL, DIMENSION(:), INTENT(OUT) :: pri ! Richardson number
111 REAL, DIMENSION(:), INTENT(OUT) :: presa ! aerodynamical resistance
112 REAL, DIMENSION(:), INTENT(OUT) :: pz0hice ! heat roughness length
113 !
114 !
115 !* 0.2 declarations of local variables
116 !
117 !
118 REAL, DIMENSION(SIZE(PTA)) :: zvmod ! wind modulus
119 REAL, DIMENSION(SIZE(PTA)) :: zustar2 ! square of friction velocity
120 REAL, DIMENSION(SIZE(PTA)) :: zac ! Aerodynamical conductance
121 REAL, DIMENSION(SIZE(PTA)) :: zra ! Aerodynamical resistance
122 REAL, DIMENSION(SIZE(PTA)) :: zdircoszw ! orography slope cosine (=1 on water!)
123 REAL, DIMENSION(SIZE(PTA)) :: zfp ! working variable
124 REAL, DIMENSION(SIZE(PTA)) :: zrrcor ! correction od CD, CH, CDN due to moist-gustiness
125 REAL(KIND=JPRB) :: zhook_handle
126 
127 !
128 !-------------------------------------------------------------------------------
129 !
130 ! 1. Initializations
131 ! ---------------
132 !
133 IF (lhook) CALL dr_hook('ICE_SEA_FLUX',0,zhook_handle)
134 zdircoszw=1.
135 !
136 pri(:) = xundef
137 pch(:) = xundef
138 pcd(:) = xundef
139 pcdn(:) = xundef
140 !
141 psfth(:)=xundef
142 psftq(:)=xundef
143 pustar(:)=xundef
144 presa(:)=xundef
145 !
146 !
147 ! 1.1 Saturated specified humidity near the water surface
148 ! ---------------------------------------------------
149 !
150 pqsat(:) = qsat(ptice(:),pps(:))
151 !
152 !-------------------------------------------------------------------------------
153 !
154 ! 2. Calculate the drag coefficient for momentum (PCD)
155 ! -------------------------------------------------
156 !
157 ! 2.1 Richardson number
158 ! -----------------
159 !
160 
161  CALL surface_ri(ptice,pqsat,pexns,pexna,pta,pqa, &
162  pzref, puref, zdircoszw,pvmod,pri)
163 !
164 !
165 ! 2.2 Z0 for sea ice
166 ! --------------------
167 !
168 pz0hice(:) = xz0hsn
169 !
170 pz0ice(:) = xz0sn
171 !
172 !-------------------------------------------------------------------------------
173 !
174 ! 3. Drag coefficient for heat and aerodynamical resistance
175 ! ----------------
176 !
177 zvmod(:)=wind_threshold(pvmod(:),puref(:))
178 !
179 IF ( xcd_ice_cst == 0.0 ) THEN
180 !
181  IF (ldrag_coef_arp) THEN
182 !
183  CALL surface_cdch_1darp(pzref, pz0ice, pz0hice , zvmod, pta, ptice, &
184  pqa, pqsat, pcd, pcdn, pch )
185 !
186  zra(:) = 1. / ( pch(:) * zvmod(:) )
187 !
188  ELSE
189 
190  CALL surface_cd(pri, pzref, puref, pz0ice, pz0hice, pcd, pcdn)
191 !
192  CALL surface_aero_cond(pri, pzref, puref, zvmod, pz0ice, pz0hice, zac, zra, pch)
193 !
194  ENDIF
195 !
196 ELSE
197 !
198 ! Using variable transfer coefficients is not appropriate on seaice
199 ! with simple bulk functions.
200 ! A constant value (e.g. 1.5.e-3 ) is preferable, and used except if the
201 ! user request backward compatibility by setting XCD_ICE_CST to 0 (DEFAULT).
202 !
203  pcd(:)=xcd_ice_cst
204  pcdn(:)=xcd_ice_cst
205  pch(:)=xcd_ice_cst
206  zra(:)=1./(pch(:)*zvmod(:))
207 !
208 ENDIF
209 !
210 zustar2(:) = pcd(:)*zvmod(:)*zvmod(:)
211 !
212 presa(:) = zra(:)
213 !
214 IF (lrrgust_arp) THEN
215  zfp(:)=max(0.0,prr(:)+prs(:))
216  zrrcor(:)=sqrt(1.0+((((zfp(:)/(zfp(:)+xrrscale))**xrrgamma)*xutilgust)**2) &
217  /(pcd(:)*zvmod(:)**2))
218 
219  pcd = pcd*zrrcor
220  pch = pch*zrrcor
221  pcdn = pcdn*zrrcor
222 ENDIF
223 !
224 !-------------------------------------------------------------------------------
225 !
226 ! 4. The fluxes
227 ! ----------
228 !
229 psfth(:) = xcpd * prhoa(:) * pch(:) * zvmod(:) * ( ptice(:) -pta(:) * pexns(:) / pexna(:) ) / pexns(:)
230 ! Using Heat transfer coefficient CH for vapor transfer coefficient CE !
231 psftq(:) = prhoa(:) * pch(:) * zvmod(:) * ( pqsat(:)-pqa(:) )
232 pustar(:) = sqrt(zustar2(:))
233 !
234 IF (lhook) CALL dr_hook('ICE_SEA_FLUX',1,zhook_handle)
235 !
236 !
237 !-------------------------------------------------------------------------------
238 !
239 END SUBROUTINE ice_sea_flux
real function, dimension(size(pwind)) wind_threshold(PWIND, PUREF)
subroutine surface_ri(PTG, PQS, PEXNS, PEXNA, PTA, PQA, PZREF, PUREF, PDIRCOSZW, PVMOD, PRI)
Definition: surface_ri.F90:6
subroutine ice_sea_flux(PZ0ICE, PTA, PEXNA, PRHOA, PTICE, PEXNS, PQA, PRR, PRS, PVMOD, PZREF, PUREF, PPS, PQSAT, PSFTH, PSFTQ, PUSTAR, PCD, PCDN, PCH, PRI, PRESA, PZ0HICE)
Definition: ice_sea_flux.F90:6
subroutine surface_aero_cond(PRI, PZREF, PUREF, PVMOD, PZ0, PZ0H, PAC, PRA, PCH)
subroutine surface_cd(PRI, PZREF, PUREF, PZ0EFF, PZ0H, PCD, PCDN)
Definition: surface_cd.F90:6
subroutine surface_cdch_1darp(PZREF, PZ0EFF, PZ0H, PVMOD, PTA, PTG, PQA, PQS, PCD, PCDN, PCH)