source: LMDZ.3.3/branches/rel-LF/libf/phylmd/coefcdrag.F90 @ 558

Last change on this file since 558 was 439, checked in by lmdzadmin, 22 years ago

On enleve le test sur le Ri IM

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