SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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 (DGS, DGSI, S, &
7  ptstep, pta, pqa, &
8  ppa, pps, prhoa, pzona, &
9  pmera, pht, phw, pcd, pcdn, pch, pce, pri, phu, &
10  pz0h, pqsat, psfth, psftq, psfzon, psfmer, &
11  pdir_sw, psca_sw, plw, pdir_alb, psca_alb, &
12  pemis, ptrad, prain, psnow, &
13  pcd_ice, pcdn_ice, pch_ice, pce_ice, pri_ice, &
14  pz0_ice, pz0h_ice, pqsat_ice, psfth_ice, psftq_ice, &
15  psfzon_ice, psfmer_ice )
16 
17 ! #####################################################################################
18 !
19 !!**** *DIAG_INLINE_SEAFLUX_n * - computes diagnostics during SEAFLUX time-step
20 !!
21 !! PURPOSE
22 !! -------
23 !
24 !!** METHOD
25 !! ------
26 !!
27 !! REFERENCE
28 !! ---------
29 !!
30 !!
31 !! AUTHOR
32 !! ------
33 !! V. Masson
34 !!
35 !! MODIFICATIONS
36 !! -------------
37 !! Original 01/2004
38 !! Modified 01/2006 : sea flux parameterization.
39 !! B. Decharme 08/2009 : Diag for Earth System Model Coupling
40 !! S. Riette 06/2009 CLS_2M becomes CLS_TQ, CLS_TQ and CLS_WIND have one
41 !! more argument (height of diagnostic)
42 !! B. Decharme 04/2013 : Add EVAP and SUBL diag
43 !! S. Senesi 01/2014 ! introduce fractional seaice and sea-ice model
44 !!------------------------------------------------------------------
45 !
46 
47 !
48 !
49 !
52 USE modd_seaflux_n, ONLY : seaflux_t
53 !
54 USE modd_csts, ONLY : xtts
55 USE modd_surf_par, ONLY : xundef
56 USE modd_sfx_oasis, ONLY : lcpl_sea
57 !
58 USE modd_types_glt, ONLY : t_glt
59 USE modd_glt_param , ONLY : gelato_dim=>nx
61 USE modi_param_cls
62 USE modi_cls_tq
63 USE modi_cls_wind
64 USE modi_diag_surf_budget_sea
65 USE modi_diag_surf_budgetc_sea
66 USE modi_diag_cpl_esm_sea
67 !
68 USE modi_seaflux_albedo
69 !
70 USE yomhook ,ONLY : lhook, dr_hook
71 USE parkind1 ,ONLY : jprb
72 !
73 IMPLICIT NONE
74 !
75 !* 0.1 declarations of arguments
76 !
77 !
78 TYPE(diag_seaflux_t), INTENT(INOUT) :: dgs
79 TYPE(diag_seaice_t), INTENT(INOUT) :: dgsi
80 TYPE(seaflux_t), INTENT(INOUT) :: s
81 !
82 REAL, INTENT(IN) :: ptstep ! atmospheric time-step (s)
83 REAL, DIMENSION(:), INTENT(IN) :: pta ! atmospheric temperature
84 REAL, DIMENSION(:), INTENT(IN) :: pqa ! atmospheric specific humidity
85 REAL, DIMENSION(:), INTENT(IN) :: ppa ! atmospheric level pressure
86 REAL, DIMENSION(:), INTENT(IN) :: pps ! surface pressure
87 REAL, DIMENSION(:), INTENT(IN) :: prhoa ! air density
88 REAL, DIMENSION(:), INTENT(IN) :: pzona ! zonal wind
89 REAL, DIMENSION(:), INTENT(IN) :: pmera ! meridian wind
90 REAL, DIMENSION(:), INTENT(IN) :: pht ! atmospheric level height
91 REAL, DIMENSION(:), INTENT(IN) :: phw ! atmospheric level height for wind
92 REAL, DIMENSION(:), INTENT(IN) :: pcd ! drag coefficient for momentum
93 REAL, DIMENSION(:), INTENT(IN) :: pcdn ! neutral drag coefficient
94 REAL, DIMENSION(:), INTENT(IN) :: pch ! drag coefficient for heat
95 REAL, DIMENSION(:), INTENT(IN) :: pce ! drag coefficient for vapor
96 REAL, DIMENSION(:), INTENT(IN) :: pri ! Richardson number
97 REAL, DIMENSION(:), INTENT(IN) :: phu ! near-surface humidity
98 REAL, DIMENSION(:), INTENT(IN) :: pz0h ! roughness length for heat
99 REAL, DIMENSION(:), INTENT(IN) :: pqsat ! humidity at saturation
100 REAL, DIMENSION(:), INTENT(IN) :: psfzon ! zonal friction
101 REAL, DIMENSION(:), INTENT(IN) :: psfmer ! meridian friction
102 REAL, DIMENSION(:), INTENT(IN) :: psfth ! heat flux (W/m2)
103 REAL, DIMENSION(:), INTENT(IN) :: psftq ! water flux (kg/m2/s)
104 REAL, DIMENSION(:,:),INTENT(IN):: pdir_sw ! direct solar radiation (on horizontal surf.)
105 ! ! (W/m2)
106 REAL, DIMENSION(:,:),INTENT(IN):: psca_sw ! diffuse solar radiation (on horizontal surf.)
107 ! ! (W/m2)
108 REAL, DIMENSION(:), INTENT(IN) :: plw ! longwave radiation (on horizontal surf.)
109 REAL, DIMENSION(:), INTENT(IN) :: ptrad ! radiative temperature (K)
110 REAL, DIMENSION(:,:),INTENT(IN):: pdir_alb ! direct albedo for each spectral band (-)
111 REAL, DIMENSION(:,:),INTENT(IN):: psca_alb ! diffuse albedo for each spectral band (-)
112 REAL, DIMENSION(:), INTENT(IN) :: pemis ! emissivity (-)
113 !
114 REAL, DIMENSION(:), INTENT(IN) :: prain ! Rainfall (kg/m2/s)
115 REAL, DIMENSION(:), INTENT(IN) :: psnow ! Snowfall (kg/m2/s)
116 !
117 REAL, DIMENSION(:), INTENT(IN) :: pcd_ice ! drag coefficient for momentum
118 REAL, DIMENSION(:), INTENT(IN) :: pcdn_ice ! neutral drag coefficient
119 REAL, DIMENSION(:), INTENT(IN) :: pch_ice ! drag coefficient for heat
120 REAL, DIMENSION(:), INTENT(IN) :: pce_ice ! drag coefficient for vapor
121 REAL, DIMENSION(:), INTENT(IN) :: pri_ice ! Richardson number
122 REAL, DIMENSION(:), INTENT(IN) :: pz0_ice ! roughness length for momentum
123 REAL, DIMENSION(:), INTENT(IN) :: pz0h_ice ! roughness length for heat
124 REAL, DIMENSION(:), INTENT(IN) :: pqsat_ice ! humidity at saturation
125 REAL, DIMENSION(:), INTENT(IN) :: psfth_ice ! heat flux (W/m2)
126 REAL, DIMENSION(:), INTENT(IN) :: psftq_ice ! water flux (kg/m2/s)
127 REAL, DIMENSION(:), INTENT(IN) :: psfzon_ice ! zonal friction
128 REAL, DIMENSION(:), INTENT(IN) :: psfmer_ice ! meridian friction
129 !
130 !* 0.2 declarations of local variables
131 !
132 LOGICAL :: gsic
133 REAL, DIMENSION(SIZE(PTA)) :: zz0w
134 REAL, DIMENSION(SIZE(PTA)) :: zh
135 !
136 REAL(KIND=JPRB) :: zhook_handle
137 !-------------------------------------------------------------------------------------
138 !
139 IF (lhook) CALL dr_hook('DIAG_INLINE_SEAFLUX_N',0,zhook_handle)
140 !
141 ! * Mean surface temperature need to couple with AGCM
142 !
143 IF (s%LHANDLE_SIC) THEN
144  dgs%XTS (:) = (1 - s%XSIC(:)) * s%XSST(:) + s%XSIC(:) * s%XTICE(:)
145  dgs%XTSRAD(:) = ptrad(:)
146 ELSE
147  dgs%XTS (:) = s%XSST (:)
148  dgs%XTSRAD(:) = ptrad(:)
149 ENDIF
150 !
151 IF (.NOT. s%LSBL) THEN
152 !
153  IF (dgs%N2M==1) THEN
154  CALL param_cls(pta, s%XSST, pqa, ppa, prhoa, pzona, pmera, pht, phw, &
155  psfth, psftq, psfzon, psfmer, &
156  dgs%XT2M, dgs%XQ2M, dgs%XHU2M, dgs%XZON10M, dgs%XMER10M )
157  IF (s%LHANDLE_SIC) THEN
158  CALL param_cls(pta, s%XTICE, pqa, ppa, prhoa, pzona, pmera, pht, phw, &
159  psfth_ice, psftq_ice, psfzon_ice, psfmer_ice, &
160  dgs%XT2M_ICE, dgs%XQ2M_ICE, dgs%XHU2M_ICE, dgs%XZON10M_ICE, dgs%XMER10M_ICE )
161  ENDIF
162  ELSE IF (dgs%N2M==2) THEN
163  zh(:)=2.
164  CALL cls_tq(pta, pqa, ppa, pps, pht, &
165  pcd, pch, pri, &
166  s%XSST, phu, pz0h, zh, &
167  dgs%XT2M, dgs%XQ2M, dgs%XHU2M)
168  zh(:)=10.
169  CALL cls_wind(pzona, pmera, phw, &
170  pcd, pcdn, pri, zh, &
171  dgs%XZON10M, dgs%XMER10M)
172  IF (s%LHANDLE_SIC) THEN
173  zh(:)=2.
174  CALL cls_tq(pta, pqa, ppa, pps, pht, &
175  pcd_ice, pch_ice, pri_ice, &
176  s%XTICE, phu, pz0h_ice, zh, &
177  dgs%XT2M_ICE, dgs%XQ2M_ICE, dgs%XHU2M_ICE)
178  zh(:)=10.
179  CALL cls_wind(pzona, pmera, phw, &
180  pcd_ice, pcdn_ice, pri_ice, zh, &
181  dgs%XZON10M_ICE, dgs%XMER10M_ICE )
182  ENDIF
183  END IF
184 !
185  IF (dgs%N2M>=1) THEN
186  IF (s%LHANDLE_SIC) THEN
187  !
188  dgs%XT2M = dgs%XT2M * (1 - s%XSIC) + dgs%XT2M_ICE * s%XSIC
189  dgs%XQ2M = dgs%XQ2M * (1 - s%XSIC) + dgs%XQ2M_ICE * s%XSIC
190  dgs%XHU2M = dgs%XHU2M * (1 - s%XSIC) + dgs%XHU2M_ICE * s%XSIC
191  !
192  dgs%XZON10M(:) = dgs%XZON10M(:) * (1 - s%XSIC(:)) + dgs%XZON10M_ICE(:) * s%XSIC(:)
193  dgs%XMER10M(:) = dgs%XMER10M(:) * (1 - s%XSIC(:)) + dgs%XMER10M_ICE(:) * s%XSIC(:)
194  dgs%XWIND10M_ICE(:) = sqrt(dgs%XZON10M_ICE(:)**2+dgs%XMER10M_ICE(:)**2)
195  !
196  dgs%XRI = pri * (1 - s%XSIC) + pri_ice * s%XSIC
197  dgs%XRI_ICE=pri_ice
198  ELSE
199  dgs%XRI =pri
200  ENDIF
201  !
202  dgs%XT2M_MIN(:) = min(dgs%XT2M_MIN(:),dgs%XT2M(:))
203  dgs%XT2M_MAX(:) = max(dgs%XT2M_MAX(:),dgs%XT2M(:))
204  !
205  dgs%XHU2M_MIN(:) = min(dgs%XHU2M_MIN(:),dgs%XHU2M(:))
206  dgs%XHU2M_MAX(:) = max(dgs%XHU2M_MAX(:),dgs%XHU2M(:))
207  !
208  dgs%XWIND10M(:) = sqrt(dgs%XZON10M(:)**2+dgs%XMER10M(:)**2)
209  dgs%XWIND10M_MAX(:) = max(dgs%XWIND10M_MAX(:),dgs%XWIND10M(:))
210  !
211  ENDIF
212 !
213 ELSE
214  IF (dgs%N2M>=1) THEN
215  dgs%XT2M = xundef
216  dgs%XQ2M = xundef
217  dgs%XHU2M = xundef
218  dgs%XZON10M = xundef
219  dgs%XMER10M = xundef
220  dgs%XRI = pri
221  ENDIF
222 ENDIF
223 !
224 IF (dgs%LSURF_BUDGET.OR.dgs%LSURF_BUDGETC) THEN
225 !
226  CALL seaflux_albedo(pdir_sw,psca_sw,pdir_alb,psca_alb,dgs%XALBT)
227 !
228  CALL diag_surf_budget_sea(xtts, s%XSST, prhoa, psfth, psfth_ice, &
229  psftq, psftq_ice, &
230  pdir_sw, psca_sw, plw, pdir_alb, &
231  psca_alb,s%XICE_ALB, pemis, ptrad, &
232  psfzon, psfzon_ice, psfmer, &
233  psfmer_ice, s%LHANDLE_SIC, s%XSIC, s%XTICE, &
234  dgs%XRN, dgs%XH, dgs%XLE, dgs%XLE_ICE, dgs%XGFLUX, &
235  dgs%XSWD, dgs%XSWU, dgs%XSWBD, dgs%XSWBU, dgs%XLWD, dgs%XLWU, &
236  dgs%XFMU, dgs%XFMV, dgs%XEVAP, dgs%XSUBL, &
237  dgs%XRN_ICE, dgs%XH_ICE, dgs%XGFLUX_ICE, &
238  dgs%XSWU_ICE, dgs%XSWBU_ICE, dgs%XLWU_ICE, &
239  dgs%XFMU_ICE, dgs%XFMV_ICE )
240 !
241 END IF
242 !
243 IF(dgs%LSURF_BUDGETC)THEN
244  CALL diag_surf_budgetc_sea(dgs, &
245  ptstep, dgs%XRN, dgs%XH, dgs%XLE, dgs%XLE_ICE, dgs%XGFLUX, &
246  dgs%XSWD, dgs%XSWU, dgs%XLWD, dgs%XLWU, dgs%XFMU, dgs%XFMV, &
247  dgs%XEVAP, dgs%XSUBL, s%LHANDLE_SIC, &
248  dgs%XRN_ICE, dgs%XH_ICE, dgs%XGFLUX_ICE, &
249  dgs%XSWU_ICE, dgs%XLWU_ICE, dgs%XFMU_ICE, dgs%XFMV_ICE)
250 ENDIF
251 !
252 IF (dgs%LCOEF) THEN
253  IF (s%LHANDLE_SIC) THEN
254  !
255  !* Transfer coefficients
256  !
257  dgs%XCD = (1 - s%XSIC) * pcd + s%XSIC * pcd_ice
258  dgs%XCH = (1 - s%XSIC) * pch + s%XSIC * pch_ice
259  dgs%XCE = (1 - s%XSIC) * pce + s%XSIC * pce_ice
260  !
261  !* Roughness lengths
262  !
263  zz0w = ( 1 - s%XSIC ) * 1.0/(log(phw/s%XZ0) **2) + &
264  s%XSIC * 1.0/(log(phw/pz0_ice)**2)
265  dgs%XZ0 = phw * exp( - sqrt( 1./ zz0w ))
266  zz0w = ( 1 - s%XSIC ) * 1.0/(log(phw/pz0h) **2) + &
267  s%XSIC * 1.0/(log(phw/pz0h_ice)**2)
268  dgs%XZ0H = phw * exp( - sqrt( 1./ zz0w ))
269 
270  dgs%XCD_ICE = pcd_ice
271  dgs%XCH_ICE = pch_ice
272  dgs%XZ0_ICE = pz0_ice
273  dgs%XZ0H_ICE = pz0h_ice
274  !
275  ELSE
276  !
277  !* Transfer coefficients
278  !
279  dgs%XCD = pcd
280  dgs%XCH = pch
281  dgs%XCE = pce
282  !
283  !* Roughness lengths
284  !
285  dgs%XZ0 = s%XZ0
286  dgs%XZ0H = pz0h
287  ENDIF
288  !
289 ENDIF
290 !
291 IF (dgs%LSURF_VARS) THEN
292  !
293  !* Humidity at saturation
294  !
295  IF (s%LHANDLE_SIC) THEN
296  dgs%XQS = (1 - s%XSIC) * pqsat + s%XSIC * pqsat_ice
297  dgs%XQS_ICE = pqsat_ice
298  ELSE
299  dgs%XQS = pqsat
300  ENDIF
301 ENDIF
302 !
303 ! Diags from embedded Seaice model
304 ! CALL DIAG_INLINE_SEAICE() : simply :
305 !
306 IF (dgsi%LDIAG_SEAICE) THEN
307  IF (trim(s%CSEAICE_SCHEME) == 'GELATO') THEN
308  gelato_dim=SIZE(pta)
309  dgsi%XSIT = reshape(glt_avhicem(s%TGLT%dom,s%TGLT%sit),(/gelato_dim/))
310  dgsi%XSND = reshape(glt_avhsnwm(s%TGLT%dom,s%TGLT%sit),(/gelato_dim/))
311  dgsi%XMLT = s%TGLT%oce_all(:,1)%tml
312  ELSE
313  ! Placeholder for an alternate seaice scheme
314  ENDIF
315 ENDIF
316 !
317 ! Diags for Earth System Model coupling or for embedded Seaice model
318 ! (we are actually using XCPL_.. variables for feeding the seaice model)
319 !
320 gsic=(s%LHANDLE_SIC.AND.(s%CSEAICE_SCHEME /= 'NONE '))
321 !
322 IF (lcpl_sea.OR.gsic) THEN
323 !
324  CALL diag_cpl_esm_sea(s, &
325  ptstep,dgs%XZON10M,dgs%XMER10M,dgs%XFMU,dgs%XFMV, &
326  dgs%XSWD,dgs%XSWU,dgs%XGFLUX,psftq,prain, &
327  psnow,plw,s%XTICE,psfth_ice, &
328  psftq_ice,pdir_sw,psca_sw, &
329  dgs%XSWU_ICE,dgs%XLWU_ICE,gsic )
330 !
331 ENDIF
332 IF (lhook) CALL dr_hook('DIAG_INLINE_SEAFLUX_N',1,zhook_handle)
333 !
334 !-------------------------------------------------------------------------------------
335 !
336 END SUBROUTINE diag_inline_seaflux_n
subroutine cls_wind(PZONA, PMERA, PHW, PCD, PCDN, PRI, PHV, PZON10M, PMER10M)
Definition: cls_wind.F90:6
subroutine param_cls(PTA, PTS, PQA, PPA, PRHOA, PZONA, PMERA, PH, PHW, PSFTH, PSFTQ, PSFZON, PSFMER, PT2M, PQ2M, PHU2M, PZON10M, PMER10M)
Definition: param_cls.F90:6
subroutine diag_surf_budgetc_sea(DGS, PTSTEP, PRN, PH, PLE, PLE_ICE, PGFLUX, PSWD, PSWU, PLWD, PLWU, PFMU, PFMV, PEVAP, PSUBL, OHANDLE_SIC, PRN_ICE, PH_ICE, PGFLUX_ICE, PSWU_ICE, PLWU_ICE, PFMU_ICE, PFMV_ICE)
subroutine diag_inline_seaflux_n(DGS, DGSI, 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 diag_surf_budget_sea(PTT, PSST, PRHOA, PSFTH, PSFTH_ICE, PSFTQ, PSFTQ_ICE, PDIR_SW, PSCA_SW, PLW, PDIR_ALB, PSCA_ALB, PALB_ICE, PEMIS, PTRAD, PSFZON, PSFZON_ICE, PSFMER, PSFMER_ICE, OHANDLE_SIC, PSIC, PTICE, PRN, PH, PLE, PLE_ICE, PGFLUX, PSWD, PSWU, PSWBD, PSWBU, PLWD, PLWU, PFMU, PFMV, PEVAP, PSUBL, PRN_ICE, PH_ICE, PGFLUX_ICE, PSWU_ICE, PSWBU_ICE, PLWU_ICE, PFMU_ICE, PFMV_ICE)
subroutine diag_cpl_esm_sea(S, PTSTEP, PZON10M, PMER10M, PSFU, PSFV, PSWD, PSWU, PGFLUX, PSFTQ, PRAIN, PSNOW, PLW, PTICE, PSFTH_ICE, PSFTQ_ICE, PDIR_SW, PSCA_SW, PSWU_ICE, PLWU_ICE, OSIC)
subroutine seaflux_albedo(PDIR_SW, PSCA_SW, PDIR_ALB, PSCA_ALB, PALB)
subroutine cls_tq(PTA, PQA, PPA, PPS, PHT, PCD, PCH, PRI, PTS, PHU, PZ0H, PH, PTNM, PQNM, PHUNM)
Definition: cls_tq.F90:6