SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
ecume_seaflux.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 ecume_seaflux(PZ0SEA,PMASK,KSIZE_WATER,KSIZE_ICE, &
7  pta,pexna,prhoa,psst,psss,pexns,pqa, &
8  prain,psnow,pvmod,pzref,puref,pps,ppa, &
9  pichce,oprecip,opwebb,opwg,kz0, &
10  ohandle_sic,pqsat,psfth,psftq,pustar,pcd,&
11  pcdn,pch,pce,pri,presa,pz0hsea, &
12  opertflux,ppertflux,hecume )
13 ! #######################################################################
14 !
15 !
16 !!**** *ECUME_SEAFLUX*
17 !!
18 !! PURPOSE
19 !! -------
20 !
21 ! Calculate the sea surface fluxes with modified bulk algorithm COARE:
22 !
23 ! Calculates the surface fluxes of heat, moisture, and momentum over
24 ! sea surface with Unified Turbulent fluxes parameterization with calibration
25 ! multi-campaign of neutral transfer coefficient from
26 ! ALBATROS dataset (exp. POMME, CATCH, FETCH, SEMAPHORE, EQUALANT99)
27 !
28 ! based on water_flux computation for sea ice
29 !
30 !!** METHOD
31 !! ------
32 !
33 !! EXTERNAL
34 !! --------
35 !!
36 !! IMPLICIT ARGUMENTS
37 !! ------------------
38 !!
39 !! REFERENCE
40 !! ---------
41 !!
42 !! AUTHOR
43 !! ------
44 !! C. Lebeaupin *Météo-France*
45 !!
46 !! MODIFICATIONS
47 !! -------------
48 !! Original 18/03/2005
49 !! Modified 08/2009 B. Decharme
50 !! Modified 01/2014 S. Senesi : handle sea ice cover, discard
51 !! computing fluxes on seaice when done elsewhere
52 !! Modified 05/2014 S. Belamari NEW ECUME : Include salinity & atm. pressure impact
53 !-------------------------------------------------------------------------------
54 !
55 !* 0. DECLARATIONS
56 ! ------------
57 USE modd_surf_par, ONLY : xundef
58 !!
59 USE modi_ice_sea_flux
60 USE modi_ecumev6_flux
61 USE modi_ecume_flux
62 !
63 USE yomhook ,ONLY : lhook, dr_hook
64 USE parkind1 ,ONLY : jprb
65 !
66 IMPLICIT NONE
67 !
68 !* 0.1 declarations of arguments
69 !
70 REAL, DIMENSION(:), INTENT(IN) :: pmask ! Either a mask positive for open sea, or a seaice fraction
71 INTEGER , INTENT(IN) :: ksize_water ! number of points with some sea water
72 INTEGER , INTENT(IN) :: ksize_ice ! number of points with some sea ice
73 !
74 REAL, DIMENSION(:), INTENT(IN) :: pta ! air temperature at atm. level (K)
75 REAL, DIMENSION(:), INTENT(IN) :: pqa ! air humidity at atm. level (kg/kg)
76 REAL, DIMENSION(:), INTENT(IN) :: pexna ! Exner function at atm. level
77 REAL, DIMENSION(:), INTENT(IN) :: prhoa ! air density at atm. level
78 REAL, DIMENSION(:), INTENT(IN) :: pvmod ! module of wind at atm. wind level (m/s)
79 REAL, DIMENSION(:), INTENT(IN) :: pzref ! atm. level for temp. and humidity (m)
80 REAL, DIMENSION(:), INTENT(IN) :: puref ! atm. level for wind (m)
81 REAL, DIMENSION(:), INTENT(IN) :: psst ! Sea Surface Temperature (K)
82 REAL, DIMENSION(:), INTENT(IN) :: psss ! Sea Surface Salinity (g/kg)
83 REAL, DIMENSION(:), INTENT(IN) :: pexns ! Exner function at sea surface
84 REAL, DIMENSION(:), INTENT(IN) :: pps ! air pressure at sea surface (Pa)
85 REAL, DIMENSION(:), INTENT(IN) :: ppa ! air pressure at atm. level (Pa)
86 REAL, DIMENSION(:), INTENT(IN) :: prain ! precipitation rate (kg/s/m2)
87 REAL, DIMENSION(:), INTENT(IN) :: psnow ! snow rate (kg/s/m2)
88 REAL, DIMENSION(:), INTENT(IN) :: ppertflux ! stochastic flux perturbation pattern
89 !
90 REAL, INTENT(IN) :: pichce !
91 LOGICAL, INTENT(IN) :: oprecip!
92 LOGICAL, INTENT(IN) :: opwebb !
93 LOGICAL, INTENT(IN) :: opwg !
94 LOGICAL, INTENT(IN) :: opertflux !
95 INTEGER, INTENT(IN) :: kz0
96 LOGICAL, INTENT(IN) :: ohandle_sic ! Do we weight seaice and open sea fluxes
97  CHARACTER(LEN=6), INTENT(IN) :: hecume ! type of ecume scheme
98 !
99 !
100 REAL, DIMENSION(:), INTENT(INOUT) :: pz0sea! roughness length over the ocean
101 !
102 ! surface fluxes : latent heat, sensible heat, friction fluxes
103 REAL, DIMENSION(:), INTENT(OUT) :: psfth ! heat flux (W/m2)
104 REAL, DIMENSION(:), INTENT(OUT) :: psftq ! water flux (kg/m2/s)
105 REAL, DIMENSION(:), INTENT(OUT) :: pustar! friction velocity (m/s)
106 !
107 ! diagnostics
108 REAL, DIMENSION(:), INTENT(OUT) :: pqsat ! humidity at saturation
109 REAL, DIMENSION(:), INTENT(OUT) :: pcd ! heat drag coefficient
110 REAL, DIMENSION(:), INTENT(OUT) :: pcdn ! momentum drag coefficient
111 REAL, DIMENSION(:), INTENT(OUT) :: pch ! neutral momentum drag coefficient
112 REAL, DIMENSION(:), INTENT(OUT) :: pce !transfer coef. for latent heat flux
113 REAL, DIMENSION(:), INTENT(OUT) :: pri ! Richardson number
114 REAL, DIMENSION(:), INTENT(OUT) :: presa ! aerodynamical resistance
115 REAL, DIMENSION(:), INTENT(OUT) :: pz0hsea ! heat roughness length
116 !
117 !* 0.2 declarations of local variables
118 !
119 INTEGER, DIMENSION(KSIZE_WATER) :: ir_water
120 INTEGER, DIMENSION(KSIZE_ICE) :: ir_ice
121 INTEGER :: j1,j2,jj
122 REAL(KIND=JPRB) :: zhook_handle
123 !
124 !-------------------------------------------------------------------------------
125 !
126 ! 1. Create Masks for ice and water sea
127 ! ------------------------------------
128 IF (lhook) CALL dr_hook('ECUME_SEAFLUX',0,zhook_handle)
129 !
130 ir_water(:)=0
131 ir_ice(:)=0
132 j1=0
133 j2=0
134 !
135 IF (ohandle_sic) THEN
136  ! Must compute open sea fluxes even over fully ice-covered sea, which may melt partly
137  DO jj=1,SIZE(psst(:))
138  ir_water(jj)= jj
139  END DO
140  ! Do not compute on sea-ice (done in coupling_iceflux)
141 ELSE
142  ! PMASK = XSST -XTTS
143  DO jj=1,SIZE(psst(:))
144  IF (pmask(jj) >=0.0 ) THEN
145  j1 = j1 + 1
146  ir_water(j1)= jj
147  ELSE
148  j2 = j2 + 1
149  ir_ice(j2)= jj
150  ENDIF
151  END DO
152 ENDIF
153 !
154 !-------------------------------------------------------------------------------
155 !
156 ! 2. water sea : call to ECUME_FLUX
157 ! ------------------------------------------------
158 !
159 IF (ksize_water > 0 ) CALL treat_surf(ir_water,'W')
160 !
161 !-------------------------------------------------------------------------------
162 !
163 ! 3. sea ice : call to ICE_SEA_FLUX
164 ! ------------------------------------
165 !
166 IF ( (ksize_ice > 0 ) .AND. (.NOT. ohandle_sic) ) CALL treat_surf(ir_ice,'I')
167 !
168 !
169 IF (lhook) CALL dr_hook('ECUME_SEAFLUX',1,zhook_handle)
170 !-------------------------------------------------------------------------------
171 !
172  CONTAINS
173 
174 SUBROUTINE treat_surf(KMASK,YTYPE)
175 !
176 IMPLICIT NONE
177 !
178 INTEGER, INTENT(IN), DIMENSION(:) :: kmask
179  CHARACTER(LEN=1), INTENT(IN) :: ytype
180 !
181 REAL, DIMENSION(SIZE(KMASK)) :: zw_ta ! air temperature at atm. level (K)
182 REAL, DIMENSION(SIZE(KMASK)) :: zw_qa ! air humidity at atm. level (kg/kg)
183 REAL, DIMENSION(SIZE(KMASK)) :: zw_exna ! Exner function at atm. level
184 REAL, DIMENSION(SIZE(KMASK)) :: zw_rhoa ! air density at atm. level
185 REAL, DIMENSION(SIZE(KMASK)) :: zw_vmod ! module of wind at atm. wind level (m/s)
186 REAL, DIMENSION(SIZE(KMASK)) :: zw_zref ! atm. level for temp. and humidity (m)
187 REAL, DIMENSION(SIZE(KMASK)) :: zw_uref ! atm. level for wind (m)
188 REAL, DIMENSION(SIZE(KMASK)) :: zw_sst ! Sea Surface Temperature (K)
189 REAL, DIMENSION(SIZE(KMASK)) :: zw_sss ! Sea Surface Salinity (g/kg)
190 REAL, DIMENSION(SIZE(KMASK)) :: zw_exns ! Exner function at sea surface
191 REAL, DIMENSION(SIZE(KMASK)) :: zw_ps ! air pressure at sea surface (Pa)
192 REAL, DIMENSION(SIZE(KMASK)) :: zw_pa ! air pressure at atm. level (Pa)
193 REAL, DIMENSION(SIZE(KMASK)) :: zw_rain !precipitation rate (kg/s/m2)
194 REAL, DIMENSION(SIZE(KMASK)) :: zw_snow !snow rate (kg/s/m2)
195 REAL, DIMENSION(SIZE(KMASK)) :: zw_pertflux !stochastic flux perturbation pattern
196 !
197 REAL, DIMENSION(SIZE(KMASK)) :: zw_z0sea! roughness length over the ocean
198 !
199 ! surface fluxes : latent heat, sensible heat, friction fluxes
200 REAL, DIMENSION(SIZE(KMASK)) :: zw_sfth ! heat flux (W/m2)
201 REAL, DIMENSION(SIZE(KMASK)) :: zw_sftq ! water flux (kg/m2/s)
202 REAL, DIMENSION(SIZE(KMASK)) :: zw_ustar! friction velocity (m/s)
203 !
204 ! diagnostics
205 REAL, DIMENSION(SIZE(KMASK)) :: zw_qsat ! humidity at saturation
206 REAL, DIMENSION(SIZE(KMASK)) :: zw_cd ! heat drag coefficient
207 REAL, DIMENSION(SIZE(KMASK)) :: zw_cdn ! momentum drag coefficient
208 REAL, DIMENSION(SIZE(KMASK)) :: zw_ch ! neutral momentum drag coefficient
209 REAL, DIMENSION(SIZE(KMASK)) :: zw_ce !transfer coef. for latent heat flux
210 REAL, DIMENSION(SIZE(KMASK)) :: zw_ri ! Richardson number
211 REAL, DIMENSION(SIZE(KMASK)) :: zw_resa ! aerodynamical resistance
212 REAL, DIMENSION(SIZE(KMASK)) :: zw_z0hsea ! heat roughness length
213 REAL :: zcoeff
214 REAL(KIND=JPRB) :: zhook_handle
215 !
216 IF (lhook) CALL dr_hook('ECUME_SEAFLUX:TREAT_SURF',0,zhook_handle)
217 DO jj=1, SIZE(kmask)
218  zw_ta(jj) = pta(kmask(jj))
219  zw_qa(jj) = pqa(kmask(jj))
220  zw_exna(jj) = pexna(kmask(jj))
221  zw_rhoa(jj) = prhoa(kmask(jj))
222  zw_vmod(jj) = pvmod(kmask(jj))
223  zw_zref(jj) = pzref(kmask(jj))
224  zw_uref(jj) = puref(kmask(jj))
225  zw_sst(jj) = psst(kmask(jj))
226  zw_sss(jj) = psss(kmask(jj))
227  zw_exns(jj) = pexns(kmask(jj))
228  zw_ps(jj) = pps(kmask(jj))
229  zw_pa(jj) = ppa(kmask(jj))
230  zw_rain(jj) = prain(kmask(jj))
231  zw_snow(jj) = psnow(kmask(jj))
232  zw_pertflux(jj) = ppertflux(kmask(jj))
233  zw_z0sea(jj)= pz0sea(kmask(jj))
234 END DO
235 !
236 zw_sfth(:) = xundef
237 zw_sftq(:) = xundef
238 zw_ustar(:) = xundef
239 zw_qsat(:) = xundef
240 zw_cd(:) = xundef
241 zw_cdn(:) = xundef
242 zw_ch(:) = xundef
243 zw_ce(:) = xundef
244 zw_ri(:) = xundef
245 zw_resa(:) = xundef
246 zw_z0hsea(:) = xundef
247 !
248 IF (ytype=='W') THEN
249  !
250  IF(hecume=='ECUME6')THEN
251  !new ecume scheme
252  CALL ecumev6_flux(zw_z0sea,zw_ta,zw_exna,zw_rhoa,zw_sst,zw_sss,zw_exns, &
253  zw_qa,zw_vmod,zw_zref,zw_uref,zw_ps,zw_pa,pichce,oprecip,opwebb,&
254  zw_qsat,zw_sfth,zw_sftq,zw_ustar,zw_cd,zw_cdn,zw_ch,zw_ce, &
255  zw_ri,zw_resa,zw_rain,kz0,zw_z0hsea,opertflux,zw_pertflux)
256  ELSE
257  !old ecume scheme
258  CALL ecume_flux(zw_z0sea,zw_ta,zw_exna,zw_rhoa,zw_sst,zw_exns, &
259  zw_qa,zw_vmod,zw_zref,zw_uref,zw_ps,pichce,oprecip,opwebb,opwg,&
260  zw_qsat,zw_sfth,zw_sftq,zw_ustar,zw_cd,zw_cdn,zw_ch,zw_ce, &
261  zw_ri,zw_resa,zw_rain,zw_z0hsea,opertflux,zw_pertflux)
262  ENDIF
263  !
264 ELSEIF ( (ytype=='I') .AND. (.NOT. ohandle_sic)) THEN
265  !
266  CALL ice_sea_flux(zw_z0sea,zw_ta,zw_exna,zw_rhoa,zw_sst,zw_exns,zw_qa,zw_rain,zw_snow, &
267  zw_vmod,zw_zref,zw_uref,zw_ps,zw_qsat,zw_sfth,zw_sftq,zw_ustar,zw_cd, &
268  zw_cdn,zw_ch,zw_ri,zw_resa,zw_z0hsea)
269  !
270 ENDIF
271 !
272 DO jj=1, SIZE(kmask)
273  pqsat(kmask(jj)) = zw_qsat(jj)
274  pz0sea(kmask(jj))= zw_z0sea(jj)
275  pustar(kmask(jj))= zw_ustar(jj)
276  psfth(kmask(jj)) = zw_sfth(jj)
277  psftq(kmask(jj)) = zw_sftq(jj)
278  pcd(kmask(jj)) = zw_cd(jj)
279  pcdn(kmask(jj)) = zw_cdn(jj)
280  pch(kmask(jj)) = zw_ch(jj)
281  pce(kmask(jj)) = zw_ce(jj)
282  pri(kmask(jj)) = zw_ri(jj)
283  presa(kmask(jj)) = zw_resa(jj)
284  pz0hsea(kmask(jj))= zw_z0hsea(jj)
285 END DO
286 IF (lhook) CALL dr_hook('ECUME_SEAFLUX:TREAT_SURF',1,zhook_handle)
287 END SUBROUTINE treat_surf
288 !
289 END SUBROUTINE ecume_seaflux
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 ecumev6_flux(PZ0SEA, PTA, PEXNA, PRHOA, PSST, PSSS, PEXNS, PQA, PVMOD, PZREF, PUREF, PPS, PPA, PICHCE, OPRECIP, OPWEBB, PQSAT, PSFTH, PSFTQ, PUSTAR, PCD, PCDN, PCH, PCE, PRI, PRESA, PRAIN, KZ0, PZ0HSEA, OPERTFLUX, PPERTFLUX)
Definition: ecumev6_flux.F90:6
subroutine ecume_flux(PZ0SEA, PTA, PEXNA, PRHOA, PSST, PEXNS, PQA, PVMOD, PZREF, PUREF, PPS, PICHCE, OPRECIP, OPWEBB, OPWG, PQSAT, PSFTH, PSFTQ, PUSTAR, PCD, PCDN, PCH, PCE, PRI, PRESA, PRAIN, PZ0HSEA, OPERTFLUX, PPERTFLUX)
Definition: ecume_flux.F90:6
subroutine treat_surf(KMASK, YTYPE)
subroutine ecume_seaflux(PZ0SEA, PMASK, KSIZE_WATER, KSIZE_ICE, PTA, PEXNA, PRHOA, PSST, PSSS, PEXNS, PQA, PRAIN, PSNOW, PVMOD, PZREF, PUREF, PPS, PPA, PICHCE, OPRECIP, OPWEBB, OPWG, KZ0, OHANDLE_SIC, PQSAT, PSFTH, PSFTQ, PUSTAR, PCD, PCDN, PCH, PCE, PRI, PRESA, PZ0HSEA, OPERTFLUX, PPERTFLUX, HECUME)