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

Annotation of /trunk/phylmd/cdrag.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 272 - (hide 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 guez 62 module clcdrag_m
2 guez 40
3 guez 62 IMPLICIT NONE
4 guez 40
5 guez 62 contains
6 guez 40
7 guez 272 SUBROUTINE clcdrag(nsrf, speed, t, q, zgeop, psol, ts, qsurf, rugos, pcfm, &
8     pcfh, pref)
9 guez 40
10 guez 221 ! From LMDZ4/libf/phylmd/clcdrag.F90, version 1.1.1.1, 2004/05/19 12:53:07
11 guez 40
12 guez 62 ! Objet : calcul des cdrags pour le moment (pcfm) et les flux de
13     ! chaleur sensible et latente (pcfh).
14 guez 271 ! Calculer le frottement au sol (drag coefficient)
15 guez 40
16 guez 221 USE indicesol, ONLY: is_oce
17 guez 248 use nr_util, only: assert_eq
18 guez 221 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 guez 271 REAL, intent(in):: speed(:) ! (knon)
24     ! norm of the wind at the first model layer
25 guez 40
26 guez 248 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 guez 272 REAL, intent(in) :: psol(:) ! (knon) pression au sol
32 guez 221 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 guez 248 REAL, intent(in):: rugos(:) ! (knon) rugosit\'e
35 guez 271 REAL, intent(out):: pcfm(:) ! (knon) drag coefficient pour le moment
36 guez 221
37 guez 248 REAL, intent(out):: pcfh(:) ! (knon)
38 guez 271 ! drag coefficient pour les flux de chaleur latente et sensible
39 guez 47
40 guez 272 REAL, intent(out), optional:: pref(:) ! (knon) pression au niveau zgeop/RG
41    
42 guez 221 ! Local:
43 guez 47
44 guez 62 ! Quelques constantes et options:
45 guez 248 REAL, PARAMETER:: ckap=0.40, cb=5.0, cc=5.0, cd=5.0, cepdu2=0.1**2
46 guez 40
47 guez 248 INTEGER:: i, knon
48 guez 221 REAL:: zdu2, ztsolv, ztvd, zscf
49     REAL:: zucf, zcr
50     REAL:: friv, frih
51 guez 271 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 guez 40
56 guez 62 !--------------------------------------------------------------------
57 guez 40
58 guez 271 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 guez 248
62     DO i = 1, knon
63 guez 271 zdu2 = max(cepdu2,speed(i)**2)
64 guez 62 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 guez 221 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 guez 62 ELSE
81     ! situation instable
82 guez 221 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 guez 62 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