SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/canopy_evol_tke.F90
Go to the documentation of this file.
00001 !     #########
00002       SUBROUTINE CANOPY_EVOL_TKE(KI,KLVL,PTSTEP,PRHOA,             &
00003                                    PZ,PZF,PDZ,PDZF,                  &
00004                                    PFORC_E,PDFORC_EDE,               &
00005                                    PU,PTH,PUW,PWTH,PWQ,PLEPS,PTKE    )  
00006 !     #########################################
00007 !
00008 !!****  *CANOPY_EVOL_TKE* - evolution of wind in canopy 
00009 !!                        
00010 !!
00011 !!    PURPOSE
00012 !!    -------
00013 !!
00014 !!**  METHOD
00015 !!    ------
00016 !!
00017 !!    EXTERNAL
00018 !!    --------
00019 !!
00020 !!
00021 !!    IMPLICIT ARGUMENTS
00022 !!    ------------------
00023 !!
00024 !!    REFERENCE
00025 !!    ---------
00026 !!
00027 !!
00028 !!    AUTHOR
00029 !!    ------
00030 !!      V. Masson   *Meteo France*      
00031 !!
00032 !!    MODIFICATIONS
00033 !!    -------------
00034 !!      Original    07/2006 
00035 !-------------------------------------------------------------------------------
00036 !
00037 !*       0.    DECLARATIONS
00038 !              ------------
00039 !
00040 USE MODI_TRIDIAG_SURF
00041 USE MODD_CANOPY_TURB, ONLY : XCED, XTKEMIN
00042 USE MODD_CSTS,        ONLY : XG, XRD, XRV
00043 !
00044 !
00045 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00046 USE PARKIND1  ,ONLY : JPRB
00047 !
00048 IMPLICIT NONE
00049 !
00050 !*       0.1   Declarations of arguments
00051 !              -------------------------
00052 !
00053 INTEGER,                  INTENT(IN)    :: KI        ! number of horizontal points
00054 INTEGER,                  INTENT(IN)    :: KLVL      ! number of levels in canopy
00055 REAL,                     INTENT(IN)    :: PTSTEP    ! time-step                             (s)
00056 REAL, DIMENSION(KI),      INTENT(IN)    :: PRHOA     ! Air density                           (kg/m3)
00057 REAL, DIMENSION(KI,KLVL), INTENT(IN)    :: PZ        ! Z at full levels                      (m)
00058 REAL, DIMENSION(KI,KLVL), INTENT(IN)    :: PZF       ! Z at half levels                      (m)
00059 REAL, DIMENSION(KI,KLVL), INTENT(IN)    :: PDZ       ! deltaZ between canopy half levels,
00060 !                                                    ! located at full levels                (m)
00061 REAL, DIMENSION(KI,KLVL), INTENT(IN)    :: PDZF      ! deltaZ between canopy (full) levels,
00062 !                                                    ! located at half levels                (m)
00063 REAL, DIMENSION(KI,KLVL), INTENT(IN)    :: PFORC_E   ! tendency of wind due to canopy drag   (m2/s3)
00064 REAL, DIMENSION(KI,KLVL), INTENT(IN)    :: PDFORC_EDE! formal derivative of the tendency of
00065 !                                                    ! wind due to canopy drag               (1/s)
00066 REAL, DIMENSION(KI,KLVL), INTENT(IN)    :: PU        ! wind speed at canopy levels           (m/s)
00067 REAL, DIMENSION(KI,KLVL), INTENT(IN)    :: PTH       ! pot. temp. at canopy levels           (K)
00068 REAL, DIMENSION(KI,KLVL), INTENT(IN)    :: PUW       ! turbulent flux (at half levels)       (m2/s2)
00069 REAL, DIMENSION(KI,KLVL), INTENT(IN)    :: PWTH      ! w'Th' flux (at half levels)           (mK/s)
00070 REAL, DIMENSION(KI,KLVL), INTENT(IN)    :: PWQ       ! w'q'  flux (at half levels)           (kg/m2/s)
00071 REAL, DIMENSION(KI,KLVL), INTENT(IN)    :: PLEPS     ! dissipative length (full levels)      (m)
00072 REAL, DIMENSION(KI,KLVL), INTENT(INOUT) :: PTKE      ! TKE at canopy levels   
00073 !
00074 !
00075 !*       0.2   Declarations of local variables
00076 !              -------------------------------
00077 !
00078 INTEGER                    :: JLAYER   ! loop counter on layers
00079 !
00080 REAL, DIMENSION(KI,KLVL)   :: ZDUDZ    ! dU/dz at mid levels
00081 REAL, DIMENSION(KI,KLVL)   :: ZDP      ! dynamical production at full levels
00082 !                                      ! (at full levels)
00083 REAL, DIMENSION(KI,KLVL)   :: ZTP      ! thermal   production at full levels
00084 !                                      ! (at full levels)
00085 REAL, DIMENSION(KI,KLVL)   :: ZDISS_O_TKE ! dissipation/TKE ratio at full levels
00086 REAL, DIMENSION(KI,KLVL)   :: ZF       ! turbulent flux at mid levels
00087 REAL, DIMENSION(KI,KLVL)   :: ZDFDDVDZ ! derivative of turbulent flux as a
00088 !                                      ! function of vertical gradient of wind variable
00089 !                                      ! (at mid levels)
00090 REAL, DIMENSION(KI,KLVL)   :: ZEXT     ! external forcing at full levels
00091 REAL, DIMENSION(KI,KLVL)   :: ZDEXTDV  ! derivative of external forcing as a
00092 !                                      ! function of vertical variable
00093 !                                      ! (at full levels)
00094 REAL, DIMENSION(KI,KLVL)   :: ZTKE     ! TKE     at canopy levels (work var.)
00095 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00096 !
00097 !-------------------------------------------------------------------------------
00098 !
00099 !
00100 !*    1. initializations
00101 !        ---------------
00102 !
00103 !* external forces
00104 !
00105 IF (LHOOK) CALL DR_HOOK('CANOPY_EVOL_TKE',0,ZHOOK_HANDLE)
00106 ZEXT = 0.
00107 ZDEXTDV = 0.
00108 !
00109 !* turbulent flux
00110 !
00111 ZF       = 0.
00112 ZDFDDVDZ = 0.
00113 !
00114 !-------------------------------------------------------------------------------
00115 !
00116 !*    2. wind vertical derivative mid layers (at half levels below full levels)
00117 !        ------------------------
00118 !
00119 ZDUDZ(:,:) = -999.
00120 DO JLAYER=2,KLVL
00121   ZDUDZ(:,JLAYER) = (PU(:,JLAYER) - PU(:,JLAYER-1)) / PDZF(:,JLAYER)
00122 END DO
00123 !-------------------------------------------------------------------------------
00124 !
00125 !*    3. Dynamical production of TKE (at full levels)
00126 !        ---------------------------
00127 !
00128 ZDP(:,:) = -999.
00129 !
00130 !* first level using an extrapolation using a 1/z law
00131 ZDP(:,1) = - PUW(:,2) * ZDUDZ(:,2) * (PZF(:,2)/PZ(:,1))
00132 
00133 ! other levels
00134 DO JLAYER=2,KLVL-1
00135   ZDP(:,JLAYER) = - 0.5 * (PUW(:,JLAYER)   * ZDUDZ(:,JLAYER)  ) &
00136                     - 0.5 * (PUW(:,JLAYER+1) * ZDUDZ(:,JLAYER+1))  
00137 END DO
00138 !
00139 !* upper level using an extrapolation using a 1/z law
00140 ZDP(:,KLVL) = - PUW(:,KLVL) * ZDUDZ(:,KLVL) * (PZF(:,KLVL)/PZ(:,KLVL))
00141 !
00142 !* adds dynamical production in non-transport forces
00143 ZEXT    = ZEXT    + ZDP
00144 ZDEXTDV = ZDEXTDV + 0.
00145 !
00146 !-------------------------------------------------------------------------------
00147 !
00148 !*    4. Thermal production of TKE (at full levels)
00149 !        -------------------------
00150 !
00151 ZTP(:,:) = -999.
00152 !
00153 ! other levels
00154 DO JLAYER=1,KLVL-1
00155   ZTP(:,JLAYER) = XG/PTH(:,JLAYER) * 0.5 * ( (PWTH(:,JLAYER)+ PWTH(:,JLAYER+1))          &
00156                                    + (XRV/XRD-1) * (PWQ(:,JLAYER) + PWQ(:,JLAYER)   )/PRHOA(:) )  
00157 END DO
00158 !
00159 !* upper level
00160 ZTP(:,KLVL) = XG/PTH(:,KLVL) * PWTH(:,KLVL)
00161 !
00162 !* adds dynamical production in non-transport forces
00163 ZEXT    = ZEXT    + ZTP
00164 ZDEXTDV = ZDEXTDV + 0.
00165 !
00166 !-------------------------------------------------------------------------------
00167 !
00168 !*    4. Dissipation/TKE ratio (to prepare implicitation of dissipation)
00169 !        ---------------------
00170 !
00171 ZDISS_O_TKE = - XCED * SQRT(PTKE(:,:)) / PLEPS(:,:)
00172 !
00173 !* adds dissipation in non-transport forces
00174 ZEXT    = ZEXT    +       ZDISS_O_TKE * PTKE(:,:)
00175 ZDEXTDV = ZDEXTDV + 1.5 * ZDISS_O_TKE
00176 !
00177 !-------------------------------------------------------------------------------
00178 !
00179 !*    6. Adds Creation force due to canopy
00180 !        ---------------------------------
00181 !
00182 !
00183 ZEXT    = ZEXT    + PFORC_E(:,:)
00184 ZDEXTDV = ZDEXTDV + PDFORC_EDE(:,:)
00185 
00186 
00187 !-------------------------------------------------------------------------------
00188 !
00189 !*    7. Evolution of TKE due to Dyn prod, Dissipation and Drag production
00190 !        -----------------------------------------------------------------
00191 !
00192 !* note that dissipation is implicited
00193 !
00194  CALL TRIDIAG_SURF(PTKE,ZF,ZDFDDVDZ,ZEXT,ZDEXTDV,PTSTEP, &
00195                     PDZF,PDZ,ZTKE                         )  
00196 !
00197 !-------------------------------------------------------------------------------
00198 !
00199 !*    7. New value of TKE (at full levels)
00200 !        ----------------
00201 !
00202 PTKE(:,:) = ZTKE(:,:)
00203 !
00204 !-------------------------------------------------------------------------------
00205 !
00206 !*    8. Security at all levels : set minimum threshold
00207 !        ----------------------
00208 !
00209 PTKE(:,:) = MAX(PTKE,XTKEMIN)
00210 IF (LHOOK) CALL DR_HOOK('CANOPY_EVOL_TKE',1,ZHOOK_HANDLE)
00211 !
00212 !----------------------------------------------------------------
00213 !
00214 END SUBROUTINE CANOPY_EVOL_TKE