SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
coare30_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 coare30_seaflux (S, &
7  pmask,ksize_water,ksize_ice, &
8  pta,pexna,prhoa,psst,pexns,pqa, &
9  prain,psnow,pvmod,pzref,puref,pps, &
10  pqsat,psfth,psftq,pustar, &
11  pcd,pcdn,pch,pce,pri,presa,pz0hsea )
12 ! ##################################################################
13 !
14 !
15 !!**** *COARE30_SEAFLUX*
16 !!
17 !! PURPOSE
18 !! -------
19 !
20 ! Calculate the sea surface fluxes with modified bulk algorithm COARE:
21 !
22 ! Calculates the surface fluxes of heat, moisture, and momentum over
23 ! sea surface with the simplified COARE 3.0 bulk algorithm from Fairall et al
24 ! 2003
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 !! B. Decharme 04/2013 : Pack only input variables
48 !! S. Senesi 01/2014 : When handling sea ice cover, compute open sea flux,
49 !! and only where ice cover < 1.
50 !-------------------------------------------------------------------------------
51 !
52 !* 0. DECLARATIONS
53 ! ------------
54 !
55 !
56 !
57 USE modd_seaflux_n, ONLY : seaflux_t
58 !
59 USE modd_surf_par, ONLY : xundef
60 !
61 USE modi_ice_sea_flux
62 USE modi_coare30_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 !
72 TYPE(seaflux_t), INTENT(INOUT) :: s
73 !
74 REAL, DIMENSION(:), INTENT(IN) :: pmask ! Either a mask positive for open sea, or a seaice fraction
75 INTEGER , INTENT(IN) :: ksize_water ! number of points with some sea water
76 INTEGER , INTENT(IN) :: ksize_ice ! number of points with some sea ice
77 !
78 REAL, DIMENSION(:), INTENT(IN) :: pta ! air temperature at atm. level (K)
79 REAL, DIMENSION(:), INTENT(IN) :: pqa ! air humidity at atm. level (kg/kg)
80 REAL, DIMENSION(:), INTENT(IN) :: pexna ! Exner function at atm. level
81 REAL, DIMENSION(:), INTENT(IN) :: prhoa ! air density at atm. level
82 REAL, DIMENSION(:), INTENT(IN) :: pvmod ! module of wind at atm. wind level (m/s)
83 REAL, DIMENSION(:), INTENT(IN) :: pzref ! atm. level for temp. and humidity (m)
84 REAL, DIMENSION(:), INTENT(IN) :: puref ! atm. level for wind (m)
85 REAL, DIMENSION(:), INTENT(IN) :: psst ! Sea Surface Temperature (K)
86 REAL, DIMENSION(:), INTENT(IN) :: pexns ! Exner function at sea surface
87 REAL, DIMENSION(:), INTENT(IN) :: pps ! air pressure at sea surface (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('MODI_COARE30_SEAFLUX:COARE30_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 COARE30_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('MODI_COARE30_SEAFLUX:COARE30_SEAFLUX',1,zhook_handle)
159 !-------------------------------------------------------------------------------
160 !
161  CONTAINS
162 !
163 SUBROUTINE treat_surf(KMASK,YTYPE)
164 !
165 INTEGER, INTENT(IN), DIMENSION(:) :: kmask
166  CHARACTER(LEN=1), INTENT(IN) :: ytype
167 !
168 REAL, DIMENSION(SIZE(KMASK)) :: zw_ta ! air temperature at atm. level (K)
169 REAL, DIMENSION(SIZE(KMASK)) :: zw_qa ! air humidity at atm. level (kg/kg)
170 REAL, DIMENSION(SIZE(KMASK)) :: zw_exna ! Exner function at atm. level
171 REAL, DIMENSION(SIZE(KMASK)) :: zw_rhoa ! air density at atm. level
172 REAL, DIMENSION(SIZE(KMASK)) :: zw_vmod ! module of wind at atm. wind level (m/s)
173 REAL, DIMENSION(SIZE(KMASK)) :: zw_zref ! atm. level for temp. and humidity (m)
174 REAL, DIMENSION(SIZE(KMASK)) :: zw_uref ! atm. level for wind (m)
175 REAL, DIMENSION(SIZE(KMASK)) :: zw_sst ! Sea Surface Temperature (K)
176 REAL, DIMENSION(SIZE(KMASK)) :: zw_exns ! Exner function at sea surface
177 REAL, DIMENSION(SIZE(KMASK)) :: zw_ps ! air pressure at sea surface (Pa)
178 REAL, DIMENSION(SIZE(KMASK)) :: zw_rain !precipitation rate (kg/s/m2)
179 REAL, DIMENSION(SIZE(KMASK)) :: zw_snow !snow rate (kg/s/m2)
180 !
181 REAL, DIMENSION(SIZE(KMASK)) :: zw_z0sea! roughness length over the ocean
182 !
183 ! surface fluxes : latent heat, sensible heat, friction fluxes
184 REAL, DIMENSION(SIZE(KMASK)) :: zw_sfth ! heat flux (W/m2)
185 REAL, DIMENSION(SIZE(KMASK)) :: zw_sftq ! water flux (kg/m2/s)
186 REAL, DIMENSION(SIZE(KMASK)) :: zw_ustar! friction velocity (m/s)
187 !
188 ! diagnostics
189 REAL, DIMENSION(SIZE(KMASK)) :: zw_qsat ! humidity at saturation
190 REAL, DIMENSION(SIZE(KMASK)) :: zw_cd ! heat drag coefficient
191 REAL, DIMENSION(SIZE(KMASK)) :: zw_cdn ! momentum drag coefficient
192 REAL, DIMENSION(SIZE(KMASK)) :: zw_ch ! neutral momentum drag coefficient
193 REAL, DIMENSION(SIZE(KMASK)) :: zw_ce !transfer coef. for latent heat flux
194 REAL, DIMENSION(SIZE(KMASK)) :: zw_ri ! Richardson number
195 REAL, DIMENSION(SIZE(KMASK)) :: zw_resa ! aerodynamical resistance
196 REAL, DIMENSION(SIZE(KMASK)) :: zw_z0hsea ! heat roughness length
197 !
198 REAL(KIND=JPRB) :: zhook_handle
199 !
200 IF (lhook) CALL dr_hook('COARE30_SEAFLUX:TREAT_SURF',0,zhook_handle)
201 !
202 DO jj=1, SIZE(kmask)
203  zw_ta(jj) = pta(kmask(jj))
204  zw_qa(jj) = pqa(kmask(jj))
205  zw_exna(jj) = pexna(kmask(jj))
206  zw_rhoa(jj) = prhoa(kmask(jj))
207  zw_vmod(jj) = pvmod(kmask(jj))
208  zw_zref(jj) = pzref(kmask(jj))
209  zw_uref(jj) = puref(kmask(jj))
210  zw_sst(jj) = psst(kmask(jj))
211  zw_exns(jj) = pexns(kmask(jj))
212  zw_ps(jj) = pps(kmask(jj))
213  zw_rain(jj) = prain(kmask(jj))
214  zw_snow(jj) = psnow(kmask(jj))
215  zw_z0sea(jj)= s%XZ0(kmask(jj))
216 ENDDO
217 !
218 zw_sfth(:) = xundef
219 zw_sftq(:) = xundef
220 zw_ustar(:) = xundef
221 zw_qsat(:) = xundef
222 zw_cd(:) = xundef
223 zw_cdn(:) = xundef
224 zw_ch(:) = xundef
225 zw_ce(:) = xundef
226 zw_ri(:) = xundef
227 zw_resa(:) = xundef
228 zw_z0hsea(:) = xundef
229 !
230 IF (ytype=='W') THEN
231  !
232  CALL coare30_flux(s, &
233  zw_z0sea,zw_ta,zw_exna,zw_rhoa,zw_sst,zw_exns,&
234  zw_qa,zw_vmod,zw_zref,zw_uref,zw_ps,zw_qsat,zw_sfth,zw_sftq,zw_ustar,&
235  zw_cd,zw_cdn,zw_ch,zw_ce,zw_ri,zw_resa,zw_rain,zw_z0hsea)
236  !
237 ELSEIF ( (ytype=='I') .AND. (.NOT. s%LHANDLE_SIC)) THEN
238  !
239  CALL ice_sea_flux(zw_z0sea,zw_ta,zw_exna,zw_rhoa,zw_sst,zw_exns,zw_qa,zw_rain,zw_snow, &
240  zw_vmod,zw_zref,zw_uref,zw_ps,zw_qsat,zw_sfth,zw_sftq,zw_ustar,zw_cd, &
241  zw_cdn,zw_ch,zw_ri,zw_resa,zw_z0hsea)
242  !
243 ENDIF
244 !
245 DO jj=1, SIZE(kmask)
246  s%XZ0(kmask(jj)) = zw_z0sea(jj)
247  psfth(kmask(jj)) = zw_sfth(jj)
248  psftq(kmask(jj)) = zw_sftq(jj)
249  pustar(kmask(jj)) = zw_ustar(jj)
250  pqsat(kmask(jj)) = zw_qsat(jj)
251  pcd(kmask(jj)) = zw_cd(jj)
252  pcdn(kmask(jj)) = zw_cdn(jj)
253  pch(kmask(jj)) = zw_ch(jj)
254  pce(kmask(jj)) = zw_ce(jj)
255  pri(kmask(jj)) = zw_ri(jj)
256  presa(kmask(jj)) = zw_resa(jj)
257  pz0hsea(kmask(jj)) = zw_z0hsea(jj)
258 END DO
259 IF (lhook) CALL dr_hook('COARE30_SEAFLUX:TREAT_SURF',1,zhook_handle)
260 !
261 END SUBROUTINE treat_surf
262 !
263 END SUBROUTINE coare30_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 treat_surf(KMASK, YTYPE)
subroutine coare30_seaflux(S, PMASK, KSIZE_WATER, KSIZE_ICE, PTA, PEXNA, PRHOA, PSST, PEXNS, PQA, PRAIN, PSNOW, PVMOD, PZREF, PUREF, PPS, PQSAT, PSFTH, PSFTQ, PUSTAR, PCD, PCDN, PCH, PCE, PRI, PRESA, PZ0HSEA)
subroutine coare30_flux(S, PZ0SEA, PTA, PEXNA, PRHOA, PSST, PEXNS, PQA, PVMOD, PZREF, PUREF, PPS, PQSAT, PSFTH, PSFTQ, PUSTAR, PCD, PCDN, PCH, PCE, PRI, PRESA, PRAIN, PZ0HSEA)
Definition: coare30_flux.F90:6