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

Contents of /trunk/dyn3d/vlspltqs.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (show annotations)
Wed Feb 27 13:16:39 2008 UTC (16 years, 3 months ago) by guez
Original Path: trunk/libf/dyn3d/vlspltqs.f
File size: 20954 byte(s)
Initial import
1 !
2 ! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/vlspltqs.F,v 1.2 2005/02/24 12:16:57 fairhead Exp $
3 !
4 SUBROUTINE vlspltqs ( q,pente_max,masse,w,pbaru,pbarv,pdt,
5 , p,pk,teta )
6 c
7 c Auteurs: P.Le Van, F.Hourdin, F.Forget, F.Codron
8 c
9 c ********************************************************************
10 c Shema d'advection " pseudo amont " .
11 c + test sur humidite specifique: Q advecte< Qsat aval
12 c (F. Codron, 10/99)
13 c ********************************************************************
14 c q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg ....
15 c
16 c pente_max facteur de limitation des pentes: 2 en general
17 c 0 pour un schema amont
18 c pbaru,pbarv,w flux de masse en u ,v ,w
19 c pdt pas de temps
20 c
21 c teta temperature potentielle, p pression aux interfaces,
22 c pk exner au milieu des couches necessaire pour calculer Qsat
23 c --------------------------------------------------------------------
24 use dimens_m
25 use paramet_m
26 use comconst
27 use comvert
28 use logic
29 IMPLICIT NONE
30 c
31
32 c
33 c Arguments:
34 c ----------
35 REAL masse(ip1jmp1,llm),pente_max
36 REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)
37 REAL q(ip1jmp1,llm)
38 REAL w(ip1jmp1,llm),pdt
39 REAL p(ip1jmp1,llmp1),teta(ip1jmp1,llm),pk(ip1jmp1,llm)
40 c
41 c Local
42 c ---------
43 c
44 INTEGER i,ij,l,j,ii
45 c
46 REAL qsat(ip1jmp1,llm)
47 REAL zm(ip1jmp1,llm)
48 REAL mu(ip1jmp1,llm)
49 REAL mv(ip1jm,llm)
50 REAL mw(ip1jmp1,llm+1)
51 REAL zq(ip1jmp1,llm)
52 REAL temps1,temps2,temps3
53 REAL zzpbar, zzw
54 LOGICAL testcpu
55 SAVE testcpu
56 SAVE temps1,temps2,temps3
57
58 REAL qmin,qmax
59 DATA qmin,qmax/0.,1.e33/
60 DATA testcpu/.false./
61 DATA temps1,temps2,temps3/0.,0.,0./
62
63 c--pour rapport de melange saturant--
64
65 REAL rtt,retv,r2es,r3les,r3ies,r4les,r4ies,play
66 REAL ptarg,pdelarg,foeew,zdelta
67 REAL tempe(ip1jmp1)
68
69 c fonction psat(T)
70
71 FOEEW ( PTARG,PDELARG ) = EXP (
72 * (R3LES*(1.-PDELARG)+R3IES*PDELARG) * (PTARG-RTT)
73 * / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG)) )
74
75 r2es = 380.11733
76 r3les = 17.269
77 r3ies = 21.875
78 r4les = 35.86
79 r4ies = 7.66
80 retv = 0.6077667
81 rtt = 273.16
82
83 c-- Calcul de Qsat en chaque point
84 c-- approximation: au milieu des couches play(l)=(p(l)+p(l+1))/2
85 c pour eviter une exponentielle.
86 DO l = 1, llm
87 DO ij = 1, ip1jmp1
88 tempe(ij) = teta(ij,l) * pk(ij,l) /cpp
89 ENDDO
90 DO ij = 1, ip1jmp1
91 zdelta = MAX( 0., SIGN(1., rtt - tempe(ij)) )
92 play = 0.5*(p(ij,l)+p(ij,l+1))
93 qsat(ij,l) = MIN(0.5, r2es* FOEEW(tempe(ij),zdelta) / play )
94 qsat(ij,l) = qsat(ij,l) / ( 1. - retv * qsat(ij,l) )
95 ENDDO
96 ENDDO
97
98 c PRINT*,'Debut vlsplt version debug sans vlyqs'
99
100 zzpbar = 0.5 * pdt
101 zzw = pdt
102 DO l=1,llm
103 DO ij = iip2,ip1jm
104 mu(ij,l)=pbaru(ij,l) * zzpbar
105 ENDDO
106 DO ij=1,ip1jm
107 mv(ij,l)=pbarv(ij,l) * zzpbar
108 ENDDO
109 DO ij=1,ip1jmp1
110 mw(ij,l)=w(ij,l) * zzw
111 ENDDO
112 ENDDO
113
114 DO ij=1,ip1jmp1
115 mw(ij,llm+1)=0.
116 ENDDO
117
118 CALL SCOPY(ijp1llm,q,1,zq,1)
119 CALL SCOPY(ijp1llm,masse,1,zm,1)
120
121 c call minmaxq(zq,qmin,qmax,'avant vlxqs ')
122 call vlxqs(zq,pente_max,zm,mu,qsat)
123
124
125 c call minmaxq(zq,qmin,qmax,'avant vlyqs ')
126
127 call vlyqs(zq,pente_max,zm,mv,qsat)
128
129
130 c call minmaxq(zq,qmin,qmax,'avant vlz ')
131
132 call vlz(zq,pente_max,zm,mw)
133
134
135 c call minmaxq(zq,qmin,qmax,'avant vlyqs ')
136 c call minmaxq(zm,qmin,qmax,'M avant vlyqs ')
137
138 call vlyqs(zq,pente_max,zm,mv,qsat)
139
140
141 c call minmaxq(zq,qmin,qmax,'avant vlxqs ')
142 c call minmaxq(zm,qmin,qmax,'M avant vlxqs ')
143
144 call vlxqs(zq,pente_max,zm,mu,qsat)
145
146 c call minmaxq(zq,qmin,qmax,'apres vlxqs ')
147 c call minmaxq(zm,qmin,qmax,'M apres vlxqs ')
148
149
150 DO l=1,llm
151 DO ij=1,ip1jmp1
152 q(ij,l)=zq(ij,l)
153 ENDDO
154 DO ij=1,ip1jm+1,iip1
155 q(ij+iim,l)=q(ij,l)
156 ENDDO
157 ENDDO
158
159 RETURN
160 END
161 SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat)
162 c
163 c Auteurs: P.Le Van, F.Hourdin, F.Forget
164 c
165 c ********************************************************************
166 c Shema d'advection " pseudo amont " .
167 c ********************************************************************
168 c
169 c --------------------------------------------------------------------
170 use dimens_m
171 use paramet_m
172 use comconst
173 use comvert
174 use logic
175 IMPLICIT NONE
176 c
177 c
178 c
179 c Arguments:
180 c ----------
181 REAL masse(ip1jmp1,llm),pente_max
182 REAL u_m( ip1jmp1,llm )
183 REAL q(ip1jmp1,llm)
184 REAL qsat(ip1jmp1,llm)
185 c
186 c Local
187 c ---------
188 c
189 INTEGER ij,l,j,i,iju,ijq,indu(ip1jmp1),niju
190 INTEGER n0,iadvplus(ip1jmp1,llm),nl(llm)
191 c
192 REAL new_m,zu_m,zdum(ip1jmp1,llm)
193 REAL dxq(ip1jmp1,llm),dxqu(ip1jmp1)
194 REAL zz(ip1jmp1)
195 REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm)
196 REAL u_mq(ip1jmp1,llm)
197
198 Logical first,testcpu
199 SAVE first,testcpu
200
201 REAL SSUM
202 REAL temps0,temps1,temps2,temps3,temps4,temps5
203 SAVE temps0,temps1,temps2,temps3,temps4,temps5
204
205
206 DATA first,testcpu/.true.,.false./
207
208 IF(first) THEN
209 temps1=0.
210 temps2=0.
211 temps3=0.
212 temps4=0.
213 temps5=0.
214 first=.false.
215 ENDIF
216
217 c calcul de la pente a droite et a gauche de la maille
218
219
220 IF (pente_max.gt.-1.e-5) THEN
221 c IF (pente_max.gt.10) THEN
222
223 c calcul des pentes avec limitation, Van Leer scheme I:
224 c -----------------------------------------------------
225
226 c calcul de la pente aux points u
227 DO l = 1, llm
228 DO ij=iip2,ip1jm-1
229 dxqu(ij)=q(ij+1,l)-q(ij,l)
230 c IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0'
231 c sigu(ij)=u_m(ij,l)/masse(ij,l)
232 ENDDO
233 DO ij=iip1+iip1,ip1jm,iip1
234 dxqu(ij)=dxqu(ij-iim)
235 c sigu(ij)=sigu(ij-iim)
236 ENDDO
237
238 DO ij=iip2,ip1jm
239 adxqu(ij)=abs(dxqu(ij))
240 ENDDO
241
242 c calcul de la pente maximum dans la maille en valeur absolue
243
244 DO ij=iip2+1,ip1jm
245 dxqmax(ij,l)=pente_max*
246 , min(adxqu(ij-1),adxqu(ij))
247 c limitation subtile
248 c , min(adxqu(ij-1)/sigu(ij-1),adxqu(ij)/(1.-sigu(ij)))
249
250
251 ENDDO
252
253 DO ij=iip1+iip1,ip1jm,iip1
254 dxqmax(ij-iim,l)=dxqmax(ij,l)
255 ENDDO
256
257 DO ij=iip2+1,ip1jm
258 IF(dxqu(ij-1)*dxqu(ij).gt.0) THEN
259 dxq(ij,l)=dxqu(ij-1)+dxqu(ij)
260 ELSE
261 c extremum local
262 dxq(ij,l)=0.
263 ENDIF
264 dxq(ij,l)=0.5*dxq(ij,l)
265 dxq(ij,l)=
266 , sign(min(abs(dxq(ij,l)),dxqmax(ij,l)),dxq(ij,l))
267 ENDDO
268
269 ENDDO ! l=1,llm
270
271 ELSE ! (pente_max.lt.-1.e-5)
272
273 c Pentes produits:
274 c ----------------
275
276 DO l = 1, llm
277 DO ij=iip2,ip1jm-1
278 dxqu(ij)=q(ij+1,l)-q(ij,l)
279 ENDDO
280 DO ij=iip1+iip1,ip1jm,iip1
281 dxqu(ij)=dxqu(ij-iim)
282 ENDDO
283
284 DO ij=iip2+1,ip1jm
285 zz(ij)=dxqu(ij-1)*dxqu(ij)
286 zz(ij)=zz(ij)+zz(ij)
287 IF(zz(ij).gt.0) THEN
288 dxq(ij,l)=zz(ij)/(dxqu(ij-1)+dxqu(ij))
289 ELSE
290 c extremum local
291 dxq(ij,l)=0.
292 ENDIF
293 ENDDO
294
295 ENDDO
296
297 ENDIF ! (pente_max.lt.-1.e-5)
298
299 c bouclage de la pente en iip1:
300 c -----------------------------
301
302 DO l=1,llm
303 DO ij=iip1+iip1,ip1jm,iip1
304 dxq(ij-iim,l)=dxq(ij,l)
305 ENDDO
306
307 DO ij=1,ip1jmp1
308 iadvplus(ij,l)=0
309 ENDDO
310
311 ENDDO
312
313
314 c calcul des flux a gauche et a droite
315
316 c on cumule le flux correspondant a toutes les mailles dont la masse
317 c au travers de la paroi pENDant le pas de temps.
318 c le rapport de melange de l'air advecte est min(q_vanleer, Qsat_downwind)
319 DO l=1,llm
320 DO ij=iip2,ip1jm-1
321 IF (u_m(ij,l).gt.0.) THEN
322 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l)
323 u_mq(ij,l)=u_m(ij,l)*
324 $ min(q(ij,l)+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l))
325 ELSE
326 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l)
327 u_mq(ij,l)=u_m(ij,l)*
328 $ min(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l))
329 ENDIF
330 ENDDO
331 ENDDO
332
333
334 c detection des points ou on advecte plus que la masse de la
335 c maille
336 DO l=1,llm
337 DO ij=iip2,ip1jm-1
338 IF(zdum(ij,l).lt.0) THEN
339 iadvplus(ij,l)=1
340 u_mq(ij,l)=0.
341 ENDIF
342 ENDDO
343 ENDDO
344 DO l=1,llm
345 DO ij=iip1+iip1,ip1jm,iip1
346 iadvplus(ij,l)=iadvplus(ij-iim,l)
347 ENDDO
348 ENDDO
349
350
351
352 c traitement special pour le cas ou on advecte en longitude plus que le
353 c contenu de la maille.
354 c cette partie est mal vectorisee.
355
356 c pas d'influence de la pression saturante (pour l'instant)
357
358 c calcul du nombre de maille sur lequel on advecte plus que la maille.
359
360 n0=0
361 DO l=1,llm
362 nl(l)=0
363 DO ij=iip2,ip1jm
364 nl(l)=nl(l)+iadvplus(ij,l)
365 ENDDO
366 n0=n0+nl(l)
367 ENDDO
368
369 IF(n0.gt.0) THEN
370 ccc PRINT*,'Nombre de points pour lesquels on advect plus que le'
371 ccc & ,'contenu de la maille : ',n0
372
373 DO l=1,llm
374 IF(nl(l).gt.0) THEN
375 iju=0
376 c indicage des mailles concernees par le traitement special
377 DO ij=iip2,ip1jm
378 IF(iadvplus(ij,l).eq.1.and.mod(ij,iip1).ne.0) THEN
379 iju=iju+1
380 indu(iju)=ij
381 ENDIF
382 ENDDO
383 niju=iju
384 c PRINT*,'niju,nl',niju,nl(l)
385
386 c traitement des mailles
387 DO iju=1,niju
388 ij=indu(iju)
389 j=(ij-1)/iip1+1
390 zu_m=u_m(ij,l)
391 u_mq(ij,l)=0.
392 IF(zu_m.gt.0.) THEN
393 ijq=ij
394 i=ijq-(j-1)*iip1
395 c accumulation pour les mailles completements advectees
396 do while(zu_m.gt.masse(ijq,l))
397 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
398 zu_m=zu_m-masse(ijq,l)
399 i=mod(i-2+iim,iim)+1
400 ijq=(j-1)*iip1+i
401 ENDDO
402 c ajout de la maille non completement advectee
403 u_mq(ij,l)=u_mq(ij,l)+zu_m*
404 & (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l))
405 ELSE
406 ijq=ij+1
407 i=ijq-(j-1)*iip1
408 c accumulation pour les mailles completements advectees
409 do while(-zu_m.gt.masse(ijq,l))
410 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
411 zu_m=zu_m+masse(ijq,l)
412 i=mod(i,iim)+1
413 ijq=(j-1)*iip1+i
414 ENDDO
415 c ajout de la maille non completement advectee
416 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l)-
417 & 0.5*(1.+zu_m/masse(ijq,l))*dxq(ijq,l))
418 ENDIF
419 ENDDO
420 ENDIF
421 ENDDO
422 ENDIF ! n0.gt.0
423
424
425
426 c bouclage en latitude
427
428 DO l=1,llm
429 DO ij=iip1+iip1,ip1jm,iip1
430 u_mq(ij,l)=u_mq(ij-iim,l)
431 ENDDO
432 ENDDO
433
434
435 c calcul des tendances
436
437 DO l=1,llm
438 DO ij=iip2+1,ip1jm
439 new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
440 q(ij,l)=(q(ij,l)*masse(ij,l)+
441 & u_mq(ij-1,l)-u_mq(ij,l))
442 & /new_m
443 masse(ij,l)=new_m
444 ENDDO
445 c Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
446 DO ij=iip1+iip1,ip1jm,iip1
447 q(ij-iim,l)=q(ij,l)
448 masse(ij-iim,l)=masse(ij,l)
449 ENDDO
450 ENDDO
451
452 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
453 c CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1)
454
455
456 RETURN
457 END
458 SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat)
459 c
460 c Auteurs: P.Le Van, F.Hourdin, F.Forget
461 c
462 c ********************************************************************
463 c Shema d'advection " pseudo amont " .
464 c ********************************************************************
465 c q,masse_adv_v,w sont des arguments d'entree pour le s-pg ....
466 c qsat est un argument de sortie pour le s-pg ....
467 c
468 c
469 c --------------------------------------------------------------------
470 c
471 use dimens_m
472 use paramet_m
473 use comconst
474 use comvert
475 use logic
476 use comgeom
477 IMPLICIT NONE
478 c
479 c
480 c Arguments:
481 c ----------
482 REAL masse(ip1jmp1,llm),pente_max
483 REAL masse_adv_v( ip1jm,llm)
484 REAL q(ip1jmp1,llm)
485 REAL qsat(ip1jmp1,llm)
486 c
487 c Local
488 c ---------
489 c
490 INTEGER i,ij,l
491 c
492 REAL airej2,airejjm,airescb(iim),airesch(iim)
493 REAL dyq(ip1jmp1,llm),dyqv(ip1jm)
494 REAL adyqv(ip1jm),dyqmax(ip1jmp1)
495 REAL qbyv(ip1jm,llm)
496
497 REAL qpns,qpsn,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
498 c REAL newq,oldmasse
499 Logical first,testcpu
500 REAL temps0,temps1,temps2,temps3,temps4,temps5
501 SAVE temps0,temps1,temps2,temps3,temps4,temps5
502 SAVE first,testcpu
503
504 REAL convpn,convps,convmpn,convmps
505 REAL sinlon(iip1),sinlondlon(iip1)
506 REAL coslon(iip1),coslondlon(iip1)
507 SAVE sinlon,coslon,sinlondlon,coslondlon
508 SAVE airej2,airejjm
509 c
510 c
511 REAL SSUM
512
513 DATA first,testcpu/.true.,.false./
514 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
515
516 IF(first) THEN
517 PRINT*,'Shema Amont nouveau appele dans Vanleer '
518 first=.false.
519 do i=2,iip1
520 coslon(i)=cos(rlonv(i))
521 sinlon(i)=sin(rlonv(i))
522 coslondlon(i)=coslon(i)*(rlonu(i)-rlonu(i-1))/pi
523 sinlondlon(i)=sinlon(i)*(rlonu(i)-rlonu(i-1))/pi
524 ENDDO
525 coslon(1)=coslon(iip1)
526 coslondlon(1)=coslondlon(iip1)
527 sinlon(1)=sinlon(iip1)
528 sinlondlon(1)=sinlondlon(iip1)
529 airej2 = SSUM( iim, aire(iip2), 1 )
530 airejjm= SSUM( iim, aire(ip1jm -iim), 1 )
531 ENDIF
532
533 c
534
535
536 DO l = 1, llm
537 c
538 c --------------------------------
539 c CALCUL EN LATITUDE
540 c --------------------------------
541
542 c On commence par calculer la valeur du traceur moyenne sur le premier cercle
543 c de latitude autour du pole (qpns pour le pole nord et qpsn pour
544 c le pole nord) qui sera utilisee pour evaluer les pentes au pole.
545
546 DO i = 1, iim
547 airescb(i) = aire(i+ iip1) * q(i+ iip1,l)
548 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l)
549 ENDDO
550 qpns = SSUM( iim, airescb ,1 ) / airej2
551 qpsn = SSUM( iim, airesch ,1 ) / airejjm
552
553 c calcul des pentes aux points v
554
555 DO ij=1,ip1jm
556 dyqv(ij)=q(ij,l)-q(ij+iip1,l)
557 adyqv(ij)=abs(dyqv(ij))
558 ENDDO
559
560 c calcul des pentes aux points scalaires
561
562 DO ij=iip2,ip1jm
563 dyq(ij,l)=.5*(dyqv(ij-iip1)+dyqv(ij))
564 dyqmax(ij)=min(adyqv(ij-iip1),adyqv(ij))
565 dyqmax(ij)=pente_max*dyqmax(ij)
566 ENDDO
567
568 c calcul des pentes aux poles
569
570 DO ij=1,iip1
571 dyq(ij,l)=qpns-q(ij+iip1,l)
572 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l)-qpsn
573 ENDDO
574
575 c filtrage de la derivee
576 dyn1=0.
577 dys1=0.
578 dyn2=0.
579 dys2=0.
580 DO ij=1,iim
581 dyn1=dyn1+sinlondlon(ij)*dyq(ij,l)
582 dys1=dys1+sinlondlon(ij)*dyq(ip1jm+ij,l)
583 dyn2=dyn2+coslondlon(ij)*dyq(ij,l)
584 dys2=dys2+coslondlon(ij)*dyq(ip1jm+ij,l)
585 ENDDO
586 DO ij=1,iip1
587 dyq(ij,l)=dyn1*sinlon(ij)+dyn2*coslon(ij)
588 dyq(ip1jm+ij,l)=dys1*sinlon(ij)+dys2*coslon(ij)
589 ENDDO
590
591 c calcul des pentes limites aux poles
592
593 fn=1.
594 fs=1.
595 DO ij=1,iim
596 IF(pente_max*adyqv(ij).lt.abs(dyq(ij,l))) THEN
597 fn=min(pente_max*adyqv(ij)/abs(dyq(ij,l)),fn)
598 ENDIF
599 IF(pente_max*adyqv(ij+ip1jm-iip1).lt.abs(dyq(ij+ip1jm,l))) THEN
600 fs=min(pente_max*adyqv(ij+ip1jm-iip1)/abs(dyq(ij+ip1jm,l)),fs)
601 ENDIF
602 ENDDO
603 DO ij=1,iip1
604 dyq(ij,l)=fn*dyq(ij,l)
605 dyq(ip1jm+ij,l)=fs*dyq(ip1jm+ij,l)
606 ENDDO
607
608 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
609 C En memoire de dIFferents tests sur la
610 C limitation des pentes aux poles.
611 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
612 C PRINT*,dyq(1)
613 C PRINT*,dyqv(iip1+1)
614 C apn=abs(dyq(1)/dyqv(iip1+1))
615 C PRINT*,dyq(ip1jm+1)
616 C PRINT*,dyqv(ip1jm-iip1+1)
617 C aps=abs(dyq(ip1jm+1)/dyqv(ip1jm-iip1+1))
618 C DO ij=2,iim
619 C apn=amax1(abs(dyq(ij)/dyqv(ij)),apn)
620 C aps=amax1(abs(dyq(ip1jm+ij)/dyqv(ip1jm-iip1+ij)),aps)
621 C ENDDO
622 C apn=min(pente_max/apn,1.)
623 C aps=min(pente_max/aps,1.)
624 C
625 C
626 C cas ou on a un extremum au pole
627 C
628 C IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
629 C & apn=0.
630 C IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
631 C & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
632 C & aps=0.
633 C
634 C limitation des pentes aux poles
635 C DO ij=1,iip1
636 C dyq(ij)=apn*dyq(ij)
637 C dyq(ip1jm+ij)=aps*dyq(ip1jm+ij)
638 C ENDDO
639 C
640 C test
641 C DO ij=1,iip1
642 C dyq(iip1+ij)=0.
643 C dyq(ip1jm+ij-iip1)=0.
644 C ENDDO
645 C DO ij=1,ip1jmp1
646 C dyq(ij)=dyq(ij)*cos(rlatu((ij-1)/iip1+1))
647 C ENDDO
648 C
649 C changement 10 07 96
650 C IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
651 C & THEN
652 C DO ij=1,iip1
653 C dyqmax(ij)=0.
654 C ENDDO
655 C ELSE
656 C DO ij=1,iip1
657 C dyqmax(ij)=pente_max*abs(dyqv(ij))
658 C ENDDO
659 C ENDIF
660 C
661 C IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
662 C & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
663 C &THEN
664 C DO ij=ip1jm+1,ip1jmp1
665 C dyqmax(ij)=0.
666 C ENDDO
667 C ELSE
668 C DO ij=ip1jm+1,ip1jmp1
669 C dyqmax(ij)=pente_max*abs(dyqv(ij-iip1))
670 C ENDDO
671 C ENDIF
672 C fin changement 10 07 96
673 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
674
675 c calcul des pentes limitees
676
677 DO ij=iip2,ip1jm
678 IF(dyqv(ij)*dyqv(ij-iip1).gt.0.) THEN
679 dyq(ij,l)=sign(min(abs(dyq(ij,l)),dyqmax(ij)),dyq(ij,l))
680 ELSE
681 dyq(ij,l)=0.
682 ENDIF
683 ENDDO
684
685 ENDDO
686
687 DO l=1,llm
688 DO ij=1,ip1jm
689 IF( masse_adv_v(ij,l).GT.0. ) THEN
690 qbyv(ij,l)= MIN( qsat(ij+iip1,l), q(ij+iip1,l ) +
691 , dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l)))
692 ELSE
693 qbyv(ij,l)= MIN( qsat(ij,l), q(ij,l) - dyq(ij,l) *
694 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l)) )
695 ENDIF
696 qbyv(ij,l) = masse_adv_v(ij,l)*qbyv(ij,l)
697 ENDDO
698 ENDDO
699
700
701 DO l=1,llm
702 DO ij=iip2,ip1jm
703 newmasse=masse(ij,l)
704 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
705 q(ij,l)=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))
706 & /newmasse
707 masse(ij,l)=newmasse
708 ENDDO
709 c.-. ancienne version
710 convpn=SSUM(iim,qbyv(1,l),1)/apoln
711 convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln
712 DO ij = 1,iip1
713 newmasse=masse(ij,l)+convmpn*aire(ij)
714 q(ij,l)=(q(ij,l)*masse(ij,l)+convpn*aire(ij))/
715 & newmasse
716 masse(ij,l)=newmasse
717 ENDDO
718 convps = -SSUM(iim,qbyv(ip1jm-iim,l),1)/apols
719 convmps = -SSUM(iim,masse_adv_v(ip1jm-iim,l),1)/apols
720 DO ij = ip1jm+1,ip1jmp1
721 newmasse=masse(ij,l)+convmps*aire(ij)
722 q(ij,l)=(q(ij,l)*masse(ij,l)+convps*aire(ij))/
723 & newmasse
724 masse(ij,l)=newmasse
725 ENDDO
726 c.-. fin ancienne version
727
728 c._. nouvelle version
729 c convpn=SSUM(iim,qbyv(1,l),1)
730 c convmpn=ssum(iim,masse_adv_v(1,l),1)
731 c oldmasse=ssum(iim,masse(1,l),1)
732 c newmasse=oldmasse+convmpn
733 c newq=(q(1,l)*oldmasse+convpn)/newmasse
734 c newmasse=newmasse/apoln
735 c DO ij = 1,iip1
736 c q(ij,l)=newq
737 c masse(ij,l)=newmasse*aire(ij)
738 c ENDDO
739 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
740 c convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
741 c oldmasse=ssum(iim,masse(ip1jm-iim,l),1)
742 c newmasse=oldmasse+convmps
743 c newq=(q(ip1jmp1,l)*oldmasse+convps)/newmasse
744 c newmasse=newmasse/apols
745 c DO ij = ip1jm+1,ip1jmp1
746 c q(ij,l)=newq
747 c masse(ij,l)=newmasse*aire(ij)
748 c ENDDO
749 c._. fin nouvelle version
750 ENDDO
751
752 RETURN
753 END

  ViewVC Help
Powered by ViewVC 1.1.21