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

Contents of /trunk/phylmd/clcdrag.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 274 - (show annotations)
Wed Jul 11 16:50:27 2018 UTC (5 years, 10 months ago) by guez
File size: 3741 byte(s)
Merge clcdrag and coefcdrag (following LMDZ revision 2232). Replace
local arrays by scalars. max(qsurf, 0), f_cdrag_ter, f_cdrag_oce in
clcdrag.  max(cepdu2, speed(i)**2) in coefcdrag, test zri > 0 instead
of >= 0. trm1 was unused in coefcdrag. No need for intermediary local
variable pref_local.

1 module clcdrag_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE clcdrag(nsrf, speed, t, q, zgeop, psol, ts, qsurf, rugos, pcfm, &
8 pcfh, pref)
9
10 ! From LMDZ4/libf/phylmd/clcdrag.F90, version 1.1.1.1, 2004/05/19 12:53:07
11
12 ! Objet : calcul des drag coefficients au sol pour le moment et
13 ! les flux de chaleur sensible et latente et calcul de la pression
14 ! au niveau de reference.
15
16 ! I. Musat, 01 Jul 2002
17
18 use clesphys, only: f_cdrag_oce, f_cdrag_ter
19 use indicesol, only: is_oce
20 use nr_util, only: assert_eq
21 use SUPHEC_M, only: rcpd, rd, retv, rg
22 USE yoethf_m, ONLY: rvtmp2
23
24 INTEGER, intent(in):: nsrf ! indice pour le type de surface
25
26 REAL, intent(in):: speed(:) ! (knon)
27 ! norm of the wind at the first model level
28
29 REAL, intent(in):: t(:) ! (knon)
30 ! temperature de l'air au 1er niveau du modele
31
32 REAL, intent(in):: q(:) ! (knon) ! humidite de l'air au 1er niveau du modele
33
34 REAL, intent(in):: zgeop(:) ! (knon)
35 ! g\'eopotentiel au 1er niveau du mod\`ele
36
37 REAL, intent(in) :: psol(:) ! (knon) pression au sol
38 REAL, intent(in):: ts(:) ! (knon) temperature de l'air a la surface
39 REAL, intent(in):: qsurf(:) ! (knon) humidite de l'air a la surface
40 REAL, intent(in):: rugos(:) ! (knon) rugosit\'e
41 REAL, intent(out):: pcfm(:) ! (knon) drag coefficient pour le moment
42
43 REAL, intent(out):: pcfh(:) ! (knon)
44 ! drag coefficient pour les flux de chaleur latente et sensible
45
46 REAL, intent(out), optional:: pref(:) ! (knon) pression au niveau zgeop/RG
47
48 ! Local:
49 REAL, PARAMETER:: ckap=0.40, cb=5.0, cc=5.0, cd=5.0, cepdu2=0.1**2
50 INTEGER i, knon
51 REAL zdu2, ztsolv, ztvd, zscf, zucf, zcr, friv, frih
52 REAL zcfm1, zcfh1, zcfm2, zcfh2
53 real zcdn ! drag coefficient neutre
54
55 REAL zri
56 ! nb. Richardson entre la surface et la couche zgeop/RG
57 ! nombre de Richardson entre la surface et le niveau de reference (zri)
58
59 !-------------------------------------------------------------------------
60
61 knon = assert_eq([size(speed), size(t), size(q), size(zgeop), size(ts), &
62 size(qsurf), size(rugos), size(pcfm), size(pcfh), size(pcfm)], &
63 "clcdrag knon")
64
65 DO i = 1, knon
66 zdu2 = max(cepdu2, speed(i)**2)
67 ztsolv = ts(i) * (1. + RETV * max(qsurf(i), 0.))
68 ztvd = (t(i)+zgeop(i)/RCPD/(1.+RVTMP2*q(i))) *(1.+RETV*q(i))
69 zri = zgeop(i)*(ztvd-ztsolv)/(zdu2*ztvd)
70 zcdn = (ckap/log(1.+zgeop(i)/(RG*rugos(i))))**2
71
72 IF (zri > 0.) THEN
73 ! Situation stable. Pour eviter les inconsistances dans les cas
74 ! tres stables on limite zri a 20. cf Hess et al. (1995).
75 zri = min(20., zri)
76 zscf = SQRT(1.+cd*ABS(zri))
77 friv = max(1. / (1.+2.*CB*zri/ zscf), 0.1)
78 zcfm1 = zcdn * friv
79 frih = max(1./ (1.+3.*CB*zri*zscf), 0.1)
80 zcfh1 = f_cdrag_ter * zcdn * frih
81 IF (nsrf == is_oce) zcfh1 = f_cdrag_oce * zcdn * frih
82 pcfm(i) = zcfm1
83 pcfh(i) = zcfh1
84 ELSE
85 ! situation instable
86 zucf = 1./(1.+3.0*cb*cc*zcdn*SQRT(ABS(zri) &
87 *(1.0+zgeop(i)/(RG*rugos(i)))))
88 zcfm2 = zcdn*max((1.-2.0*cb*zri*zucf), 0.1)
89 zcfh2 = f_cdrag_ter * zcdn*max((1.-3.0*cb*zri*zucf), 0.1)
90 pcfm(i) = zcfm2
91 pcfh(i) = zcfh2
92
93 ! pcfh sur l'ocean cf. Miller et al. (1992)
94 zcr = (0.0016/(zcdn*SQRT(zdu2)))*ABS(ztvd-ztsolv)**(1./3.)
95 IF (nsrf == is_oce) pcfh(i) = f_cdrag_oce * zcdn &
96 * (1. + zcr**1.25)**(1. / 1.25)
97 ENDIF
98 END DO
99
100 if (present(pref)) &
101 pref = exp(log(psol) - zgeop / (RD * t * (1. + RETV * max(q, 0.))))
102
103 END SUBROUTINE clcdrag
104
105 end module clcdrag_m

  ViewVC Help
Powered by ViewVC 1.1.21