source: LMDZ6/trunk/libf/phylmd/Dust/bl_for_dms.f90 @ 5277

Last change on this file since 5277 was 5274, checked in by abarral, 9 hours ago

Replace yomcst.h by existing module

File size: 4.4 KB
Line 
1SUBROUTINE bl_for_dms(u,v,paprs,pplay,cdragh,cdragm &
2        ,t,q,tsol,ustar,obklen)
3  USE dimphy
4  USE dimensions_mod, ONLY: iim, jjm, llm, ndm
5USE yomcst_mod_h, ONLY: RPI, RCLUM, RHPLA, RKBOL, RNAVO                   &
6          , RDAY, REA, REPSM, RSIYEA, RSIDAY, ROMEGA                  &
7          , R_ecc, R_peri, R_incl                                      &
8          , RA, RG, R1SA                                         &
9          , RSIGMA                                                     &
10          , R, RMD, RMV, RD, RV, RCPD                    &
11          , RMO3, RMCO2, RMC, RMCH4, RMN2O, RMCFC11, RMCFC12        &
12          , RCPV, RCVD, RCVV, RKAPPA, RETV, eps_w                    &
13          , RCW, RCS                                                 &
14          , RLVTT, RLSTT, RLMLT, RTT, RATM                           &
15          , RESTT, RALPW, RBETW, RGAMW, RALPS, RBETS, RGAMS            &
16          , RALPD, RBETD, RGAMD
17IMPLICIT NONE
18  !
19  !===================================================================
20  ! Auteur : E. Cosme
21  ! Calcul de la vitesse de friction (ustar) et de la longueur de
22  ! Monin-Obukhov (obklen), necessaires pour calculer les flux de DMS
23  ! par la methode de Nightingale.
24  ! Cette subroutine est plus que fortement inspiree de la subroutine
25  ! 'nonlocal' dans clmain.F .
26  ! reference :  Holtslag, A.A.M., and B.A. Boville, 1993:
27  ! Local versus nonlocal boundary-layer diffusion in a global climate
28  ! model. J. of Climate, vol. 6, 1825-1842. (a confirmer)
29  ! 31 08 01
30  !===================================================================
31  !
32
33
34  INCLUDE "YOETHF.h"
35  INCLUDE "FCTTRE.h"
36  !
37  ! Arguments :
38  REAL :: u(klon,klev)          ! vent zonal
39  REAL :: v(klon,klev)          ! vent meridien
40  REAL :: paprs(klon,klev+1)    ! niveaux de pression aux intercouches (Pa)
41  REAL :: pplay(klon,klev)      ! niveaux de pression aux milieux... (Pa)
42  REAL :: cdragh(klon)          ! coefficient de trainee pour la chaleur
43  REAL :: cdragm(klon)          ! coefficient de trainee pour le vent
44  REAL :: t(klon,klev)          ! temperature
45  REAL :: q(klon,klev)          ! humidite kg/kg
46  REAL :: tsol(klon)            ! temperature du sol
47  REAL :: ustar(klon)           ! vitesse de friction
48  REAL :: obklen(klon)          ! longueur de Monin-Obukhov
49  !
50  ! Locales :
51  REAL :: vk
52  PARAMETER (vk=0.35)
53  REAL :: beta  ! coefficient d'evaporation reelle (/evapotranspiration)
54             ! ! entre 0 et 1, mais 1 au-dessus de la mer
55  PARAMETER (beta=1.)
56  INTEGER :: i,k
57  REAL :: zxt, zxu, zxv, zxq, zxqs, zxmod, taux, tauy
58  REAL :: zcor, zdelta, zcvm5
59  REAL :: z(klon,klev)
60  REAL :: zx_alf1, zx_alf2 ! parametres pour extrapolation
61  REAL :: khfs(klon)       ! surface kinematic heat flux [mK/s]
62  REAL :: kqfs(klon)       ! sfc kinematic constituent flux [m/s]
63  REAL :: heatv(klon)      ! surface virtual heat flux
64
65
66  !
67  !======================================================================
68  !
69  ! Calculer les hauteurs de chaque couche
70  !
71  ! JE20150707      r2es=611.14 *18.0153/28.9644
72  DO i = 1, klon
73     z(i,1) = RD * t(i,1) / (0.5*(paprs(i,1)+pplay(i,1))) &
74           * (paprs(i,1)-pplay(i,1)) / RG
75  ENDDO
76  DO k = 2, klev
77  DO i = 1, klon
78     z(i,k) = z(i,k-1) &
79           + RD * 0.5*(t(i,k-1)+t(i,k)) / paprs(i,k) &
80           * (pplay(i,k-1)-pplay(i,k)) / RG
81  ENDDO
82  ENDDO
83
84  DO i = 1, klon
85  !
86    zdelta=MAX(0.,SIGN(1.,RTT-tsol(i)))
87    zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
88    zcvm5 = zcvm5 / RCPD / (1.0+RVTMP2*q(i,1))
89    zxqs= r2es * FOEEW(tsol(i),zdelta)/paprs(i,1)
90    zxqs=MIN(0.5,zxqs)
91    zcor=1./(1.-retv*zxqs)
92    zxqs=zxqs*zcor
93  !
94    zx_alf1 = 1.0
95    zx_alf2 = 1.0 - zx_alf1
96    zxt = (t(i,1)+z(i,1)*RG/RCPD/(1.+RVTMP2*q(i,1))) &
97          *(1.+RETV*q(i,1))*zx_alf1 &
98          + (t(i,2)+z(i,2)*RG/RCPD/(1.+RVTMP2*q(i,2))) &
99          *(1.+RETV*q(i,2))*zx_alf2
100    zxu = u(i,1)*zx_alf1+u(i,2)*zx_alf2
101    zxv = v(i,1)*zx_alf1+v(i,2)*zx_alf2
102    zxq = q(i,1)*zx_alf1+q(i,2)*zx_alf2
103    zxmod = 1.0+SQRT(zxu**2+zxv**2)
104    khfs(i) = (tsol(i)*(1.+RETV*q(i,1))-zxt) *zxmod*cdragh(i)
105    kqfs(i) = (zxqs-zxq) *zxmod*cdragh(i) * beta
106    heatv(i) = khfs(i) + 0.61*zxt*kqfs(i)
107    taux = zxu *zxmod*cdragm(i)
108    tauy = zxv *zxmod*cdragm(i)
109    ustar(i) = SQRT(taux**2+tauy**2)
110    ustar(i) = MAX(SQRT(ustar(i)),0.01)
111  !
112  ENDDO
113  !
114  DO i = 1, klon
115     obklen(i) = -t(i,1)*ustar(i)**3/(RG*vk*heatv(i))
116  ENDDO
117  !
118END SUBROUTINE
Note: See TracBrowser for help on using the repository browser.