SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
update_esm_surf_atmn.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_esm_surf_atm_n (F, I, S, U, W, &
7  hprogram, ki, ksw, pzenith, psw_bands, &
8  ptrad, pdir_alb, psca_alb, pemis, ptsurf )
9 ! #################################################################################
10 !
11 !!**** *UPDATE_ESM_SURF_ATM_n * - Routine to update radiative properties in Earth
12 !! System Model (SEA, WATER, NATURE, TOWN) after
13 !! the call to OASIS coupler in order to close the
14 !! energy budget between radiative scheme and surfex
15 !!
16 !! PURPOSE
17 !! -------
18 !
19 !!** METHOD
20 !! ------
21 !!
22 !! REFERENCE
23 !! ---------
24 !!
25 !!
26 !! AUTHOR
27 !! ------
28 !! B. Decharme
29 !!
30 !! MODIFICATIONS
31 !! -------------
32 !! Original 09/2009
33 !! B. Decharme 06/2013 new coupling variables
34 !!-------------------------------------------------------------
35 !
36 !
37 !
38 !
39 !
40 !
41 USE modd_flake_n, ONLY : flake_t
42 USE modd_isba_n, ONLY : isba_t
43 USE modd_seaflux_n, ONLY : seaflux_t
44 USE modd_surf_atm_n, ONLY : surf_atm_t
45 USE modd_watflux_n, ONLY : watflux_t
46 !
47 USE modd_surf_par, ONLY : xundef
48 !
49 USE modd_data_cover_par, ONLY : ntilesfc
50 !
51 USE modi_average_rad
52 !
53 USE modi_average_tsurf
54 !
55 USE yomhook ,ONLY : lhook, dr_hook
56 USE parkind1 ,ONLY : jprb
57 !
58 USE modi_abor1_sfx
59 !
60 USE modi_update_esm_isba_n
61 USE modi_update_esm_seaflux_n
62 USE modi_update_esm_watflux_n
63 USE modi_update_esm_flake_n
64 !
65 IMPLICIT NONE
66 !
67 !* 0.1 declarations of arguments
68 !
69 !
70 TYPE(flake_t), INTENT(INOUT) :: f
71 TYPE(isba_t), INTENT(INOUT) :: i
72 TYPE(seaflux_t), INTENT(INOUT) :: s
73 TYPE(surf_atm_t), INTENT(INOUT) :: u
74 TYPE(watflux_t), INTENT(INOUT) :: w
75 !
76  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling surf. schemes
77 INTEGER, INTENT(IN) :: ki ! number of points
78 INTEGER, INTENT(IN) :: ksw ! number of short-wave spectral bands
79 REAL, DIMENSION(KI), INTENT(IN) :: pzenith ! zenithal angle (radian from the vertical)
80 REAL, DIMENSION(KSW), INTENT(IN) :: psw_bands ! mean wavelength of each shortwave band (m)
81 !
82 REAL, DIMENSION(KI), INTENT(OUT) :: ptrad ! radiative temperature (K)
83 REAL, DIMENSION(KI,KSW),INTENT(OUT) :: pdir_alb ! direct albedo for each spectral band (-)
84 REAL, DIMENSION(KI,KSW),INTENT(OUT) :: psca_alb ! diffuse albedo for each spectral band (-)
85 REAL, DIMENSION(KI), INTENT(OUT) :: pemis ! emissivity (-)
86 REAL, DIMENSION(KI), INTENT(OUT) :: ptsurf ! surface effective temperature (K)
87 !
88 !* 0.2 declarations of local variables
89 !
90 INTEGER :: jtile ! loop on type of surface
91 LOGICAL :: gnature, gtown, gwater, gsea ! .T. if the corresponding surface is represented
92 !
93 ! Tile outputs:
94 !
95 REAL, DIMENSION(KI,NTILESFC) :: ztrad_tile ! radiative surface temperature
96 REAL, DIMENSION(KI,NTILESFC) :: zemis_tile ! emissivity
97 REAL, DIMENSION(KI,NTILESFC) :: zfrac_tile ! fraction of each surface type
98 REAL, DIMENSION(KI,NTILESFC) :: ztsurf_tile ! surface effective temperature
99 !
100 REAL, DIMENSION(KI,KSW,NTILESFC) :: zdir_alb_tile ! direct albedo
101 REAL, DIMENSION(KI,KSW,NTILESFC) :: zsca_alb_tile ! diffuse albedo
102 !
103 REAL(KIND=JPRB) :: zhook_handle
104 !-------------------------------------------------------------------------------------
105 ! Preliminaries: Tile related operations
106 !-------------------------------------------------------------------------------------
107 ! FLAGS for the various surfaces:
108 !
109 IF (lhook) CALL dr_hook('UPDATE_ESM_SURF_ATM_N',0,zhook_handle)
110 gsea = (u%NSIZE_SEA >0 .AND. u%CSEA/='NONE')
111 gwater = (u%NSIZE_WATER >0 .AND. u%CWATER/='NONE')
112 gnature = (u%NSIZE_NATURE >0 .AND. u%CNATURE/='NONE')
113 !
114 gtown = u%NSIZE_TOWN >0
115 IF(gtown)THEN
116  CALL abor1_sfx('UPDATE_ESM_SURF_ATM_n: TOWN SCHEME NOT YET AVAILABLE FOR EARTH SYSTEM MODEL')
117 ENDIF
118 !
119 ! Tile counter:
120 !
121 jtile = 0
122 !
123 ! Initialization: Outputs to atmosphere over each tile:
124 !
125 ztrad_tile(:,:) = xundef
126 zdir_alb_tile(:,:,:) = xundef
127 zsca_alb_tile(:,:,:) = xundef
128 zemis_tile(:,:) = xundef
129 ztsurf_tile(:,:) = xundef
130 !
131 ! Fractions for each tile:
132 !
133 zfrac_tile(:,:) = 0.0
134 !
135 !--------------------------------------------------------------------------------------
136 ! Call arrange interfaces for sea, water, nature and town here...
137 !--------------------------------------------------------------------------------------
138 !
139 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
140 ! SEA Tile calculations:
141 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
142 !
143 jtile = jtile + 1
144 !
145 IF(gsea)THEN
146 !
147  zfrac_tile(:,jtile) = u%XSEA(:)
148 !
149  CALL treat_surf(u%NSIZE_SEA,u%NR_SEA,jtile) ! pack variables which are arguments to this routine
150 !
151 ENDIF
152 !
153 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
154 ! INLAND WATER Tile calculations:
155 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
156 !
157 jtile = jtile + 1
158 !
159 IF(gwater)THEN
160 !
161  zfrac_tile(:,jtile) = u%XWATER(:)
162 !
163  CALL treat_surf(u%NSIZE_WATER,u%NR_WATER,jtile)
164 !
165 ENDIF
166 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
167 ! NATURAL SURFACE Tile calculations:
168 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
169 !
170 jtile = jtile + 1
171 !
172 IF(gnature)THEN
173 !
174  zfrac_tile(:,jtile) = u%XNATURE(:)
175 !
176  CALL treat_surf(u%NSIZE_NATURE,u%NR_NATURE,jtile)
177 !
178 ENDIF
179 !
180 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
181 ! URBAN Tile calculations:
182 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
183 ! Not yet implemented
184 !
185 !JTILE = JTILE + 1
186 !
187 !IF(GTOWN)THEN
188 !
189 ! ZFRAC_TILE(:,JTILE) = XTOWN(:)
190 !
191 ! CALL TREAT_SURF(NSIZE_TOWN,NR_TOWN,JTILE)
192 !
193 !ENDIF
194 !
195 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
196 ! Grid box average radiative properties:
197 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
198 !
199  CALL average_rad(zfrac_tile, &
200  zdir_alb_tile, zsca_alb_tile, zemis_tile, ztrad_tile, &
201  pdir_alb, psca_alb, pemis, ptrad )
202 !
203  CALL average_tsurf(zfrac_tile, ztsurf_tile, ptsurf)
204 !
205 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
206 !
207 IF (lhook) CALL dr_hook('UPDATE_ESM_SURF_ATM_N',1,zhook_handle)
208  CONTAINS
209 !=======================================================================================
210 SUBROUTINE treat_surf(KSIZE,KMASK,KTILE)
211 !
212 INTEGER, INTENT(IN) :: ksize
213 INTEGER, INTENT(IN), DIMENSION(:) :: kmask
214 INTEGER, INTENT(IN) :: ktile
215 !
216 REAL, DIMENSION(KSIZE) :: zp_zenith ! zenithal angle (radian from the vertical)
217 !
218 REAL, DIMENSION(KSIZE) :: zp_trad ! radiative temperature (K)
219 REAL, DIMENSION(KSIZE,KSW) :: zp_dir_alb ! direct albedo for each spectral band (-)
220 REAL, DIMENSION(KSIZE,KSW) :: zp_sca_alb ! diffuse albedo for each spectral band (-)
221 REAL, DIMENSION(KSIZE) :: zp_emis ! emissivity
222 REAL, DIMENSION(KSIZE) :: zp_tsurf ! effective temperature (K)
223 !
224 INTEGER :: jj
225 REAL(KIND=JPRB) :: zhook_handle
226 !
227 ! input arguments:
228 !
229 IF (lhook) CALL dr_hook('UPDATE_ESM_SURF_ATM_N:TREAT_SURF',0,zhook_handle)
230 !
231 zp_trad = xundef
232 zp_dir_alb = xundef
233 zp_sca_alb = xundef
234 zp_emis = xundef
235 zp_tsurf = xundef
236 !
237 DO jj=1,ksize
238  zp_zenith(jj) = pzenith(kmask(jj))
239 ENDDO
240 !
241 !
242 IF (ktile==1) THEN
243  !
244  IF (u%CSEA=='SEAFLX') THEN
245  CALL update_esm_seaflux_n(s, &
246  u%NSIZE_SEA,ksw,zp_zenith,zp_dir_alb, &
247  zp_sca_alb,zp_emis,zp_trad,zp_tsurf )
248  ELSE
249  CALL abor1_sfx('UPDATE_ESM_SURF_ATM_n: SEA SCHEME MUST BE ACTIVATED FOR EARTH SYSTEM MODEL')
250  ENDIF
251  !
252 ELSEIF (ktile==2) THEN
253  !
254  IF (u%CWATER=='WATFLX') THEN
255  CALL update_esm_watflux_n(w, &
256  u%NSIZE_WATER,ksw,zp_zenith,zp_dir_alb, &
257  zp_sca_alb,zp_emis,zp_trad,zp_tsurf )
258  ELSEIF (u%CWATER=='FLAKE ') THEN
259  CALL update_esm_flake_n(f, &
260  u%NSIZE_WATER,ksw,zp_zenith,zp_dir_alb, &
261  zp_sca_alb,zp_emis,zp_trad,zp_tsurf )
262  ELSE
263  CALL abor1_sfx('UPDATE_ESM_SURF_ATM_n: INLAND WATER SCHEME MUST BE ACTIVATED FOR EARTH SYSTEM MODEL')
264  ENDIF
265  !
266 ELSEIF (ktile==3) THEN
267  !
268  IF (u%CNATURE=='ISBA') THEN
269  CALL update_esm_isba_n(i, &
270  u%NSIZE_NATURE,ksw,zp_zenith,psw_bands,zp_dir_alb, &
271  zp_sca_alb,zp_emis,zp_trad,zp_tsurf )
272  ELSE
273  CALL abor1_sfx('UPDATE_ESM_SURF_ATM_n: NATURE SCHEME MUST BE ACTIVATED FOR EARTH SYSTEM MODEL')
274  ENDIF
275  !
276 !ELSEIF (KTILE==4) THEN
277 ! !
278 ! IF (CTOWN=='TEB ') THEN
279 ! CALL UPDATE_ESM_TEB_n(NSIZE_SEA,KSW,ZP_ZENITH,ZP_TRAD,ZP_DIR_ALB,ZP_SCA_ALB,ZP_EMIS,ZP_TSURF)
280 ! ELSE
281 ! CALL ABOR1_SFX('UPDATE_ESM_SURF_ATM_n: TEB SCHEME MUST BE ACTIVATED FOR EARTH SYSTEM MODEL')
282 ! ENDIF
283 ! !
284 ENDIF
285 !
286 DO jj=1,ksize
287  ztrad_tile(kmask(jj),ktile) = zp_trad(jj)
288  zdir_alb_tile(kmask(jj),:,ktile)= zp_dir_alb(jj,:)
289  zsca_alb_tile(kmask(jj),:,ktile)= zp_sca_alb(jj,:)
290  zemis_tile(kmask(jj),ktile) = zp_emis(jj)
291  ztsurf_tile(kmask(jj),ktile) = zp_tsurf(jj)
292 ENDDO
293 !
294 IF (lhook) CALL dr_hook('UPDATE_ESM_SURF_ATM_N:TREAT_SURF',1,zhook_handle)
295 !
296 END SUBROUTINE treat_surf
297 !=======================================================================================
298 !
299 END SUBROUTINE update_esm_surf_atm_n
300 
301 
subroutine average_tsurf(PFRAC_TILE, PTSURF_TILE, PTSURF)
subroutine update_esm_isba_n(I, KI, KSW, PZENITH, PSW_BANDS, PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD, PTSURF)
subroutine update_esm_watflux_n(W, KI, KSW, PZENITH, PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD, PTSURF)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine update_esm_surf_atm_n(F, I, S, U, W, HPROGRAM, KI, KSW, PZENITH, PSW_BANDS, PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF)
subroutine average_rad(PFRAC_TILE, PDIR_ALB_TILE, PSCA_ALB_TILE, PEMIS_TILE, PTRAD_TILE, PDIR_ALB, PSCA_ALB, PEMIS, PTRAD)
Definition: average_rad.F90:6
subroutine update_esm_seaflux_n(S, KI, KSW, PZENITH, PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD, PTSURF)
subroutine treat_surf(KMASK, YTYPE)
subroutine update_esm_flake_n(F, KI, KSW, PZENITH, PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD, PTSURF)