SURFEX v8.1
General documentation of Surfex
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, PMASK,KSIZE_WATER,KSIZE_ICE, &
7  PTA,PEXNA,PRHOA,PSST,PEXNS,PQA, &
8  PRAIN,PSNOW,PVMOD,PZREF,PUREF,PPS, &
9  PQSAT,PSFTH,PSFTQ,PUSTAR, &
10  PCD,PCDN,PCH,PCE,PRI,PRESA,PZ0HSEA )
11 ! ##################################################################
12 !
13 !
14 !!**** *COARE30_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 the simplified COARE 3.0 bulk algorithm from Fairall et al
23 ! 2003
24 !
25 ! based on water_flux computation for sea ice
26 !
27 !!** METHOD
28 !! ------
29 !
30 !! EXTERNAL
31 !! --------
32 !!
33 !! IMPLICIT ARGUMENTS
34 !! ------------------
35 !!
36 !! REFERENCE
37 !! ---------
38 !!
39 !! AUTHOR
40 !! ------
41 !! C. Lebeaupin *Météo-France*
42 !!
43 !! MODIFICATIONS
44 !! -------------
45 !! Original 18/03/2005
46 !! B. Decharme 04/2013 : Pack only input variables
47 !! S. Senesi 01/2014 : When handling sea ice cover, compute open sea flux,
48 !! and only where ice cover < 1.
49 !-------------------------------------------------------------------------------
50 !
51 !* 0. DECLARATIONS
52 ! ------------
53 !
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_coare30_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 !
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) :: PRAIN ! precipitation rate (kg/s/m2)
88 REAL, DIMENSION(:), INTENT(IN) :: PSNOW ! snow rate (kg/s/m2)
89 !
90 ! surface fluxes : latent heat, sensible heat, friction fluxes
91 REAL, DIMENSION(:), INTENT(OUT) :: PSFTH ! heat flux (W/m2)
92 REAL, DIMENSION(:), INTENT(OUT) :: PSFTQ ! water flux (kg/m2/s)
93 REAL, DIMENSION(:), INTENT(OUT) :: PUSTAR! friction velocity (m/s)
94 !
95 ! diagnostics
96 REAL, DIMENSION(:), INTENT(OUT) :: PQSAT ! humidity at saturation
97 REAL, DIMENSION(:), INTENT(OUT) :: PCD ! heat drag coefficient
98 REAL, DIMENSION(:), INTENT(OUT) :: PCDN ! momentum drag coefficient
99 REAL, DIMENSION(:), INTENT(OUT) :: PCH ! neutral momentum drag coefficient
100 REAL, DIMENSION(:), INTENT(OUT) :: PCE !transfer coef. for latent heat flux
101 REAL, DIMENSION(:), INTENT(OUT) :: PRI ! Richardson number
102 REAL, DIMENSION(:), INTENT(OUT) :: PRESA ! aerodynamical resistance
103 REAL, DIMENSION(:), INTENT(OUT) :: PZ0HSEA ! heat roughness length
104 !
105 !* 0.2 declarations of local variables
106 !
107 INTEGER, DIMENSION(KSIZE_WATER) :: IR_WATER
108 INTEGER, DIMENSION(KSIZE_ICE) :: IR_ICE
109 INTEGER :: J1,J2,JJ
110 REAL(KIND=JPRB) :: ZHOOK_HANDLE
111 !
112 !-------------------------------------------------------------------------------
113 !
114 ! 1. Create Masks for ice and water sea
115 ! ------------------------------------
116 IF (lhook) CALL dr_hook('MODI_COARE30_SEAFLUX:COARE30_SEAFLUX',0,zhook_handle)
117 !
118 ir_water(:)=0
119 ir_ice(:)=0
120 j1=0
121 j2=0
122 !
123 IF (s%LHANDLE_SIC) THEN
124  ! Must compute open sea fluxes even over fully ice-covered sea, which may melt partly
125  DO jj=1,SIZE(psst(:))
126  ir_water(jj)= jj
127  END DO
128  ! Do not compute on sea-ice (done in coupling_iceflux)
129 ELSE
130  ! PMASK = XSST -XTTS
131  DO jj=1,SIZE(psst(:))
132  IF (pmask(jj) >=0.0 ) THEN
133  j1 = j1 + 1
134  ir_water(j1)= jj
135  ELSE
136  j2 = j2 + 1
137  ir_ice(j2)= jj
138  ENDIF
139  END DO
140 ENDIF
141 !
142 !-------------------------------------------------------------------------------
143 !
144 ! 2. water sea : call to COARE30_FLUX
145 ! ------------------------------------------------
146 !
147 IF (ksize_water > 0 ) CALL treat_surf(ir_water,'W')
148 !
149 !-------------------------------------------------------------------------------
150 !
151 ! 3. sea ice : call to ICE_SEA_FLUX
152 ! ------------------------------------
153 !
154 IF ( (ksize_ice > 0 ) .AND. (.NOT. s%LHANDLE_SIC) ) CALL treat_surf(ir_ice,'I')
155 !
156 !
157 IF (lhook) CALL dr_hook('MODI_COARE30_SEAFLUX:COARE30_SEAFLUX',1,zhook_handle)
158 !-------------------------------------------------------------------------------
159 !
160 CONTAINS
161 !
162 SUBROUTINE treat_surf(KMASK,YTYPE)
163 !
164 INTEGER, INTENT(IN), DIMENSION(:) :: KMASK
165  CHARACTER(LEN=1), INTENT(IN) :: YTYPE
166 !
167 REAL, DIMENSION(SIZE(KMASK)) :: ZW_TA ! air temperature at atm. level (K)
168 REAL, DIMENSION(SIZE(KMASK)) :: ZW_QA ! air humidity at atm. level (kg/kg)
169 REAL, DIMENSION(SIZE(KMASK)) :: ZW_EXNA ! Exner function at atm. level
170 REAL, DIMENSION(SIZE(KMASK)) :: ZW_RHOA ! air density at atm. level
171 REAL, DIMENSION(SIZE(KMASK)) :: ZW_VMOD ! module of wind at atm. wind level (m/s)
172 REAL, DIMENSION(SIZE(KMASK)) :: ZW_ZREF ! atm. level for temp. and humidity (m)
173 REAL, DIMENSION(SIZE(KMASK)) :: ZW_UREF ! atm. level for wind (m)
174 REAL, DIMENSION(SIZE(KMASK)) :: ZW_SST ! Sea Surface Temperature (K)
175 REAL, DIMENSION(SIZE(KMASK)) :: ZW_EXNS ! Exner function at sea surface
176 REAL, DIMENSION(SIZE(KMASK)) :: ZW_PS ! air pressure at sea surface (Pa)
177 REAL, DIMENSION(SIZE(KMASK)) :: ZW_RAIN !precipitation rate (kg/s/m2)
178 REAL, DIMENSION(SIZE(KMASK)) :: ZW_SNOW !snow rate (kg/s/m2)
179 !
180 REAL, DIMENSION(SIZE(KMASK)) :: ZW_Z0SEA! roughness length over the ocean
181 !
182 ! surface fluxes : latent heat, sensible heat, friction fluxes
183 REAL, DIMENSION(SIZE(KMASK)) :: ZW_SFTH ! heat flux (W/m2)
184 REAL, DIMENSION(SIZE(KMASK)) :: ZW_SFTQ ! water flux (kg/m2/s)
185 REAL, DIMENSION(SIZE(KMASK)) :: ZW_USTAR! friction velocity (m/s)
186 !
187 ! diagnostics
188 REAL, DIMENSION(SIZE(KMASK)) :: ZW_QSAT ! humidity at saturation
189 REAL, DIMENSION(SIZE(KMASK)) :: ZW_CD ! heat drag coefficient
190 REAL, DIMENSION(SIZE(KMASK)) :: ZW_CDN ! momentum drag coefficient
191 REAL, DIMENSION(SIZE(KMASK)) :: ZW_CH ! neutral momentum drag coefficient
192 REAL, DIMENSION(SIZE(KMASK)) :: ZW_CE !transfer coef. for latent heat flux
193 REAL, DIMENSION(SIZE(KMASK)) :: ZW_RI ! Richardson number
194 REAL, DIMENSION(SIZE(KMASK)) :: ZW_RESA ! aerodynamical resistance
195 REAL, DIMENSION(SIZE(KMASK)) :: ZW_Z0HSEA ! heat roughness length
196 !
197 REAL(KIND=JPRB) :: ZHOOK_HANDLE
198 !
199 IF (lhook) CALL dr_hook('COARE30_SEAFLUX:TREAT_SURF',0,zhook_handle)
200 !
201 DO jj=1, SIZE(kmask)
202  zw_ta(jj) = pta(kmask(jj))
203  zw_qa(jj) = pqa(kmask(jj))
204  zw_exna(jj) = pexna(kmask(jj))
205  zw_rhoa(jj) = prhoa(kmask(jj))
206  zw_vmod(jj) = pvmod(kmask(jj))
207  zw_zref(jj) = pzref(kmask(jj))
208  zw_uref(jj) = puref(kmask(jj))
209  zw_sst(jj) = psst(kmask(jj))
210  zw_exns(jj) = pexns(kmask(jj))
211  zw_ps(jj) = pps(kmask(jj))
212  zw_rain(jj) = prain(kmask(jj))
213  zw_snow(jj) = psnow(kmask(jj))
214  zw_z0sea(jj)= s%XZ0(kmask(jj))
215 ENDDO
216 !
217 zw_sfth(:) = xundef
218 zw_sftq(:) = xundef
219 zw_ustar(:) = xundef
220 zw_qsat(:) = xundef
221 zw_cd(:) = xundef
222 zw_cdn(:) = xundef
223 zw_ch(:) = xundef
224 zw_ce(:) = xundef
225 zw_ri(:) = xundef
226 zw_resa(:) = xundef
227 zw_z0hsea(:) = xundef
228 !
229 IF (ytype=='W') THEN
230  !
231  CALL coare30_flux(s, zw_z0sea,zw_ta,zw_exna,zw_rhoa,zw_sst,zw_exns,&
232  zw_qa,zw_vmod,zw_zref,zw_uref,zw_ps,zw_qsat,zw_sfth,zw_sftq,zw_ustar,&
233  zw_cd,zw_cdn,zw_ch,zw_ce,zw_ri,zw_resa,zw_rain,zw_z0hsea)
234  !
235 ELSEIF ( (ytype=='I') .AND. (.NOT. s%LHANDLE_SIC)) THEN
236  !
237  CALL ice_sea_flux(zw_z0sea,zw_ta,zw_exna,zw_rhoa,zw_sst,zw_exns,zw_qa,zw_rain,zw_snow, &
238  zw_vmod,zw_zref,zw_uref,zw_ps,zw_qsat,zw_sfth,zw_sftq,zw_ustar,zw_cd, &
239  zw_cdn,zw_ch,zw_ri,zw_resa,zw_z0hsea)
240  !
241 ENDIF
242 !
243 DO jj=1, SIZE(kmask)
244  s%XZ0(kmask(jj)) = zw_z0sea(jj)
245  psfth(kmask(jj)) = zw_sfth(jj)
246  psftq(kmask(jj)) = zw_sftq(jj)
247  pustar(kmask(jj)) = zw_ustar(jj)
248  pqsat(kmask(jj)) = zw_qsat(jj)
249  pcd(kmask(jj)) = zw_cd(jj)
250  pcdn(kmask(jj)) = zw_cdn(jj)
251  pch(kmask(jj)) = zw_ch(jj)
252  pce(kmask(jj)) = zw_ce(jj)
253  pri(kmask(jj)) = zw_ri(jj)
254  presa(kmask(jj)) = zw_resa(jj)
255  pz0hsea(kmask(jj)) = zw_z0hsea(jj)
256 END DO
257 IF (lhook) CALL dr_hook('COARE30_SEAFLUX:TREAT_SURF',1,zhook_handle)
258 !
259 END SUBROUTINE treat_surf
260 !
261 END SUBROUTINE coare30_seaflux
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine treat_surf(KMASK, YTYPE)
subroutine ice_sea_flux(PZ0ICE,
Definition: ice_sea_flux.F90:7
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:9