SURFEX v8.1
General documentation of Surfex
diag_inline_seafluxn.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 diag_inline_seaflux_n (DGO, D, DC, DI, DIC, DGMSI, S, &
7  PTSTEP, PTA, PQA, PPA, PPS, PRHOA, PZONA, &
8  PMERA, PHT, PHW, PCD, PCDN, PCH, PCE, PRI, PHU, &
9  PZ0H, PQSAT, PSFTH, PSFTQ, PSFZON, PSFMER, &
10  PDIR_SW, PSCA_SW, PLW, PDIR_ALB, PSCA_ALB, &
11  PEMIS, PTRAD, PRAIN, PSNOW, &
12  PCD_ICE, PCDN_ICE, PCH_ICE, PCE_ICE, PRI_ICE, &
13  PZ0_ICE, PZ0H_ICE, PQSAT_ICE, PSFTH_ICE, PSFTQ_ICE, &
14  PSFZON_ICE, PSFMER_ICE )
15 
16 ! #####################################################################################
17 !
18 !!**** *DIAG_INLINE_SEAFLUX_n * - computes diagnostics during SEAFLUX time-step
19 !!
20 !! PURPOSE
21 !! -------
22 !
23 !!** METHOD
24 !! ------
25 !!
26 !! REFERENCE
27 !! ---------
28 !!
29 !!
30 !! AUTHOR
31 !! ------
32 !! V. Masson
33 !!
34 !! MODIFICATIONS
35 !! -------------
36 !! Original 01/2004
37 !! Modified 01/2006 : sea flux parameterization.
38 !! B. Decharme 08/2009 : Diag for Earth System Model Coupling
39 !! S. Riette 06/2009 CLS_2M becomes CLS_TQ, CLS_TQ and CLS_WIND have one
40 !! more argument (height of diagnostic)
41 !! B. Decharme 04/2013 : Add EVAP and SUBL diag
42 !! S. Senesi 01/2014 ! introduce fractional seaice and sea-ice model
43 !!------------------------------------------------------------------
44 !
47 USE modd_seaflux_n, ONLY : seaflux_t
48 !
49 USE modd_csts, ONLY : xtts
50 USE modd_surf_par, ONLY : xundef
51 USE modd_sfx_oasis, ONLY : lcpl_sea
52 !
53 USE modd_types_glt, ONLY : t_glt
54 USE modd_glt_param , ONLY : gelato_dim=>nx
55 USE mode_glt_stats , ONLY : glt_avhicem, glt_avhsnwm
56 USE modi_cls_tq
57 USE modi_cls_wind
58 USE modi_diag_surf_budget_sea
59 USE modi_diag_surf_budgetc
60 USE modi_diag_cpl_esm_sea
61 !
62 USE modi_seaflux_albedo
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(diag_options_t), INTENT(INOUT) :: DGO
73 TYPE(diag_t), INTENT(INOUT) :: D
74 TYPE(diag_t), INTENT(INOUT) :: DC
75 TYPE(diag_t), INTENT(INOUT) :: DI
76 TYPE(diag_t), INTENT(INOUT) :: DIC
77 TYPE(diag_misc_seaice_t), INTENT(INOUT) :: DGMSI
78 TYPE(seaflux_t), INTENT(INOUT) :: S
79 !
80 REAL, INTENT(IN) :: PTSTEP ! atmospheric time-step (s)
81 REAL, DIMENSION(:), INTENT(IN) :: PTA ! atmospheric temperature
82 REAL, DIMENSION(:), INTENT(IN) :: PQA ! atmospheric specific humidity
83 REAL, DIMENSION(:), INTENT(IN) :: PPA ! atmospheric level pressure
84 REAL, DIMENSION(:), INTENT(IN) :: PPS ! surface pressure
85 REAL, DIMENSION(:), INTENT(IN) :: PRHOA ! air density
86 REAL, DIMENSION(:), INTENT(IN) :: PZONA ! zonal wind
87 REAL, DIMENSION(:), INTENT(IN) :: PMERA ! meridian wind
88 REAL, DIMENSION(:), INTENT(IN) :: PHT ! atmospheric level height
89 REAL, DIMENSION(:), INTENT(IN) :: PHW ! atmospheric level height for wind
90 REAL, DIMENSION(:), INTENT(IN) :: PCD ! drag coefficient for momentum
91 REAL, DIMENSION(:), INTENT(IN) :: PCDN ! neutral drag coefficient
92 REAL, DIMENSION(:), INTENT(IN) :: PCH ! drag coefficient for heat
93 REAL, DIMENSION(:), INTENT(IN) :: PCE ! drag coefficient for vapor
94 REAL, DIMENSION(:), INTENT(IN) :: PRI ! Richardson number
95 REAL, DIMENSION(:), INTENT(IN) :: PHU ! near-surface humidity
96 REAL, DIMENSION(:), INTENT(IN) :: PZ0H ! roughness length for heat
97 REAL, DIMENSION(:), INTENT(IN) :: PQSAT ! humidity at saturation
98 REAL, DIMENSION(:), INTENT(IN) :: PSFZON ! zonal friction
99 REAL, DIMENSION(:), INTENT(IN) :: PSFMER ! meridian friction
100 REAL, DIMENSION(:), INTENT(IN) :: PSFTH ! heat flux (W/m2)
101 REAL, DIMENSION(:), INTENT(IN) :: PSFTQ ! water flux (kg/m2/s)
102 REAL, DIMENSION(:,:),INTENT(IN):: PDIR_SW ! direct solar radiation (on horizontal surf.)
103 ! ! (W/m2)
104 REAL, DIMENSION(:,:),INTENT(IN):: PSCA_SW ! diffuse solar radiation (on horizontal surf.)
105 ! ! (W/m2)
106 REAL, DIMENSION(:), INTENT(IN) :: PLW ! longwave radiation (on horizontal surf.)
107 REAL, DIMENSION(:), INTENT(IN) :: PTRAD ! radiative temperature (K)
108 REAL, DIMENSION(:,:),INTENT(IN):: PDIR_ALB ! direct albedo for each spectral band (-)
109 REAL, DIMENSION(:,:),INTENT(IN):: PSCA_ALB ! diffuse albedo for each spectral band (-)
110 REAL, DIMENSION(:), INTENT(IN) :: PEMIS ! emissivity (-)
111 !
112 REAL, DIMENSION(:), INTENT(IN) :: PRAIN ! Rainfall (kg/m2/s)
113 REAL, DIMENSION(:), INTENT(IN) :: PSNOW ! Snowfall (kg/m2/s)
114 !
115 REAL, DIMENSION(:), INTENT(IN) :: PCD_ICE ! drag coefficient for momentum
116 REAL, DIMENSION(:), INTENT(IN) :: PCDN_ICE ! neutral drag coefficient
117 REAL, DIMENSION(:), INTENT(IN) :: PCH_ICE ! drag coefficient for heat
118 REAL, DIMENSION(:), INTENT(IN) :: PCE_ICE ! drag coefficient for vapor
119 REAL, DIMENSION(:), INTENT(IN) :: PRI_ICE ! Richardson number
120 REAL, DIMENSION(:), INTENT(IN) :: PZ0_ICE ! roughness length for momentum
121 REAL, DIMENSION(:), INTENT(IN) :: PZ0H_ICE ! roughness length for heat
122 REAL, DIMENSION(:), INTENT(IN) :: PQSAT_ICE ! humidity at saturation
123 REAL, DIMENSION(:), INTENT(IN) :: PSFTH_ICE ! heat flux (W/m2)
124 REAL, DIMENSION(:), INTENT(IN) :: PSFTQ_ICE ! water flux (kg/m2/s)
125 REAL, DIMENSION(:), INTENT(IN) :: PSFZON_ICE ! zonal friction
126 REAL, DIMENSION(:), INTENT(IN) :: PSFMER_ICE ! meridian friction
127 !
128 !* 0.2 declarations of local variables
129 !
130 LOGICAL :: GSIC
131 REAL, DIMENSION(SIZE(PTA)) :: ZZ0W
132 REAL, DIMENSION(SIZE(PTA)) :: ZH
133 !
134 REAL(KIND=JPRB) :: ZHOOK_HANDLE
135 !-------------------------------------------------------------------------------------
136 !
137 IF (lhook) CALL dr_hook('DIAG_INLINE_SEAFLUX_N',0,zhook_handle)
138 !
139 ! * Mean surface temperature need to couple with AGCM
140 !
141 IF (s%LHANDLE_SIC) THEN
142  d%XTS (:) = (1 - s%XSIC(:)) * s%XSST(:) + s%XSIC(:) * s%XTICE(:)
143  d%XTSRAD(:) = ptrad(:)
144 ELSE
145  d%XTS (:) = s%XSST (:)
146  d%XTSRAD(:) = ptrad(:)
147 ENDIF
148 !
149 IF (.NOT. s%LSBL) THEN
150 !
151  IF (dgo%N2M==2) THEN
152  zh(:)=2.
153  CALL cls_tq(pta, pqa, ppa, pps, pht, pcd, pch, pri, &
154  s%XSST, phu, pz0h, zh,d%XT2M, d%XQ2M, d%XHU2M)
155  zh(:)=10.
156  CALL cls_wind(pzona, pmera, phw,pcd, pcdn, pri, zh, &
157  d%XZON10M, d%XMER10M)
158  IF (s%LHANDLE_SIC) THEN
159  zh(:)=2.
160  CALL cls_tq(pta, pqa, ppa, pps, pht, pcd_ice, pch_ice, pri_ice, &
161  s%XTICE, phu, pz0h_ice, zh, di%XT2M, di%XQ2M, di%XHU2M)
162  zh(:)=10.
163  CALL cls_wind(pzona, pmera, phw, pcd_ice, pcdn_ice, pri_ice, zh, &
164  di%XZON10M, di%XMER10M )
165  ENDIF
166  END IF
167 !
168  IF (dgo%N2M>=1) THEN
169  IF (s%LHANDLE_SIC) THEN
170  !
171  d%XT2M = d%XT2M * (1 - s%XSIC) + di%XT2M * s%XSIC
172  d%XQ2M = d%XQ2M * (1 - s%XSIC) + di%XQ2M * s%XSIC
173  d%XHU2M = d%XHU2M * (1 - s%XSIC) + di%XHU2M * s%XSIC
174  !
175  d%XZON10M(:) = d%XZON10M(:) * (1 - s%XSIC(:)) + di%XZON10M(:) * s%XSIC(:)
176  d%XMER10M(:) = d%XMER10M(:) * (1 - s%XSIC(:)) + di%XMER10M(:) * s%XSIC(:)
177  di%XWIND10M(:) = sqrt(di%XZON10M(:)**2+di%XMER10M(:)**2)
178  !
179  d%XRI = pri * (1 - s%XSIC) + pri_ice * s%XSIC
180  di%XRI =pri_ice
181  ELSE
182  d%XRI =pri
183  ENDIF
184  !
185  d%XT2M_MIN(:) = min(d%XT2M_MIN(:),d%XT2M(:))
186  d%XT2M_MAX(:) = max(d%XT2M_MAX(:),d%XT2M(:))
187  !
188  d%XHU2M_MIN(:) = min(d%XHU2M_MIN(:),d%XHU2M(:))
189  d%XHU2M_MAX(:) = max(d%XHU2M_MAX(:),d%XHU2M(:))
190  !
191  d%XWIND10M(:) = sqrt(d%XZON10M(:)**2+d%XMER10M(:)**2)
192  d%XWIND10M_MAX(:) = max(d%XWIND10M_MAX(:),d%XWIND10M(:))
193  !
194  ENDIF
195 !
196 ELSE
197  IF (dgo%N2M>=1) THEN
198  d%XT2M = xundef
199  d%XQ2M = xundef
200  d%XHU2M = xundef
201  d%XZON10M = xundef
202  d%XMER10M = xundef
203  d%XRI = pri
204  ENDIF
205 ENDIF
206 !
207 IF (dgo%LSURF_BUDGET.OR.dgo%LSURF_BUDGETC) THEN
208 !
209  CALL seaflux_albedo(pdir_sw,psca_sw,pdir_alb,psca_alb,d%XALBT)
210 !
211  CALL diag_surf_budget_sea (d, di, s, xtts, prhoa, psfth, psfth_ice, &
212  psftq, psftq_ice, pdir_sw, psca_sw, plw, &
213  pdir_alb, psca_alb, pemis, ptrad, &
214  psfzon, psfzon_ice, psfmer, psfmer_ice )
215  IF (s%LHANDLE_SIC) di%XLE = d%XLEI
216 !
217 END IF
218 !
219 IF(dgo%LSURF_BUDGETC)THEN
220  !
221  CALL diag_surf_budgetc(d, dc, ptstep, .true.)
222  !
223  IF (s%LHANDLE_SIC) THEN
224  CALL diag_surf_budgetc(di, dic, ptstep, .false.)
225  dic%XLE = dc%XLEI
226  ENDIF
227  !
228 ENDIF
229 !
230 IF (dgo%LCOEF) THEN
231  IF (s%LHANDLE_SIC) THEN
232  !
233  !* Transfer coefficients
234  !
235  d%XCD = (1 - s%XSIC) * pcd + s%XSIC * pcd_ice
236  d%XCH = (1 - s%XSIC) * pch + s%XSIC * pch_ice
237  d%XCE = (1 - s%XSIC) * pce + s%XSIC * pce_ice
238  !
239  !* Roughness lengths
240  !
241  zz0w = ( 1 - s%XSIC ) * 1.0/(log(phw/s%XZ0) **2) + s%XSIC * 1.0/(log(phw/pz0_ice)**2)
242  d%XZ0 = phw * exp( - sqrt( 1./ zz0w ))
243  zz0w = ( 1 - s%XSIC ) * 1.0/(log(phw/pz0h) **2) + s%XSIC * 1.0/(log(phw/pz0h_ice)**2)
244  d%XZ0H = phw * exp( - sqrt( 1./ zz0w ))
245 
246  di%XCD = pcd_ice
247  di%XCH = pch_ice
248  di%XZ0 = pz0_ice
249  di%XZ0H = pz0h_ice
250  !
251  ELSE
252  !
253  !* Transfer coefficients
254  !
255  d%XCD = pcd
256  d%XCH = pch
257  d%XCE = pce
258  !
259  !* Roughness lengths
260  !
261  d%XZ0 = s%XZ0
262  d%XZ0H = pz0h
263  ENDIF
264  !
265 ENDIF
266 !
267 IF (dgo%LSURF_VARS) THEN
268  !
269  !* Humidity at saturation
270  !
271  IF (s%LHANDLE_SIC) THEN
272  d%XQS = (1 - s%XSIC) * pqsat + s%XSIC * pqsat_ice
273  di%XQS = pqsat_ice
274  ELSE
275  d%XQS = pqsat
276  ENDIF
277 ENDIF
278 !
279 ! Diags from embedded Seaice model
280 ! CALL DIAG_INLINE_SEAICE() : simply :
281 !
282 IF (dgmsi%LDIAG_MISC_SEAICE) THEN
283  IF (trim(s%CSEAICE_SCHEME) == 'GELATO') THEN
284  gelato_dim=SIZE(pta)
285  dgmsi%XSIT = reshape(glt_avhicem(s%TGLT%dom,s%TGLT%sit),(/gelato_dim/))
286  dgmsi%XSND = reshape(glt_avhsnwm(s%TGLT%dom,s%TGLT%sit),(/gelato_dim/))
287  dgmsi%XMLT = s%TGLT%oce_all(:,1)%tml
288  ELSE
289  ! Placeholder for an alternate seaice scheme
290  ENDIF
291 ENDIF
292 !
293 ! Diags for Earth System Model coupling or for embedded Seaice model
294 ! (we are actually using XCPL_.. variables for feeding the seaice model)
295 !
296 gsic=(s%LHANDLE_SIC.AND.(s%CSEAICE_SCHEME /= 'NONE '))
297 !
298 IF (lcpl_sea.OR.gsic) THEN
299 !
300  CALL diag_cpl_esm_sea(s, d, di, ptstep, psftq, prain, psnow, &
301  plw, psfth_ice, psftq_ice, pdir_sw, psca_sw, gsic )
302 !
303 ENDIF
304 IF (lhook) CALL dr_hook('DIAG_INLINE_SEAFLUX_N',1,zhook_handle)
305 !
306 !-------------------------------------------------------------------------------------
307 !
308 END SUBROUTINE diag_inline_seaflux_n
subroutine cls_wind(PZONA, PMERA, PHW, PCD, PCDN, PRI, PHV, PZON10M, PMER10M)
Definition: cls_wind.F90:7
subroutine diag_surf_budget_sea(D, DI, S, PTT, PRHOA, PSFTH, PSFTH_ICE, PSFTQ, PSFTQ_ICE, PDIR_SW, PSCA_SW, PLW, PDIR_ALB, PSCA_ALB, PEMIS, PTRAD, PSFZON, PSFZON_ICE, PSFMER, PSFMER_ICE)
subroutine diag_cpl_esm_sea(S, D, DI, PTSTEP, PSFTQ, PRAIN, PSNOW, PLW, PSFTH_ICE, PSFTQ_ICE, PDIR_SW, PSCA_SW, OSIC)
real, save xtts
Definition: modd_csts.F90:68
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine diag_surf_budgetc(D, DC, PTSTEP, ONOTICE)
subroutine seaflux_albedo(PDIR_SW, PSCA_SW, PDIR_ALB, PSCA_ALB, PALB)
subroutine diag_inline_seaflux_n(DGO, D, DC, DI, DIC, DGMSI, S, PTSTEP, PTA, PQA, PPA, PPS, PRHOA, PZONA, PMERA, PHT, PHW, PCD, PCDN, PCH, PCE, PRI, PHU, PZ0H, PQSAT, PSFTH, PSFTQ, PSFZON, PSFMER, PDIR_SW, PSCA_SW, PLW, PDIR_ALB, PSCA_ALB, PEMIS, PTRAD, PRAIN, PSNOW, PCD_ICE, PCDN_ICE, PCH_ICE, PCE_ICE, PRI_ICE, PZ0_ICE, PZ0H_ICE, PQSAT_ICE, PSFTH_ICE, PSFTQ_ICE, PSFZON_ICE, PSFMER_ICE)
subroutine cls_tq(PTA, PQA, PPA, PPS, PHT, PCD, PCH, PRI, PTS, PHU, PZ0H, PH, PTNM, PQNM, PHUNM)
Definition: cls_tq.F90:8