SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/param_cls.F90
Go to the documentation of this file.
00001 !     #########
00002        SUBROUTINE PARAM_CLS(PTA, PTS, PQA, PPA, PRHOA, PZONA, PMERA, PH, PHW, &
00003                               PSFTH, PSFTQ, PSFZON, PSFMER,                      &
00004                               PT2M, PQ2M, PHU2M, PZON10M, PMER10M               )  
00005 !     #####################################################################
00006 !
00007 !!****  *PARAMCLS*  interpolates wind at 10m and temperature/humidity at 2m
00008 !!
00009 !!    PURPOSE
00010 !!    -------
00011 !
00012 !         
00013 !     
00014 !!**  METHOD
00015 !!    ------
00016 !
00017 !!    EXTERNAL
00018 !!    --------
00019 !!
00020 !!    none
00021 !!
00022 !!    IMPLICIT ARGUMENTS
00023 !!    ------------------ 
00024 !!
00025 !!
00026 !!      
00027 !!    REFERENCE
00028 !!    ---------
00029 !!
00030 !!      
00031 !!    AUTHOR
00032 !!    ------
00033 !!
00034 !!   Rui Salgado
00035 !!
00036 !!    MODIFICATIONS
00037 !!    -------------
00038 !!
00039 !!      Original    26/10/98
00040 !!                  06/2003  (V. Masson) use of Paulson functions and
00041 !!                                       atmospheric level only
00042 !!                  11/2006  (P. LeMoigne) min value for LMO for unstable case
00043 !!                  01/2010  (S. Riette) XUNDEF is sent for wind where forcing
00044 !!                                       level is below heigt of diagnostic
00045 !!                                       (no extrapolation, only interpolation)
00046 !-------------------------------------------------------------------------------
00047 !
00048 !*       0.     DECLARATIONS
00049 !               ------------
00050 !
00051 USE MODD_SURF_PAR,   ONLY : XUNDEF
00052 USE MODD_CSTS,       ONLY : XKARMAN, XRD, XCPD, XP00, XRV, XG
00053 !
00054 USE MODE_SBLS
00055 USE MODE_THERMOS
00056 !
00057 !
00058 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00059 USE PARKIND1  ,ONLY : JPRB
00060 !
00061 IMPLICIT NONE
00062 !
00063 !*      0.1    declarations of arguments
00064 !
00065 !
00066 !
00067 REAL, DIMENSION(:), INTENT(IN)       :: PTA    ! atmospheric temperature
00068 REAL, DIMENSION(:), INTENT(IN)       :: PTS    ! surface temperature
00069 REAL, DIMENSION(:), INTENT(IN)       :: PQA    ! atmospheric specific humidity
00070 REAL, DIMENSION(:), INTENT(IN)       :: PPA    ! atmospheric level pressure
00071 REAL, DIMENSION(:), INTENT(IN)       :: PRHOA  ! air density
00072 REAL, DIMENSION(:), INTENT(IN)       :: PZONA  ! zonal wind
00073 REAL, DIMENSION(:), INTENT(IN)       :: PMERA  ! meridian wind
00074 REAL, DIMENSION(:), INTENT(IN)       :: PH     ! atmospheric level height
00075 REAL, DIMENSION(:), INTENT(IN)       :: PHW    ! atmospheric level height for wind
00076 REAL, DIMENSION(:), INTENT(IN)       :: PSFZON ! zonal friction
00077 REAL, DIMENSION(:), INTENT(IN)       :: PSFMER ! meridian friction
00078 REAL, DIMENSION(:), INTENT(IN)       :: PSFTH  ! heat flux  (W/m2)
00079 REAL, DIMENSION(:), INTENT(IN)       :: PSFTQ  ! vapor flux (kg/m2/s)
00080 !
00081 REAL, DIMENSION(:), INTENT(OUT)      :: PT2M   ! temperature at 2 meters
00082 REAL, DIMENSION(:), INTENT(OUT)      :: PQ2M   ! specific humidity at 2 meters
00083 REAL, DIMENSION(:), INTENT(OUT)      :: PHU2M  ! relative humidity at 2 meters
00084 REAL, DIMENSION(:), INTENT(OUT)      :: PZON10M! zonal wind component at 10 meters
00085 REAL, DIMENSION(:), INTENT(OUT)      :: PMER10M! meridian wind component at 10 meters
00086 !
00087 !*      0.2    declarations of local variables
00088 !
00089 REAL, DIMENSION(SIZE(PTA)) :: ZUSTAR     ! friction
00090 REAL, DIMENSION(SIZE(PTA)) :: ZTH        ! potential temperature
00091 REAL, DIMENSION(SIZE(PTA)) :: ZRV        ! H2O mixing ratio
00092 REAL, DIMENSION(SIZE(PTA)) :: ZLMO       ! Monin Obhukov length
00093 REAL, DIMENSION(SIZE(PTA)) :: ZH_O_LMO   ! h/LMO
00094 REAL, DIMENSION(SIZE(PTA)) :: Z10M_O_LMO ! 10m/LMO
00095 REAL, DIMENSION(SIZE(PTA)) :: Z2M_O_LMO  ! 2m/LMO
00096 REAL, DIMENSION(SIZE(PTA)) :: ZTSTAR     ! Scale of Temperature
00097 REAL, DIMENSION(SIZE(PTA)) :: ZQSTAR     ! Scale of humidity
00098 REAL, DIMENSION(SIZE(PTA)) :: ZTH2M      ! Potential temperature at 2m
00099 REAL, DIMENSION(SIZE(PTA)) :: ZP2M       ! Pressure at 2m
00100 REAL, DIMENSION(SIZE(PTA)) :: ZQSAT2M    ! saturation specific humidity at 2m
00101 REAL                       :: Z10M       ! 10m
00102 REAL                       :: Z2M        ! 2m
00103 REAL, DIMENSION(SIZE(PTA)) :: ZWT        ! potential temperature flux (Km/s)
00104 REAL, DIMENSION(SIZE(PTA)) :: ZWQ        ! water vapor flux           (kg/kg*m/s)
00105 REAL, DIMENSION(SIZE(PTA)) :: ZEXN       ! Exner function
00106 REAL                       :: ZLMOMIN    ! Minimum value of ZLMO for unstable cases
00107 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00108 !-------------------------------------------------------------------------------
00109 !
00110 IF (LHOOK) CALL DR_HOOK('PARAM_CLS',0,ZHOOK_HANDLE)
00111 Z10M = 10.
00112 Z2M  = 2.
00113 !
00114 !* friction
00115 !
00116 ZUSTAR(:) = SQRT(SQRT(PSFZON(:)**2+PSFMER(:)**2))
00117 !
00118 !* Exner function
00119 !
00120 ZEXN(:) =  (PPA(:)/XP00)**(XRD/XCPD)
00121 !
00122 !* Potential temperature
00123 !
00124 ZTH(:) = PTA(:) / ZEXN(:)
00125 !
00126 !* Vapor mixing ratio
00127 !
00128 WHERE (PQA(:)/=0.)
00129   ZRV = 1./(1./PQA(:) - 1.)
00130 ELSEWHERE
00131   ZRV = 0.
00132 END WHERE
00133 !
00134 !* Kinematic fluxes
00135 !
00136 ZWT(:) = PSFTH(:) / (PRHOA(:) * XCPD / ZEXN(:))
00137 ZWQ(:) = PSFTQ(:) /  PRHOA(:)
00138 !
00139 !
00140 !* Monin Obhukov length
00141 !
00142 ZLMO = LMO(ZUSTAR,ZTH,ZRV,ZWT,ZWQ)
00143 !
00144 ! min value of 1 meter for ZLMO for unstable case
00145 !
00146 ZLMOMIN = 1.
00147 ZLMO    = ZLMO * (1.-SIGN(1.,ZLMO))/2. + MAX(ZLMOMIN,ZLMO) * (1.+SIGN(1.,ZLMO))/2.
00148 !
00149 !* h/LMO; 10m/LMO; 2m/LMO
00150 !
00151 ZH_O_LMO   = 0.
00152 Z10M_O_LMO = 0.
00153 Z2M_O_LMO  = 0.
00154 !
00155 WHERE (ZLMO/=XUNDEF)
00156   Z10M_O_LMO = Z10M/ZLMO
00157   Z2M_O_LMO  = Z2M/ZLMO
00158 END WHERE
00159 !
00160 !-------------------------------------------------------------------------------
00161 !
00162 !* use of wind forcing height
00163 !
00164 WHERE (ZLMO/=XUNDEF)
00165   ZH_O_LMO   = PHW/ZLMO
00166 END WHERE
00167 !
00168 !* Wind at 10m
00169 !
00170 !* note : is set to zero value where the law does not apply correctly
00171 !  (e.g. over high mountains)
00172 !         and is set to XUNDEF when forcing level is below 10m diagnostic level
00173 PZON10M(:) = XUNDEF
00174 PMER10M(:) = XUNDEF
00175 WHERE(PHW(:)>=Z10M)
00176 WHERE (PSFZON(:)>=0.) 
00177   PZON10M(:) = PZONA(:) - SQRT( PSFZON(:))/XKARMAN *(   LOG ( Z10M/PHW)           &
00178                                                         - PAULSON_PSIM(Z10M_O_LMO)  &
00179                                                         + PAULSON_PSIM(ZH_O_LMO)    )  
00180   PZON10M(:) = MIN ( 0., PZON10M(:) )
00181 END WHERE
00182 !
00183 WHERE (PSFZON(:)< 0.) 
00184   PZON10M(:) = PZONA(:) + SQRT(-PSFZON(:))/XKARMAN *(   LOG ( Z10M/PHW)           &
00185                                                         - PAULSON_PSIM(Z10M_O_LMO)  &
00186                                                         + PAULSON_PSIM(ZH_O_LMO)    )  
00187   PZON10M(:) = MAX ( 0., PZON10M(:) )
00188 END WHERE
00189 !
00190 WHERE (PSFMER(:)>=0.) 
00191   PMER10M(:) = PMERA(:) - SQRT( PSFMER(:))/XKARMAN *(   LOG ( Z10M/PHW)           &
00192                                                         - PAULSON_PSIM(Z10M_O_LMO)  &
00193                                                         + PAULSON_PSIM(ZH_O_LMO)    )  
00194   PMER10M(:) = MIN ( 0., PMER10M(:) )
00195 END WHERE
00196 !
00197 WHERE (PSFMER(:)< 0.) 
00198   PMER10M(:) = PMERA(:) + SQRT(-PSFMER(:))/XKARMAN *(   LOG ( Z10M/PHW)           &
00199                                                         - PAULSON_PSIM(Z10M_O_LMO)  &
00200                                                         + PAULSON_PSIM(ZH_O_LMO)    )  
00201   PMER10M(:) = MAX ( 0., PMER10M(:) )
00202 END WHERE
00203 END WHERE
00204 !
00205 !-------------------------------------------------------------------------------
00206 !
00207 !* use of temperature forcing height
00208 !
00209 WHERE (ZLMO/=XUNDEF)
00210   ZH_O_LMO   = PH/ZLMO
00211 END WHERE
00212 !
00213 !* Temperature scale
00214 !
00215 ZTSTAR(:) = - ZWT(:) / MAX(ZUSTAR,0.01)
00216 !
00217 !* Potential Temperature at 2m
00218 !
00219 ZTH2M(:) = ZTH(:) + 0.74 * ZTSTAR(:)/XKARMAN *(  LOG ( Z2M/PH)             &
00220                                                  - PAULSON_PSIH(Z2M_O_LMO)   &
00221                                                  + PAULSON_PSIH(ZH_O_LMO)    )  
00222 !
00223 !* Pressure at 2m
00224 !
00225 ZP2M(:) = PPA(:) - XG * PRHOA(:) * (Z2M-PH(:))
00226 !
00227 !* Temperature at 2m
00228 !
00229 WHERE (ZWT(:) > 0. .OR. PTS(:) == XUNDEF)
00230   ! Businger formulation in unstable case
00231   PT2M(:) = ZTH2M(:) * (ZP2M(:)/XP00)**(XRD/XCPD)
00232 ELSEWHERE 
00233   ! Linear interpolation between Ts and Ta in stable case
00234   PT2M(:) = PTS(:) + (PTA(:)-PTS(:))*Z2M/PH(:)
00235 END WHERE
00236 !
00237 !-------------------------------------------------------------------------------
00238 !
00239 !* Humidity scale
00240 !
00241 ZQSTAR(:) = - ZWQ(:) / MAX(ZUSTAR,0.01)
00242 !
00243 !* Specific humidity at 2m
00244 !
00245 PQ2M(:) = PQA(:) + 0.74 * ZQSTAR(:)/XKARMAN *(  LOG ( Z2M/PH)             &
00246                                                 - PAULSON_PSIH(Z2M_O_LMO)   &
00247                                                 + PAULSON_PSIH(ZH_O_LMO)    )  
00248 !
00249 !* must be below saturation
00250 !
00251 ZQSAT2M(:) = QSAT(PT2M(:),ZP2M(:))
00252 PQ2M(:) = MIN (ZQSAT2M(:),PQ2M(:))
00253 !
00254 PHU2M(:) = PQ2M(:) / ZQSAT2M(:)
00255 IF (LHOOK) CALL DR_HOOK('PARAM_CLS',1,ZHOOK_HANDLE)
00256 !
00257 !-------------------------------------------------------------------------------
00258 !
00259 END SUBROUTINE PARAM_CLS