SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/sso_z0_frictionn.F90
Go to the documentation of this file.
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