/[lmdze]/trunk/dyn3d/vlxqs.f
ViewVC logotype

Contents of /trunk/dyn3d/vlxqs.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 254 - (show annotations)
Mon Feb 5 10:39:38 2018 UTC (6 years, 3 months ago) by guez
File size: 7550 byte(s)
Move Sources/* to root directory.
1 SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat)
2 !
3 ! Auteurs: P.Le Van, F.Hourdin, F.Forget
4 !
5 ! ********************************************************************
6 ! Shema d'advection " pseudo amont " .
7 ! ********************************************************************
8 !
9 ! --------------------------------------------------------------------
10 use dimens_m
11 use paramet_m
12 use comconst
13 use disvert_m
14 use conf_gcm_m
15 IMPLICIT NONE
16 !
17 !
18 !
19 ! Arguments:
20 ! ----------
21 REAL masse(ip1jmp1,llm),pente_max
22 REAL u_m( ip1jmp1,llm )
23 REAL q(ip1jmp1,llm)
24 REAL qsat(ip1jmp1,llm)
25 !
26 ! Local
27 ! ---------
28 !
29 INTEGER ij,l,j,i,iju,ijq,indu(ip1jmp1),niju
30 INTEGER n0,iadvplus(ip1jmp1,llm),nl(llm)
31 !
32 REAL new_m,zu_m,zdum(ip1jmp1,llm)
33 REAL dxq(ip1jmp1,llm),dxqu(ip1jmp1)
34 REAL zz(ip1jmp1)
35 REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm)
36 REAL u_mq(ip1jmp1,llm)
37
38 ! calcul de la pente a droite et a gauche de la maille
39
40
41 IF (pente_max.gt.-1.e-5) THEN
42 ! IF (pente_max.gt.10) THEN
43
44 ! calcul des pentes avec limitation, Van Leer scheme I:
45 ! -----------------------------------------------------
46
47 ! calcul de la pente aux points u
48 DO l = 1, llm
49 DO ij=iip2,ip1jm-1
50 dxqu(ij)=q(ij+1,l)-q(ij,l)
51 ! IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0'
52 ! sigu(ij)=u_m(ij,l)/masse(ij,l)
53 ENDDO
54 DO ij=iip1+iip1,ip1jm,iip1
55 dxqu(ij)=dxqu(ij-iim)
56 ! sigu(ij)=sigu(ij-iim)
57 ENDDO
58
59 DO ij=iip2,ip1jm
60 adxqu(ij)=abs(dxqu(ij))
61 ENDDO
62
63 ! calcul de la pente maximum dans la maille en valeur absolue
64
65 DO ij=iip2+1,ip1jm
66 dxqmax(ij,l)=pente_max* &
67 min(adxqu(ij-1),adxqu(ij))
68 ! limitation subtile
69 ! , min(adxqu(ij-1)/sigu(ij-1),adxqu(ij)/(1.-sigu(ij)))
70
71
72 ENDDO
73
74 DO ij=iip1+iip1,ip1jm,iip1
75 dxqmax(ij-iim,l)=dxqmax(ij,l)
76 ENDDO
77
78 DO ij=iip2+1,ip1jm
79 IF(dxqu(ij-1)*dxqu(ij).gt.0) THEN
80 dxq(ij,l)=dxqu(ij-1)+dxqu(ij)
81 ELSE
82 ! extremum local
83 dxq(ij,l)=0.
84 ENDIF
85 dxq(ij,l)=0.5*dxq(ij,l)
86 dxq(ij,l)= &
87 sign(min(abs(dxq(ij,l)),dxqmax(ij,l)),dxq(ij,l))
88 ENDDO
89
90 ENDDO ! l=1,llm
91
92 ELSE ! (pente_max.lt.-1.e-5)
93
94 ! Pentes produits:
95 ! ----------------
96
97 DO l = 1, llm
98 DO ij=iip2,ip1jm-1
99 dxqu(ij)=q(ij+1,l)-q(ij,l)
100 ENDDO
101 DO ij=iip1+iip1,ip1jm,iip1
102 dxqu(ij)=dxqu(ij-iim)
103 ENDDO
104
105 DO ij=iip2+1,ip1jm
106 zz(ij)=dxqu(ij-1)*dxqu(ij)
107 zz(ij)=zz(ij)+zz(ij)
108 IF(zz(ij).gt.0) THEN
109 dxq(ij,l)=zz(ij)/(dxqu(ij-1)+dxqu(ij))
110 ELSE
111 ! extremum local
112 dxq(ij,l)=0.
113 ENDIF
114 ENDDO
115
116 ENDDO
117
118 ENDIF ! (pente_max.lt.-1.e-5)
119
120 ! bouclage de la pente en iip1:
121 ! -----------------------------
122
123 DO l=1,llm
124 DO ij=iip1+iip1,ip1jm,iip1
125 dxq(ij-iim,l)=dxq(ij,l)
126 ENDDO
127
128 DO ij=1,ip1jmp1
129 iadvplus(ij,l)=0
130 ENDDO
131
132 ENDDO
133
134
135 ! calcul des flux a gauche et a droite
136
137 ! on cumule le flux correspondant a toutes les mailles dont la masse
138 ! au travers de la paroi pENDant le pas de temps.
139 ! le rapport de melange de l'air advecte est min(q_vanleer, Qsat_downwind)
140 DO l=1,llm
141 DO ij=iip2,ip1jm-1
142 IF (u_m(ij,l).gt.0.) THEN
143 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l)
144 u_mq(ij,l)=u_m(ij,l)* &
145 min(q(ij,l)+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l))
146 ELSE
147 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l)
148 u_mq(ij,l)=u_m(ij,l)* &
149 min(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l))
150 ENDIF
151 ENDDO
152 ENDDO
153
154
155 ! detection des points ou on advecte plus que la masse de la
156 ! maille
157 DO l=1,llm
158 DO ij=iip2,ip1jm-1
159 IF(zdum(ij,l).lt.0) THEN
160 iadvplus(ij,l)=1
161 u_mq(ij,l)=0.
162 ENDIF
163 ENDDO
164 ENDDO
165 DO l=1,llm
166 DO ij=iip1+iip1,ip1jm,iip1
167 iadvplus(ij,l)=iadvplus(ij-iim,l)
168 ENDDO
169 ENDDO
170
171
172
173 ! traitement special pour le cas ou on advecte en longitude plus que le
174 ! contenu de la maille.
175 ! cette partie est mal vectorisee.
176
177 ! pas d'influence de la pression saturante (pour l'instant)
178
179 ! calcul du nombre de maille sur lequel on advecte plus que la maille.
180
181 n0=0
182 DO l=1,llm
183 nl(l)=0
184 DO ij=iip2,ip1jm
185 nl(l)=nl(l)+iadvplus(ij,l)
186 ENDDO
187 n0=n0+nl(l)
188 ENDDO
189
190 IF(n0.gt.0) THEN
191 DO l=1,llm
192 IF(nl(l).gt.0) THEN
193 iju=0
194 ! indicage des mailles concernees par le traitement special
195 DO ij=iip2,ip1jm
196 IF(iadvplus(ij,l).eq.1.and.mod(ij,iip1).ne.0) THEN
197 iju=iju+1
198 indu(iju)=ij
199 ENDIF
200 ENDDO
201 niju=iju
202
203 ! traitement des mailles
204 DO iju=1,niju
205 ij=indu(iju)
206 j=(ij-1)/iip1+1
207 zu_m=u_m(ij,l)
208 u_mq(ij,l)=0.
209 IF(zu_m.gt.0.) THEN
210 ijq=ij
211 i=ijq-(j-1)*iip1
212 ! accumulation pour les mailles completements advectees
213 do while(zu_m.gt.masse(ijq,l))
214 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
215 zu_m=zu_m-masse(ijq,l)
216 i=mod(i-2+iim,iim)+1
217 ijq=(j-1)*iip1+i
218 ENDDO
219 ! ajout de la maille non completement advectee
220 u_mq(ij,l)=u_mq(ij,l)+zu_m* &
221 (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l))
222 ELSE
223 ijq=ij+1
224 i=ijq-(j-1)*iip1
225 ! accumulation pour les mailles completements advectees
226 do while(-zu_m.gt.masse(ijq,l))
227 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
228 zu_m=zu_m+masse(ijq,l)
229 i=mod(i,iim)+1
230 ijq=(j-1)*iip1+i
231 ENDDO
232 ! ajout de la maille non completement advectee
233 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l)- &
234 0.5*(1.+zu_m/masse(ijq,l))*dxq(ijq,l))
235 ENDIF
236 ENDDO
237 ENDIF
238 ENDDO
239 ENDIF ! n0.gt.0
240
241
242
243 ! bouclage en latitude
244
245 DO l=1,llm
246 DO ij=iip1+iip1,ip1jm,iip1
247 u_mq(ij,l)=u_mq(ij-iim,l)
248 ENDDO
249 ENDDO
250
251
252 ! calcul des tendances
253
254 DO l=1,llm
255 DO ij=iip2+1,ip1jm
256 new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
257 q(ij,l)=(q(ij,l)*masse(ij,l)+ &
258 u_mq(ij-1,l)-u_mq(ij,l)) &
259 /new_m
260 masse(ij,l)=new_m
261 ENDDO
262 ! Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
263 DO ij=iip1+iip1,ip1jm,iip1
264 q(ij-iim,l)=q(ij,l)
265 masse(ij-iim,l)=masse(ij,l)
266 ENDDO
267 ENDDO
268
269 ! CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
270 ! CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1)
271
272
273 RETURN
274 END

  ViewVC Help
Powered by ViewVC 1.1.21