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

Contents of /trunk/Sources/phylmd/clcdrag.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 221 - (show annotations)
Thu Apr 20 14:44:47 2017 UTC (7 years, 1 month ago) by guez
File size: 3051 byte(s)
clcdrag is no longer used in LMDZ. Replaced by cdrag in LMDZ. In cdrag
in LMDZ, zxli is a symbolic constant, false. So removed case zxli true
in LMDZE.

read_sst is called zero (if no ocean point on the whole planet) time or
once per call of physiq. If mod(itap - 1, lmt_pas) == 0 then we have
advanced in time of lmt_pas and deja_lu is necessarily false.

qsat[sl] and dqsat[sl] were never called.

Added output of qsurf in histins, following LMDZ.

Last dummy argument dtime of phystokenc is always the same as first
dummy argument pdtphys, removed dtime.

Removed make rules for nag_xref95, since it does not exist any longer.

1 module clcdrag_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE clcdrag(nsrf, u, v, t, q, zgeop, ts, qsurf, rugos, pcfm, pcfh)
8
9 ! From LMDZ4/libf/phylmd/clcdrag.F90, version 1.1.1.1, 2004/05/19 12:53:07
10
11 ! Objet : calcul des cdrags pour le moment (pcfm) et les flux de
12 ! chaleur sensible et latente (pcfh).
13 ! Calculer le frottement au sol (Cdrag)
14
15 USE dimphy, ONLY: klon
16 USE indicesol, ONLY: is_oce
17 USE suphec_m, ONLY: rcpd, retv, rg
18 USE yoethf_m, ONLY: rvtmp2
19
20 INTEGER, intent(in):: nsrf ! indice pour le type de surface
21
22 REAL, intent(in), dimension(klon):: u, v, t, q
23 ! u-------input-R- vent zonal au 1er niveau du modele
24 ! v-------input-R- vent meridien au 1er niveau du modele
25 ! t-------input-R- temperature de l'air au 1er niveau du modele
26 ! q-------input-R- humidite de l'air au 1er niveau du modele
27
28 REAL, intent(in):: zgeop(klon) ! géopotentiel au 1er niveau du modèle
29 REAL, intent(in):: ts(:) ! (knon) temperature de l'air a la surface
30 REAL, intent(in):: qsurf(:) ! (knon) humidite de l'air a la surface
31 REAL, intent(in):: rugos(klon) ! rugosit\'e
32
33 REAL, intent(out):: pcfm(:), pcfh(:) ! (knon)
34 ! pcfm---output-R- cdrag pour le moment
35 ! pcfh---output-R- cdrag pour les flux de chaleur latente et sensible
36
37 ! Local:
38
39 ! Quelques constantes et options:
40 REAL, PARAMETER:: ckap=0.40, cb=5.0, cc=5.0, cd=5.0, cepdu2=(0.1)**2
41
42 INTEGER:: i
43 REAL:: zdu2, ztsolv, ztvd, zscf
44 REAL:: zucf, zcr
45 REAL:: friv, frih
46 REAL, dimension(klon):: zcfm1, zcfm2
47 REAL, dimension(klon):: zcfh1, zcfh2
48 REAL, dimension(klon):: zcdn
49 REAL, dimension(klon):: zri
50
51 !--------------------------------------------------------------------
52
53 DO i = 1, size(pcfm)
54 zdu2 = max(cepdu2,u(i)**2+v(i)**2)
55 ztsolv = ts(i) * (1.0+RETV*qsurf(i))
56 ztvd = (t(i)+zgeop(i)/RCPD/(1.+RVTMP2*q(i))) &
57 *(1.+RETV*q(i))
58 zri(i) = zgeop(i)*(ztvd-ztsolv)/(zdu2*ztvd)
59 zcdn(i) = (ckap/log(1.+zgeop(i)/(RG*rugos(i))))**2
60
61 IF (zri(i) .gt. 0.) THEN
62 ! situation stable
63 zri(i) = min(20.,zri(i))
64 zscf = SQRT(1.+cd*ABS(zri(i)))
65 FRIV = AMAX1(1. / (1.+2.*CB*zri(i)/ZSCF), 0.1)
66 zcfm1(i) = zcdn(i) * FRIV
67 FRIH = AMAX1(1./ (1.+3.*CB*zri(i)*ZSCF), 0.1 )
68 zcfh1(i) = 0.8 * zcdn(i) * FRIH
69 pcfm(i) = zcfm1(i)
70 pcfh(i) = zcfh1(i)
71 ELSE
72 ! situation instable
73 zucf = 1./(1.+3.0*cb*cc*zcdn(i)*SQRT(ABS(zri(i)) &
74 *(1.0+zgeop(i)/(RG*rugos(i)))))
75 zcfm2(i) = zcdn(i)*amax1((1.-2.0*cb*zri(i)*zucf),0.1)
76 zcfh2(i) = 0.8 * zcdn(i)*amax1((1.-3.0*cb*zri(i)*zucf),0.1)
77 pcfm(i) = zcfm2(i)
78 pcfh(i) = zcfh2(i)
79 zcr = (0.0016/(zcdn(i)*SQRT(zdu2)))*ABS(ztvd-ztsolv)**(1./3.)
80 IF(nsrf == is_oce) pcfh(i) = 0.8 * zcdn(i) &
81 * (1. + zcr**1.25)**(1. / 1.25)
82 ENDIF
83 END DO
84
85 END SUBROUTINE clcdrag
86
87 end module clcdrag_m

  ViewVC Help
Powered by ViewVC 1.1.21