source: LMDZ6/branches/Amaury_dev/libf/phylmd/coefcdrag.F90 @ 5116

Last change on this file since 5116 was 5111, checked in by abarral, 4 months ago

Put abort_physic into a module
Remove -g option from makelmdz_fcm, since that option is linked to a header file that isn't included anywhere.
(lint) light lint on traversed files

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