source: LMDZ6/branches/contrails/libf/phylmd/Dust/lmdz_spla_bl_for_dms.f90

Last change on this file was 5618, checked in by aborella, 4 months ago

Merge with trunk testing r5597. We have convergence in prod and debug in NPv7.0.1c

File size: 4.1 KB
Line 
1MODULE lmdz_spla_bl_for_dms
2
3CONTAINS
4
5SUBROUTINE 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  !
114END SUBROUTINE spla_bl_for_dms
115
116END MODULE lmdz_spla_bl_for_dms
Note: See TracBrowser for help on using the repository browser.