source: LMDZ5/trunk/libf/phylmd/coefcdrag.F90 @ 2136

Last change on this file since 2136 was 2126, checked in by fhourdin, 10 years ago

Introduction du cas Dice couplé atmosphere/surface
+ nouveau paramètre de contrôle f_ri_cd_min, seuil minimum
sur la fonction f(Ri) en facteur du coefficient de traîné neutre.
Par défaut : f_ri_cd_min=0.1 (comme avant)

Introduction of the coupled atmosphere/surface dice case.
+ new parameter f_ri_cd_min, minimum threshold on the f(Ri) fonction
that multiply the neutral drag coefficient.

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.8 KB
RevLine 
[524]1!
2!
3!
4      SUBROUTINE coefcdrag (klon, knon, nsrf, zxli, &
5                            speed, t, q, zgeop, psol, &
6                            ts, qsurf, rugos, okri, ri1, &
7                            cdram, cdrah, cdran, zri1, pref)
[1785]8
9      USE indice_sol_mod
10
[524]11      IMPLICIT none
12!-------------------------------------------------------------------------
13! Objet : calcul des cdrags pour le moment (cdram) et les flux de chaleur
14!         sensible et latente (cdrah), du cdrag neutre (cdran),
15!         du nombre de Richardson entre la surface et le niveau de reference
16!         (zri1) et de la pression au niveau de reference (pref).   
17!
18! I. Musat, 01.07.2002
19!-------------------------------------------------------------------------
20!
21! klon----input-I- dimension de la grille physique (= nb_pts_latitude X nb_pts_longitude)
22! knon----input-I- nombre de points pour un type de surface
[1785]23! nsrf----input-I- indice pour le type de surface; voir indice_sol_mod.F90
[524]24! zxli----input-L- TRUE si calcul des cdrags selon Laurent Li
25! speed---input-R- module du vent au 1er niveau du modele
26! t-------input-R- temperature de l'air au 1er niveau du modele
27! q-------input-R- humidite de l'air au 1er niveau du modele
28! zgeop---input-R- geopotentiel au 1er niveau du modele
29! psol----input-R- pression au sol
30! ts------input-R- temperature de l'air a la surface
31! qsurf---input-R- humidite de l'air a la surface
32! rugos---input-R- rugosite
33! okri----input-L- TRUE si on veut tester le nb. Richardson entre la sfce
34!                  et zref par rapport au Ri entre la sfce et la 1ere couche
35! ri1-----input-R- nb. Richardson entre la surface et la 1ere couche
36!
37! cdram--output-R- cdrag pour le moment
38! cdrah--output-R- cdrag pour les flux de chaleur latente et sensible
39! cdran--output-R- cdrag neutre
40! zri1---output-R- nb. Richardson entre la surface et la couche zgeop/RG
41! pref---output-R- pression au niveau zgeop/RG
42!
43      INTEGER, intent(in) :: klon, knon, nsrf
44      LOGICAL, intent(in) :: zxli
45      REAL, dimension(klon), intent(in) :: speed, t, q, zgeop, psol
46      REAL, dimension(klon), intent(in) :: ts, qsurf, rugos, ri1
47      LOGICAL, intent(in) :: okri   
48!
49      REAL, dimension(klon), intent(out) :: cdram, cdrah, cdran, zri1, pref
50!-------------------------------------------------------------------------
51!
[793]52      include "YOMCST.h"
53      include "YOETHF.h"
[2011]54      INCLUDE "clesphys.h"
[524]55! Quelques constantes :
[1061]56      REAL, parameter :: RKAR=0.40, CB=5.0, CC=5.0, CD=5.0, cepdu2=(0.1)**2
[524]57!
58! Variables locales :
59      INTEGER :: i
60      REAL, dimension(klon) :: zdu2, zdphi, ztsolv, ztvd
61      REAL, dimension(klon) :: zscf, friv, frih, zucf, zcr
62      REAL, dimension(klon) :: zcfm1, zcfh1
63      REAL, dimension(klon) :: zcfm2, zcfh2
64      REAL, dimension(klon) :: trm0, trm1
[2126]65
[524]66!-------------------------------------------------------------------------
67      REAL :: fsta, fins, x
68      fsta(x) = 1.0 / (1.0+10.0*x*(1+8.0*x))
69      fins(x) = SQRT(1.0-18.0*x)
70!-------------------------------------------------------------------------
71!
72      DO i = 1, knon
73!
74       zdphi(i) = zgeop(i)
[1061]75       zdu2(i) = max(cepdu2,speed(i)**2)
[524]76       pref(i) = exp(log(psol(i)) - zdphi(i)/(RD*t(i)* &
77                 (1.+ RETV * max(q(i),0.0))))
78       ztsolv(i) = ts(i)
[2011]79!       ztvd(i) = t(i) * (psol(i)/pref(i))**RKAPPA
80       ztvd(i) = (t(i)+zdphi(i)/RCPD/(1.+RVTMP2*q(i))) &
81          *(1.+RETV*q(i))
[524]82       trm0(i) = 1. + RETV * max(qsurf(i),0.0)
83       trm1(i) = 1. + RETV * max(q(i),0.0)
84       ztsolv(i) = ztsolv(i) * trm0(i)
[2011]85!       ztvd(i) = ztvd(i) * trm1(i)
[524]86       zri1(i) = zdphi(i)*(ztvd(i)-ztsolv(i))/(zdu2(i)*ztvd(i))
87!
88! on teste zri1 par rapport au Richardson de la 1ere couche ri1
89!
90!IM +++
91       IF(1.EQ.0) THEN
92       IF (okri) THEN
93         IF (ri1(i).GE.0.0.AND.zri1(i).LT.0.0) THEN
94           zri1(i) = ri1(i)
95         ELSE IF(ri1(i).LT.0.0.AND.zri1(i).GE.0.0) THEN
96           zri1(i) = ri1(i)
97         ENDIF
98       ENDIF
99       ENDIF
100!IM ---
101!
102       cdran(i) = (RKAR/log(1.+zdphi(i)/(RG*rugos(i))))**2
103
104       IF (zri1(i) .ge. 0.) THEN
105!
106! situation stable : pour eviter les inconsistances dans les cas
107! tres stables on limite zri1 a 20. cf Hess et al. (1995)
108!
109         zri1(i) = min(20.,zri1(i))
110!
111         IF (.NOT.zxli) THEN
112           zscf(i) = SQRT(1.+CD*ABS(zri1(i)))
[2126]113           friv(i) = max(1. / (1.+2.*CB*zri1(i)/ zscf(i)), f_ri_cd_min)
[524]114           zcfm1(i) = cdran(i) * friv(i)
[2126]115           frih(i) = max(1./ (1.+3.*CB*zri1(i)*zscf(i)), f_ri_cd_min )
[2011]116!           zcfh1(i) = cdran(i) * frih(i)
117           zcfh1(i) = f_cdrag_ter*cdran(i) * frih(i)
118           IF(nsrf.EQ.is_oce) zcfh1(i)=f_cdrag_oce*cdran(i)*frih(i)
[524]119           cdram(i) = zcfm1(i)
120           cdrah(i) = zcfh1(i)
121         ELSE
122           cdram(i) = cdran(i)* fsta(zri1(i))
123           cdrah(i) = cdran(i)* fsta(zri1(i))
124         ENDIF
125!
126       ELSE
127!
128! situation instable
129!
130         IF (.NOT.zxli) THEN
131           zucf(i) = 1./(1.+3.0*CB*CC*cdran(i)*SQRT(ABS(zri1(i)) &
132                 *(1.0+zdphi(i)/(RG*rugos(i)))))
[2126]133           zcfm2(i) = cdran(i)*max((1.-2.0*CB*zri1(i)*zucf(i)),f_ri_cd_min)
134!           zcfh2(i) = cdran(i)*max((1.-3.0*CB*zri1(i)*zucf(i)),f_ri_cd_min)
135           zcfh2(i) = f_cdrag_ter*cdran(i)*max((1.-3.0*CB*zri1(i)*zucf(i)),f_ri_cd_min)
[524]136           cdram(i) = zcfm2(i)
137           cdrah(i) = zcfh2(i)
138         ELSE
139           cdram(i) = cdran(i)* fins(zri1(i))
140           cdrah(i) = cdran(i)* fins(zri1(i))
141         ENDIF
142!
143! cdrah sur l'ocean cf. Miller et al. (1992)
144!
145         zcr(i) = (0.0016/(cdran(i)*SQRT(zdu2(i))))*ABS(ztvd(i)-ztsolv(i)) &
146               **(1./3.)
[2011]147!         IF (nsrf.EQ.is_oce) cdrah(i) = cdran(i)*(1.0+zcr(i)**1.25) &
148!                  **(1./1.25)
149         IF (nsrf.EQ.is_oce) cdrah(i)=f_cdrag_oce*cdran(i)*(1.0+zcr(i)**1.25) &
[524]150                  **(1./1.25)
151       ENDIF
152!
153      END DO
154      RETURN
155      END SUBROUTINE coefcdrag
Note: See TracBrowser for help on using the repository browser.