SURFEX v8.1
General documentation of Surfex
isba_albedo.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 isba_albedo(PEK, OTR_ML, OMEB, PDIR_SW, PSCA_SW, PSW_BANDS, KSW, &
7  PFALB, PFFV, PFFG, PGLOBAL_SW, &
8  PMEB_SCA_SW, PALBNIR_TVEG, PALBVIS_TVEG, &
9  PALBNIR_TSOIL, PALBVIS_TSOIL )
10 ! ##########################################################################
11 !
12 !!**** *ISBA_ALBEDO*
13 !!
14 !! PURPOSE
15 !! -------
16 !
17 ! Calculates grid-averaged albedo and emissivity (according to snow scheme)
18 !
19 !! EXTERNAL
20 !! --------
21 !!
22 !! none
23 !!
24 !! IMPLICIT ARGUMENTS
25 !! ------------------
26 !!
27 !! AUTHOR
28 !! ------
29 !!
30 !! S. Belair * Meteo-France *
31 !!
32 !! MODIFICATIONS
33 !! -------------
34 !! Original
35 !! P. Samuelsson 02/2012 MEB
36 !!
37 !-------------------------------------------------------------------------------
38 !
39 !* 0. DECLARATIONS
40 ! ------------
41 !
42 USE modd_isba_n, ONLY : isba_pe_t
43 !
44 USE modd_surf_par, ONLY : xundef
45 !
46 USE modi_albedo_from_nir_vis
47 !
48 !
49 USE yomhook ,ONLY : lhook, dr_hook
50 USE parkind1 ,ONLY : jprb
51 !
52 IMPLICIT NONE
53 !
54 !* 0.1 declarations of arguments
55 !
56 LOGICAL, INTENT(IN) :: OTR_ML
57 LOGICAL, INTENT(IN) :: OMEB ! True = patch with multi-energy balance
58 ! ! False = patch with classical ISBA
59 !
60 REAL, DIMENSION(:,:), INTENT(IN) :: PDIR_SW ! direct incoming solar radiation
61 REAL, DIMENSION(:,:), INTENT(IN) :: PSCA_SW ! diffus incoming solar radiation
62 REAL, DIMENSION(:) , INTENT(IN) :: PSW_BANDS ! mean wavelength of each shortwave band (m)
63 INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands
64 !
65 TYPE(isba_pe_t), INTENT(INOUT) :: PEK
66 !
67 REAL, DIMENSION(:) , INTENT(IN) :: PFALB ! Floodplain albedo
68 REAL, DIMENSION(:) , INTENT(IN) :: PFFV ! Floodplain fraction over vegetation
69 REAL, DIMENSION(:) , INTENT(IN) :: PFFG ! Floodplain fraction over the ground
70 !
71 REAL, DIMENSION(:) , INTENT(OUT) :: PGLOBAL_SW ! global incoming SW rad.
72 REAL, DIMENSION(:) , INTENT(OUT) :: PMEB_SCA_SW ! diffuse incoming SW rad.
73 REAL, DIMENSION(:) , INTENT(OUT) :: PALBNIR_TVEG ! nearIR veg tot albedo
74 REAL, DIMENSION(:) , INTENT(OUT) :: PALBVIS_TVEG ! visible veg tot albedo
75 REAL, DIMENSION(:) , INTENT(OUT) :: PALBNIR_TSOIL ! nearIR soil tot albedo
76 REAL, DIMENSION(:) , INTENT(OUT) :: PALBVIS_TSOIL ! visible soil tot albedo
77 !
78 !-------------------------------------------------------------------------------
79 !
80 !* 0. Local variables
81 ! ---------------
82 !
83 INTEGER :: JLAYER
84 INTEGER :: JSWB
85 REAL, DIMENSION(SIZE(PEK%XALBNIR)) :: ZSW_UP
86 REAL, DIMENSION(SIZE(PEK%XALBNIR),KSW) :: ZDIR_ALB_WITHOUT_SNOW
87 REAL, DIMENSION(SIZE(PEK%XALBNIR),KSW) :: ZSCA_ALB_WITHOUT_SNOW
88 REAL, DIMENSION(SIZE(PEK%XALBNIR),KSW) :: ZDIR_ALB_VEG_WITHOUT_SNOW
89 REAL, DIMENSION(SIZE(PEK%XALBNIR),KSW) :: ZSCA_ALB_VEG_WITHOUT_SNOW
90 REAL, DIMENSION(SIZE(PEK%XALBNIR),KSW) :: ZDIR_ALB_SOIL_WITHOUT_SNOW
91 REAL, DIMENSION(SIZE(PEK%XALBNIR),KSW) :: ZSCA_ALB_SOIL_WITHOUT_SNOW
92 REAL(KIND=JPRB) :: ZHOOK_HANDLE
93 !
94 !-------------------------------------------------------------------------------
95 !
96 !* 2. Compute snow-free albedo
97 ! ------------------------
98 !
99 !* Snow-free surface albedo for each wavelength
100 !
101 IF (lhook) CALL dr_hook('ISBA_ALBEDO',0,zhook_handle)
102 !
103 IF (otr_ml )THEN
104  IF (omeb) THEN
105  palbnir_tveg(:) = pek%XALBNIR_VEG(:)
106  palbnir_tsoil(:) = ( 1.-pffg(:))*pek%XALBNIR_SOIL(:) + pffg(:)*pfalb(:)
107  palbvis_tveg(:) = pek%XALBVIS_VEG(:)
108  palbvis_tsoil(:) = ( 1.-pffg(:))*pek%XALBVIS_SOIL(:) + pffg(:)*pfalb(:)
109  ELSE
110  palbnir_tveg(:) = pek%XALBNIR_VEG(:)
111  palbnir_tsoil(:) = pek%XALBNIR_SOIL(:)
112  palbvis_tveg(:) = pek%XALBVIS_VEG(:)
113  palbvis_tsoil(:) = pek%XALBVIS_SOIL(:)
114  ENDIF
115 ELSE
116  palbnir_tveg(:) = xundef
117  palbnir_tsoil(:) = xundef
118  palbvis_tveg(:) = xundef
119  palbvis_tsoil(:) = xundef
120 ENDIF
121 !
122  CALL albedo_from_nir_vis(psw_bands, pek%XALBNIR(:), pek%XALBVIS(:), pek%XALBUV(:), &
123  zdir_alb_without_snow, zsca_alb_without_snow )
124 !
125 !* total shortwave incoming radiation
126 !
127 pglobal_sw(:) = 0.
128 pmeb_sca_sw(:) = 0.
129 DO jswb=1,ksw
130  pglobal_sw(:) = pglobal_sw(:) + (pdir_sw(:,jswb) + psca_sw(:,jswb))
131  pmeb_sca_sw(:) = pmeb_sca_sw(:) + (psca_sw(:,jswb))
132 END DO
133 !
134 !* snow-free global albedo (needed by ISBA)
135 !
136 zsw_up(:) = 0.
137 DO jswb=1,ksw
138  zsw_up(:) = zsw_up(:) &
139  + zdir_alb_without_snow(:,jswb) * pdir_sw(:,jswb) &
140  + zsca_alb_without_snow(:,jswb) * psca_sw(:,jswb)
141 END DO
142 pek%XSNOWFREE_ALB(:) = xundef
143 WHERE(pglobal_sw(:)>0.)
144  pek%XSNOWFREE_ALB(:) = zsw_up(:) / pglobal_sw(:)
145 ELSEWHERE
146  pek%XSNOWFREE_ALB(:) = zdir_alb_without_snow(:,1)
147 END WHERE
148 !
149 IF(pek%TSNOW%SCHEME == 'EBA') THEN
150  CALL albedo_from_nir_vis(psw_bands, &
151  pek%XALBNIR_VEG(:), pek%XALBVIS_VEG(:), pek%XALBUV_VEG(:), &
152  zdir_alb_veg_without_snow, zsca_alb_veg_without_snow )
153  zsw_up(:) = 0.
154  DO jswb=1,ksw
155  zsw_up(:) = zsw_up(:) &
156  + zdir_alb_veg_without_snow(:,jswb) * pdir_sw(:,jswb) &
157  + zsca_alb_veg_without_snow(:,jswb) * psca_sw(:,jswb)
158  END DO
159  pek%XSNOWFREE_ALB_VEG(:) = xundef
160  WHERE(pglobal_sw(:)>0.) pek%XSNOWFREE_ALB_VEG(:) = zsw_up(:) / pglobal_sw(:)
161 !
162  CALL albedo_from_nir_vis(psw_bands, &
163  pek%XALBNIR_SOIL(:), pek%XALBVIS_SOIL(:), pek%XALBUV_SOIL(:), &
164  zdir_alb_soil_without_snow, zsca_alb_soil_without_snow )
165  zsw_up(:) = 0.
166  DO jswb=1,ksw
167  zsw_up(:) = zsw_up(:) &
168  + zdir_alb_soil_without_snow(:,jswb) * pdir_sw(:,jswb) &
169  + zsca_alb_soil_without_snow(:,jswb) * psca_sw(:,jswb)
170  END DO
171  pek%XSNOWFREE_ALB_SOIL(:) = xundef
172  WHERE(pglobal_sw(:)>0.) pek%XSNOWFREE_ALB_SOIL(:) = zsw_up(:) / pglobal_sw(:)
173 ENDIF
174 !
175 IF (lhook) CALL dr_hook('ISBA_ALBEDO',1,zhook_handle)
176 !
177 !-------------------------------------------------------------------------------
178 !
179 END SUBROUTINE isba_albedo
subroutine isba_albedo(PEK, OTR_ML, OMEB, PDIR_SW, PSCA_SW, PSW_BA
Definition: isba_albedo.F90:7
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine albedo_from_nir_vis(PSW_BANDS, PALBNIR, PALBVIS, PALBUV, PD