/[lmdze]/trunk/phylmd/coefcdrag.f
ViewVC logotype

Annotation of /trunk/phylmd/coefcdrag.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 108 - (hide annotations)
Tue Sep 16 14:00:41 2014 UTC (9 years, 8 months ago) by guez
File size: 5791 byte(s)
Imported writefield from LMDZ. Close at the end of gcm the files which
were created by writefiled (not done in LMDZ).

Removed procedures for the output of Grads files. Removed calls to
dump2d. In guide, replaced calls to wrgrads by calls to writefield.

In vlspltqs, removed redundant programming of saturation
pressure. Call foeew from module FCTTRE instead.

Bug fix in interpre: size of w exceeding size of correponding actual
argument wg in advtrac.

In leapfrog, call guide until the end of the run, instead of six hours
before the end.

Bug fix in readsulfate_preind: type of arguments.

1 guez 108 module coefcdrag_m
2    
3     IMPLICIT none
4    
5     contains
6    
7     SUBROUTINE coefcdrag (klon, knon, nsrf, zxli, &
8     speed, t, q, zgeop, psol, &
9     ts, qsurf, rugos, okri, ri1, &
10     cdram, cdrah, cdran, zri1, pref)
11    
12     ! From LMDZ4/libf/phylmd/coefcdrag.F90,v 1.1.1.1 2004/05/19 12:53:07
13    
14     use indicesol
15     use SUPHEC_M
16     use yoethf_m
17     !-------------------------------------------------------------------------
18     ! Objet : calcul des cdrags pour le moment (cdram) et les flux de chaleur
19     ! sensible et latente (cdrah), du cdrag neutre (cdran),
20     ! du nombre de Richardson entre la surface et le niveau de reference
21     ! (zri1) et de la pression au niveau de reference (pref).
22     !
23     ! I. Musat, 01.07.2002
24     !-------------------------------------------------------------------------
25     !
26     ! klon----input-I- dimension de la grille physique (= nb_pts_latitude X nb_pts_longitude)
27     ! knon----input-I- nombre de points pour un type de surface
28     ! nsrf----input-I- indice pour le type de surface; voir indicesol.inc
29     ! zxli----input-L- TRUE si calcul des cdrags selon Laurent Li
30     ! speed---input-R- module du vent au 1er niveau du modele
31     ! t-------input-R- temperature de l'air au 1er niveau du modele
32     ! q-------input-R- humidite de l'air au 1er niveau du modele
33     ! zgeop---input-R- geopotentiel au 1er niveau du modele
34     ! psol----input-R- pression au sol
35     ! ts------input-R- temperature de l'air a la surface
36     ! qsurf---input-R- humidite de l'air a la surface
37     ! rugos---input-R- rugosite
38     ! okri----input-L- TRUE si on veut tester le nb. Richardson entre la sfce
39     ! et zref par rapport au Ri entre la sfce et la 1ere couche
40     ! ri1-----input-R- nb. Richardson entre la surface et la 1ere couche
41     !
42     ! cdram--output-R- cdrag pour le moment
43     ! cdrah--output-R- cdrag pour les flux de chaleur latente et sensible
44     ! cdran--output-R- cdrag neutre
45     ! zri1---output-R- nb. Richardson entre la surface et la couche zgeop/RG
46     ! pref---output-R- pression au niveau zgeop/RG
47     !
48     INTEGER, intent(in) :: klon, knon, nsrf
49     LOGICAL, intent(in) :: zxli
50     REAL, dimension(klon), intent(in) :: speed, t, q, zgeop, psol
51     REAL, dimension(klon), intent(in) :: ts, qsurf, rugos, ri1
52     LOGICAL, intent(in) :: okri
53     !
54     REAL, dimension(klon), intent(out) :: cdram, cdrah, cdran, zri1, pref
55     !-------------------------------------------------------------------------
56     !
57     ! Quelques constantes :
58     REAL, parameter :: RKAR=0.40, CB=5.0, CC=5.0, CD=5.0
59     !
60     ! Variables locales :
61     INTEGER :: i
62     REAL, dimension(klon) :: zdu2, zdphi, ztsolv, ztvd
63     REAL, dimension(klon) :: zscf, friv, frih, zucf, zcr
64     REAL, dimension(klon) :: zcfm1, zcfh1
65     REAL, dimension(klon) :: zcfm2, zcfh2
66     REAL, dimension(klon) :: trm0, trm1
67     !-------------------------------------------------------------------------
68     !
69     DO i = 1, knon
70     !
71 guez 3 zdphi(i) = zgeop(i)
72     zdu2(i) = speed(i)**2
73     pref(i) = exp(log(psol(i)) - zdphi(i)/(RD*t(i)* &
74 guez 108 (1.+ RETV * max(q(i),0.0))))
75 guez 3 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 guez 108 !
83     ! on teste zri1 par rapport au Richardson de la 1ere couche ri1
84     !
85     !IM +++
86 guez 3 IF(1.EQ.0) THEN
87 guez 108 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 guez 3 ENDIF
95 guez 108 !IM ---
96     !
97 guez 3 cdran(i) = (RKAR/log(1.+zdphi(i)/(RG*rugos(i))))**2
98    
99     IF (zri1(i) .ge. 0.) THEN
100 guez 108 !
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 guez 3 ELSE
120 guez 108 !
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 guez 3 **(1./3.)
139 guez 108 IF (nsrf.EQ.is_oce) cdrah(i) = cdran(i)*(1.0+zcr(i)**1.25) &
140     **(1./1.25)
141 guez 3 ENDIF
142 guez 108 !
143     END DO
144    
145     contains
146    
147     REAL function fsta(x)
148     real x
149     fsta = 1.0 / (1.0+10.0*x*(1+8.0*x))
150     end function fsta
151    
152     REAL function fins(x)
153     real x
154     fins = SQRT(1.0-18.0*x)
155     end function fins
156    
157     END SUBROUTINE coefcdrag
158    
159     end module coefcdrag_m

  ViewVC Help
Powered by ViewVC 1.1.21