/[lmdze]/trunk/dyn3d/Vlsplt/vlx.f
ViewVC logotype

Contents of /trunk/dyn3d/Vlsplt/vlx.f

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.21