SURFEX v7.3
General documentation of Surfex
|
00001 ! ######################################### 00002 SUBROUTINE CANOPY_EVOL_NEUTRAL(KI,KLVL,PTSTEP,KIMPL,PWIND,PRHOA, & 00003 PSFLUX_U, & 00004 PFORC_U,PDFORC_UDU,PFORC_E,PDFORC_EDE, & 00005 PZ,PZF,PDZ,PDZF,PU,PTKE,PUSTAR, & 00006 PALFAU,PBETAU ) 00007 ! ######################################### 00008 ! 00009 !!**** *CANOPY_EVOL* - evolution of canopy 00010 !! 00011 !! 00012 !! PURPOSE 00013 !! ------- 00014 !! 00015 !!** METHOD 00016 !! ------ 00017 !! 00018 !! EXTERNAL 00019 !! -------- 00020 !! 00021 !! 00022 !! IMPLICIT ARGUMENTS 00023 !! ------------------ 00024 !! 00025 !! REFERENCE 00026 !! --------- 00027 !! 00028 !! 00029 !! AUTHOR 00030 !! ------ 00031 !! V. Masson *Meteo France* 00032 !! 00033 !! MODIFICATIONS 00034 !! ------------- 00035 !! Original 05/2010 00036 !------------------------------------------------------------------------------- 00037 ! 00038 !* 0. DECLARATIONS 00039 ! ------------ 00040 ! 00041 USE MODD_CSTS, ONLY : XKARMAN 00042 USE MODD_SURF_PAR, ONLY : XUNDEF 00043 USE MODD_CANOPY_TURB, ONLY : XCMFS, XALPSBL, XCED 00044 ! 00045 USE MODI_CANOPY_EVOL_WIND 00046 USE MODI_CANOPY_EVOL_TKE 00047 ! 00048 USE MODE_SBLS 00049 ! 00050 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00051 USE PARKIND1 ,ONLY : JPRB 00052 ! 00053 IMPLICIT NONE 00054 ! 00055 !* 0.1 Declarations of arguments 00056 ! ------------------------- 00057 ! 00058 INTEGER, INTENT(IN) :: KI ! number of horizontal points 00059 INTEGER, INTENT(IN) :: KLVL ! number of levels in canopy 00060 REAL, INTENT(IN) :: PTSTEP ! atmospheric time-step (s) 00061 INTEGER, INTENT(IN) :: KIMPL ! implicitation code: 00062 ! ! 1 : computes only alfa and beta coupling 00063 ! ! coefficients for all variables 00064 ! ! 2 : computes temporal evolution of the 00065 ! ! variables 00066 REAL, DIMENSION(KI), INTENT(IN) :: PWIND ! wind speed (m/s) 00067 REAL, DIMENSION(KI), INTENT(IN) :: PRHOA ! Air density at forcing level (kg/m3) 00068 REAL, DIMENSION(KI), INTENT(IN) :: PSFLUX_U ! surface flux u'w' (m2/s2) 00069 REAL, DIMENSION(KI,KLVL), INTENT(IN) :: PFORC_U ! tendency of wind due to canopy drag (m/s2) 00070 REAL, DIMENSION(KI,KLVL), INTENT(IN) :: PDFORC_UDU! formal derivative of the tendency of 00071 ! ! wind due to canopy drag (1/s) 00072 REAL, DIMENSION(KI,KLVL), INTENT(IN) :: PFORC_E ! tendency of TKE due to canopy drag (m2/s3) 00073 REAL, DIMENSION(KI,KLVL), INTENT(IN) :: PDFORC_EDE! formal derivative of the tendency of 00074 ! ! TKE due to canopy drag (1/s) 00075 ! 00076 REAL, DIMENSION(KI,KLVL), INTENT(INOUT) :: PZ ! heights of canopy levels (m) 00077 REAL, DIMENSION(KI,KLVL), INTENT(IN) :: PZF ! heights of bottom of canopy levels (m) 00078 REAL, DIMENSION(KI,KLVL), INTENT(IN) :: PDZ ! depth of canopy levels (m) 00079 REAL, DIMENSION(KI,KLVL), INTENT(IN) :: PDZF ! depth between canopy levels (m) 00080 REAL, DIMENSION(KI,KLVL), INTENT(INOUT) :: PU ! wind speed at canopy levels (m/s) 00081 REAL, DIMENSION(KI,KLVL), INTENT(INOUT) :: PTKE ! TKE at canopy levels (m2/s2) 00082 REAL, DIMENSION(KI), INTENT(OUT) :: PUSTAR ! friction velocity at forcing level (m/s) 00083 REAL, DIMENSION(KI), INTENT(OUT) :: PALFAU ! V+(1) = alfa u'w'(1) + beta 00084 REAL, DIMENSION(KI), INTENT(OUT) :: PBETAU ! V+(1) = alfa u'w'(1) + beta 00085 ! 00086 !* 0.2 Declarations of local variables 00087 ! ------------------------------- 00088 ! 00089 INTEGER :: JLAYER ! loop counter on layers 00090 INTEGER :: JI ! loop counter 00091 ! 00092 REAL, DIMENSION(KI,KLVL) :: ZK ! mixing coefficient 00093 REAL, DIMENSION(KI,KLVL) :: ZDKDDVDZ ! formal derivative of mixing coefficient according to variable vertical gradient 00094 REAL, DIMENSION(KI,KLVL) :: ZEXN ! Exner function at full levels 00095 REAL, DIMENSION(KI,KLVL) :: ZUW ! friction at mid levels 00096 REAL, DIMENSION(KI,KLVL) :: ZTH ! temperature(meaningless here) 00097 REAL, DIMENSION(KI,KLVL) :: ZWTH ! heat flux (supposed equal to zero) 00098 REAL, DIMENSION(KI,KLVL) :: ZWQ ! vapor flux (supposed equal to zero) 00099 REAL, DIMENSION(KI,KLVL) :: ZLEPS ! Dissipative length at full levels 00100 REAL, DIMENSION(KI,KLVL) :: ZZ ! height above displacement height 00101 REAL, DIMENSION(KI,KLVL) :: ZLM ! Mixing length at mid levels 00102 REAL, DIMENSION(KI) :: ZUSTAR ! friction velocity (estimated from 00103 ! ! fluxes at atmospheric forcing level) 00104 ! 00105 REAL :: ZZ0 ! a value of z0 just for first time-step init. 00106 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00107 ! 00108 !------------------------------------------------------------------------------- 00109 ! 00110 !* 1. First time step initialization 00111 ! ------------------------------ 00112 ! 00113 !* first time step (i.e. wind profile is initially zero) : 00114 ! set a neutral wind profile in relation with forcing wind 00115 IF (LHOOK) CALL DR_HOOK('CANOPY_EVOL_NEUTRAL',0,ZHOOK_HANDLE) 00116 DO JI=1,KI 00117 IF(PWIND(JI)>0. .AND. PU(JI,KLVL-1)==0.) THEN 00118 ZZ0 = PZ(JI,1)/2. 00119 PU(JI,:) = PWIND(JI) * LOG (PZ(JI,:)/ZZ0) / LOG (PZ(JI,KLVL)/ZZ0) 00120 END IF 00121 END DO 00122 !------------------------------------------------------------------------------- 00123 ! 00124 !* 2. mixing and dissipative lengths (at full levels) 00125 ! ------------------------------ 00126 ! 00127 !* influence of ground surface on mixing length in neutral case 00128 DO JLAYER=1,KLVL 00129 ZLM (:,JLAYER) = XKARMAN/SQRT(XALPSBL)/XCMFS * PZ(:,JLAYER) 00130 ZLEPS(:,JLAYER) = XKARMAN*(XALPSBL**1.5)*XCED * PZ(:,JLAYER) 00131 END DO 00132 ! 00133 !------------------------------------------------------------------------------- 00134 ! 00135 !* 3. time evolution of wind in canopy 00136 ! -------------------------------- 00137 ! 00138 !* 3.1 mixing coefficient for wind at mid layers (at half levels) 00139 ! --------------------------- 00140 ! 00141 ZK = -999. 00142 DO JLAYER=2,KLVL 00143 ZK(:,JLAYER) = 0.5 * XCMFS * ZLM(:,JLAYER) * SQRT(PTKE(:,JLAYER) ) & 00144 + 0.5 * XCMFS * ZLM(:,JLAYER-1) * SQRT(PTKE(:,JLAYER-1)) 00145 END DO 00146 ! 00147 ! 00148 !* 3.2 mixing coefficient vertical derivative at mid layers (at half levels) 00149 ! -------------------------------------- 00150 ! 00151 !* there is no formal dependency on wind 00152 ZDKDDVDZ = 0. 00153 ! 00154 ! 00155 !* 3.3 time evolution of wind in canopy 00156 ! -------------------------------- 00157 ! 00158 CALL CANOPY_EVOL_WIND(KI,KLVL,PTSTEP,KIMPL,PWIND,ZK,ZDKDDVDZ,PSFLUX_U,PFORC_U,PDFORC_UDU,PDZ,PDZF,PU,ZUW,PALFAU,PBETAU) 00159 ! 00160 !* 3.4 Friction velocity at top of SBL layers 00161 ! -------------------------------------- 00162 ! 00163 PUSTAR = SQRT(ABS(ZUW(:,KLVL))) 00164 ! 00165 !------------------------------------------------------------------------------- 00166 ! 00167 !* 4. time evolution of TKE in canopy 00168 ! ------------------------------- 00169 ! 00170 !* neutral case, no thermal production 00171 ZWTH = 0. 00172 ZWQ = 0. 00173 ZTH = 300. 00174 ! 00175 CALL CANOPY_EVOL_TKE(KI,KLVL,PTSTEP,PRHOA,PZ,PZF,PDZ,PDZF,PFORC_E,PDFORC_EDE, & 00176 PU,ZTH,ZUW,ZWTH,ZWQ,ZLEPS,PTKE ) 00177 ! 00178 !------------------------------------------------------------------------------- 00179 ! 00180 !* 5. Security at atmospheric forcing level 00181 ! ------------------------------------- 00182 ! 00183 PU(:,KLVL) = PWIND(:) 00184 IF (LHOOK) CALL DR_HOOK('CANOPY_EVOL_NEUTRAL',1,ZHOOK_HANDLE) 00185 ! 00186 !------------------------------------------------------------------------------- 00187 END SUBROUTINE CANOPY_EVOL_NEUTRAL 00188 00189