source: LMDZ6/trunk/libf/phylmd/coefcdrag.f90

Last change on this file was 5274, checked in by abarral, 50 minutes ago

Replace yomcst.h by existing module

  • 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: 6.8 KB
Line 
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)
8
9      USE indice_sol_mod
10
11      USE yomcst_mod_h, ONLY: RPI, RCLUM, RHPLA, RKBOL, RNAVO                   &
12          , RDAY, REA, REPSM, RSIYEA, RSIDAY, ROMEGA                  &
13          , R_ecc, R_peri, R_incl                                      &
14          , RA, RG, R1SA                                         &
15          , RSIGMA                                                     &
16          , R, RMD, RMV, RD, RV, RCPD                    &
17          , RMO3, RMCO2, RMC, RMCH4, RMN2O, RMCFC11, RMCFC12        &
18          , RCPV, RCVD, RCVV, RKAPPA, RETV, eps_w                    &
19          , RCW, RCS                                                 &
20          , RLVTT, RLSTT, RLMLT, RTT, RATM                           &
21          , RESTT, RALPW, RBETW, RGAMW, RALPS, RBETS, RGAMS            &
22          , RALPD, RBETD, RGAMD
23IMPLICIT none
24!-------------------------------------------------------------------------
25! Objet : calcul des cdrags pour le moment (cdram) et les flux de chaleur
26!         sensible et latente (cdrah), du cdrag neutre (cdran),
27!         du nombre de Richardson entre la surface et le niveau de reference
28!         (zri1) et de la pression au niveau de reference (pref).
29!
30! I. Musat, 01.07.2002
31!-------------------------------------------------------------------------
32!
33! klon----input-I- dimension de la grille physique (= nb_pts_latitude X nb_pts_longitude)
34! knon----input-I- nombre de points pour un type de surface
35! nsrf----input-I- indice pour le type de surface; voir indice_sol_mod.F90
36! zxli----input-L- TRUE si calcul des cdrags selon Laurent Li
37! speed---input-R- module du vent au 1er niveau du modele
38! t-------input-R- temperature de l'air au 1er niveau du modele
39! q-------input-R- humidite de l'air au 1er niveau du modele
40! zgeop---input-R- geopotentiel au 1er niveau du modele
41! psol----input-R- pression au sol
42! ts------input-R- temperature de l'air a la surface
43! qsurf---input-R- humidite de l'air a la surface
44! rugos---input-R- rugosite
45! okri----input-L- TRUE si on veut tester le nb. Richardson entre la sfce
46!                  et zref par rapport au Ri entre la sfce et la 1ere couche
47! ri1-----input-R- nb. Richardson entre la surface et la 1ere couche
48!
49! cdram--output-R- cdrag pour le moment
50! cdrah--output-R- cdrag pour les flux de chaleur latente et sensible
51! cdran--output-R- cdrag neutre
52! zri1---output-R- nb. Richardson entre la surface et la couche zgeop/RG
53! pref---output-R- pression au niveau zgeop/RG
54!
55      INTEGER, intent(in) :: klon, knon, nsrf
56      LOGICAL, intent(in) :: zxli
57      REAL, dimension(klon), intent(in) :: speed, t, q, zgeop, psol
58      REAL, dimension(klon), intent(in) :: ts, qsurf, rugos, ri1
59      LOGICAL, intent(in) :: okri
60!
61      REAL, dimension(klon), intent(out) :: cdram, cdrah, cdran, zri1, pref
62!-------------------------------------------------------------------------
63!
64
65      include "YOETHF.h"
66      INCLUDE "clesphys.h"
67! Quelques constantes :
68      REAL, parameter :: RKAR=0.40, CB=5.0, CC=5.0, CD=5.0, cepdu2=(0.1)**2
69!
70! Variables locales :
71      INTEGER :: i
72      REAL, dimension(klon) :: zdu2, zdphi, ztsolv, ztvd
73      REAL, dimension(klon) :: zscf, friv, frih, zucf, zcr
74      REAL, dimension(klon) :: zcfm1, zcfh1
75      REAL, dimension(klon) :: zcfm2, zcfh2
76      REAL, dimension(klon) :: trm0, trm1
77
78  CHARACTER (LEN=80) :: abort_message
79  CHARACTER (LEN=20) :: modname = 'coefcdra'
80
81
82!
83
84
85!-------------------------------------------------------------------------
86      REAL :: fsta, fins, x
87      fsta(x) = 1.0 / (1.0+10.0*x*(1+8.0*x))
88      fins(x) = SQRT(1.0-18.0*x)
89!-------------------------------------------------------------------------
90
91  abort_message='obsolete, remplace par cdrag, use at you own risk'
92  CALL abort_physic(modname,abort_message,1)
93
94!
95      DO i = 1, knon
96!
97       zdphi(i) = zgeop(i)
98       zdu2(i) = max(cepdu2,speed(i)**2)
99       pref(i) = exp(log(psol(i)) - zdphi(i)/(RD*t(i)* &
100                 (1.+ RETV * max(q(i),0.0))))
101       ztsolv(i) = ts(i)
102!       ztvd(i) = t(i) * (psol(i)/pref(i))**RKAPPA
103!       ztvd(i) = (t(i)+zdphi(i)/RCPD/(1.+RVTMP2*q(i))) &
104!          *(1.+RETV*q(i))
105       ztvd(i) = (t(i)+zdphi(i)/RCPD/(1.+RVTMP2*q(i)))
106       trm0(i) = 1. + RETV * max(qsurf(i),0.0)
107       trm1(i) = 1. + RETV * max(q(i),0.0)
108       ztsolv(i) = ztsolv(i) * trm0(i)
109       ztvd(i) = ztvd(i) * trm1(i)
110       zri1(i) = zdphi(i)*(ztvd(i)-ztsolv(i))/(zdu2(i)*ztvd(i))
111!
112! on teste zri1 par rapport au Richardson de la 1ere couche ri1
113!
114!IM +++
115       IF(1.EQ.0) THEN
116       IF (okri) THEN
117         IF (ri1(i).GE.0.0.AND.zri1(i).LT.0.0) THEN
118           zri1(i) = ri1(i)
119         ELSE IF(ri1(i).LT.0.0.AND.zri1(i).GE.0.0) THEN
120           zri1(i) = ri1(i)
121         ENDIF
122       ENDIF
123       ENDIF
124!IM ---
125!
126       cdran(i) = (RKAR/log(1.+zdphi(i)/(RG*rugos(i))))**2
127
128       IF (zri1(i) .ge. 0.) THEN
129!
130! situation stable : pour eviter les inconsistances dans les cas
131! tres stables on limite zri1 a 20. cf Hess et al. (1995)
132!
133         zri1(i) = min(20.,zri1(i))
134!
135         IF (.NOT.zxli) THEN
136           zscf(i) = SQRT(1.+CD*ABS(zri1(i)))
137           friv(i) = max(1. / (1.+2.*CB*zri1(i)/ zscf(i)), f_ri_cd_min)
138           zcfm1(i) = cdran(i) * friv(i)
139           frih(i) = max(1./ (1.+3.*CB*zri1(i)*zscf(i)), f_ri_cd_min )
140!           zcfh1(i) = cdran(i) * frih(i)
141           zcfh1(i) = f_cdrag_ter*cdran(i) * frih(i)
142           IF(nsrf.EQ.is_oce) zcfh1(i)=f_cdrag_oce*cdran(i)*frih(i)
143           cdram(i) = zcfm1(i)
144           cdrah(i) = zcfh1(i)
145         ELSE
146           cdram(i) = cdran(i)* fsta(zri1(i))
147           cdrah(i) = cdran(i)* fsta(zri1(i))
148         ENDIF
149!
150       ELSE
151!
152! situation instable
153!
154         IF (.NOT.zxli) THEN
155           zucf(i) = 1./(1.+3.0*CB*CC*cdran(i)*SQRT(ABS(zri1(i)) &
156                 *(1.0+zdphi(i)/(RG*rugos(i)))))
157           zcfm2(i) = cdran(i)*max((1.-2.0*CB*zri1(i)*zucf(i)),f_ri_cd_min)
158!           zcfh2(i) = cdran(i)*max((1.-3.0*CB*zri1(i)*zucf(i)),f_ri_cd_min)
159           zcfh2(i) = f_cdrag_ter*cdran(i)*max((1.-3.0*CB*zri1(i)*zucf(i)),f_ri_cd_min)
160           cdram(i) = zcfm2(i)
161           cdrah(i) = zcfh2(i)
162         ELSE
163           cdram(i) = cdran(i)* fins(zri1(i))
164           cdrah(i) = cdran(i)* fins(zri1(i))
165         ENDIF
166!
167! cdrah sur l'ocean cf. Miller et al. (1992)
168!
169         zcr(i) = (0.0016/(cdran(i)*SQRT(zdu2(i))))*ABS(ztvd(i)-ztsolv(i)) &
170               **(1./3.)
171!         IF (nsrf.EQ.is_oce) cdrah(i) = cdran(i)*(1.0+zcr(i)**1.25) &
172!                  **(1./1.25)
173         IF (nsrf.EQ.is_oce) cdrah(i)=f_cdrag_oce*cdran(i)*(1.0+zcr(i)**1.25) &
174                  **(1./1.25)
175       ENDIF
176!
177      END DO
178      RETURN
179      END SUBROUTINE coefcdrag
Note: See TracBrowser for help on using the repository browser.