SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/sso_be04_frictionn.F90
Go to the documentation of this file.
00001 !     ###############################################################################
00002 SUBROUTINE SSO_BE04_FRICTION_n(PTSTEP,PSEA,PUREF,PRHOA,PU,PV,PSFU,PSFV)
00003 !     ###############################################################################
00004 !
00005 !!****  *SSO_BE04_FRICTION_n * - Computes subgrid-scale orography friction
00006 !                                  according to several options:
00007 !                                CROUGH='Z01D' : orographic roughness length
00008 !                                CROUGH='Z04D' : orographic roughness length
00009 !                                                variable with wind direction
00010 !!
00011 !!    PURPOSE
00012 !!    -------
00013 !
00014 !!**  METHOD
00015 !!    ------
00016 !!
00017 !!    REFERENCE
00018 !!    ---------
00019 !!      
00020 !!
00021 !!    AUTHOR
00022 !!    ------
00023 !!     V. Masson 
00024 !!
00025 !!    MODIFICATIONS
00026 !!    -------------
00027 !!      Original    05/2010
00028 !----------------------------------------------------------------
00029 !
00030 !
00031 USE MODD_SURF_PAR,       ONLY : XUNDEF
00032 USE MODD_SURF_ATM_SSO_n, ONLY : XSSO_STDEV
00033 USE MODD_CANOPY_TURB,    ONLY : XALPSBL
00034 USE MODD_CSTS,           ONLY : XKARMAN
00035 !
00036 USE MODD_SSO_CANOPY_n,   ONLY : NLVL, XZ, XU, XTKE, XDZ, XZF, XDZF
00037 !
00038 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00039 USE PARKIND1  ,ONLY : JPRB
00040 !
00041 USE MODI_CANOPY_EVOL
00042 USE MODI_CANOPY_GRID_UPDATE
00043 USE MODI_SSO_BELJAARS04
00044 !
00045 IMPLICIT NONE
00046 !
00047 !*      0.1    declarations of arguments
00048 !
00049 REAL,               INTENT(IN)    :: PTSTEP    ! time step
00050 REAL, DIMENSION(:), INTENT(IN)    :: PSEA      ! Sea fraction                          (-)
00051 REAL, DIMENSION(:), INTENT(IN)    :: PUREF     ! Wind forcing height                   (m)
00052 REAL, DIMENSION(:), INTENT(IN)    :: PRHOA     ! air density                           (kg/m3)
00053 REAL, DIMENSION(:), INTENT(IN)    :: PU        ! zonal wind                            (m/s)
00054 REAL, DIMENSION(:), INTENT(IN)    :: PV        ! meridian wind                         (m/s)
00055 REAL, DIMENSION(:), INTENT(INOUT) :: PSFU      ! zonal momentum flux                   (Pa)
00056 REAL, DIMENSION(:), INTENT(INOUT) :: PSFV      ! meridian momentum flux                (Pa)
00057 !
00058 !*      0.2    declarations of local variables
00059 !
00060 REAL, DIMENSION(SIZE(PU))    :: ZWIND   ! wind strength (m/s)
00061 REAL, DIMENSION(SIZE(PU))    :: ZSSO_STDEV! SSO standard deviation (m)
00062 REAL, DIMENSION(SIZE(PU))    :: ZUSTAR  ! friction velocity
00063 !
00064 !* canopy variables
00065 !
00066 REAL, DIMENSION(SIZE(PU))     :: ZTA      ! temperature                                   (K)
00067 REAL, DIMENSION(SIZE(PU))     :: ZQA      ! specific humidity                             (kg/m3)
00068 REAL, DIMENSION(SIZE(PU))     :: ZPA      ! pressure                                      (Pa)
00069 REAL, DIMENSION(SIZE(PU),NLVL) :: ZT
00070 REAL, DIMENSION(SIZE(PU),NLVL) :: ZQ
00071 REAL, DIMENSION(SIZE(PU),NLVL) :: ZLMO
00072 REAL, DIMENSION(SIZE(PU),NLVL) :: ZLM
00073 REAL, DIMENSION(SIZE(PU),NLVL) :: ZLEPS
00074 REAL, DIMENSION(SIZE(PU),NLVL) :: ZP
00075 REAL, DIMENSION(SIZE(PU))     :: ZSFLUX_T
00076 REAL, DIMENSION(SIZE(PU))     :: ZSFLUX_Q
00077 REAL, DIMENSION(SIZE(PU),NLVL) :: ZFORC_T
00078 REAL, DIMENSION(SIZE(PU),NLVL) :: ZDFORC_TDT
00079 REAL, DIMENSION(SIZE(PU),NLVL) :: ZFORC_Q
00080 REAL, DIMENSION(SIZE(PU),NLVL) :: ZDFORC_QDQ
00081 REAL, DIMENSION(SIZE(PU)) :: ZALFATH
00082 REAL, DIMENSION(SIZE(PU)) :: ZBETATH
00083 REAL, DIMENSION(SIZE(PU)) :: ZALFAQ
00084 REAL, DIMENSION(SIZE(PU)) :: ZBETAQ
00085 !
00086 REAL,    DIMENSION(SIZE(PU), NLVL) :: ZFORC_U      ! tendency due to drag force for wind
00087 REAL,    DIMENSION(SIZE(PU), NLVL) :: ZDFORC_UDU   ! formal derivative of
00088 !                                                  ! tendency due to drag force for wind
00089 REAL,    DIMENSION(SIZE(PU), NLVL) :: ZFORC_E      ! tendency due to drag force for TKE
00090 REAL,    DIMENSION(SIZE(PU), NLVL) :: ZDFORC_EDE   ! formal derivative of
00091 !                                                  ! tendency due to drag force for TKE
00092 INTEGER                            :: INI          ! number of points
00093 INTEGER                            :: JI           ! number of points loop counter
00094 INTEGER                            :: JLAYER       ! vertical loop counter
00095 REAL,    DIMENSION(SIZE(PU))       :: ZH        ! Canopy height     (m)
00096 REAL,    DIMENSION(SIZE(PU))       :: ZSFLUX_U  ! Surface flux u'w' (m2/s2)
00097 REAL,    DIMENSION(SIZE(PU))       :: ZALFAU   ! V+(1) = alfa u'w'(1) + beta ! not used
00098 REAL,    DIMENSION(SIZE(PU))       :: ZBETAU   ! V+(1) = alfa u'w'(1) + beta ! not used
00099 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00100 !
00101 !-------------------------------------------------------------------------------------
00102 !
00103 !
00104 !*      1.     Initializations
00105 !              ---------------
00106 !
00107 !*      1.1    Grid definition
00108 !              ---------------
00109 IF (LHOOK) CALL DR_HOOK('SSO_BE04_FRICTION_N',0,ZHOOK_HANDLE)
00110 INI = SIZE(PU)
00111 !
00112 ZH = 0.
00113  CALL CANOPY_GRID_UPDATE(INI,NLVL,ZH,PUREF,XZ,XZF,XDZ,XDZF)
00114 !
00115 !*      1.2    Wind
00116 !              ----
00117 !
00118 ZWIND    = SQRT(PU**2+PV**2)
00119 !
00120 ZSFLUX_U = - SQRT(PSFU**2+PSFV**2)
00121 !
00122 !
00123 !*      1.3    Canopy profiles at first time step (neutral case)
00124 !              ----------------------------------
00125 !
00126 IF (ANY(XU(:,NLVL)==XUNDEF)) THEN
00127   DO JLAYER=1,NLVL
00128      DO JI=1,INI
00129         XU  (JI,JLAYER) = MAX ( ZWIND(JI) + SQRT(-ZSFLUX_U(JI)) / XKARMAN      &
00130                                   * LOG(XZ(JI,JLAYER)/XZ(JI,NLVL))   , 0.)
00131         XTKE(JI,JLAYER) = - XALPSBL * ZSFLUX_U(JI)
00132      ENDDO
00133   ENDDO
00134 ENDIF
00135 !
00136 !
00137 !-------------------------------------------------------------------------------------
00138 !
00139 !*      2.    Subgrid-scale orographic drag (Beljaars et al 2004)
00140 !             -----------------------------
00141 !
00142 ZSSO_STDEV = XSSO_STDEV
00143 WHERE (ZSSO_STDEV==XUNDEF) ZSSO_STDEV=0.
00144 !
00145 ZFORC_U   (:,:)= 0.
00146 ZDFORC_UDU(:,:)= 0.
00147 ZFORC_E   (:,:) = 0.
00148 ZDFORC_EDE(:,:) = 0.
00149 !
00150 !* computes tendencies on wind and Tke due to subgridscale orography
00151  CALL SSO_BELJAARS04( INI,NLVL,XZ,ZSSO_STDEV,XU,ZFORC_U,ZDFORC_UDU )
00152 !
00153 DO JLAYER=1,NLVL
00154    DO JI=1,INI
00155       ZFORC_U   (JI,NLVL) = ZFORC_U   (JI,NLVL) * (1.0-PSEA(JI))
00156       ZDFORC_UDU(JI,NLVL) = ZDFORC_UDU(JI,NLVL) * (1.0-PSEA(JI))
00157    ENDDO
00158 ENDDO
00159 !
00160 !-------------------------------------------------------------------------------------
00161 !
00162 !*      3.    Computes coefficients for implicitation
00163 !             ---------------------------------------
00164 !
00165 ZTA     (:) = XUNDEF
00166 ZQA     (:) = XUNDEF
00167 ZPA     (:) = XUNDEF
00168 ZSFLUX_T(:) = XUNDEF
00169 ZSFLUX_Q(:) = XUNDEF
00170 ZT        (:,:) = XUNDEF
00171 ZQ        (:,:) = XUNDEF
00172 ZLMO      (:,:) = XUNDEF
00173 ZP        (:,:) = XUNDEF
00174 ZFORC_T   (:,:) = XUNDEF
00175 ZDFORC_TDT(:,:) = XUNDEF 
00176 ZFORC_Q   (:,:) = XUNDEF
00177 ZDFORC_QDQ(:,:) = XUNDEF
00178 !
00179  CALL CANOPY_EVOL(INI, NLVL, PTSTEP, 2, XZ, ZWIND, ZTA, ZQA, ZPA, PRHOA,   &
00180                  ZSFLUX_U, ZSFLUX_T, ZSFLUX_Q,                            &
00181                  ZFORC_U, ZDFORC_UDU, ZFORC_E, ZDFORC_EDE,                &
00182                  ZFORC_T, ZDFORC_TDT, ZFORC_Q, ZDFORC_QDQ,                &
00183                  XZ, XZF, XDZ, XDZF, XU, XTKE, ZT, ZQ, ZLMO, ZLM,         &
00184                  ZLEPS, ZP, ZUSTAR,                                       &
00185                  ZALFAU, ZBETAU, ZALFATH, ZBETATH, ZALFAQ, ZBETAQ,        &
00186                  ONEUTRAL=.TRUE.                                          )
00187 !
00188 !-------------------------------------------------------------------------------------
00189 !
00190 !
00191 ! Momentum fluxes if canopy is used
00192 !
00193 WHERE (ZWIND>0.)
00194   PSFU (:) = - PU(:)/ZWIND(:) * ZUSTAR(:)**2 * PRHOA(:)
00195   PSFV (:) = - PV(:)/ZWIND(:) * ZUSTAR(:)**2 * PRHOA(:)
00196 END WHERE
00197 !
00198 IF (LHOOK) CALL DR_HOOK('SSO_BE04_FRICTION_N',1,ZHOOK_HANDLE)
00199 !
00200 !-------------------------------------------------------------------------------------
00201 !
00202 END SUBROUTINE SSO_BE04_FRICTION_n