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

Annotation of /trunk/phylmd/coefcdrag.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 272 - (hide 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 guez 108 module coefcdrag_m
2    
3 guez 246 IMPLICIT NONE
4 guez 108
5     contains
6    
7 guez 246 SUBROUTINE coefcdrag (nsrf, speed, t, q, zgeop, psol, ts, qsurf, rugos, &
8 guez 272 pcfm, pcfh, pref)
9 guez 108
10 guez 227 ! From LMDZ4/libf/phylmd/coefcdrag.F90, version 1.1.1.1, 2004/05/19 12:53:07
11 guez 108
12 guez 272 ! 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 guez 227
16 guez 108 ! I. Musat, 01.07.2002
17 guez 227
18     use indicesol, only: is_oce
19 guez 272 use nr_util, only: assert_eq
20 guez 227 use SUPHEC_M, only: rd, retv, rg, rkappa
21     use dimphy, only: klon
22    
23 guez 246 INTEGER, intent(in) :: nsrf
24 guez 108 ! nsrf----input-I- indice pour le type de surface; voir indicesol.inc
25 guez 227 REAL, intent(in) :: speed(:), t(:), q(:), zgeop(:), psol(:) ! (knon)
26 guez 108 ! 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 guez 227 ! psol----input-R- pression au sol
31     REAL, dimension(klon), intent(in) :: ts, qsurf, rugos
32 guez 108 ! 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 guez 227
36 guez 272 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 guez 227
42     ! Local:
43 guez 272 REAL, parameter :: CKAP=0.40, CB=5.0, CC=5.0, CD=5.0
44 guez 108 INTEGER :: i
45 guez 272 REAL, dimension(klon) :: zdu2, ztsolv, ztvd
46 guez 108 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 guez 272 real cdran(klon) ! drag coefficient neutre
51     REAL pref_local(size(speed)) ! (knon) pression au niveau zgeop/RG
52 guez 227
53 guez 272 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 guez 108 !-------------------------------------------------------------------------
58 guez 227
59 guez 246 DO i = 1, size(speed)
60 guez 3 zdu2(i) = speed(i)**2
61 guez 272 pref_local(i) = exp(log(psol(i)) - zgeop(i)/(RD*t(i)* &
62 guez 227 (1.+ RETV * max(q(i), 0.0))))
63 guez 3 ztsolv(i) = ts(i)
64 guez 272 ztvd(i) = t(i) * (psol(i)/pref_local(i))**RKAPPA
65 guez 227 trm0(i) = 1. + RETV * max(qsurf(i), 0.0)
66     trm1(i) = 1. + RETV * max(q(i), 0.0)
67 guez 3 ztsolv(i) = ztsolv(i) * trm0(i)
68     ztvd(i) = ztvd(i) * trm1(i)
69 guez 272 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 guez 3
72 guez 227 IF (zri1(i) >= 0.) THEN
73     ! situation stable : pour eviter les inconsistances dans les cas
74 guez 108 ! tres stables on limite zri1 a 20. cf Hess et al. (1995)
75 guez 227 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 guez 272 pcfm(i) = zcfm1(i)
82     pcfh(i) = zcfh1(i)
83 guez 3 ELSE
84 guez 108 ! situation instable
85 guez 227 zucf(i) = 1./(1.+3.0*CB*CC*cdran(i)*SQRT(ABS(zri1(i)) &
86 guez 272 *(1.0+zgeop(i)/(RG*rugos(i)))))
87 guez 227 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 guez 272 pcfm(i) = zcfm2(i)
90     pcfh(i) = zcfh2(i)
91 guez 227
92 guez 272 ! pcfh sur l'ocean cf. Miller et al. (1992)
93 guez 227
94 guez 108 zcr(i) = (0.0016/(cdran(i)*SQRT(zdu2(i))))*ABS(ztvd(i)-ztsolv(i)) &
95 guez 3 **(1./3.)
96 guez 272 IF (nsrf == is_oce) pcfh(i) = cdran(i)*(1.0+zcr(i)**1.25) **(1./1.25)
97 guez 3 ENDIF
98 guez 108 END DO
99    
100 guez 272 if (present(pref)) pref = pref_local
101    
102 guez 108 END SUBROUTINE coefcdrag
103    
104     end module coefcdrag_m

  ViewVC Help
Powered by ViewVC 1.1.21