SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/surface_cd.F90
Go to the documentation of this file.
00001 !   #################################################################
00002     SUBROUTINE SURFACE_CD(PRI, PZREF, PUREF, PZ0EFF, PZ0H,   &
00003                               PCD, PCDN) 
00004 !   #################################################################
00005 !
00006 !!****  *SURFACE_CD*  
00007 !!
00008 !!    PURPOSE
00009 !!    -------
00010 !
00011 !     Computes the drag coefficients for momentum near the ground
00012 !         
00013 !     
00014 !!**  METHOD
00015 !!    ------
00016 !
00017 !
00018 !
00019 !    1 and 2 : computation of relative humidity near the ground
00020 !
00021 !    3 : richardson number
00022 !
00023 !    4 : the aerodynamical resistance for heat transfers is deduced
00024 !
00025 !    5 : the drag coefficient for momentum ZCD is computed
00026 !
00027 !
00028 !!    EXTERNAL
00029 !!    --------
00030 !!
00031 !!
00032 !!    IMPLICIT ARGUMENTS
00033 !!    ------------------
00034 !!
00035 !!    MODD_CST
00036 !!    MODD_GROUND_PAR
00037 !!
00038 !!      
00039 !!    REFERENCE
00040 !!    ---------
00041 !!
00042 !!      
00043 !!    AUTHOR
00044 !!    ------
00045 !!
00046 !!      V. Masson           * Meteo-France *
00047 !!
00048 !!    MODIFICATIONS
00049 !!    -------------
00050 !!      Original    20/01/98 
00051 !!                  02/04/01 (P Jabouille) limitation of Z0 with 0.5 PUREF
00052 !-------------------------------------------------------------------------------
00053 !
00054 !*       0.     DECLARATIONS
00055 !               ------------
00056 !
00057 USE MODD_CSTS,ONLY : XKARMAN
00058 !
00059 USE MODE_THERMOS
00060 !
00061 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00062 USE PARKIND1  ,ONLY : JPRB
00063 !
00064 IMPLICIT NONE
00065 !
00066 !*      0.1    declarations of arguments
00067 !
00068 !
00069 REAL, DIMENSION(:), INTENT(IN)    :: PRI      ! Richardson number
00070 REAL, DIMENSION(:), INTENT(IN)    :: PZREF    ! reference height of the first
00071                                               ! atmospheric level
00072 REAL, DIMENSION(:), INTENT(IN)    :: PUREF    ! reference height of the wind
00073 !                                             ! NOTE this is different from ZZREF
00074 !                                             ! ONLY in stand-alone/forced mode,
00075 !                                             ! NOT when coupled to a model (MesoNH)
00076 REAL, DIMENSION(:), INTENT(IN)    :: PZ0EFF   ! roughness length for momentum
00077                                               ! with subgrid-scale orography
00078 REAL, DIMENSION(:), INTENT(IN)    :: PZ0H     ! roughness length for heat
00079 !
00080 REAL, DIMENSION(:), INTENT(OUT)   :: PCD      ! drag coefficient for momentum
00081 REAL, DIMENSION(:), INTENT(OUT)   :: PCDN     ! neutral drag coefficient for momentum
00082 !
00083 !*      0.2    declarations of local variables
00084 !
00085 !
00086 REAL                       :: ZZ0EFF, ZZ0H, ZMU,     
00087                                ZCMSTAR, ZPM, ZCM, ZFM 
00088 INTEGER                    :: JJ
00089 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00090 
00091 ! Functions :
00092 REAL :: X, CMSTAR, PM
00093 CMSTAR(X) = 6.8741 + 2.6933*X - 0.3601*X*X + 0.0154*X*X*X
00094 PM    (X) = 0.5233 - 0.0815*X + 0.0135*X*X - 0.0010*X*X*X
00095 
00096 !-------------------------------------------------------------------------------
00097 !
00098 !*       1.     Drag coefficient for momentum transfers
00099 !               ---------------------------------------
00100 !
00101 
00102 !
00103 IF (LHOOK) CALL DR_HOOK('SURFACE_CD',0,ZHOOK_HANDLE)
00104 DO JJ=1,SIZE(PRI)
00105   ZZ0EFF = MIN(PZ0EFF(JJ),PUREF(JJ)*0.5)
00106   ZZ0H   = MIN(ZZ0EFF,PZ0H(JJ))
00107 !
00108   ZMU = LOG( MIN(ZZ0EFF/ZZ0H,200.) )
00109 !
00110   PCDN(JJ) = (XKARMAN/LOG(PUREF(JJ)/ZZ0EFF))**2
00111 
00112   ZCMSTAR = CMSTAR(ZMU)
00113   ZPM     = PM(ZMU)
00114 !
00115   ZCM = 10.*ZCMSTAR*PCDN(JJ)*( PUREF(JJ)/ZZ0EFF )**ZPM
00116 !
00117   IF ( PRI(JJ) > 0.0 ) THEN
00118     ZFM = 1. + 10.*PRI(JJ) / SQRT( 1.+5.*PRI(JJ) )
00119     ZFM = 1. / ZFM
00120   ELSE
00121     ZFM = 1. - 10.*PRI(JJ) / ( 1.+ZCM*SQRT(-PRI(JJ)) )
00122   ENDIF
00123 !
00124   PCD(JJ) = PCDN(JJ)*ZFM
00125 !
00126 ENDDO
00127 IF (LHOOK) CALL DR_HOOK('SURFACE_CD',1,ZHOOK_HANDLE)
00128 !
00129 !-------------------------------------------------------------------------------
00130 !
00131 END SUBROUTINE SURFACE_CD