SURFEX v7.3
General documentation of Surfex
|
00001 ! ################################################################################ 00002 SUBROUTINE SSO_Z0_FRICTION_n(PSEA,PUREF,PRHOA,PU,PV,PPEW_A_COEF,PPEW_B_COEF,PSFU,PSFV) 00003 ! ################################################################################ 00004 ! 00005 !!**** *SSO_Z0_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 !! E. Martin 01/2012 Correction masque (compatibilité XUNDEF) 00029 !! B. Decharme 09/2012 new wind implicitation and sea fraction 00030 !---------------------------------------------------------------- 00031 ! 00032 ! 00033 USE MODD_SURF_PAR, ONLY : XUNDEF 00034 USE MODD_SURF_ATM, ONLY : CIMPLICIT_WIND 00035 USE MODD_CSTS, ONLY : XKARMAN, XPI 00036 USE MODD_SURF_ATM_SSO_n, ONLY : CROUGH, XZ0EFFJPDIR, XZ0REL, XFRACZ0, & 00037 XZ0EFFIP, XZ0EFFIM, XZ0EFFJP, XZ0EFFJM 00038 ! 00039 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00040 USE PARKIND1 ,ONLY : JPRB 00041 ! 00042 IMPLICIT NONE 00043 ! 00044 !* 0.1 declarations of arguments 00045 ! 00046 REAL, DIMENSION(:), INTENT(IN) :: PSEA ! Sea fraction (-) 00047 REAL, DIMENSION(:), INTENT(IN) :: PUREF ! Wind forcing height (m) 00048 REAL, DIMENSION(:), INTENT(IN) :: PRHOA ! air density (kg/m3) 00049 REAL, DIMENSION(:), INTENT(IN) :: PU ! zonal wind (m/s) 00050 REAL, DIMENSION(:), INTENT(IN) :: PV ! meridian wind (m/s) 00051 REAL, DIMENSION(:), INTENT(IN) :: PPEW_A_COEF! implicit coefficients (m2s/kg) 00052 REAL, DIMENSION(:), INTENT(IN) :: PPEW_B_COEF! needed if HCOUPLING='I' (m/s) 00053 REAL, DIMENSION(:), INTENT(INOUT) :: PSFU ! zonal momentum flux (Pa) 00054 REAL, DIMENSION(:), INTENT(INOUT) :: PSFV ! meridian momentum flux (Pa) 00055 ! 00056 !* 0.2 declarations of local variables 00057 ! 00058 REAL, DIMENSION(SIZE(PU)) :: ZWIND ! wind strength (m/s) 00059 REAL, DIMENSION(SIZE(PU)) :: ZDIR ! wind direction (rad., clockwise) 00060 REAL, DIMENSION(SIZE(PU)) :: ZALFA ! angle between z0eff J axis and wind direction (rad., clockwise) 00061 REAL, DIMENSION(SIZE(PU)) :: ZCOS2, ZSIN2 00062 REAL, DIMENSION(SIZE(PU)) :: ZZ0EFF ! Momentum Roughness length 00063 REAL, DIMENSION(SIZE(PU)) :: ZCD ! drag coefficient 00064 REAL, DIMENSION(SIZE(PU)) :: ZUSTAR2 ! square of friction velocity 00065 REAL, DIMENSION(SIZE(PU)) :: ZSSO_SFU! zonal orographic momentum flux 00066 REAL, DIMENSION(SIZE(PU)) :: ZSSO_SFV! meridian orographic momentum flux 00067 LOGICAL, DIMENSION(SIZE(PU)) :: GMASK ! mask where SSO exists 00068 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00069 00070 !------------------------------------------------------------------------------------- 00071 ! 00072 !* 1. roughness length formalism 00073 ! -------------------------- 00074 00075 !* wind strength 00076 ! 00077 IF (LHOOK) CALL DR_HOOK('SSO_Z0_FRICTION_N',0,ZHOOK_HANDLE) 00078 ZWIND(:) = SQRT(PU(:)**2+PV(:)**2) 00079 ! 00080 !* wind direction 00081 ! 00082 ZDIR(:) = 0. 00083 WHERE (ZWIND(:)>0.) ZDIR(:)=ATAN2(PU(:),PV(:)) 00084 ! 00085 !* default value 00086 ! 00087 GMASK(:)=(PSEA(:)/=1..AND. XZ0REL(:)/=0.) 00088 ZZ0EFF(:) = XUNDEF 00089 ! 00090 !* 2. Constant orographic roughness length 00091 ! ------------------------------------ 00092 ! 00093 IF (CROUGH=="Z01D") ZZ0EFF(:) = XZ0REL(:) 00094 ! 00095 !* 3. Directionnal roughness length 00096 ! ----------------------------- 00097 ! 00098 IF (CROUGH=="Z04D") THEN 00099 WHERE(GMASK(:)) 00100 ! 00101 ZALFA(:) = ZDIR(:) - XZ0EFFJPDIR(:) * XPI/180. 00102 ! 00103 WHERE (ZALFA(:)<=-XPI) 00104 ZALFA(:) = ZALFA(:) + 2.*XPI 00105 ELSEWHERE(ZALFA(:)> XPI) 00106 ZALFA(:) = ZALFA(:) - 2.*XPI 00107 ENDWHERE 00108 ! 00109 WHERE (ZALFA(:)>=-XPI.AND.ZALFA(:)<=XPI) 00110 ! 00111 ZSIN2(:) = SIN(ZALFA(:))**2 00112 ZCOS2(:) = COS(ZALFA(:))**2 00113 ! 00114 WHERE (ZALFA(:)<0.) 00115 ZZ0EFF(:)=XZ0EFFIM(:)*ZSIN2(:) 00116 ELSEWHERE 00117 ZZ0EFF(:)=XZ0EFFIP(:)*ZSIN2(:) 00118 ENDWHERE 00119 ! 00120 WHERE (ZALFA(:)>=-XPI/2. .AND. ZALFA(:)<XPI/2.) 00121 ZZ0EFF(:) = ZZ0EFF(:) + XZ0EFFJP(:)*ZCOS2(:) 00122 ELSEWHERE 00123 ZZ0EFF(:) = ZZ0EFF(:) + XZ0EFFJM(:)*ZCOS2(:) 00124 END WHERE 00125 ! 00126 END WHERE 00127 ! 00128 ENDWHERE 00129 ENDIF 00130 ! 00131 !* 4. Friction coefficient 00132 ! -------------------- 00133 ! 00134 ZCD (:) = 0. 00135 ZUSTAR2(:) = 0. 00136 ! 00137 GMASK(:)=(GMASK(:).AND.ZZ0EFF(:)>0.) 00138 ! 00139 WHERE (GMASK(:)) 00140 ! 00141 !* sets a limit to roughness length 00142 ZZ0EFF(:) = MIN(ZZ0EFF(:),PUREF(:)/XFRACZ0) 00143 ! 00144 ! neutral case 00145 ZCD(:) = (XKARMAN/LOG(PUREF(:)/ZZ0EFF(:)))**2 00146 ! 00147 END WHERE 00148 ! 00149 !* 5. Friction due to orography 00150 ! ------------------------- 00151 ! 00152 ! Modify flux-form implicit coupling coefficients: 00153 ! 00154 IF(CIMPLICIT_WIND=='OLD')THEN 00155 ! old implicitation 00156 ZUSTAR2(:) = ZCD(:)*ZWIND(:)*PPEW_B_COEF(:) & 00157 / (1.0-PRHOA(:)*ZCD(:)*ZWIND(:)*PPEW_A_COEF(:)) 00158 ELSE 00159 ! new implicitation 00160 ZUSTAR2(:) = (ZCD(:)*ZWIND(:)*(2.*PPEW_B_COEF(:)-ZWIND(:)) ) & 00161 / (1.0-2.0*PRHOA(:)*ZCD(:)*ZWIND(:)*PPEW_A_COEF(:)) 00162 ENDIF 00163 ! 00164 WHERE (GMASK(:)) 00165 ! 00166 ZWIND(:) = PRHOA(:)*PPEW_A_COEF(:)*ZUSTAR2(:) + PPEW_B_COEF(:) 00167 ZWIND(:) = MAX(ZWIND(:),0.) 00168 ! 00169 WHERE(PPEW_A_COEF(:)/= 0.) 00170 ZUSTAR2(:) = MAX( ( ZWIND(:) - PPEW_B_COEF(:) ) / (PRHOA(:)*PPEW_A_COEF(:)), 0.) 00171 ENDWHERE 00172 ! 00173 END WHERE 00174 ! 00175 !* 6. Projection of friction on wind components 00176 ! ----------------------------------------- 00177 ! 00178 ZSSO_SFU (:) = 0. 00179 ZSSO_SFV (:) = 0. 00180 WHERE (ZWIND(:)>0.) 00181 ZSSO_SFU (:) = - PU(:)/ZWIND(:) * ZUSTAR2(:) * PRHOA(:) 00182 ZSSO_SFV (:) = - PV(:)/ZWIND(:) * ZUSTAR2(:) * PRHOA(:) 00183 END WHERE 00184 ! 00185 !* 7. Adds orographic friction to other sources of friction 00186 ! ----------------------------------------------------- 00187 ! 00188 PSFU(:) = PSFU(:) + ZSSO_SFU(:) * (1.0-PSEA(:)) 00189 PSFV(:) = PSFV(:) + ZSSO_SFV(:) * (1.0-PSEA(:)) 00190 ! 00191 IF (LHOOK) CALL DR_HOOK('SSO_Z0_FRICTION_N',1,ZHOOK_HANDLE) 00192 ! 00193 !------------------------------------------------------------------------------------- 00194 ! 00195 END SUBROUTINE SSO_Z0_FRICTION_n