1 | MODULE lmdz_spla_bl_for_dms |
---|
2 | |
---|
3 | CONTAINS |
---|
4 | |
---|
5 | SUBROUTINE spla_bl_for_dms(klon,klev,u,v,paprs,pplay,cdragh,cdragm & |
---|
6 | ,t,q,tsol,ustar,obklen) |
---|
7 | |
---|
8 | USE lmdz_spla_ini, ONLY : RG,RD,RCPD,RLVTT,RLSTT,RETV,RTT, & |
---|
9 | R2ES,R3IES,R3LES,R4IES,R4LES,R5IES,R5LES,RVTMP2 |
---|
10 | |
---|
11 | !USE yoethf_mod_h |
---|
12 | ! |
---|
13 | !=================================================================== |
---|
14 | ! Auteur : E. Cosme |
---|
15 | ! Calcul de la vitesse de friction (ustar) et de la longueur de |
---|
16 | ! Monin-Obukhov (obklen), necessaires pour calculer les flux de DMS |
---|
17 | ! par la methode de Nightingale. |
---|
18 | ! Cette subroutine est plus que fortement inspiree de la subroutine |
---|
19 | ! 'nonlocal' dans clmain.F . |
---|
20 | ! reference : Holtslag, A.A.M., and B.A. Boville, 1993: |
---|
21 | ! Local versus nonlocal boundary-layer diffusion in a global climate |
---|
22 | ! model. J. of Climate, vol. 6, 1825-1842. (a confirmer) |
---|
23 | ! 31 08 01 |
---|
24 | !=================================================================== |
---|
25 | ! |
---|
26 | IMPLICIT NONE |
---|
27 | |
---|
28 | INCLUDE "FCTTRE.h" |
---|
29 | |
---|
30 | ! |
---|
31 | INTEGER, intent(in) :: klon,klev |
---|
32 | ! |
---|
33 | ! Arguments : |
---|
34 | REAL, dimension(klon,klev), intent(in) :: u ! vent zonal |
---|
35 | REAL, dimension(klon,klev), intent(in) :: v ! vent meridien |
---|
36 | REAL, dimension(klon,klev+1), intent(in):: paprs ! niveaux de pression aux intercouches (Pa) |
---|
37 | REAL, dimension(klon,klev), intent(in) :: pplay ! niveaux de pression aux milieux... (Pa) |
---|
38 | REAL, dimension(klon,klev), intent(in) :: t ! temperature |
---|
39 | REAL, dimension(klon,klev), intent(in) :: q ! humidite kg/kg |
---|
40 | REAL, dimension(klon), intent(in) :: cdragh ! coefficient de trainee pour la chaleur |
---|
41 | REAL, dimension(klon), intent(in) :: cdragm ! coefficient de trainee pour le vent |
---|
42 | REAL, dimension(klon), intent(in) :: tsol ! temperature du sol |
---|
43 | REAL, dimension(klon), intent(out) :: ustar ! vitesse de friction |
---|
44 | REAL, dimension(klon), intent(out) :: obklen ! longueur de Monin-Obukhov |
---|
45 | ! |
---|
46 | ! Locales : |
---|
47 | REAL :: vk |
---|
48 | PARAMETER (vk=0.35) |
---|
49 | REAL :: beta ! coefficient d'evaporation reelle (/evapotranspiration) |
---|
50 | ! ! entre 0 et 1, mais 1 au-dessus de la mer |
---|
51 | PARAMETER (beta=1.) |
---|
52 | INTEGER :: i,k |
---|
53 | REAL :: zxt, zxu, zxv, zxq, zxqs, zxmod, taux, tauy |
---|
54 | REAL :: zcor, zdelta, zcvm5 |
---|
55 | REAL, dimension(klon,klev) :: z |
---|
56 | REAL :: zx_alf1, zx_alf2 ! parametres pour extrapolation |
---|
57 | REAL, dimension(klon) :: khfs ! surface kinematic heat flux [mK/s] |
---|
58 | REAL, dimension(klon) :: kqfs ! sfc kinematic constituent flux [m/s] |
---|
59 | REAL, dimension(klon) :: heatv ! surface virtual heat flux |
---|
60 | |
---|
61 | |
---|
62 | ! |
---|
63 | !====================================================================== |
---|
64 | ! |
---|
65 | ! Calculer les hauteurs de chaque couche |
---|
66 | ! |
---|
67 | ! JE20150707 r2es=611.14 *18.0153/28.9644 |
---|
68 | DO i = 1, klon |
---|
69 | z(i,1) = RD * t(i,1) / (0.5*(paprs(i,1)+pplay(i,1))) & |
---|
70 | * (paprs(i,1)-pplay(i,1)) / RG |
---|
71 | ENDDO |
---|
72 | DO k = 2, klev |
---|
73 | DO i = 1, klon |
---|
74 | z(i,k) = z(i,k-1) & |
---|
75 | + RD * 0.5*(t(i,k-1)+t(i,k)) / paprs(i,k) & |
---|
76 | * (pplay(i,k-1)-pplay(i,k)) / RG |
---|
77 | ENDDO |
---|
78 | ENDDO |
---|
79 | |
---|
80 | DO i = 1, klon |
---|
81 | ! |
---|
82 | zdelta=MAX(0.,SIGN(1.,RTT-tsol(i))) |
---|
83 | zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta |
---|
84 | zcvm5 = zcvm5 / RCPD / (1.0+RVTMP2*q(i,1)) |
---|
85 | zxqs= r2es * FOEEW(tsol(i),zdelta)/paprs(i,1) |
---|
86 | zxqs=MIN(0.5,zxqs) |
---|
87 | zcor=1./(1.-retv*zxqs) |
---|
88 | zxqs=zxqs*zcor |
---|
89 | ! |
---|
90 | zx_alf1 = 1.0 |
---|
91 | zx_alf2 = 1.0 - zx_alf1 |
---|
92 | zxt = (t(i,1)+z(i,1)*RG/RCPD/(1.+RVTMP2*q(i,1))) & |
---|
93 | *(1.+RETV*q(i,1))*zx_alf1 & |
---|
94 | + (t(i,2)+z(i,2)*RG/RCPD/(1.+RVTMP2*q(i,2))) & |
---|
95 | *(1.+RETV*q(i,2))*zx_alf2 |
---|
96 | zxu = u(i,1)*zx_alf1+u(i,2)*zx_alf2 |
---|
97 | zxv = v(i,1)*zx_alf1+v(i,2)*zx_alf2 |
---|
98 | zxq = q(i,1)*zx_alf1+q(i,2)*zx_alf2 |
---|
99 | zxmod = 1.0+SQRT(zxu**2+zxv**2) |
---|
100 | khfs(i) = (tsol(i)*(1.+RETV*q(i,1))-zxt) *zxmod*cdragh(i) |
---|
101 | kqfs(i) = (zxqs-zxq) *zxmod*cdragh(i) * beta |
---|
102 | heatv(i) = khfs(i) + 0.61*zxt*kqfs(i) |
---|
103 | taux = zxu *zxmod*cdragm(i) |
---|
104 | tauy = zxv *zxmod*cdragm(i) |
---|
105 | ustar(i) = SQRT(taux**2+tauy**2) |
---|
106 | ustar(i) = MAX(SQRT(ustar(i)),0.01) |
---|
107 | ! |
---|
108 | ENDDO |
---|
109 | ! |
---|
110 | DO i = 1, klon |
---|
111 | obklen(i) = -t(i,1)*ustar(i)**3/(RG*vk*heatv(i)) |
---|
112 | ENDDO |
---|
113 | ! |
---|
114 | END SUBROUTINE spla_bl_for_dms |
---|
115 | |
---|
116 | END MODULE lmdz_spla_bl_for_dms |
---|