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