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

Contents of /trunk/phylmd/cdrag.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 272 - (show annotations)
Wed Jul 11 14:51:28 2018 UTC (5 years, 10 months ago) by guez
Original Path: trunk/phylmd/clcdrag.f
File size: 3409 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 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 cdrags pour le moment (pcfm) et les flux de
13 ! chaleur sensible et latente (pcfh).
14 ! Calculer le frottement au sol (drag coefficient)
15
16 USE indicesol, ONLY: is_oce
17 use nr_util, only: assert_eq
18 USE suphec_m, ONLY: rcpd, retv, rg
19 USE yoethf_m, ONLY: rvtmp2
20
21 INTEGER, intent(in):: nsrf ! indice pour le type de surface
22
23 REAL, intent(in):: speed(:) ! (knon)
24 ! norm of the wind at the first model layer
25
26 REAL, intent(in):: t(:) ! (knon)
27 ! temperature de l'air au 1er niveau du modele
28
29 REAL, intent(in):: q(:) ! (knon) ! humidite de l'air au 1er niveau du modele
30 REAL, intent(in):: zgeop(:) ! (knon) géopotentiel au 1er niveau du modèle
31 REAL, intent(in) :: psol(:) ! (knon) pression au sol
32 REAL, intent(in):: ts(:) ! (knon) temperature de l'air a la surface
33 REAL, intent(in):: qsurf(:) ! (knon) humidite de l'air a la surface
34 REAL, intent(in):: rugos(:) ! (knon) rugosit\'e
35 REAL, intent(out):: pcfm(:) ! (knon) drag coefficient pour le moment
36
37 REAL, intent(out):: pcfh(:) ! (knon)
38 ! drag coefficient pour les flux de chaleur latente et sensible
39
40 REAL, intent(out), optional:: pref(:) ! (knon) pression au niveau zgeop/RG
41
42 ! Local:
43
44 ! Quelques constantes et options:
45 REAL, PARAMETER:: ckap=0.40, cb=5.0, cc=5.0, cd=5.0, cepdu2=0.1**2
46
47 INTEGER:: i, knon
48 REAL:: zdu2, ztsolv, ztvd, zscf
49 REAL:: zucf, zcr
50 REAL:: friv, frih
51 REAL, dimension(size(speed)):: zcfm1, zcfm2
52 REAL, dimension(size(speed)):: zcfh1, zcfh2
53 REAL, dimension(size(speed)):: zcdn
54 REAL, dimension(size(speed)):: zri
55
56 !--------------------------------------------------------------------
57
58 knon = assert_eq([size(speed), size(t), size(q), size(zgeop), size(ts), &
59 size(qsurf), size(rugos), size(pcfm), size(pcfh), size(pcfm)], &
60 "clcdrag knon")
61
62 DO i = 1, knon
63 zdu2 = max(cepdu2,speed(i)**2)
64 ztsolv = ts(i) * (1.0+RETV*qsurf(i))
65 ztvd = (t(i)+zgeop(i)/RCPD/(1.+RVTMP2*q(i))) &
66 *(1.+RETV*q(i))
67 zri(i) = zgeop(i)*(ztvd-ztsolv)/(zdu2*ztvd)
68 zcdn(i) = (ckap/log(1.+zgeop(i)/(RG*rugos(i))))**2
69
70 IF (zri(i) .gt. 0.) THEN
71 ! situation stable
72 zri(i) = min(20.,zri(i))
73 zscf = SQRT(1.+cd*ABS(zri(i)))
74 FRIV = AMAX1(1. / (1.+2.*CB*zri(i)/ZSCF), 0.1)
75 zcfm1(i) = zcdn(i) * FRIV
76 FRIH = AMAX1(1./ (1.+3.*CB*zri(i)*ZSCF), 0.1 )
77 zcfh1(i) = 0.8 * zcdn(i) * FRIH
78 pcfm(i) = zcfm1(i)
79 pcfh(i) = zcfh1(i)
80 ELSE
81 ! situation instable
82 zucf = 1./(1.+3.0*cb*cc*zcdn(i)*SQRT(ABS(zri(i)) &
83 *(1.0+zgeop(i)/(RG*rugos(i)))))
84 zcfm2(i) = zcdn(i)*amax1((1.-2.0*cb*zri(i)*zucf),0.1)
85 zcfh2(i) = 0.8 * zcdn(i)*amax1((1.-3.0*cb*zri(i)*zucf),0.1)
86 pcfm(i) = zcfm2(i)
87 pcfh(i) = zcfh2(i)
88 zcr = (0.0016/(zcdn(i)*SQRT(zdu2)))*ABS(ztvd-ztsolv)**(1./3.)
89 IF(nsrf == is_oce) pcfh(i) = 0.8 * zcdn(i) &
90 * (1. + zcr**1.25)**(1. / 1.25)
91 ENDIF
92 END DO
93
94 END SUBROUTINE clcdrag
95
96 end module clcdrag_m

  ViewVC Help
Powered by ViewVC 1.1.21