SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/z0eff.F90
Go to the documentation of this file.
00001 !     #########
00002     SUBROUTINE Z0EFF(HROUGH, PALFA, PZREF, PUREF, PZ0, PZ0REL, PPSN,          &
00003                       PZ0EFFIP,PZ0EFFIM,PZ0EFFJP,PZ0EFFJM,PFF,PZ0_FLOOD,        &
00004                       PAOSIP,PAOSIM,PAOSJP,PAOSJM,PHO2IP,PHO2IM,PHO2JP,PHO2JM,  &
00005                       PZ0_O_Z0H, PZ0_WITH_SNOW, PZ0H_WITH_SNOW,PZ0EFF           )  
00006 !   ############################################################################
00007 !
00008 !!****  *Z0EFF*  
00009 !!
00010 !!    PURPOSE
00011 !!    -------
00012 !
00013 !     Calculates the z0eff for momentum fluxes according to wind direction.
00014 !         
00015 !     
00016 !!**  METHOD
00017 !!    ------
00018 !
00019 !
00020 !!    EXTERNAL
00021 !!    --------
00022 !!
00023 !!
00024 !!    IMPLICIT ARGUMENTS
00025 !!    ------------------
00026 !!
00027 !!      
00028 !!    REFERENCE
00029 !!    ---------
00030 !!
00031 !!    Mascart et al. (1995)
00032 !!    Belair (1995)
00033 !!      
00034 !!    AUTHOR
00035 !!    ------
00036 !!
00037 !!      S. Belair           * Meteo-France *
00038 !!
00039 !!    MODIFICATIONS
00040 !!    -------------
00041 !!      Original    13/03/95 
00042 !!      (J.Stein)   15/11/95  use the potential temperature to compute Ri
00043 !!                            and PVMOD instead of ZVMOD
00044 !!      (P.Lacarrere)15/03/96 replace * PEXNS by / PEXNS
00045 !!      (V.Masson)   22/12/97 computation of z0eff after snow treatment
00046 !!      (V.Masson)   05/10/98 clear routine
00047 !!      (A.Boone)    11/26/98 Option for PDELTA: forested vs default surface
00048 !!      (V Masson)   12/07/01 new formulation for aggregation with snow z0
00049 !!      (P.LeMoigne) 09/02/06 computation of z0h in presence of snow
00050 !!      (B; Decharme)    2008 floodplains
00051 !-------------------------------------------------------------------------------
00052 !
00053 !*       0.     DECLARATIONS
00054 !               ------------
00055 !
00056 USE MODD_CSTS,     ONLY : XPI, XG
00057 USE MODD_SNOW_PAR, ONLY : XZ0SN, XWCRN, XZ0HSN
00058 USE MODD_ISBA_n,   ONLY : TSNOW
00059 !
00060 USE MODI_SUBSCALE_Z0EFF
00061 USE MODD_SURF_ATM, ONLY : LALDZ0H
00062 !
00063 !
00064 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00065 USE PARKIND1  ,ONLY : JPRB
00066 !
00067 IMPLICIT NONE
00068 !
00069 !*      0.1    declarations of arguments
00070 !
00071 !
00072  CHARACTER(LEN=*),   INTENT(IN)  :: HROUGH         ! type of roughness length
00073 REAL, DIMENSION(:), INTENT(IN)  :: PALFA          ! wind direction from J axis (clockwise)
00074 REAL, DIMENSION(:), INTENT(IN)  :: PZREF          ! height of atmospheric level
00075 REAL, DIMENSION(:), INTENT(IN)  :: PUREF          ! reference height for wind
00076 REAL, DIMENSION(:), INTENT(IN)  :: PZ0            ! vegetation roughness length
00077 REAL, DIMENSION(:), INTENT(IN)  :: PZ0REL         ! 1d orographic roughness length
00078 REAL, DIMENSION(:), INTENT(IN)  :: PPSN           ! fraction of snow
00079 REAL, DIMENSION(:), INTENT(IN)  :: PZ0EFFIP       ! z0eff for increasing x
00080 REAL, DIMENSION(:), INTENT(IN)  :: PZ0EFFIM       ! z0eff for decreasing x
00081 REAL, DIMENSION(:), INTENT(IN)  :: PZ0EFFJP       ! z0eff for increasing y
00082 REAL, DIMENSION(:), INTENT(IN)  :: PZ0EFFJM       ! z0eff for decreasing y
00083 REAL, DIMENSION(:), INTENT(IN)  :: PAOSIP         ! A/S for increasing x
00084 REAL, DIMENSION(:), INTENT(IN)  :: PAOSIM         ! A/S for decreasing x
00085 REAL, DIMENSION(:), INTENT(IN)  :: PAOSJP         ! A/S for increasing y
00086 REAL, DIMENSION(:), INTENT(IN)  :: PAOSJM         ! A/S for decreasing y
00087 REAL, DIMENSION(:), INTENT(IN)  :: PHO2IP         ! h/2 for increasing x
00088 REAL, DIMENSION(:), INTENT(IN)  :: PHO2IM         ! h/2 for decreasing x
00089 REAL, DIMENSION(:), INTENT(IN)  :: PHO2JP         ! h/2 for increasing y
00090 REAL, DIMENSION(:), INTENT(IN)  :: PHO2JM         ! h/2 for decreasing y
00091 REAL, DIMENSION(:), INTENT(IN)  :: PZ0_O_Z0H      ! ratio between heat and momentum z0
00092 !
00093 REAL, DIMENSION(:), INTENT(IN)  :: PFF            ! fraction of flood
00094 REAL, DIMENSION(:), INTENT(IN)  :: PZ0_FLOOD      ! floodplains roughness length
00095 !
00096 REAL, DIMENSION(:), INTENT(OUT) :: PZ0_WITH_SNOW  ! vegetation z0 modified by snow
00097 REAL, DIMENSION(:), INTENT(OUT) :: PZ0H_WITH_SNOW ! vegetation z0h modified by snow
00098 REAL, DIMENSION(:), INTENT(OUT) :: PZ0EFF         ! effective z0
00099 !
00100 !
00101 !
00102 !
00103 !*      0.2    declarations of local variables
00104 !
00105 !
00106 !
00107 REAL, DIMENSION(SIZE(PZ0EFF)) :: ZWORK, ZALFA,       
00108                                    ZZ0EFFIP, ZZ0EFFIM, 
00109                                    ZZ0EFFJP, ZZ0EFFJM  
00110 !                                              effective roughness length in 4
00111 !                                              directions
00112 REAL                          :: Z0CR, ZUZ0CN, ZALRCN1, ZALRCN2
00113 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00114 !-------------------------------------------------------------------------------
00115 !
00116 IF (LHOOK) CALL DR_HOOK('Z0EFF',0,ZHOOK_HANDLE)
00117 ZALRCN1=1.E-03
00118 ZALRCN2=2.5E-03
00119 Z0CR = XG*ZALRCN1
00120 ZUZ0CN=1./(XG*ZALRCN2)
00121 ZALFA(:) = PALFA(:)
00122 WHERE(ZALFA(:)<=-XPI) ZALFA = ZALFA + 2.*XPI
00123 WHERE(ZALFA(:)>  XPI) ZALFA = ZALFA - 2.*XPI
00124 !
00125 !
00126 !*       1.     GRID-AVERAGED ROUGHNESS LENGTHS
00127 !               -------------------------------
00128 !       (considering the effect of snow-flood-covered surfaces and orography)
00129 !
00130 !*       1.1    for heat
00131 !               --------
00132 !
00133 PZ0_WITH_SNOW(:)  = PZ0(:)
00134 PZ0H_WITH_SNOW(:) = PZ0(:) / PZ0_O_Z0H(:)
00135 !
00136 IF(TSNOW%SCHEME=='EBA') THEN
00137 !        
00138    WHERE (PPSN(:)>0.)
00139 !
00140 !!!!!Flooding scheme not implemented with this option 
00141       PZ0_WITH_SNOW(:) = PZ0_WITH_SNOW(:) + ( Z0CR - PZ0(:))* &
00142         PPSN(:)/(PPSN(:) + XWCRN*(1.0+ZUZ0CN*PZ0(:)))  
00143 !        
00144    END WHERE 
00145 
00146 
00147    IF (LALDZ0H) THEN  
00148      WHERE (PPSN(:)>0.)
00149          PZ0H_WITH_SNOW(:) = PZ0H_WITH_SNOW(:) + ( Z0CR - PZ0H_WITH_SNOW(:))* &
00150            PPSN(:)/(PPSN(:) + XWCRN*(1.0+ZUZ0CN*PZ0H_WITH_SNOW(:)))   
00151      END WHERE  
00152   END IF   
00153     
00154 !        
00155 ELSE
00156 !        
00157    WHERE (PPSN(:)>0..OR.PFF(:)>0.)
00158 !        
00159       ZWORK(:) =  (            PPSN(:) /(LOG(PUREF(:)/XZ0SN       ))**2 ) &
00160                 + (            PFF (:) /(LOG(PUREF(:)/PZ0_FLOOD(:)))**2 ) &
00161                 + ((1.-PPSN(:)-PFF (:))/(LOG(PUREF(:)/PZ0(:)      ))**2 )  
00162 !
00163       PZ0_WITH_SNOW(:) = PUREF(:) /EXP( SQRT( 1./ZWORK(:) ) )
00164 !
00165       ZWORK(:) =  (            PPSN(:) /(LOG(PZREF(:)/XZ0HSN                      ))**2 ) &
00166                 + (            PFF (:) /(LOG(PZREF(:)/(PZ0_FLOOD(:)/ PZ0_O_Z0H(:))))**2 ) &
00167                 + ((1.-PPSN(:)-PFF (:))/(LOG(PZREF(:)/(PZ0(:)/PZ0_O_Z0H(:))       ))**2 )  
00168 !
00169       PZ0H_WITH_SNOW(:) = PZREF(:) /EXP( SQRT( 1./ZWORK(:) ) )
00170 !
00171    END WHERE
00172 !
00173 ENDIF
00174 !
00175 !
00176 !*       1.2    for momentum
00177 !               ------------
00178 !
00179 !
00180 !                                     In this particular case, we now use
00181 !                                     the roughness length due to the coupled
00182 !                                     effect of vegetation and topography
00183 !                                     Snow and Flood effects are yet taken
00184 !                                     into account through ZZ0EFF
00185 !
00186 IF (HROUGH=='Z04D') THEN
00187   !
00188   ZZ0EFFIP(:) = PZ0EFFIP(:)
00189   ZZ0EFFIM(:) = PZ0EFFIM(:)
00190   ZZ0EFFJP(:) = PZ0EFFJP(:)
00191   ZZ0EFFJM(:) = PZ0EFFJM(:)
00192   !
00193   CALL SUBSCALE_Z0EFF(PAOSIP,PAOSIM,PAOSJP,PAOSJM,               &
00194                         PHO2IP,PHO2IM,PHO2JP,PHO2JM,PZ0_WITH_SNOW, &
00195                         ZZ0EFFIP,ZZ0EFFIM,ZZ0EFFJP,ZZ0EFFJM,       &
00196                         OMASK=(PPSN>0..OR.PFF(:)>0.)               )  
00197   !
00198   WHERE(ZALFA(:)>=0. .AND. ZALFA(:)<XPI/2.)
00199     PZ0EFF(:)=ZZ0EFFIP(:)*SIN(ZALFA(:))**2 + ZZ0EFFJP(:)*COS(ZALFA(:))**2
00200   END WHERE
00201   WHERE(ZALFA(:)>=XPI/2. .AND. ZALFA(:)<=XPI)
00202     PZ0EFF(:)=ZZ0EFFIP(:)*SIN(ZALFA(:))**2 + ZZ0EFFJM(:)*COS(ZALFA(:))**2
00203   END WHERE
00204   WHERE (ZALFA(:)>=-XPI/2 .AND. ZALFA(:)<0.)
00205     PZ0EFF(:)=ZZ0EFFIM(:)*SIN(ZALFA(:))**2 + ZZ0EFFJP(:)*COS(ZALFA(:))**2
00206   END WHERE
00207   WHERE (ZALFA(:)>=-XPI .AND. ZALFA(:)<-XPI/2.)
00208     PZ0EFF(:)=ZZ0EFFIM(:)*SIN(ZALFA(:))**2 + ZZ0EFFJM(:)*COS(ZALFA(:))**2
00209   END WHERE
00210 !
00211 ELSE IF (HROUGH=='Z01D') THEN
00212   PZ0EFF(:) = PZ0_WITH_SNOW(:) + PZ0REL(:)
00213   IF (LALDZ0H) THEN
00214      ! Aladin dynamic z0 contains already orographic component
00215      PZ0EFF(:) = PZ0EFF(:) - PZ0REL(:)
00216 !     PZ0H_WITH_SNOW(:) = PZ0EFF(:) / PZ0_O_Z0H(:)   ! it is aleardy corrected under IF statement of TSNOW%SCHEME  
00217   ENDIF
00218 ELSE
00219   PZ0EFF(:) = PZ0_WITH_SNOW(:)
00220 END IF
00221 IF (LHOOK) CALL DR_HOOK('Z0EFF',1,ZHOOK_HANDLE)
00222 !
00223 !-------------------------------------------------------------------------------
00224 !
00225 END SUBROUTINE Z0EFF