/[lmdze]/trunk/libf/dyn3d/vlspltqs.f90
ViewVC logotype

Contents of /trunk/libf/dyn3d/vlspltqs.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 71 - (show annotations)
Mon Jul 8 18:12:18 2013 UTC (10 years, 9 months ago) by guez
File size: 3802 byte(s)
No reason to call inidissip in ce0l.

In inidissip, set random seed to 1 beacuse PGI compiler does not
accept all zeros.

dq was computed needlessly in caladvtrac. Arguments masse and dq of
calfis not used.

Replaced real*8 by double precision.

Pass arrays with inverted order of vertical levels to conflx instead
of creating local variables for this inside conflx.

1 SUBROUTINE vlspltqs(q, pente_max, masse, w, pbaru, pbarv, pdt, p, pk, teta)
2
3 ! From LMDZ4/libf/dyn3d/vlspltqs.F, version 1.2 2005/02/24 12:16:57 fairhead
4
5 ! Authors: P. Le Van, F. Hourdin, F. Forget, F. Codron
6
7 ! Schéma d'advection "pseudo amont"
8 ! + test sur humidité spécifique : Q advecté < Qsat aval
9 ! (F. Codron, 10/99)
10
11 ! q, pbaru, pbarv, w sont des arguments d'entree pour le sous-programme
12
13 ! pente_max facteur de limitation des pentes: 2 en général
14 ! 0 pour un schéma amont
15 ! pbaru, pbarv, w flux de masse en u , v , w
16 ! pdt pas de temps
17
18 ! teta température potentielle, p pression aux interfaces,
19 ! pk exner au milieu des couches nécessaire pour calculer Qsat
20
21 USE dimens_m, ONLY : iim, llm
22 USE paramet_m, ONLY : iip1, iip2, ijp1llm, ip1jm, ip1jmp1, llmp1
23 USE comconst, ONLY : cpp
24
25 IMPLICIT NONE
26
27 ! Arguments:
28
29 REAL masse(ip1jmp1, llm), pente_max
30 REAL, intent(in):: pbaru(ip1jmp1, llm), pbarv(ip1jm, llm)
31 REAL q(ip1jmp1, llm)
32 REAL w(ip1jmp1, llm)
33 real, intent(in):: pdt
34 REAL, intent(in):: p(ip1jmp1, llmp1)
35 real, intent(in):: teta(ip1jmp1, llm)
36 real, intent(in):: pk(ip1jmp1, llm)
37
38 ! Local
39
40 INTEGER i, ij, l, j, ii
41
42 REAL qsat(ip1jmp1, llm)
43 REAL zm(ip1jmp1, llm)
44 REAL mu(ip1jmp1, llm)
45 REAL mv(ip1jm, llm)
46 REAL mw(ip1jmp1, llm+1)
47 REAL zq(ip1jmp1, llm)
48 REAL temps1, temps2, temps3
49 REAL zzpbar, zzw
50 LOGICAL testcpu
51 SAVE testcpu
52 SAVE temps1, temps2, temps3
53
54 REAL qmin, qmax
55 DATA qmin, qmax/0., 1.e33/
56 DATA testcpu/.false./
57 DATA temps1, temps2, temps3/0., 0., 0./
58
59 !--pour rapport de melange saturant--
60
61 REAL rtt, retv, r2es, r3les, r3ies, r4les, r4ies, play
62 REAL ptarg, pdelarg, foeew, zdelta
63 REAL tempe(ip1jmp1)
64
65 ! fonction psat(T)
66 FOEEW(PTARG, PDELARG) = EXP ((R3LES*(1.-PDELARG)+R3IES*PDELARG) &
67 * (PTARG-RTT) / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG)))
68
69 !------------------------------------------------------------------
70
71 r2es = 380.11733
72 r3les = 17.269
73 r3ies = 21.875
74 r4les = 35.86
75 r4ies = 7.66
76 retv = 0.6077667
77 rtt = 273.16
78
79 !-- Calcul de Qsat en chaque point
80 !-- approximation: au milieu des couches play(l)=(p(l)+p(l+1))/2
81 ! pour eviter une exponentielle.
82 DO l = 1, llm
83 DO ij = 1, ip1jmp1
84 tempe(ij) = teta(ij, l) * pk(ij, l) /cpp
85 ENDDO
86 DO ij = 1, ip1jmp1
87 zdelta = MAX(0., SIGN(1., rtt - tempe(ij)))
88 play = 0.5*(p(ij, l)+p(ij, l+1))
89 qsat(ij, l) = MIN(0.5, r2es* FOEEW(tempe(ij), zdelta) / play)
90 qsat(ij, l) = qsat(ij, l) / (1. - retv * qsat(ij, l))
91 ENDDO
92 ENDDO
93
94 zzpbar = 0.5 * pdt
95 zzw = pdt
96 DO l=1, llm
97 DO ij = iip2, ip1jm
98 mu(ij, l)=pbaru(ij, l) * zzpbar
99 ENDDO
100 DO ij=1, ip1jm
101 mv(ij, l)=pbarv(ij, l) * zzpbar
102 ENDDO
103 DO ij=1, ip1jmp1
104 mw(ij, l)=w(ij, l) * zzw
105 ENDDO
106 ENDDO
107
108 DO ij=1, ip1jmp1
109 mw(ij, llm+1)=0.
110 ENDDO
111
112 CALL SCOPY(ijp1llm, q, 1, zq, 1)
113 CALL SCOPY(ijp1llm, masse, 1, zm, 1)
114
115 ! call minmaxq(zq, qmin, qmax, 'avant vlxqs ')
116 call vlxqs(zq, pente_max, zm, mu, qsat)
117
118 ! call minmaxq(zq, qmin, qmax, 'avant vlyqs ')
119
120 call vlyqs(zq, pente_max, zm, mv, qsat)
121
122 ! call minmaxq(zq, qmin, qmax, 'avant vlz ')
123
124 call vlz(zq, pente_max, zm, mw)
125
126 ! call minmaxq(zq, qmin, qmax, 'avant vlyqs ')
127 ! call minmaxq(zm, qmin, qmax, 'M avant vlyqs ')
128
129 call vlyqs(zq, pente_max, zm, mv, qsat)
130
131 ! call minmaxq(zq, qmin, qmax, 'avant vlxqs ')
132 ! call minmaxq(zm, qmin, qmax, 'M avant vlxqs ')
133
134 call vlxqs(zq, pente_max, zm, mu, qsat)
135
136 ! call minmaxq(zq, qmin, qmax, 'apres vlxqs ')
137 ! call minmaxq(zm, qmin, qmax, 'M apres vlxqs ')
138
139 DO l=1, llm
140 DO ij=1, ip1jmp1
141 q(ij, l)=zq(ij, l)
142 ENDDO
143 DO ij=1, ip1jm+1, iip1
144 q(ij+iim, l)=q(ij, l)
145 ENDDO
146 ENDDO
147
148 END SUBROUTINE vlspltqs

  ViewVC Help
Powered by ViewVC 1.1.21