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