source: LMDZ5/branches/LMDZ5_SPLA/libf/phylmd/bl_for_dms.F @ 5215

Last change on this file since 5215 was 2175, checked in by jescribano, 10 years ago

SPLA code included for first time

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