Changeset 1067 for LMDZ4/trunk/libf/phylmd/coef_diff_turb_mod.F90
- Timestamp:
- Dec 17, 2008, 2:30:13 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ4/trunk/libf/phylmd/coef_diff_turb_mod.F90
r878 r1067 1 !2 ! $Header$3 1 ! 4 2 MODULE coef_diff_turb_mod … … 8 6 ! at surface(cdrag) 9 7 ! 10 USE dimphy11 12 8 IMPLICIT NONE 13 9 … … 17 13 ! 18 14 SUBROUTINE coef_diff_turb(dtime, nsrf, knon, ni, & 19 ypaprs, ypplay, yu, yv, yq, yt, yts, yrugos, yqsurf, &15 ypaprs, ypplay, yu, yv, yq, yt, yts, yrugos, yqsurf, ycdragm, & 20 16 ycoefm, ycoefh ,yq2) 21 ! 17 18 USE dimphy 19 ! 22 20 ! Calculate coefficients(ycoefm, ycoefh) for turbulent diffusion in the 23 ! atmosphere and coefficients for turbulent diffusion at surface - cdrag 24 ! (ycoefm(:,1), ycoefh(:,1)). 21 ! atmosphere 22 ! NB! No values are calculated between surface and the first model layer. 23 ! ycoefm(:,1) and ycoefh(:,1) are not valid !!! 25 24 ! 26 25 ! … … 35 34 REAL, DIMENSION(klon,klev), INTENT(IN) :: yq, yt 36 35 REAL, DIMENSION(klon), INTENT(IN) :: yts, yrugos, yqsurf 37 REAL, DIMENSION(klon,klev+1) :: yq2 36 REAL, DIMENSION(klon), INTENT(IN) :: ycdragm 37 38 ! InOutput arguments 39 !**************************************************************************************** 40 REAL, DIMENSION(klon,klev+1), INTENT(INOUT):: yq2 38 41 39 42 ! Output arguments … … 47 50 REAL, DIMENSION(klon,klev) :: ycoefm0, ycoefh0, yzlay, yteta 48 51 REAL, DIMENSION(klon,klev+1) :: yzlev, q2diag, ykmm, ykmn, ykmq 49 REAL, DIMENSION(klon) :: y_cd_h, y_cd_m50 52 REAL, DIMENSION(klon) :: yustar 51 53 … … 59 61 INCLUDE "YOMCST.h" 60 62 61 !****************************************************************************************62 ! Start calculation63 ! - Initilalize output variables64 !****************************************************************************************65 66 ycoefm(:,:) = 0.067 ycoefh(:,:) = 0.068 69 63 70 64 !**************************************************************************************** 71 ! Methode 1 : 65 ! Calcul de coefficients de diffusion turbulent de l'atmosphere : 66 ! ycoefm(:,2:klev), ycoefh(:,2:klev) 72 67 ! 73 68 !**************************************************************************************** … … 80 75 81 76 !**************************************************************************************** 82 ! Methode 2 : 77 ! Eventuelle recalcule des coeffeicients de diffusion turbulent de l'atmosphere : 78 ! ycoefm(:,2:klev), ycoefh(:,2:klev) 83 79 ! 84 80 !**************************************************************************************** … … 96 92 ENDIF 97 93 98 !****************************************************************************************99 ! IM cf JLD : on seuille ycoefm et ycoefh100 !101 !****************************************************************************************102 IF (nsrf.EQ.is_oce) THEN103 DO j=1,knon104 ycoefm(j,1)=MIN(ycoefm(j,1),cdmmax)105 ycoefh(j,1)=MIN(ycoefh(j,1),cdhmax)106 ENDDO107 ENDIF108 94 109 95 !**************************************************************************************** … … 112 98 !**************************************************************************************** 113 99 IF (ok_kzmin) THEN 114 CALL coefkzmin(knon,ypaprs,ypplay,yu,yv,yt,yq,yc oefm, &100 CALL coefkzmin(knon,ypaprs,ypplay,yu,yv,yt,yq,ycdragm, & 115 101 ycoefm0,ycoefh0) 116 102 … … 127 113 !**************************************************************************************** 128 114 ! MELLOR ET YAMADA adapte a Mars Richard Fournier et Frederic Hourdin 129 ! Methode 3 :115 ! 130 116 !**************************************************************************************** 131 117 … … 159 145 END DO 160 146 161 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 162 ! Pour memoire, le papier Hourdin et al. 2002 a ete obtenur avec un 163 ! bug sur les coefficients de surface : 164 ! y_cd_h(1:knon) = ycoefm(1:knon,1) 165 ! y_cd_m(1:knon) = ycoefh(1:knon,1) 166 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 167 168 y_cd_m(1:knon) = ycoefm(1:knon,1) 169 y_cd_h(1:knon) = ycoefh(1:knon,1) 170 171 CALL ustarhb(knon,yu,yv,y_cd_m, yustar) 147 !!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 148 !!$! Pour memoire, le papier Hourdin et al. 2002 a ete obtenur avec un 149 !!$! bug sur les coefficients de surface : 150 !!$! ycdragh(1:knon) = ycoefm(1:knon,1) 151 !!$! ycdragm(1:knon) = ycoefh(1:knon,1) 152 !!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 153 CALL ustarhb(knon,yu,yv,ycdragm, yustar) 172 154 173 155 IF (prt_level > 9) THEN … … 179 161 CALL vdif_kcay(knon,dtime,RG,RD,ypaprs,yt, & 180 162 yzlev,yzlay,yu,yv,yteta, & 181 y _cd_m,yq2,q2diag,ykmm,ykmn,yustar, &163 ycdragm,yq2,q2diag,ykmm,ykmn,yustar, & 182 164 iflag_pbl) 183 165 ELSE 184 166 CALL yamada4(knon,dtime,RG,RD,ypaprs,yt, & 185 167 yzlev,yzlay,yu,yv,yteta, & 186 y _cd_m,yq2,ykmm,ykmn,ykmq,yustar, &168 ycdragm,yq2,ykmm,ykmn,ykmq,yustar, & 187 169 iflag_pbl) 188 170 ENDIF 189 171 190 ycoefm(1:knon,1)=y_cd_m(1:knon)191 ycoefh(1:knon,1)=y_cd_h(1:knon)192 172 ycoefm(1:knon,2:klev)=ykmm(1:knon,2:klev) 193 173 ycoefh(1:knon,2:klev)=ykmn(1:knon,2:klev) … … 206 186 pcfm, pcfh) 207 187 188 USE dimphy 189 208 190 !====================================================================== 209 191 ! Auteur(s) F. Hourdin, M. Forichon, Z.X. Li (LMD/CNRS) date: 19930922 … … 236 218 ! 237 219 INTEGER, INTENT(IN) :: knon, nsrf 220 REAL, INTENT(IN) :: ksta, ksta_ter 238 221 REAL, DIMENSION(klon), INTENT(IN) :: ts 239 REAL, DIMENSION(klon,klev+1), INTENT(IN) :: 240 REAL, DIMENSION(klon,klev), INTENT(IN) :: 222 REAL, DIMENSION(klon,klev+1), INTENT(IN) :: paprs 223 REAL, DIMENSION(klon,klev), INTENT(IN) :: pplay 241 224 REAL, DIMENSION(klon,klev), INTENT(IN) :: u, v, t, q 242 225 REAL, DIMENSION(klon), INTENT(IN) :: rugos 226 REAL, DIMENSION(klon), INTENT(IN) :: qsurf 243 227 244 228 REAL, DIMENSION(klon,klev), INTENT(OUT) :: pcfm, pcfh 245 229 246 247 ! Local variables 248 249 ! numero de couche du sommet de la couche limite 250 INTEGER, DIMENSION(klon) :: itop 230 ! 231 ! Local variables: 232 ! 233 INTEGER, DIMENSION(klon) :: itop ! numero de couche du sommet de la couche limite 251 234 ! 252 235 ! Quelques constantes et options: 253 236 ! 254 REAL cepdu2, ckap, cb, cc, cd, clam 255 PARAMETER (cepdu2 =(0.1)**2) 256 PARAMETER (CKAP=0.4) 257 PARAMETER (cb=5.0) 258 PARAMETER (cc=5.0) 259 PARAMETER (cd=5.0) 260 PARAMETER (clam=160.0) 261 REAL ratqs ! largeur de distribution de vapeur d'eau 262 PARAMETER (ratqs=0.05) 263 LOGICAL richum ! utilise le nombre de Richardson humide 264 PARAMETER (richum=.TRUE.) 265 REAL ric ! nombre de Richardson critique 266 PARAMETER(ric=0.4) 267 REAL prandtl 268 PARAMETER (prandtl=0.4) 237 REAL, PARAMETER :: cepdu2=0.1**2 238 REAL, PARAMETER :: CKAP=0.4 239 REAL, PARAMETER :: cb=5.0 240 REAL, PARAMETER :: cc=5.0 241 REAL, PARAMETER :: cd=5.0 242 REAL, PARAMETER :: clam=160.0 243 REAL, PARAMETER :: ratqs=0.05 ! largeur de distribution de vapeur d'eau 244 LOGICAL, PARAMETER :: richum=.TRUE. ! utilise le nombre de Richardson humide 245 REAL, PARAMETER :: ric=0.4 ! nombre de Richardson critique 246 REAL, PARAMETER :: prandtl=0.4 269 247 REAL kstable ! diffusion minimale (situation stable) 270 248 ! GKtest 271 249 ! PARAMETER (kstable=1.0e-10) 272 REAL ksta, ksta_ter273 250 !IM: 261103 REAL kstable_ter, kstable_sinon 274 251 !IM: 211003 cf GK PARAMETER (kstable_ter = 1.0e-6) … … 277 254 !IM: 261103 PARAMETER (kstable_sinon = 1.0e-10) 278 255 ! fin GKtest 279 REAL mixlen ! constante controlant longueur de melange 280 PARAMETER (mixlen=35.0) 256 REAL, PARAMETER :: mixlen=35.0 ! constante controlant longueur de melange 281 257 INTEGER isommet ! le sommet de la couche limite 282 LOGICAL tvirtu ! calculer Ri d'une maniere plus performante 283 PARAMETER (tvirtu=.TRUE.) 284 LOGICAL opt_ec ! formule du Centre Europeen dans l'atmosphere 285 PARAMETER (opt_ec=.FALSE.) 258 LOGICAL, PARAMETER :: tvirtu=.TRUE. ! calculer Ri d'une maniere plus performante 259 LOGICAL, PARAMETER :: opt_ec=.FALSE.! formule du Centre Europeen dans l'atmosphere 286 260 287 261 ! 288 262 ! Variables locales: 289 290 263 INTEGER i, k !IM 120704 291 264 REAL zgeop(klon,klev) … … 293 266 REAL zri(klon) 294 267 REAL zl2(klon) 295 296 REAL u1(klon), v1(klon), t1(klon), q1(klon), z1(klon)297 REAL pcfm1(klon), pcfh1(klon)298 299 268 REAL zdphi, zdu2, ztvd, ztvu, zcdn 300 269 REAL zscf 301 270 REAL zt, zq, zdelta, zcvm5, zcor, zqs, zfr, zdqs 302 271 REAL z2geomf, zalh2, zalm2, zscfh, zscfm 303 REAL t_coup 304 PARAMETER (t_coup=273.15) 305 !IM 306 LOGICAL check 307 PARAMETER (check=.FALSE.) 272 REAL, PARAMETER :: t_coup=273.15 273 LOGICAL, PARAMETER :: check=.FALSE. 308 274 ! 309 275 ! contre-gradient pour la chaleur sensible: Kelvin/metre 310 276 REAL gamt(2:klev) 311 REAL qsurf(klon) 312 313 LOGICAL, SAVE :: appel1er 277 278 LOGICAL, SAVE :: appel1er=.TRUE. 314 279 !$OMP THREADPRIVATE(appel1er) 315 280 ! 316 281 ! Fonctions thermodynamiques et fonctions d'instabilite 317 282 REAL fsta, fins, x 318 LOGICAL zxli ! utiliser un jeu de fonctions simples319 PARAMETER (zxli=.FALSE.)320 283 321 284 fsta(x) = 1.0 / (1.0+10.0*x*(1+8.0*x)) 322 285 fins(x) = SQRT(1.0-18.0*x) 323 324 DATA appel1er /.TRUE./325 326 286 327 287 isommet=klev … … 388 348 ENDDO 389 349 390 !391 ! Calculer le frottement au sol (Cdrag)392 !393 DO i = 1, knon394 u1(i) = u(i,1)395 v1(i) = v(i,1)396 t1(i) = t(i,1)397 q1(i) = q(i,1)398 z1(i) = zgeop(i,1)399 ENDDO400 401 CALL clcdrag(klon, knon, nsrf, zxli, &402 u1, v1, t1, q1, z1, &403 ts, qsurf, rugos, &404 pcfm1, pcfh1)405 !IM ts, qsurf, rugos,406 407 DO i = 1, knon408 pcfm(i,1)=pcfm1(i)409 pcfh(i,1)=pcfh1(i)410 ENDDO411 350 ! 412 351 ! Calculer les coefficients turbulents dans l'atmosphere … … 535 474 pcfm, pcfh) 536 475 476 USE dimphy 477 537 478 !====================================================================== 538 479 ! J'introduit un peu de diffusion sauf dans les endroits … … 562 503 ! Quelques constantes et options: 563 504 ! 564 REAL prandtl 565 PARAMETER (prandtl=0.4) 566 REAL kstable 567 PARAMETER (kstable=0.002) 568 ! PARAMETER (kstable=0.001) 569 REAL mixlen ! constante controlant longueur de melange 570 PARAMETER (mixlen=35.0) 571 REAL seuil ! au-dela l'inversion est consideree trop faible 572 PARAMETER (seuil=-0.02) 505 REAL, PARAMETER :: prandtl=0.4 506 REAL, PARAMETER :: kstable=0.002 507 ! REAL, PARAMETER :: kstable=0.001 508 REAL, PARAMETER :: mixlen=35.0 ! constante controlant longueur de melange 509 REAL, PARAMETER :: seuil=-0.02 ! au-dela l'inversion est consideree trop faible 573 510 ! PARAMETER (seuil=-0.04) 574 511 ! PARAMETER (seuil=-0.06)
Note: See TracChangeset
for help on using the changeset viewer.