source: LMDZ.3.3/trunk/libf/phylmd/coefcdrag.F90 @ 2086

Last change on this file since 2086 was 416, checked in by lmdzadmin, 22 years ago

Inclusion initiale

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