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

Contents of /trunk/phylmd/coefcdrag.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 108 - (show annotations)
Tue Sep 16 14:00:41 2014 UTC (9 years, 7 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 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 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
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