SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
update_rad_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 update_rad_sea(HALB,PSST,PZENITH,PTT,PEMIS,PDIR_ALB,PSCA_ALB, &
7  pdir_alb_atmos,psca_alb_atmos,pemis_atmos,ptrad,&
8  ohandle_sic,ptice,psic,pice_alb,pu,pv )
9 ! #######################################################################
10 !
11 !!**** *UPDATE_RAD_SEA * - update the radiative properties at time t+1 (see by the atmosphere)
12 ! in order to close the energy budget between surfex and the atmosphere
13 
14 !!
15 !! PURPOSE
16 !! -------
17 !
18 !!** METHOD
19 !! ------
20 !!
21 !! REFERENCE
22 !! ---------
23 !!
24 !!
25 !! AUTHOR
26 !! ------
27 !! B. Decharme
28 !!
29 !! MODIFICATIONS
30 !! -------------
31 !! Original 09/2009
32 !! Modified 03/2011 : E. Bazile (MK10) albedo from Marat Khairoutdinov
33 !! Modified 01/2014 : S. Senesi : handle fractional seaice
34 !! Modified 02/2014 : split from update_rad_seawat.F90
35 !! Modified 01/2015 : introduce interactive ocean surface albedo (R.Séférian)
36 !!------------------------------------------------------------------
37 !
38 USE modd_water_par, ONLY : xemiswat, xemiswatice, &
39  xalbwat, xalbsca_wat, &
40  xalbseaice
41 !
42 USE modd_sfx_oasis, ONLY : lcpl_sea
43 !
44 USE modi_albedo_ta96
45 USE modi_albedo_mk10
46 USE modi_albedo_rs14
47 !
48 USE yomhook ,ONLY : lhook, dr_hook
49 USE parkind1 ,ONLY : jprb
50 !
51 IMPLICIT NONE
52 !
53 !* 0.1 declarations of arguments
54 !
55  CHARACTER(LEN=4), INTENT(IN) :: halb
56 !
57 REAL, DIMENSION(:), INTENT(IN) :: psst ! Sea surface temperature
58 REAL, DIMENSION(:), INTENT(IN) :: pzenith ! Zenithal angle at t+1
59 REAL, INTENT(IN) :: ptt ! Sea/ice transition temperature (different according to sea or inland water)
60 !
61 REAL, DIMENSION(:), INTENT(INOUT):: pdir_alb ! Direct albedo at t+1 for the mix (open sea, seaice)
62 REAL, DIMENSION(:), INTENT(INOUT):: psca_alb ! Diffuse albedo at t+1 for the mix (open sea, seaice)
63 REAL, DIMENSION(:), INTENT(OUT) :: pemis ! emissivity (sea water + sea ice) at t+1
64 !
65 REAL, DIMENSION(:,:), INTENT(OUT) :: pdir_alb_atmos ! Direct albedo at t+1 for the atmosphere
66 REAL, DIMENSION(:,:), INTENT(OUT) :: psca_alb_atmos ! Diffuse albedo at t+1 for the atmosphere
67 REAL, DIMENSION(:), INTENT(OUT) :: pemis_atmos ! Emissivity at t+1 for the atmosphere
68 REAL, DIMENSION(:), INTENT(OUT) :: ptrad ! radiative temp at t+1 for the atmosphere
69 !
70 LOGICAL, INTENT(IN) , OPTIONAL :: ohandle_sic ! Do we weight seaice and open sea fluxes
71 REAL, DIMENSION(:), INTENT(IN) , OPTIONAL :: ptice ! Seaice surface temperature
72 REAL, DIMENSION(:), INTENT(IN) , OPTIONAL :: psic ! Seaice cover
73 REAL, DIMENSION(:), INTENT(IN) , OPTIONAL :: pice_alb ! Seaice albedo
74 REAL, DIMENSION(:), INTENT(IN) , OPTIONAL :: pu ! zonal wind (m/s)
75 REAL, DIMENSION(:), INTENT(IN) , OPTIONAL :: pv ! meridian wind (m/s)
76 !
77 !* 0.2 declarations of local variables
78 !
79 INTEGER :: jswb
80 REAL, DIMENSION(SIZE(PZENITH)) :: zalbdir
81 REAL, DIMENSION(SIZE(PZENITH)) :: zalbsca
82 REAL, DIMENSION(SIZE(PZENITH)) :: zwind
83 LOGICAL :: ghandle_sic
84 !
85 REAL(KIND=JPRB) :: zhook_handle
86 !
87 !-------------------------------------------------------------------------------------
88 !
89 IF (lhook) CALL dr_hook('UPDATE_RAD_SEA',0,zhook_handle)
90 !
91 zalbdir(:) = 0.
92 zalbsca(:) = 0.
93 !
94 IF (halb=='TA96') THEN
95 !
96  zalbdir(:) = albedo_ta96(pzenith(:))
97  zalbsca(:) = xalbsca_wat
98 !
99 ELSEIF (halb=='MK10') THEN
100 !
101  zalbdir(:) = albedo_mk10(pzenith(:))
102  zalbsca(:) = xalbsca_wat
103 !
104 ELSEIF (halb=='RS14') THEN
105 !
106  IF (present(pu).AND.present(pv)) THEN
107  zwind(:) = sqrt(pu(:)**2+pv(:)**2)
108  CALL albedo_rs14(pzenith(:),zwind(:),zalbdir(:),zalbsca(:))
109  ELSE
110  zalbdir(:) = pdir_alb(:)
111  zalbsca(:) = psca_alb(:)
112  ENDIF
113 !
114 ENDIF
115 !
116 IF (.NOT. present(ohandle_sic)) THEN
117  ghandle_sic=.false.
118 ELSE
119  ghandle_sic=ohandle_sic
120 ENDIF
121 !
122 IF(lcpl_sea)THEN !Earth System Model
123 !
124 !Sea and/or ice albedo already given by coupled seaice model
125 !Except for Taylor et al (1996) and MK10 formulation
126 !
127  WHERE (psst(:)>=ptt )
128  !* open water
129  pemis(:) = xemiswat
130  ELSEWHERE
131  !* sea ice
132  pemis(:) = xemiswatice
133  END WHERE
134  !
135  IF (halb=='TA96' .OR. halb=='MK10' .OR. halb=='RS14') THEN
136  !* Taylor et al 1996
137  !* open water
138  WHERE (psst(:)>=ptt) pdir_alb(:) = zalbdir(:)
139  WHERE (psst(:)>=ptt) psca_alb(:) = zalbsca(:)
140  ENDIF
141  !
142 ELSEIF(ghandle_sic) THEN
143  ! Returned values are an average of open sea and seaice properties
144  ! weighted by the seaice cover
145  pemis(:) = ( 1 - psic(:)) * xemiswat + psic(:) * xemiswatice
146  IF (halb=='UNIF') THEN
147  pdir_alb(:) = ( 1 - psic(:)) * xalbwat + psic(:) * pice_alb(:)
148  psca_alb(:) = ( 1 - psic(:)) * xalbwat + psic(:) * pice_alb(:)
149  ELSE IF (halb=='TA96' .OR. halb=='MK10' .OR. halb=='RS14') THEN
150  pdir_alb(:) = ( 1 - psic(:)) * zalbdir(:) + psic(:) * pice_alb(:)
151  psca_alb(:) = ( 1 - psic(:)) * zalbsca(:) + psic(:) * pice_alb(:)
152  ENDIF
153 ELSE
154  !
155  IF (halb=='UNIF') THEN
156  !* uniform albedo
157  WHERE (psst(:)>=ptt )
158  !* open water
159  pdir_alb(:) = xalbwat
160  psca_alb(:) = xalbwat
161  pemis(:) = xemiswat
162  ELSEWHERE
163  !* sea ice
164  pdir_alb(:) = xalbseaice
165  psca_alb(:) = xalbseaice
166  pemis(:) = xemiswatice
167  END WHERE
168  !
169  ELSE IF (halb=='TA96' .OR. halb=='MK10' .OR. halb=='RS14') THEN
170  !* Taylor et al 1996
171  !
172  WHERE (psst(:)>=ptt)
173  !* open water
174  pdir_alb(:) = zalbdir(:)
175  psca_alb(:) = zalbsca(:)
176  pemis(:) = xemiswat
177  ELSEWHERE
178  !* sea ice
179  pdir_alb(:) = xalbseaice
180  psca_alb(:) = xalbseaice
181  pemis(:) = xemiswatice
182  END WHERE
183  !
184  ENDIF
185  !
186 ENDIF
187 !
188 !-------------------------------------------------------------------------------------
189 !
190 DO jswb=1,SIZE(pdir_alb_atmos,2)
191  pdir_alb_atmos(:,jswb) = pdir_alb(:)
192  psca_alb_atmos(:,jswb) = psca_alb(:)
193 END DO
194 !
195 pemis_atmos(:) = pemis(:)
196 IF(ghandle_sic) THEN
197  ptrad(:) = (((1 - psic(:)) * xemiswat * psst(:)**4 + &
198  psic(:) * xemiswatice * ptice(:)**4)/ &
199  pemis(:)) ** 0.25
200 ELSE
201  ptrad(:) = psst(:)
202 END IF
203 !
204 IF (lhook) CALL dr_hook('UPDATE_RAD_SEA',1,zhook_handle)
205 !
206 !-------------------------------------------------------------------------------------
207 !
208 END SUBROUTINE update_rad_sea
209 
subroutine update_rad_sea(HALB, PSST, PZENITH, PTT, PEMIS, PDIR_ALB, PSCA_ALB, PDIR_ALB_ATMOS, PSCA_ALB_ATMOS, PEMIS_ATMOS, PTRAD, OHANDLE_SIC, PTICE, PSIC, PICE_ALB, PU, PV)
subroutine albedo_rs14(PZENITH, PWIND, PDIR_ALB, PSCA_ALB)
Definition: albedo_rs14.F90:6
real function, dimension(size(pzenith)) albedo_ta96(PZENITH)
Definition: albedo_ta96.F90:6
real function, dimension(size(pzenith)) albedo_mk10(PZENITH)
Definition: albedo_mk10.F90:6