SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/update_rad_isban.F90
Go to the documentation of this file.
00001 !     #########
00002 SUBROUTINE UPDATE_RAD_ISBA_n(OFLOOD,HSNOW,PZENITH,PSW_BANDS,PVEG,PLAI,PZ0, &
00003                                PALBNIR,PALBVIS,PALBUV,PEMIS,               &
00004                                PDIR_ALB_WITH_SNOW,PSCA_ALB_WITH_SNOW,PEMIST)  
00005 !     ####################################################################
00006 !
00007 !!****  *UPDATE_RAD_ISBA_n * - Calculate snow/flood fraction, dir/dif albedo
00008 !!                             and emissivity at t+1 in order to close the 
00009 !!                             energy budget between the atmospheric model 
00010 !!                             and surfex  
00011 !!
00012 !!    PURPOSE
00013 !!    -------
00014 !
00015 !!**  METHOD
00016 !!    ------
00017 !!
00018 !!    REFERENCE
00019 !!    ---------
00020 !!      
00021 !!
00022 !!    AUTHOR
00023 !!    ------
00024 !!     B. Decharme 
00025 !!
00026 !!    MODIFICATIONS
00027 !!    -------------
00028 !!      Original    09/2009
00029 !!------------------------------------------------------------------
00030 !
00031 USE MODD_TYPE_SNOW
00032 !
00033 USE MODD_ISBA_n,    ONLY : NSIZE_NATURE_P,NR_NATURE_P,      &
00034                              NPATCH,XTG,TSNOW,XPSNG,XPSNV_A,  &
00035                              XPSNV,XPSN,XFFLOOD,XFF,XFFG,XFFV,&
00036                              XALBF,XEMISF,XDIR_ALB_WITH_SNOW, &
00037                              XSCA_ALB_WITH_SNOW,XFFROZEN  
00038 !
00039 USE MODD_CSTS,      ONLY : XTT
00040 USE MODD_SURF_PAR,  ONLY : XUNDEF
00041 USE MODD_SNOW_PAR,  ONLY : XRHOSMIN_ES,XRHOSMAX_ES,XSNOWDMIN,XEMISSN
00042 USE MODD_WATER_PAR, ONLY : XALBSCA_WAT, XEMISWAT, XALBWATICE, XEMISWATICE 
00043 !
00044 USE MODE_SURF_FLOOD_FRAC
00045 USE MODE_SURF_SNOW_FRAC      
00046 !
00047 USE MODI_ALBEDO_TA96
00048 USE MODI_ALBEDO_FROM_NIR_VIS
00049 USE MODI_PACK_SAME_RANK
00050 USE MODI_UNPACK_SAME_RANK
00051 USE MODI_ISBA_SNOW_FRAC
00052 !
00053 !
00054 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00055 USE PARKIND1  ,ONLY : JPRB
00056 !
00057 IMPLICIT NONE
00058 !
00059 !*      0.1    declarations of arguments
00060 !
00061 LOGICAL,                INTENT(IN)   :: OFLOOD
00062  CHARACTER(LEN=*),       INTENT(IN)   :: HSNOW
00063 !
00064 REAL, DIMENSION(:),     INTENT(IN)   :: PZENITH   ! Zenithal angle at t+1
00065 REAL, DIMENSION(:),     INTENT(IN)   :: PSW_BANDS ! mean wavelength of each shortwave band (m)
00066 REAL, DIMENSION(:,:),   INTENT(IN)   :: PVEG      ! Vegetation fraction at t+1
00067 REAL, DIMENSION(:,:),   INTENT(IN)   :: PLAI      ! leaf area index at t+1
00068 REAL, DIMENSION(:,:),   INTENT(IN)   :: PZ0       ! roughness length at t+1
00069 REAL, DIMENSION(:,:),   INTENT(IN)   :: PALBNIR   ! near-infra-red albedo (soil+vegetation) at t+1
00070 REAL, DIMENSION(:,:),   INTENT(IN)   :: PALBVIS   ! visible albedo (soil+vegetation) at t+1
00071 REAL, DIMENSION(:,:),   INTENT(IN)   :: PALBUV    ! UV albedo (soil+vegetation) at t+1
00072 REAL, DIMENSION(:,:),   INTENT(IN)   :: PEMIS     ! emissivity (soil+vegetation) at t+1
00073 !
00074 REAL, DIMENSION(:,:,:), INTENT(OUT)  :: PDIR_ALB_WITH_SNOW ! Total direct albedo at t+1
00075 REAL, DIMENSION(:,:,:), INTENT(OUT)  :: PSCA_ALB_WITH_SNOW ! Total diffuse albedo at t+1
00076 REAL, DIMENSION(:,:),   INTENT(OUT)  :: PEMIST             ! Total emissivity at t+1
00077 !
00078 !*      0.2    declarations of local variables
00079 !
00080 INTEGER :: JPATCH, ISWB
00081 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00082 !
00083 !-------------------------------------------------------------------------------------
00084 ! Initialization
00085 !-------------------------------------------------------------------------------------
00086 
00087 IF (LHOOK) CALL DR_HOOK('UPDATE_RAD_ISBA_N',0,ZHOOK_HANDLE)
00088 ISWB   = SIZE(PSW_BANDS)
00089 !
00090 !-------------------------------------------------------------------------------------
00091 !Patch loop
00092 !
00093 DO JPATCH=1,NPATCH
00094   !
00095   IF(NSIZE_NATURE_P(JPATCH)>0) CALL TREAT_NATURE(NSIZE_NATURE_P(JPATCH),JPATCH)
00096   !
00097 ENDDO
00098 !-------------------------------------------------------------------------------
00099 !
00100 !Update albedo with snow for the next time step
00101 !
00102 PDIR_ALB_WITH_SNOW(:,:,:)=XDIR_ALB_WITH_SNOW (:,:,:)
00103 PSCA_ALB_WITH_SNOW(:,:,:)=XSCA_ALB_WITH_SNOW (:,:,:)
00104 !
00105 IF (LHOOK) CALL DR_HOOK('UPDATE_RAD_ISBA_N',1,ZHOOK_HANDLE)
00106 !
00107 CONTAINS
00108 !
00109 SUBROUTINE TREAT_NATURE(KSIZE,KPATCH)
00110 !
00111 IMPLICIT NONE
00112 !
00113 INTEGER, INTENT(IN) :: KSIZE
00114 INTEGER, INTENT(IN) :: KPATCH
00115 !
00116 INTEGER, DIMENSION(KSIZE) :: IMASK
00117 !
00118 REAL, DIMENSION(KSIZE,SIZE(TSNOW%WSNOW,2)) :: ZLAYERSWE
00119 REAL, DIMENSION(KSIZE,SIZE(TSNOW%WSNOW,2)) :: ZLAYERRHO
00120 !
00121 
00122 REAL, DIMENSION(KSIZE,ISWB) :: ZDIR_ALB_WITH_SNOW
00123 REAL, DIMENSION(KSIZE,ISWB) :: ZSCA_ALB_WITH_SNOW
00124 !
00125 REAL, DIMENSION(KSIZE) :: ZSNOWALB          
00126 REAL, DIMENSION(KSIZE) :: ZLAI             
00127 REAL, DIMENSION(KSIZE) :: ZZ0               
00128 REAL, DIMENSION(KSIZE) :: ZVEG
00129 REAL, DIMENSION(KSIZE) :: ZEMIS    
00130 REAL, DIMENSION(KSIZE) :: ZALBNIR           
00131 REAL, DIMENSION(KSIZE) :: ZALBVIS           
00132 REAL, DIMENSION(KSIZE) :: ZALBUV  
00133 !
00134 REAL, DIMENSION(KSIZE) :: ZPSN
00135 REAL, DIMENSION(KSIZE) :: ZPSNV_A
00136 REAL, DIMENSION(KSIZE) :: ZPSNG             
00137 REAL, DIMENSION(KSIZE) :: ZPSNV 
00138 !
00139 REAL, DIMENSION(KSIZE) :: ZALBF_DIR
00140 REAL, DIMENSION(KSIZE) :: ZALBF_SCA
00141 REAL, DIMENSION(KSIZE) :: ZEMISF   
00142 REAL, DIMENSION(KSIZE) :: ZFF   
00143 !
00144 REAL, DIMENSION(KSIZE) :: ZALBNIR_WITH_SNOW
00145 REAL, DIMENSION(KSIZE) :: ZALBVIS_WITH_SNOW
00146 REAL, DIMENSION(KSIZE) :: ZALBUV_WITH_SNOW
00147 !
00148 REAL, DIMENSION(KSIZE) :: ZEMIST    
00149 !
00150 REAL, PARAMETER :: ZPUT0 = 0.0
00151 INTEGER  :: JSWB
00152 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00153 !
00154 IF (LHOOK) CALL DR_HOOK('UPDATE_RAD_ISBA_N:TREAT_NATURE',0,ZHOOK_HANDLE)
00155 !
00156 IMASK(:)=NR_NATURE_P(1:KSIZE,KPATCH)
00157 !
00158  CALL PACK_SAME_RANK(IMASK(:),TSNOW%WSNOW(:,:,KPATCH),ZLAYERSWE(:,:))
00159  CALL PACK_SAME_RANK(IMASK(:),TSNOW%RHO  (:,:,KPATCH),ZLAYERRHO(:,:))
00160 !  
00161  CALL PACK_SAME_RANK(IMASK(:),TSNOW%ALB  (:,KPATCH),ZSNOWALB(:))
00162  CALL PACK_SAME_RANK(IMASK(:),PLAI       (:,KPATCH),ZLAI    (:))
00163  CALL PACK_SAME_RANK(IMASK(:),PZ0        (:,KPATCH),ZZ0     (:))
00164  CALL PACK_SAME_RANK(IMASK(:),PVEG       (:,KPATCH),ZVEG    (:))
00165  CALL PACK_SAME_RANK(IMASK(:),PEMIS      (:,KPATCH),ZEMIS   (:))
00166  CALL PACK_SAME_RANK(IMASK(:),PALBNIR    (:,KPATCH),ZALBNIR (:))
00167  CALL PACK_SAME_RANK(IMASK(:),PALBVIS    (:,KPATCH),ZALBVIS (:))
00168  CALL PACK_SAME_RANK(IMASK(:),PALBUV     (:,KPATCH),ZALBUV  (:))
00169 !   
00170 !-------------------------------------------------------------------------------
00171 !
00172  CALL ISBA_SNOW_FRAC(HSNOW, ZLAYERSWE, ZLAYERRHO, ZSNOWALB,    &
00173          ZVEG, ZLAI, ZZ0,ZPSN(:), ZPSNV_A(:), ZPSNG(:), ZPSNV(:) )  
00174 IF ( HSNOW=='EBA' ) CALL UNPACK_SAME_RANK(IMASK(:),ZPSNV_A(:),XPSNV_A(:,KPATCH),ZPUT0) 
00175 !
00176 !-------------------------------------------------------------------------------
00177 !
00178 ! Flood fractions and properties
00179 !
00180 IF(OFLOOD)THEN   
00181   CALL TREAT_FLOOD(KSIZE,KPATCH,IMASK,ZPSNG,ZPSNV,ZLAI,ZVEG,&
00182                 ZALBF_DIR,ZALBF_SCA,ZEMISF,ZFF)
00183 ELSE
00184   ZALBF_DIR (:)=0.0
00185   ZALBF_SCA (:)=0.0
00186   ZEMISF    (:)=0.0
00187   ZFF       (:)=0.0
00188 ENDIF        
00189 !-------------------------------------------------------------------------------
00190 !
00191 !* albedo for near-infra-red and visible over snow-covered and snow-flood-free surface
00192 !
00193 ZALBNIR_WITH_SNOW(:) = ZALBNIR(:) * (1.-ZPSN(:)-ZFF(:)) + ZSNOWALB (:) * ZPSN(:)   
00194 ZALBVIS_WITH_SNOW(:) = ZALBVIS(:) * (1.-ZPSN(:)-ZFF(:)) + ZSNOWALB (:) * ZPSN(:)  
00195 ZALBUV_WITH_SNOW (:) = ZALBUV (:) * (1.-ZPSN(:)-ZFF(:)) + ZSNOWALB (:) * ZPSN(:)  
00196 !
00197 !* snow-flood-covered surface albedo for each wavelength (needed for outputs)
00198 !
00199  CALL ALBEDO_FROM_NIR_VIS(PSW_BANDS,                                              &
00200                          ZALBNIR_WITH_SNOW,  ZALBVIS_WITH_SNOW, ZALBUV_WITH_SNOW,&
00201                          ZDIR_ALB_WITH_SNOW, ZSCA_ALB_WITH_SNOW                  )  
00202 !
00203 DO JSWB=1,ISWB
00204   ZDIR_ALB_WITH_SNOW(:,JSWB)=ZDIR_ALB_WITH_SNOW(:,JSWB) + ZFF(:)*ZALBF_DIR(:)
00205   ZSCA_ALB_WITH_SNOW(:,JSWB)=ZSCA_ALB_WITH_SNOW(:,JSWB) + ZFF(:)*ZALBF_SCA(:)
00206 ENDDO
00207 !
00208 !-------------------------------------------------------------------------------
00209 !
00210 ! longwave computations for outputs (emissivity for radiative scheme)
00211 !
00212 ZEMIST(:) = (1.-ZPSN(:)-ZFF(:))*ZEMIS(:) + ZPSN(:) * XEMISSN + ZFF(:)*ZEMISF(:)
00213 !
00214 !-------------------------------------------------------------------------------
00215 !
00216 ! Unpack variable
00217 !
00218  CALL UNPACK_SAME_RANK(IMASK(:),ZPSNG (:),XPSNG  (:,KPATCH),ZPUT0)     
00219  CALL UNPACK_SAME_RANK(IMASK(:),ZPSNV (:),XPSNV  (:,KPATCH),ZPUT0)     
00220  CALL UNPACK_SAME_RANK(IMASK(:),ZPSN  (:),XPSN   (:,KPATCH),ZPUT0)  
00221  CALL UNPACK_SAME_RANK(IMASK(:),ZEMIST(:),PEMIST (:,KPATCH),ZPUT0)  
00222  CALL UNPACK_SAME_RANK(IMASK(:),ZDIR_ALB_WITH_SNOW (:,:),XDIR_ALB_WITH_SNOW (:,:,KPATCH),ZPUT0)  
00223  CALL UNPACK_SAME_RANK(IMASK(:),ZSCA_ALB_WITH_SNOW (:,:),XSCA_ALB_WITH_SNOW (:,:,KPATCH),ZPUT0)
00224 !
00225 !-------------------------------------------------------------------------------
00226 IF (LHOOK) CALL DR_HOOK('UPDATE_RAD_ISBA_N:TREAT_NATURE',1,ZHOOK_HANDLE)
00227 !
00228 END SUBROUTINE TREAT_NATURE
00229 !
00230 SUBROUTINE TREAT_FLOOD(KSIZE,KPATCH,KMASK,PPSNG,PPSNV,PLAI,PVEG,&
00231                PALBF_DIR,PALBF_SCA,PEMISF,PFF)
00232 !
00233 IMPLICIT NONE
00234 !
00235 INTEGER, INTENT(IN) :: KSIZE
00236 INTEGER, INTENT(IN) :: KPATCH
00237 INTEGER, DIMENSION(:), INTENT(IN) :: KMASK
00238 REAL, DIMENSION(:),  INTENT(IN) :: PPSNG             
00239 REAL, DIMENSION(:),  INTENT(IN) :: PPSNV 
00240 REAL, DIMENSION(:),  INTENT(IN) :: PLAI
00241 REAL, DIMENSION(:),  INTENT(IN) :: PVEG
00242 REAL, DIMENSION(:), INTENT(OUT) :: PALBF_DIR
00243 REAL, DIMENSION(:), INTENT(OUT) :: PALBF_SCA
00244 REAL, DIMENSION(:), INTENT(OUT) :: PEMISF   
00245 REAL, DIMENSION(:), INTENT(OUT) :: PFF  
00246 !
00247 REAL, DIMENSION(KSIZE) :: ZTG
00248 REAL, DIMENSION(KSIZE) :: ZZENITH
00249 REAL, DIMENSION(KSIZE) :: ZFFLOOD
00250 REAL, DIMENSION(KSIZE) :: ZFFG   
00251 REAL, DIMENSION(KSIZE) :: ZFFV
00252 REAL, DIMENSION(KSIZE) :: ZALBF
00253 REAL, DIMENSION(KSIZE) :: ZFFROZEN
00254 REAL, DIMENSION(KSIZE) :: ZALBEDO
00255 !
00256 REAL, PARAMETER :: ZPUT0 = 0.0
00257 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00258 !
00259 IF (LHOOK) CALL DR_HOOK('UPDATE_RAD_ISBA_N:TREAT_FLOOD',0,ZHOOK_HANDLE)
00260 !
00261  CALL PACK_SAME_RANK(KMASK(:),XTG(:,1,KPATCH),ZTG(:))
00262 !
00263  CALL PACK_SAME_RANK(KMASK(:),PZENITH(:),ZZENITH (:))
00264  CALL PACK_SAME_RANK(KMASK(:),XFFLOOD(:),ZFFLOOD (:))
00265 !      
00266 ZFFG(:) = FLOOD_FRAC_GROUND(PPSNG,ZFFLOOD)
00267 ZFFV(:) = FLOOD_FRAC_VEG(PLAI,PPSNV,ZFFLOOD)
00268 PFF (:) = FLOOD_FRAC_NAT(PVEG,ZFFG,ZFFV,ZFFLOOD)
00269 !
00270 ZALBEDO(:) = ALBEDO_TA96(ZZENITH(:))
00271 WHERE(ZFFLOOD==0.0)
00272   PALBF_DIR (:) = XUNDEF
00273   PALBF_SCA (:) = XUNDEF
00274   ZALBF     (:) = XUNDEF
00275   PEMISF    (:) = XUNDEF
00276   ZFFROZEN  (:) = 0.0
00277 ELSEWHERE
00278   WHERE(ZTG(:)>=XTT)
00279     PALBF_DIR (:) = ZALBEDO(:)
00280     PALBF_SCA (:) = XALBSCA_WAT
00281     PEMISF    (:) = XEMISWAT
00282     ZFFROZEN  (:) = 0.0
00283   ELSEWHERE
00284     PALBF_DIR (:) = XALBWATICE
00285     PALBF_SCA (:) = XALBWATICE
00286     PEMISF    (:) = XEMISWATICE
00287     ZFFROZEN  (:) = 1.0
00288   END WHERE
00289   ZALBF(:)=0.5*(PALBF_DIR(:)+PALBF_SCA(:))
00290 ENDWHERE
00291 !
00292  CALL UNPACK_SAME_RANK(KMASK(:),ZFFG    (:),XFFG    (:,KPATCH),ZPUT0)     
00293  CALL UNPACK_SAME_RANK(KMASK(:),ZFFV    (:),XFFV    (:,KPATCH),ZPUT0)     
00294  CALL UNPACK_SAME_RANK(KMASK(:),ZFFROZEN(:),XFFROZEN(:,KPATCH),ZPUT0)     
00295  CALL UNPACK_SAME_RANK(KMASK(:),PFF     (:),XFF     (:,KPATCH),ZPUT0) 
00296  CALL UNPACK_SAME_RANK(KMASK(:),PEMISF  (:),XEMISF  (:,KPATCH),XUNDEF)
00297  CALL UNPACK_SAME_RANK(KMASK(:),ZALBF   (:),XALBF   (:,KPATCH),XUNDEF)     
00298 !
00299 IF (LHOOK) CALL DR_HOOK('UPDATE_RAD_ISBA_N:TREAT_FLOOD',1,ZHOOK_HANDLE)
00300 !
00301 END SUBROUTINE TREAT_FLOOD
00302 !
00303 END SUBROUTINE UPDATE_RAD_ISBA_n