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