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