SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
diag_surf_budget_sea.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_surf_budget_sea(PTT , PSST, PRHOA, PSFTH, PSFTH_ICE, &
7  psftq, psftq_ice, &
8  pdir_sw, psca_sw, plw, &
9  pdir_alb,psca_alb,palb_ice,pemis, ptrad,&
10  psfzon, psfzon_ice, psfmer, psfmer_ice, &
11  ohandle_sic, psic, ptice, &
12  prn, ph, ple, ple_ice, pgflux, &
13  pswd, pswu, pswbd, pswbu, plwd, plwu, &
14  pfmu, pfmv, pevap, psubl, &
15  prn_ice, ph_ice, pgflux_ice, &
16  pswu_ice, pswbu_ice, plwu_ice, &
17  pfmu_ice, pfmv_ice )
18 
19 
20 ! ###############################################################################
21 !
22 !!**** *DIAG_SURF_BUDGET_WATER * - Computes diagnostics over water
23 !!
24 !! PURPOSE
25 !! -------
26 !
27 !!** METHOD
28 !! ------
29 !!
30 !! REFERENCE
31 !! ---------
32 !!
33 !!
34 !! AUTHOR
35 !! ------
36 !! V. Masson
37 !!
38 !! MODIFICATIONS
39 !! -------------
40 !! Original 01/2004
41 ! B. decharme 04/2013 : Add EVAP and SUBL diag
42 ! S.Senesi 01/2014 : Handle fluxes on seaice
43 !!------------------------------------------------------------------
44 !
45 
46 !
47 !
48 USE modd_csts, ONLY : xstefan, xlstt, xlvtt
49 USE modd_water_par, ONLY : xemiswatice, xalbseaice
50 !
51 !
52 USE yomhook ,ONLY : lhook, dr_hook
53 USE parkind1 ,ONLY : jprb
54 USE modi_abor1_sfx
55 !
56 IMPLICIT NONE
57 !
58 !* 0.1 declarations of arguments
59 !
60 REAL, INTENT(IN) :: ptt ! freezing temperature of water surface
61 REAL, DIMENSION(:), INTENT(IN) :: psst ! sea surface temperature (K)
62 REAL, DIMENSION(:), INTENT(IN) :: prhoa ! air density
63 REAL, DIMENSION(:), INTENT(IN) :: psfth ! heat flux
64 REAL, DIMENSION(:), INTENT(IN) :: psfth_ice ! heat flux on seaice
65 !
66 REAL, DIMENSION(:), INTENT(IN) :: psftq ! water flux
67 REAL, DIMENSION(:), INTENT(IN) :: psftq_ice ! water flux on seaice
68 !
69 REAL, DIMENSION(:,:),INTENT(IN):: pdir_sw ! direct solar radiation (on horizontal surf.)
70 ! ! (W/m2)
71 REAL, DIMENSION(:,:),INTENT(IN):: psca_sw ! diffuse solar radiation (on horizontal surf.)
72 ! ! (W/m2)
73 REAL, DIMENSION(:), INTENT(IN) :: plw ! longwave radiation (on horizontal surf.)
74 !
75 REAL, DIMENSION(:,:),INTENT(IN):: pdir_alb ! direct albedo for each spectral band (-)
76 REAL, DIMENSION(:,:),INTENT(IN):: psca_alb ! diffuse albedo for each spectral band (-)
77 REAL, DIMENSION(:) ,INTENT(IN):: palb_ice ! Seaice albedo
78 REAL, DIMENSION(:), INTENT(IN) :: pemis ! emissivity (-)
79 REAL, DIMENSION(:), INTENT(IN) :: ptrad ! radiative temperature (K)
80 !
81 REAL, DIMENSION(:), INTENT(IN) :: psfzon ! zonal friction
82 REAL, DIMENSION(:), INTENT(IN) :: psfzon_ice! zonal friction
83 REAL, DIMENSION(:), INTENT(IN) :: psfmer ! meridional friction
84 REAL, DIMENSION(:), INTENT(IN) :: psfmer_ice! meridional friction
85 !
86 LOGICAL, INTENT(IN) :: ohandle_sic ! Do we weight seaice and open sea fluxes
87 REAL, DIMENSION(:), INTENT(IN) :: psic ! Sea ice cover (-)
88 REAL, DIMENSION(:), INTENT(IN) :: ptice ! Sea ice temperature (°K)
89 !
90 REAL, DIMENSION(:), INTENT(OUT):: prn ! net radiation (W/m2)
91 REAL, DIMENSION(:), INTENT(OUT):: ph ! sensible heat flux (W/m2)
92 REAL, DIMENSION(:), INTENT(OUT):: ple ! total latent heat flux (W/m2)
93 REAL, DIMENSION(:), INTENT(OUT):: ple_ice ! sublimation latent heat flux (W/m2)
94 REAL, DIMENSION(:), INTENT(OUT):: pgflux ! storage flux (W/m2)
95 !
96 REAL, DIMENSION(:), INTENT(OUT):: pswd ! total incoming short wave radiation (W/m2)
97 REAL, DIMENSION(:), INTENT(OUT):: pswu ! total upward short wave radiation (W/m2)
98 REAL, DIMENSION(:,:), INTENT(OUT):: pswbd ! incoming short wave radiation by spectral band (W/m2)
99 REAL, DIMENSION(:,:), INTENT(OUT):: pswbu ! upward short wave radiation by spectral band (W/m2)
100 REAL, DIMENSION(:), INTENT(OUT):: plwd ! Downward long wave radiation (W/m2)
101 REAL, DIMENSION(:), INTENT(OUT):: plwu ! Upward long wave radiation (W/m2)
102 !
103 REAL, DIMENSION(:), INTENT(OUT):: pfmu ! zonal wind stress
104 REAL, DIMENSION(:), INTENT(OUT):: pfmv ! meridian wind stress
105 REAL, DIMENSION(:), INTENT(OUT):: pevap ! total evaporation (kg/m2/s)
106 REAL, DIMENSION(:), INTENT(OUT):: psubl ! sublimation (kg/m2/s)
107 ! Fluxes on seaice
108 REAL, DIMENSION(:), INTENT(OUT):: prn_ice ! net radiation (W/m2)
109 REAL, DIMENSION(:), INTENT(OUT):: ph_ice ! sensible heat flux (W/m2)
110 REAL, DIMENSION(:), INTENT(OUT):: pgflux_ice! storage flux (W/m2)
111 ! Continued
112 REAL, DIMENSION(:), INTENT(OUT):: pswu_ice ! total upward short wave radiation (W/m2)
113 REAL, DIMENSION(:,:),INTENT(OUT):: pswbu_ice! upward short wave radiation by spectral band (W/m2)
114 REAL, DIMENSION(:), INTENT(OUT):: plwu_ice ! upward long wave radiation (W/m2)
115 REAL, DIMENSION(:), INTENT(OUT):: pfmu_ice ! zonal wind stress on sea-ice
116 REAL, DIMENSION(:), INTENT(OUT):: pfmv_ice ! meridian wind stress on sea-ice
117 
118 !* 0.2 declarations of local variables
119 !
120 INTEGER :: i
121 INTEGER :: iswb ! number of SW bands
122 INTEGER :: jswb ! loop counter on number of SW bands
123 REAL(KIND=JPRB) :: zhook_handle
124 !-------------------------------------------------------------------------------------
125 !
126 IF (lhook) CALL dr_hook('DIAG_SURF_BUDGET_SEA',0,zhook_handle)
127 !
128 iswb = SIZE(pdir_sw,2)
129 !
130 !* total incoming and outgoing SW
131 !
132 DO jswb=1,iswb
133  pswbd(:,jswb) = pdir_sw(:,jswb) + psca_sw(:,jswb)
134  pswbu(:,jswb) = pdir_sw(:,jswb) * pdir_alb(:,jswb) + psca_sw(:,jswb) * psca_alb(:,jswb)
135 ENDDO
136 !
137 pswd(:) = 0.
138 pswu(:) = 0.
139 DO jswb=1,iswb
140  pswd(:)=pswd(:)+pswbd(:,jswb)
141  pswu(:)=pswu(:)+pswbu(:,jswb)
142 ENDDO
143 !
144 !*incoming outgoing LW
145 !
146 plwd(:)=plw(:)
147 plwu(:)=pemis(:)*xstefan*ptrad(:)**4 + (1.-pemis(:))*plw(:)
148 !
149 !* net radiation
150 !
151 prn(:) = pswd(:) - pswu(:) + plwd(:) - plwu(:)
152 !
153 IF (.NOT.ohandle_sic) THEN
154  !
155  !* sensible heat flux
156  !
157  ph = psfth
158  !
159  !* latent heat flux
160  !
161  WHERE (psst<ptt )
162  ple = psftq * xlstt
163  ple_ice= psftq * xlstt
164  pevap = psftq
165  psubl = psftq
166  ELSEWHERE
167  ple = psftq * xlvtt
168  ple_ice= 0.0
169  pevap = psftq
170  psubl = 0.0
171  END WHERE
172  !
173  !* wind stress
174  !
175  pfmu = psfzon
176  pfmv = psfmer
177 !
178 ELSE
179  !
180  !----------------------------------------------------------------------------
181  ! Sea ice or mixed diag
182  !----------------------------------------------------------------------------
183  !
184  !
185  !* total incoming and outgoing SW
186  !
187  DO jswb=1,iswb
188  pswbu_ice(:,jswb) = (pdir_sw(:,jswb) + psca_sw(:,jswb)) * palb_ice(:)
189  ENDDO
190  !
191  pswu_ice(:) = 0.
192  DO jswb=1,iswb
193  pswu_ice(:)=pswu_ice(:)+pswbu_ice(:,jswb)
194  ENDDO
195  !
196  !*incoming outgoing LW
197  !
198  plwu_ice(:)=xemiswatice*xstefan*ptice(:)**4 + (1.-xemiswatice)*plw(:)
199  !
200  !* net radiation
201  !
202  prn_ice(:) = pswd(:) - pswu_ice(:) + plwd(:) - plwu_ice(:)
203  !
204  !* sensible heat flux
205  !
206  ph = (1 - psic) * psfth + psic * psfth_ice
207  ph_ice = psfth_ice
208  !
209  !* latent heat flux
210  !
211  ple = (1 - psic) * psftq * xlvtt + psic * psftq_ice * xlstt
212  ple_ice = psftq_ice * xlstt
213  pevap = (1 - psic) * psftq + psic * psftq_ice
214  psubl = psic * psftq_ice
215  !
216  !* ice storage flux
217  !
218  pgflux_ice = prn_ice - ph_ice - ple_ice
219  !
220  !* wind stress
221  !
222  pfmu = (1 - psic) * psfzon + psic * psfzon_ice
223  pfmu_ice = psfzon_ice
224  pfmv = (1 - psic) * psfmer + psic * psfmer_ice
225  pfmv_ice = psfmer_ice
226 !
227 ENDIF
228 !
229 !* total storage flux
230 !
231 pgflux = prn - ph - ple
232 !
233 !
234 IF (lhook) CALL dr_hook('DIAG_SURF_BUDGET_SEA',1,zhook_handle)
235 !
236 !-------------------------------------------------------------------------------------
237 !
238 END SUBROUTINE diag_surf_budget_sea
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)