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

Contents of /trunk/phylmd/coefcdrag.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 272 - (show annotations)
Wed Jul 11 14:51:28 2018 UTC (5 years, 11 months ago) by guez
File size: 3898 byte(s)
Add arguments psol and pref to clcdrag, in preparation of merge with
coefcdrag. Remove intent out arguments cdran and zri1 of coefcdrag,
not used. Make argument pref of coefcdrag optional, in preparation of
merge with clcdrag. Remove useless intermediary local variable zdphi
in coefcdrag. Remove unused local variable ri1 in stdlevvar.

1 module coefcdrag_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE coefcdrag (nsrf, speed, t, q, zgeop, psol, ts, qsurf, rugos, &
8 pcfm, pcfh, pref)
9
10 ! From LMDZ4/libf/phylmd/coefcdrag.F90, version 1.1.1.1, 2004/05/19 12:53:07
11
12 ! Objet : calcul des cdrags pour le moment (pcfm) et les flux de
13 ! chaleur sensible et latente (pcfh) et de la pression au niveau
14 ! de reference (pref).
15
16 ! I. Musat, 01.07.2002
17
18 use indicesol, only: is_oce
19 use nr_util, only: assert_eq
20 use SUPHEC_M, only: rd, retv, rg, rkappa
21 use dimphy, only: klon
22
23 INTEGER, intent(in) :: nsrf
24 ! nsrf----input-I- indice pour le type de surface; voir indicesol.inc
25 REAL, intent(in) :: speed(:), t(:), q(:), zgeop(:), psol(:) ! (knon)
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 REAL, dimension(klon), intent(in) :: ts, qsurf, rugos
32 ! ts------input-R- temperature de l'air a la surface
33 ! qsurf---input-R- humidite de l'air a la surface
34 ! rugos---input-R- rugosite
35
36 REAL, dimension(klon), intent(out) :: pcfm, pcfh
37 ! drag coefficients pour le moment et pour les flux de chaleur
38 ! latente et sensible
39
40 REAL, intent(out), optional:: pref(:) ! (knon) pression au niveau zgeop/RG
41
42 ! Local:
43 REAL, parameter :: CKAP=0.40, CB=5.0, CC=5.0, CD=5.0
44 INTEGER :: i
45 REAL, dimension(klon) :: zdu2, ztsolv, ztvd
46 REAL, dimension(klon) :: zscf, friv, frih, zucf, zcr
47 REAL, dimension(klon) :: zcfm1, zcfh1
48 REAL, dimension(klon) :: zcfm2, zcfh2
49 REAL, dimension(klon) :: trm0, trm1
50 real cdran(klon) ! drag coefficient neutre
51 REAL pref_local(size(speed)) ! (knon) pression au niveau zgeop/RG
52
53 REAL zri1(klon)
54 ! nb. Richardson entre la surface et la couche zgeop/RG
55 ! nombre de Richardson entre la surface et le niveau de reference (zri1)
56
57 !-------------------------------------------------------------------------
58
59 DO i = 1, size(speed)
60 zdu2(i) = speed(i)**2
61 pref_local(i) = exp(log(psol(i)) - zgeop(i)/(RD*t(i)* &
62 (1.+ RETV * max(q(i), 0.0))))
63 ztsolv(i) = ts(i)
64 ztvd(i) = t(i) * (psol(i)/pref_local(i))**RKAPPA
65 trm0(i) = 1. + RETV * max(qsurf(i), 0.0)
66 trm1(i) = 1. + RETV * max(q(i), 0.0)
67 ztsolv(i) = ztsolv(i) * trm0(i)
68 ztvd(i) = ztvd(i) * trm1(i)
69 zri1(i) = zgeop(i)*(ztvd(i)-ztsolv(i))/(zdu2(i)*ztvd(i))
70 cdran(i) = (CKAP/log(1.+zgeop(i)/(RG*rugos(i))))**2
71
72 IF (zri1(i) >= 0.) THEN
73 ! situation stable : pour eviter les inconsistances dans les cas
74 ! tres stables on limite zri1 a 20. cf Hess et al. (1995)
75 zri1(i) = min(20., zri1(i))
76 zscf(i) = SQRT(1.+CD*ABS(zri1(i)))
77 friv(i) = max(1. / (1.+2.*CB*zri1(i)/ zscf(i)), 0.1)
78 zcfm1(i) = cdran(i) * friv(i)
79 frih(i) = max(1./ (1.+3.*CB*zri1(i)*zscf(i)), 0.1)
80 zcfh1(i) = cdran(i) * frih(i)
81 pcfm(i) = zcfm1(i)
82 pcfh(i) = zcfh1(i)
83 ELSE
84 ! situation instable
85 zucf(i) = 1./(1.+3.0*CB*CC*cdran(i)*SQRT(ABS(zri1(i)) &
86 *(1.0+zgeop(i)/(RG*rugos(i)))))
87 zcfm2(i) = cdran(i)*max((1.-2.0*CB*zri1(i)*zucf(i)), 0.1)
88 zcfh2(i) = cdran(i)*max((1.-3.0*CB*zri1(i)*zucf(i)), 0.1)
89 pcfm(i) = zcfm2(i)
90 pcfh(i) = zcfh2(i)
91
92 ! pcfh sur l'ocean cf. Miller et al. (1992)
93
94 zcr(i) = (0.0016/(cdran(i)*SQRT(zdu2(i))))*ABS(ztvd(i)-ztsolv(i)) &
95 **(1./3.)
96 IF (nsrf == is_oce) pcfh(i) = cdran(i)*(1.0+zcr(i)**1.25) **(1./1.25)
97 ENDIF
98 END DO
99
100 if (present(pref)) pref = pref_local
101
102 END SUBROUTINE coefcdrag
103
104 end module coefcdrag_m

  ViewVC Help
Powered by ViewVC 1.1.21