SURFEX v7.3
General documentation of Surfex
|
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