GCC Code Coverage Report


Directory: ./
File: dyn3d_common/advn.f
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 366 0.0%
Branches: 0 246 0.0%

Line Branch Exec Source
1 !
2 ! $Header$
3 !
4 SUBROUTINE advn(q,masse,w,pbaru,pbarv,pdt,mode)
5 c
6 c Auteur : F. Hourdin
7 c
8 c ********************************************************************
9 c Shema d'advection " pseudo amont " .
10 c ********************************************************************
11 c q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg ....
12 c
13 c pbaru,pbarv,w flux de masse en u ,v ,w
14 c pdt pas de temps
15 c
16 c --------------------------------------------------------------------
17 IMPLICIT NONE
18 c
19 include "dimensions.h"
20 include "paramet.h"
21 include "comgeom.h"
22 include "iniprint.h"
23
24 c
25 c Arguments:
26 c ----------
27 integer mode
28 real masse(ip1jmp1,llm)
29 REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)
30 REAL q(ip1jmp1,llm)
31 REAL w(ip1jmp1,llm),pdt
32 c
33 c Local
34 c ---------
35 c
36 INTEGER i,ij,l,j,ii
37 integer ijlqmin,iqmin,jqmin,lqmin
38 integer ismin
39 c
40 real zm(ip1jmp1,llm),newmasse
41 real mu(ip1jmp1,llm)
42 real mv(ip1jm,llm)
43 real mw(ip1jmp1,llm+1)
44 real zq(ip1jmp1,llm),zz,qpn,qps
45 real zqg(ip1jmp1,llm),zqd(ip1jmp1,llm)
46 real zqs(ip1jmp1,llm),zqn(ip1jmp1,llm)
47 real zqh(ip1jmp1,llm),zqb(ip1jmp1,llm)
48 real temps0,temps1,temps2,temps3
49 real ztemps1,ztemps2,ztemps3,ssum
50 logical testcpu
51 save testcpu
52 save temps1,temps2,temps3
53 real zzpbar,zzw
54
55
56 real qmin,qmax
57 data qmin,qmax/0.,1./
58 data testcpu/.false./
59 data temps1,temps2,temps3/0.,0.,0./
60
61 zzpbar = 0.5 * pdt
62 zzw = pdt
63
64 DO l=1,llm
65 DO ij = iip2,ip1jm
66 mu(ij,l)=pbaru(ij,l) * zzpbar
67 ENDDO
68 DO ij=1,ip1jm
69 mv(ij,l)=pbarv(ij,l) * zzpbar
70 ENDDO
71 DO ij=1,ip1jmp1
72 mw(ij,l)=w(ij,l) * zzw
73 ENDDO
74 ENDDO
75
76 DO ij=1,ip1jmp1
77 mw(ij,llm+1)=0.
78 ENDDO
79
80 do l=1,llm
81 qpn=0.
82 qps=0.
83 do ij=1,iim
84 qpn=qpn+q(ij,l)*masse(ij,l)
85 qps=qps+q(ip1jm+ij,l)*masse(ip1jm+ij,l)
86 enddo
87 qpn=qpn/ssum(iim,masse(1,l),1)
88 qps=qps/ssum(iim,masse(ip1jm+1,l),1)
89 do ij=1,iip1
90 q(ij,l)=qpn
91 q(ip1jm+ij,l)=qps
92 enddo
93 enddo
94
95 do ij=1,ip1jmp1
96 mw(ij,llm+1)=0.
97 enddo
98 do l=1,llm
99 do ij=1,ip1jmp1
100 zq(ij,l)=q(ij,l)
101 zm(ij,l)=masse(ij,l)
102 enddo
103 enddo
104
105 c call minmaxq(zq,qmin,qmax,'avant vlx ')
106 call advnqx(zq,zqg,zqd)
107 call advnx(zq,zqg,zqd,zm,mu,mode)
108 call advnqy(zq,zqs,zqn)
109 call advny(zq,zqs,zqn,zm,mv)
110 call advnqz(zq,zqh,zqb)
111 call advnz(zq,zqh,zqb,zm,mw)
112 c call vlz(zq,0.,zm,mw)
113 call advnqy(zq,zqs,zqn)
114 call advny(zq,zqs,zqn,zm,mv)
115 call advnqx(zq,zqg,zqd)
116 call advnx(zq,zqg,zqd,zm,mu,mode)
117 c call minmaxq(zq,qmin,qmax,'apres vlx ')
118
119 do l=1,llm
120 do ij=1,ip1jmp1
121 q(ij,l)=zq(ij,l)
122 enddo
123 do ij=1,ip1jm+1,iip1
124 q(ij+iim,l)=q(ij,l)
125 enddo
126 enddo
127
128 RETURN
129 END
130
131 SUBROUTINE advnqx(q,qg,qd)
132 c
133 c Auteurs: Calcul des valeurs de q aux point u.
134 c
135 c --------------------------------------------------------------------
136 IMPLICIT NONE
137 c
138 !-----------------------------------------------------------------------
139 ! INCLUDE 'dimensions.h'
140 !
141 ! dimensions.h contient les dimensions du modele
142 ! ndm est tel que iim=2**ndm
143 !-----------------------------------------------------------------------
144
145 INTEGER iim,jjm,llm,ndm
146
147 PARAMETER (iim= 32,jjm=32,llm=39,ndm=1)
148
149 !-----------------------------------------------------------------------
150 !
151 ! $Header$
152 !
153 !
154 ! ATTENTION!!!!: ce fichier include est compatible format fixe/format libre
155 ! veillez n'utiliser que des ! pour les commentaires
156 ! et bien positionner les & des lignes de continuation
157 ! (les placer en colonne 6 et en colonne 73)
158 !
159 !
160 !-----------------------------------------------------------------------
161 ! INCLUDE 'paramet.h'
162
163 INTEGER iip1,iip2,iip3,jjp1,llmp1,llmp2,llmm1
164 INTEGER kftd,ip1jm,ip1jmp1,ip1jmi1,ijp1llm
165 INTEGER ijmllm,mvar
166 INTEGER jcfil,jcfllm
167
168 PARAMETER( iip1= iim+1,iip2=iim+2,iip3=iim+3 &
169 & ,jjp1=jjm+1-1/jjm)
170 PARAMETER( llmp1 = llm+1, llmp2 = llm+2, llmm1 = llm-1 )
171 PARAMETER( kftd = iim/2 -ndm )
172 PARAMETER( ip1jm = iip1*jjm, ip1jmp1= iip1*jjp1 )
173 PARAMETER( ip1jmi1= ip1jm - iip1 )
174 PARAMETER( ijp1llm= ip1jmp1 * llm, ijmllm= ip1jm * llm )
175 PARAMETER( mvar= ip1jmp1*( 2*llm+1) + ijmllm )
176 PARAMETER( jcfil=jjm/2+5, jcfllm=jcfil*llm )
177
178 !-----------------------------------------------------------------------
179 !
180 ! $Header$
181 !
182 !
183 ! gestion des impressions de sorties et de d�bogage
184 ! lunout: unit� du fichier dans lequel se font les sorties
185 ! (par defaut 6, la sortie standard)
186 ! prt_level: niveau d'impression souhait� (0 = minimum)
187 !
188 INTEGER lunout, prt_level
189 COMMON /comprint/ lunout, prt_level
190 c
191 c
192 c Arguments:
193 c ----------
194 real q(ip1jmp1,llm),qg(ip1jmp1,llm),qd(ip1jmp1,llm)
195 c
196 c Local
197 c ---------
198 c
199 INTEGER ij,l
200 c
201 real dxqu(ip1jmp1),zqu(ip1jmp1)
202 real zqmax(ip1jmp1),zqmin(ip1jmp1)
203 logical extremum(ip1jmp1)
204
205 integer mode
206 save mode
207 data mode/1/
208
209 c calcul des pentes en u:
210 c -----------------------
211 if (mode.eq.0) then
212 do l=1,llm
213 do ij=1,ip1jm
214 qd(ij,l)=q(ij,l)
215 qg(ij,l)=q(ij,l)
216 enddo
217 enddo
218 else
219 do l = 1, llm
220 do ij=iip2,ip1jm-1
221 dxqu(ij)=q(ij+1,l)-q(ij,l)
222 zqu(ij)=0.5*(q(ij+1,l)+q(ij,l))
223 enddo
224 do ij=iip1+iip1,ip1jm,iip1
225 dxqu(ij)=dxqu(ij-iim)
226 zqu(ij)=zqu(ij-iim)
227 enddo
228 do ij=iip2,ip1jm-1
229 zqu(ij)=zqu(ij)-dxqu(ij+1)/12.
230 enddo
231 do ij=iip1+iip1,ip1jm,iip1
232 zqu(ij)=zqu(ij-iim)
233 enddo
234 do ij=iip2+1,ip1jm
235 zqu(ij)=zqu(ij)+dxqu(ij-1)/12.
236 enddo
237 do ij=iip1+iip1,ip1jm,iip1
238 zqu(ij-iim)=zqu(ij)
239 enddo
240
241 c calcul des valeurs max et min acceptees aux interfaces
242
243 do ij=iip2,ip1jm-1
244 zqmax(ij)=max(q(ij+1,l),q(ij,l))
245 zqmin(ij)=min(q(ij+1,l),q(ij,l))
246 enddo
247 do ij=iip1+iip1,ip1jm,iip1
248 zqmax(ij)=zqmax(ij-iim)
249 zqmin(ij)=zqmin(ij-iim)
250 enddo
251 do ij=iip2+1,ip1jm
252 extremum(ij)=dxqu(ij)*dxqu(ij-1).le.0.
253 enddo
254 do ij=iip1+iip1,ip1jm,iip1
255 extremum(ij-iim)=extremum(ij)
256 enddo
257 do ij=iip2,ip1jm
258 zqu(ij)=min(max(zqmin(ij),zqu(ij)),zqmax(ij))
259 enddo
260 do ij=iip2+1,ip1jm
261 if(extremum(ij)) then
262 qg(ij,l)=q(ij,l)
263 qd(ij,l)=q(ij,l)
264 else
265 qd(ij,l)=zqu(ij)
266 qg(ij,l)=zqu(ij-1)
267 endif
268 enddo
269 do ij=iip1+iip1,ip1jm,iip1
270 qd(ij-iim,l)=qd(ij,l)
271 qg(ij-iim,l)=qg(ij,l)
272 enddo
273
274 goto 8888
275
276 do ij=iip2+1,ip1jm
277 if(extremum(ij).and..not.extremum(ij-1))
278 s qd(ij-1,l)=q(ij,l)
279 enddo
280
281 do ij=iip1+iip1,ip1jm,iip1
282 qd(ij-iim,l)=qd(ij,l)
283 enddo
284 do ij=iip2,ip1jm-1
285 if (extremum(ij).and..not.extremum(ij+1))
286 s qg(ij+1,l)=q(ij,l)
287 enddo
288
289 do ij=iip1+iip1,ip1jm,iip1
290 qg(ij,l)=qg(ij-iim,l)
291 enddo
292 8888 continue
293 enddo
294 endif
295 RETURN
296 END
297 SUBROUTINE advnqy(q,qs,qn)
298 c
299 c Auteurs: Calcul des valeurs de q aux point v.
300 c
301 c --------------------------------------------------------------------
302 IMPLICIT NONE
303 c
304 !-----------------------------------------------------------------------
305 ! INCLUDE 'dimensions.h'
306 !
307 ! dimensions.h contient les dimensions du modele
308 ! ndm est tel que iim=2**ndm
309 !-----------------------------------------------------------------------
310
311 INTEGER iim,jjm,llm,ndm
312
313 PARAMETER (iim= 32,jjm=32,llm=39,ndm=1)
314
315 !-----------------------------------------------------------------------
316 !
317 ! $Header$
318 !
319 !
320 ! ATTENTION!!!!: ce fichier include est compatible format fixe/format libre
321 ! veillez n'utiliser que des ! pour les commentaires
322 ! et bien positionner les & des lignes de continuation
323 ! (les placer en colonne 6 et en colonne 73)
324 !
325 !
326 !-----------------------------------------------------------------------
327 ! INCLUDE 'paramet.h'
328
329 INTEGER iip1,iip2,iip3,jjp1,llmp1,llmp2,llmm1
330 INTEGER kftd,ip1jm,ip1jmp1,ip1jmi1,ijp1llm
331 INTEGER ijmllm,mvar
332 INTEGER jcfil,jcfllm
333
334 PARAMETER( iip1= iim+1,iip2=iim+2,iip3=iim+3 &
335 & ,jjp1=jjm+1-1/jjm)
336 PARAMETER( llmp1 = llm+1, llmp2 = llm+2, llmm1 = llm-1 )
337 PARAMETER( kftd = iim/2 -ndm )
338 PARAMETER( ip1jm = iip1*jjm, ip1jmp1= iip1*jjp1 )
339 PARAMETER( ip1jmi1= ip1jm - iip1 )
340 PARAMETER( ijp1llm= ip1jmp1 * llm, ijmllm= ip1jm * llm )
341 PARAMETER( mvar= ip1jmp1*( 2*llm+1) + ijmllm )
342 PARAMETER( jcfil=jjm/2+5, jcfllm=jcfil*llm )
343
344 !-----------------------------------------------------------------------
345 !
346 ! $Header$
347 !
348 !
349 ! gestion des impressions de sorties et de d�bogage
350 ! lunout: unit� du fichier dans lequel se font les sorties
351 ! (par defaut 6, la sortie standard)
352 ! prt_level: niveau d'impression souhait� (0 = minimum)
353 !
354 INTEGER lunout, prt_level
355 COMMON /comprint/ lunout, prt_level
356 c
357 c
358 c Arguments:
359 c ----------
360 real q(ip1jmp1,llm),qs(ip1jmp1,llm),qn(ip1jmp1,llm)
361 c
362 c Local
363 c ---------
364 c
365 INTEGER ij,l
366 c
367 real dyqv(ip1jm),zqv(ip1jm,llm)
368 real zqmax(ip1jm),zqmin(ip1jm)
369 logical extremum(ip1jmp1)
370
371 integer mode
372 save mode
373 data mode/1/
374
375 if (mode.eq.0) then
376 do l=1,llm
377 do ij=1,ip1jmp1
378 qn(ij,l)=q(ij,l)
379 qs(ij,l)=q(ij,l)
380 enddo
381 enddo
382 else
383
384 c calcul des pentes en u:
385 c -----------------------
386 do l = 1, llm
387 do ij=1,ip1jm
388 dyqv(ij)=q(ij,l)-q(ij+iip1,l)
389 enddo
390
391 do ij=iip2,ip1jm-iip1
392 zqv(ij,l)=0.5*(q(ij+iip1,l)+q(ij,l))
393 zqv(ij,l)=zqv(ij,l)+(dyqv(ij+iip1)-dyqv(ij-iip1))/12.
394 enddo
395
396 do ij=iip2,ip1jm
397 extremum(ij)=dyqv(ij)*dyqv(ij-iip1).le.0.
398 enddo
399
400 c Pas de pentes aux poles
401 do ij=1,iip1
402 zqv(ij,l)=q(ij,l)
403 zqv(ip1jm-iip1+ij,l)=q(ip1jm+ij,l)
404 extremum(ij)=.true.
405 extremum(ip1jmp1-iip1+ij)=.true.
406 enddo
407
408 c calcul des valeurs max et min acceptees aux interfaces
409 do ij=1,ip1jm
410 zqmax(ij)=max(q(ij+iip1,l),q(ij,l))
411 zqmin(ij)=min(q(ij+iip1,l),q(ij,l))
412 enddo
413
414 do ij=1,ip1jm
415 zqv(ij,l)=min(max(zqmin(ij),zqv(ij,l)),zqmax(ij))
416 enddo
417
418 do ij=iip2,ip1jm
419 if(extremum(ij)) then
420 qs(ij,l)=q(ij,l)
421 qn(ij,l)=q(ij,l)
422 c if (.not.extremum(ij-iip1)) qs(ij-iip1,l)=q(ij,l)
423 c if (.not.extremum(ij+iip1)) qn(ij+iip1,l)=q(ij,l)
424 else
425 qs(ij,l)=zqv(ij,l)
426 qn(ij,l)=zqv(ij-iip1,l)
427 endif
428 enddo
429
430 do ij=1,iip1
431 qs(ij,l)=q(ij,l)
432 qn(ij,l)=q(ij,l)
433 qs(ip1jm+ij,l)=q(ip1jm+ij,l)
434 qn(ip1jm+ij,l)=q(ip1jm+ij,l)
435 enddo
436
437 enddo
438 endif
439 RETURN
440 END
441
442 SUBROUTINE advnqz(q,qh,qb)
443 c
444 c Auteurs: Calcul des valeurs de q aux point v.
445 c
446 c --------------------------------------------------------------------
447 IMPLICIT NONE
448 c
449 !-----------------------------------------------------------------------
450 ! INCLUDE 'dimensions.h'
451 !
452 ! dimensions.h contient les dimensions du modele
453 ! ndm est tel que iim=2**ndm
454 !-----------------------------------------------------------------------
455
456 INTEGER iim,jjm,llm,ndm
457
458 PARAMETER (iim= 32,jjm=32,llm=39,ndm=1)
459
460 !-----------------------------------------------------------------------
461 !
462 ! $Header$
463 !
464 !
465 ! ATTENTION!!!!: ce fichier include est compatible format fixe/format libre
466 ! veillez n'utiliser que des ! pour les commentaires
467 ! et bien positionner les & des lignes de continuation
468 ! (les placer en colonne 6 et en colonne 73)
469 !
470 !
471 !-----------------------------------------------------------------------
472 ! INCLUDE 'paramet.h'
473
474 INTEGER iip1,iip2,iip3,jjp1,llmp1,llmp2,llmm1
475 INTEGER kftd,ip1jm,ip1jmp1,ip1jmi1,ijp1llm
476 INTEGER ijmllm,mvar
477 INTEGER jcfil,jcfllm
478
479 PARAMETER( iip1= iim+1,iip2=iim+2,iip3=iim+3 &
480 & ,jjp1=jjm+1-1/jjm)
481 PARAMETER( llmp1 = llm+1, llmp2 = llm+2, llmm1 = llm-1 )
482 PARAMETER( kftd = iim/2 -ndm )
483 PARAMETER( ip1jm = iip1*jjm, ip1jmp1= iip1*jjp1 )
484 PARAMETER( ip1jmi1= ip1jm - iip1 )
485 PARAMETER( ijp1llm= ip1jmp1 * llm, ijmllm= ip1jm * llm )
486 PARAMETER( mvar= ip1jmp1*( 2*llm+1) + ijmllm )
487 PARAMETER( jcfil=jjm/2+5, jcfllm=jcfil*llm )
488
489 !-----------------------------------------------------------------------
490 !
491 ! $Header$
492 !
493 !
494 ! gestion des impressions de sorties et de d�bogage
495 ! lunout: unit� du fichier dans lequel se font les sorties
496 ! (par defaut 6, la sortie standard)
497 ! prt_level: niveau d'impression souhait� (0 = minimum)
498 !
499 INTEGER lunout, prt_level
500 COMMON /comprint/ lunout, prt_level
501 c
502 c
503 c Arguments:
504 c ----------
505 real q(ip1jmp1,llm),qh(ip1jmp1,llm),qb(ip1jmp1,llm)
506 c
507 c Local
508 c ---------
509 c
510 INTEGER ij,l
511 c
512 real dzqw(ip1jmp1,llm+1),zqw(ip1jmp1,llm+1)
513 real zqmax(ip1jmp1,llm),zqmin(ip1jmp1,llm)
514 logical extremum(ip1jmp1,llm)
515
516 integer mode
517 save mode
518
519 data mode/1/
520
521 c calcul des pentes en u:
522 c -----------------------
523
524 if (mode.eq.0) then
525 do l=1,llm
526 do ij=1,ip1jmp1
527 qb(ij,l)=q(ij,l)
528 qh(ij,l)=q(ij,l)
529 enddo
530 enddo
531 else
532 do l = 2, llm
533 do ij=1,ip1jmp1
534 dzqw(ij,l)=q(ij,l-1)-q(ij,l)
535 zqw(ij,l)=0.5*(q(ij,l-1)+q(ij,l))
536 enddo
537 enddo
538 do ij=1,ip1jmp1
539 dzqw(ij,1)=0.
540 dzqw(ij,llm+1)=0.
541 enddo
542 do l=2,llm
543 do ij=1,ip1jmp1
544 zqw(ij,l)=zqw(ij,l)+(dzqw(ij,l+1)-dzqw(ij,l-1))/12.
545 enddo
546 enddo
547 do l=2,llm-1
548 do ij=1,ip1jmp1
549 extremum(ij,l)=dzqw(ij,l)*dzqw(ij,l+1).le.0.
550 enddo
551 enddo
552
553 c Pas de pentes en bas et en haut
554 do ij=1,ip1jmp1
555 zqw(ij,2)=q(ij,1)
556 zqw(ij,llm)=q(ij,llm)
557 extremum(ij,1)=.true.
558 extremum(ij,llm)=.true.
559 enddo
560
561 c calcul des valeurs max et min acceptees aux interfaces
562 do l=2,llm
563 do ij=1,ip1jmp1
564 zqmax(ij,l)=max(q(ij,l-1),q(ij,l))
565 zqmin(ij,l)=min(q(ij,l-1),q(ij,l))
566 enddo
567 enddo
568
569 do l=2,llm
570 do ij=1,ip1jmp1
571 zqw(ij,l)=min(max(zqmin(ij,l),zqw(ij,l)),zqmax(ij,l))
572 enddo
573 enddo
574
575 do l=2,llm-1
576 do ij=1,ip1jmp1
577 if(extremum(ij,l)) then
578 qh(ij,l)=q(ij,l)
579 qb(ij,l)=q(ij,l)
580 else
581 qh(ij,l)=zqw(ij,l+1)
582 qb(ij,l)=zqw(ij,l)
583 endif
584 enddo
585 enddo
586 c do l=2,llm-1
587 c do ij=1,ip1jmp1
588 c if(extremum(ij,l)) then
589 c if (.not.extremum(ij,l-1)) qh(ij,l-1)=q(ij,l)
590 c if (.not.extremum(ij,l+1)) qb(ij,l+1)=q(ij,l)
591 c endif
592 c enddo
593 c enddo
594
595 do ij=1,ip1jmp1
596 qb(ij,1)=q(ij,1)
597 qh(ij,1)=q(ij,1)
598 qb(ij,llm)=q(ij,llm)
599 qh(ij,llm)=q(ij,llm)
600 enddo
601
602 endif
603
604 RETURN
605 END
606
607 SUBROUTINE advnx(q,qg,qd,masse,u_m,mode)
608 c
609 c Auteur : F. Hourdin
610 c
611 c ********************************************************************
612 c Shema d'advection " pseudo amont " .
613 c ********************************************************************
614 c nq,iq,q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg ....
615 c
616 c
617 c --------------------------------------------------------------------
618 IMPLICIT NONE
619 c
620 include "dimensions.h"
621 include "paramet.h"
622 include "iniprint.h"
623 c
624 c
625 c Arguments:
626 c ----------
627 integer mode
628 real masse(ip1jmp1,llm)
629 real u_m( ip1jmp1,llm )
630 real q(ip1jmp1,llm),qd(ip1jmp1,llm),qg(ip1jmp1,llm)
631 c
632 c Local
633 c ---------
634 c
635 INTEGER i,j,ij,l,indu(ip1jmp1),niju,iju,ijq
636 integer n0,nl(llm)
637 c
638 real new_m,zu_m,zdq,zz
639 real zsigg(ip1jmp1,llm),zsigd(ip1jmp1,llm),zsig
640 real u_mq(ip1jmp1,llm)
641
642 real zm,zq,zsigm,zsigp,zqm,zqp,zu
643
644 logical ladvplus(ip1jmp1,llm)
645
646 real prec
647 save prec
648
649 data prec/1.e-15/
650
651 do l=1,llm
652 do ij=iip2,ip1jm
653 zdq=qd(ij,l)-qg(ij,l)
654 c if((qd(ij,l)-q(ij,l))*(q(ij,l)-qg(ij,l)).lt.0.) then
655 c print*,'probleme au point ij=',ij,' l=',l
656 c print*,qd(ij,l),q(ij,l),qg(ij,l)
657 c qd(ij,l)=q(ij,l)
658 c qg(ij,l)=q(ij,l)
659 c endif
660 if(abs(zdq).gt.prec) then
661 zsigd(ij,l)=(q(ij,l)-qg(ij,l))/zdq
662 zsigg(ij,l)=1.-zsigd(ij,l)
663 c if(.not.(zsigd(ij,l).ge.0..and.zsigd(ij,l).le.1. .and.
664 c s zsigg(ij,l).ge.0..or.zsigg(ij,l).le.1.) ) then
665 c print*,'probleme au point ij=',ij,' l=',l
666 c print*,'sigg=',zsigg(ij,l),' sigd=',zsigd(ij,l)
667 c print*,'q d,c,g ',qd(ij,l),q(ij,l),qg(ij,l),zdq
668 c stop
669 c endif
670 else
671 zsigd(ij,l)=0.5
672 zsigg(ij,l)=0.5
673 qd(ij,l)=q(ij,l)
674 qg(ij,l)=q(ij,l)
675 endif
676 enddo
677 enddo
678
679 c calcul de la pente maximum dans la maille en valeur absolue
680
681 do l=1,llm
682 do ij=iip2,ip1jm-1
683 if (u_m(ij,l).ge.0.) then
684 zsigp=zsigd(ij,l)
685 zsigm=zsigg(ij,l)
686 zqp=qd(ij,l)
687 zqm=qg(ij,l)
688 zm=masse(ij,l)
689 zq=q(ij,l)
690 else
691 zsigm=zsigd(ij+1,l)
692 zsigp=zsigg(ij+1,l)
693 zqm=qd(ij+1,l)
694 zqp=qg(ij+1,l)
695 zm=masse(ij+1,l)
696 zq=q(ij+1,l)
697 endif
698 zu=abs(u_m(ij,l))
699 ladvplus(ij,l)=zu.gt.zm
700 zsig=zu/zm
701 if(zsig.eq.0.) zsigp=0.1
702 if (mode.eq.1) then
703 if (zsig.le.zsigp) then
704 u_mq(ij,l)=u_m(ij,l)*zqp
705 else if (mode.eq.1) then
706 u_mq(ij,l)=
707 s sign(zm,u_m(ij,l))*(zsigp*zqp+(zsig-zsigp)*zqm)
708 endif
709 else
710 if (zsig.le.zsigp) then
711 u_mq(ij,l)=u_m(ij,l)*(zqp-0.5*zsig/zsigp*(zqp-zq))
712 else
713 zz=0.5*(zsig-zsigp)/zsigm
714 u_mq(ij,l)=sign(zm,u_m(ij,l))*( 0.5*(zq+zqp)*zsigp
715 s +(zsig-zsigp)*(zq+zz*(zqm-zq)) )
716 endif
717 endif
718 c if(zsig.lt.0.) then
719 c print*,'au point ij=',ij,' l=',l,' sig=',zsig
720 c stop
721 c endif
722 enddo
723 enddo
724
725 do l=1,llm
726 do ij=iip1+iip1,ip1jm,iip1
727 u_mq(ij,l)=u_mq(ij-iim,l)
728 ladvplus(ij,l)=ladvplus(ij-iim,l)
729 enddo
730 enddo
731
732 c=================================================================
733 C SCHEMA SEMI-LAGRAGIEN EN X DANS LES REGIONS POLAIRES
734 c=================================================================
735 c tris des regions a traiter
736 n0=0
737 do l=1,llm
738 nl(l)=0
739 do ij=iip2,ip1jm
740 if(ladvplus(ij,l)) then
741 nl(l)=nl(l)+1
742 u_mq(ij,l)=0.
743 endif
744 enddo
745 n0=n0+nl(l)
746 enddo
747
748 if(n0.gt.1) then
749 IF (prt_level > 9) WRITE(lunout,*)
750 & 'Nombre de points pour lesquels on advect plus que le'
751 & ,'contenu de la maille : ',n0
752
753 do l=1,llm
754 if(nl(l).gt.0) then
755 iju=0
756 c indicage des mailles concernees par le traitement special
757 do ij=iip2,ip1jm
758 if(ladvplus(ij,l).and.mod(ij,iip1).ne.0) then
759 iju=iju+1
760 indu(iju)=ij
761 endif
762 enddo
763 niju=iju
764 c print*,'niju,nl',niju,nl(l)
765
766 c traitement des mailles
767 do iju=1,niju
768 ij=indu(iju)
769 j=(ij-1)/iip1+1
770 zu_m=u_m(ij,l)
771 u_mq(ij,l)=0.
772 if(zu_m.gt.0.) then
773 ijq=ij
774 i=ijq-(j-1)*iip1
775 c accumulation pour les mailles completements advectees
776 do while(zu_m.gt.masse(ijq,l))
777 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
778 zu_m=zu_m-masse(ijq,l)
779 i=mod(i-2+iim,iim)+1
780 ijq=(j-1)*iip1+i
781 enddo
782 c MODIFS SPECIFIQUES DU SCHEMA
783 c ajout de la maille non completement advectee
784 zsig=zu_m/masse(ijq,l)
785 if(zsig.le.zsigd(ijq,l)) then
786 u_mq(ij,l)=u_mq(ij,l)+zu_m*(qd(ijq,l)
787 s -0.5*zsig/zsigd(ijq,l)*(qd(ijq,l)-q(ijq,l)))
788 else
789 c u_mq(ij,l)=u_mq(ij,l)+zu_m*q(ijq,l)
790 c goto 8888
791 zz=0.5*(zsig-zsigd(ijq,l))/zsigg(ijq,l)
792 if(.not.(zz.gt.0..and.zz.le.0.5)) then
793 WRITE(lunout,*)'probleme2 au point ij=',ij,
794 s ' l=',l
795 WRITE(lunout,*)'zz=',zz
796 stop
797 endif
798 u_mq(ij,l)=u_mq(ij,l)+masse(ijq,l)*(
799 s 0.5*(q(ijq,l)+qd(ijq,l))*zsigd(ijq,l)
800 s +(zsig-zsigd(ijq,l))*(q(ijq,l)+zz*(qg(ijq,l)-q(ijq,l))) )
801 endif
802 else
803 ijq=ij+1
804 i=ijq-(j-1)*iip1
805 c accumulation pour les mailles completements advectees
806 do while(-zu_m.gt.masse(ijq,l))
807 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
808 zu_m=zu_m+masse(ijq,l)
809 i=mod(i,iim)+1
810 ijq=(j-1)*iip1+i
811 enddo
812 c ajout de la maille non completement advectee
813 c 2eme MODIF SPECIFIQUE
814 zsig=-zu_m/masse(ij+1,l)
815 if(zsig.le.zsigg(ijq,l)) then
816 u_mq(ij,l)=u_mq(ij,l)+zu_m*(qg(ijq,l)
817 s -0.5*zsig/zsigg(ijq,l)*(qg(ijq,l)-q(ijq,l)))
818 else
819 c u_mq(ij,l)=u_mq(ij,l)+zu_m*q(ijq,l)
820 c goto 9999
821 zz=0.5*(zsig-zsigg(ijq,l))/zsigd(ijq,l)
822 if(.not.(zz.gt.0..and.zz.le.0.5)) then
823 WRITE(lunout,*)'probleme22 au point ij=',ij
824 s ,' l=',l
825 WRITE(lunout,*)'zz=',zz
826 stop
827 endif
828 u_mq(ij,l)=u_mq(ij,l)-masse(ijq,l)*(
829 s 0.5*(q(ijq,l)+qg(ijq,l))*zsigg(ijq,l)
830 s +(zsig-zsigg(ijq,l))*
831 s (q(ijq,l)+zz*(qd(ijq,l)-q(ijq,l))) )
832 endif
833 c fin de la modif
834 endif
835 enddo
836 endif
837 enddo
838 endif ! n0.gt.0
839
840 c bouclage en latitude
841 do l=1,llm
842 do ij=iip1+iip1,ip1jm,iip1
843 u_mq(ij,l)=u_mq(ij-iim,l)
844 enddo
845 enddo
846
847 c=================================================================
848 c CALCUL DE LA CONVERGENCE DES FLUX
849 c=================================================================
850
851 do l=1,llm
852 do ij=iip2+1,ip1jm
853 new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
854 q(ij,l)=(q(ij,l)*masse(ij,l)+
855 & u_mq(ij-1,l)-u_mq(ij,l))
856 & /new_m
857 masse(ij,l)=new_m
858 enddo
859 c Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
860 do ij=iip1+iip1,ip1jm,iip1
861 q(ij-iim,l)=q(ij,l)
862 masse(ij-iim,l)=masse(ij,l)
863 enddo
864 enddo
865
866 RETURN
867 END
868 SUBROUTINE advny(q,qs,qn,masse,v_m)
869 c
870 c Auteur : F. Hourdin
871 c
872 c ********************************************************************
873 c Shema d'advection " pseudo amont " .
874 c ********************************************************************
875 c nq,iq,q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg ....
876 c
877 c
878 c --------------------------------------------------------------------
879 IMPLICIT NONE
880 c
881 !-----------------------------------------------------------------------
882 ! INCLUDE 'dimensions.h'
883 !
884 ! dimensions.h contient les dimensions du modele
885 ! ndm est tel que iim=2**ndm
886 !-----------------------------------------------------------------------
887
888 INTEGER iim,jjm,llm,ndm
889
890 PARAMETER (iim= 32,jjm=32,llm=39,ndm=1)
891
892 !-----------------------------------------------------------------------
893 !
894 ! $Header$
895 !
896 !
897 ! ATTENTION!!!!: ce fichier include est compatible format fixe/format libre
898 ! veillez n'utiliser que des ! pour les commentaires
899 ! et bien positionner les & des lignes de continuation
900 ! (les placer en colonne 6 et en colonne 73)
901 !
902 !
903 !-----------------------------------------------------------------------
904 ! INCLUDE 'paramet.h'
905
906 INTEGER iip1,iip2,iip3,jjp1,llmp1,llmp2,llmm1
907 INTEGER kftd,ip1jm,ip1jmp1,ip1jmi1,ijp1llm
908 INTEGER ijmllm,mvar
909 INTEGER jcfil,jcfllm
910
911 PARAMETER( iip1= iim+1,iip2=iim+2,iip3=iim+3 &
912 & ,jjp1=jjm+1-1/jjm)
913 PARAMETER( llmp1 = llm+1, llmp2 = llm+2, llmm1 = llm-1 )
914 PARAMETER( kftd = iim/2 -ndm )
915 PARAMETER( ip1jm = iip1*jjm, ip1jmp1= iip1*jjp1 )
916 PARAMETER( ip1jmi1= ip1jm - iip1 )
917 PARAMETER( ijp1llm= ip1jmp1 * llm, ijmllm= ip1jm * llm )
918 PARAMETER( mvar= ip1jmp1*( 2*llm+1) + ijmllm )
919 PARAMETER( jcfil=jjm/2+5, jcfllm=jcfil*llm )
920
921 !-----------------------------------------------------------------------
922 !
923 ! $Header$
924 !
925 !CDK comgeom
926 COMMON/comgeom/ &
927 & cu(ip1jmp1),cv(ip1jm),unscu2(ip1jmp1),unscv2(ip1jm), &
928 & aire(ip1jmp1),airesurg(ip1jmp1),aireu(ip1jmp1), &
929 & airev(ip1jm),unsaire(ip1jmp1),apoln,apols, &
930 & unsairez(ip1jm),airuscv2(ip1jm),airvscu2(ip1jm), &
931 & aireij1(ip1jmp1),aireij2(ip1jmp1),aireij3(ip1jmp1), &
932 & aireij4(ip1jmp1),alpha1(ip1jmp1),alpha2(ip1jmp1), &
933 & alpha3(ip1jmp1),alpha4(ip1jmp1),alpha1p2(ip1jmp1), &
934 & alpha1p4(ip1jmp1),alpha2p3(ip1jmp1),alpha3p4(ip1jmp1), &
935 & fext(ip1jm),constang(ip1jmp1),rlatu(jjp1),rlatv(jjm), &
936 & rlonu(iip1),rlonv(iip1),cuvsurcv(ip1jm),cvsurcuv(ip1jm), &
937 & cvusurcu(ip1jmp1),cusurcvu(ip1jmp1),cuvscvgam1(ip1jm), &
938 & cuvscvgam2(ip1jm),cvuscugam1(ip1jmp1), &
939 & cvuscugam2(ip1jmp1),cvscuvgam(ip1jm),cuscvugam(ip1jmp1), &
940 & unsapolnga1,unsapolnga2,unsapolsga1,unsapolsga2, &
941 & unsair_gam1(ip1jmp1),unsair_gam2(ip1jmp1),unsairz_gam(ip1jm), &
942 & aivscu2gam(ip1jm),aiuscv2gam(ip1jm),xprimu(iip1),xprimv(iip1)
943
944 !
945 REAL &
946 & cu,cv,unscu2,unscv2,aire,airesurg,aireu,airev,unsaire,apoln ,&
947 & apols,unsairez,airuscv2,airvscu2,aireij1,aireij2,aireij3,aireij4,&
948 & alpha1,alpha2,alpha3,alpha4,alpha1p2,alpha1p4,alpha2p3,alpha3p4 ,&
949 & fext,constang,rlatu,rlatv,rlonu,rlonv,cuvscvgam1,cuvscvgam2 ,&
950 & cvuscugam1,cvuscugam2,cvscuvgam,cuscvugam,unsapolnga1,unsapolnga2&
951 & ,unsapolsga1,unsapolsga2,unsair_gam1,unsair_gam2,unsairz_gam ,&
952 & aivscu2gam ,aiuscv2gam,cuvsurcv,cvsurcuv,cvusurcu,cusurcvu,xprimu&
953 & , xprimv
954 !
955 !
956 ! $Header$
957 !
958 !
959 ! gestion des impressions de sorties et de d�bogage
960 ! lunout: unit� du fichier dans lequel se font les sorties
961 ! (par defaut 6, la sortie standard)
962 ! prt_level: niveau d'impression souhait� (0 = minimum)
963 !
964 INTEGER lunout, prt_level
965 COMMON /comprint/ lunout, prt_level
966 c
967 c
968 c Arguments:
969 c ----------
970 real masse(ip1jmp1,llm)
971 real v_m( ip1jm,llm )
972 real q(ip1jmp1,llm),qn(ip1jmp1,llm),qs(ip1jmp1,llm)
973 c
974 c Local
975 c ---------
976 c
977 INTEGER ij,l
978 c
979 real new_m,zdq,zz
980 real zsigs(ip1jmp1),zsign(ip1jmp1),zsig
981 real v_mq(ip1jm,llm)
982 real convpn,convps,convmpn,convmps,massen,masses
983 real zm,zq,zsigm,zsigp,zqm,zqp
984 real ssum
985 real prec
986 save prec
987
988 data prec/1.e-15/
989 do l=1,llm
990 do ij=1,ip1jmp1
991 zdq=qn(ij,l)-qs(ij,l)
992 c if((qn(ij,l)-q(ij,l))*(q(ij,l)-qs(ij,l)).lt.0.) then
993 c print*,'probleme au point ij=',ij,' l=',l,' advnqx'
994 c print*,qn(ij,l),q(ij,l),qs(ij,l)
995 c qn(ij,l)=q(ij,l)
996 c qs(ij,l)=q(ij,l)
997 c endif
998 if(abs(zdq).gt.prec) then
999 zsign(ij)=(q(ij,l)-qs(ij,l))/zdq
1000 zsigs(ij)=1.-zsign(ij)
1001 c if(.not.(zsign(ij).ge.0..and.zsign(ij).le.1. .and.
1002 c s zsigs(ij).ge.0..or.zsigs(ij).le.1.) ) then
1003 c print*,'probleme au point ij=',ij,' l=',l
1004 c print*,'sigs=',zsigs(ij),' sign=',zsign(ij)
1005 c stop
1006 c endif
1007 else
1008 zsign(ij)=0.5
1009 zsigs(ij)=0.5
1010 endif
1011 enddo
1012
1013 c calcul de la pente maximum dans la maille en valeur absolue
1014
1015 do ij=1,ip1jm
1016 if (v_m(ij,l).ge.0.) then
1017 zsigp=zsign(ij+iip1)
1018 zsigm=zsigs(ij+iip1)
1019 zqp=qn(ij+iip1,l)
1020 zqm=qs(ij+iip1,l)
1021 zm=masse(ij+iip1,l)
1022 zq=q(ij+iip1,l)
1023 else
1024 zsigm=zsign(ij)
1025 zsigp=zsigs(ij)
1026 zqm=qn(ij,l)
1027 zqp=qs(ij,l)
1028 zm=masse(ij,l)
1029 zq=q(ij,l)
1030 endif
1031 zsig=abs(v_m(ij,l))/zm
1032 if(zsig.eq.0.) zsigp=0.1
1033 if (zsig.le.zsigp) then
1034 v_mq(ij,l)=v_m(ij,l)*(zqp-0.5*zsig/zsigp*(zqp-zq))
1035 else
1036 zz=0.5*(zsig-zsigp)/zsigm
1037 v_mq(ij,l)=sign(zm,v_m(ij,l))*( 0.5*(zq+zqp)*zsigp
1038 s +(zsig-zsigp)*(zq+zz*(zqm-zq)) )
1039 endif
1040 enddo
1041 enddo
1042
1043 do l=1,llm
1044 do ij=iip2,ip1jm
1045 new_m=masse(ij,l)
1046 & +v_m(ij,l)-v_m(ij-iip1,l)
1047 q(ij,l)=(q(ij,l)*masse(ij,l)+v_mq(ij,l)-v_mq(ij-iip1,l))
1048 & /new_m
1049 masse(ij,l)=new_m
1050 enddo
1051 c.-. ancienne version
1052 convpn=SSUM(iim,v_mq(1,l),1)
1053 convmpn=ssum(iim,v_m(1,l),1)
1054 massen=ssum(iim,masse(1,l),1)
1055 new_m=massen+convmpn
1056 q(1,l)=(q(1,l)*massen+convpn)/new_m
1057 do ij = 1,iip1
1058 q(ij,l)=q(1,l)
1059 masse(ij,l)=new_m*aire(ij)/apoln
1060 enddo
1061
1062 convps=-SSUM(iim,v_mq(ip1jm-iim,l),1)
1063 convmps=-ssum(iim,v_m(ip1jm-iim,l),1)
1064 masses=ssum(iim,masse(ip1jm+1,l),1)
1065 new_m=masses+convmps
1066 q(ip1jm+1,l)=(q(ip1jm+1,l)*masses+convps)/new_m
1067 do ij = ip1jm+1,ip1jmp1
1068 q(ij,l)=q(ip1jm+1,l)
1069 masse(ij,l)=new_m*aire(ij)/apols
1070 enddo
1071 enddo
1072
1073 RETURN
1074 END
1075 SUBROUTINE advnz(q,qh,qb,masse,w_m)
1076 c
1077 c Auteurs: F.Hourdin
1078 c
1079 c ********************************************************************
1080 c Shema d'advection " pseudo amont " .
1081 c b designe le bas et h le haut
1082 c il y a une correspondance entre le b en z et le d en x
1083 c ********************************************************************
1084 c
1085 c
1086 c --------------------------------------------------------------------
1087 IMPLICIT NONE
1088 c
1089 !-----------------------------------------------------------------------
1090 ! INCLUDE 'dimensions.h'
1091 !
1092 ! dimensions.h contient les dimensions du modele
1093 ! ndm est tel que iim=2**ndm
1094 !-----------------------------------------------------------------------
1095
1096 INTEGER iim,jjm,llm,ndm
1097
1098 PARAMETER (iim= 32,jjm=32,llm=39,ndm=1)
1099
1100 !-----------------------------------------------------------------------
1101 !
1102 ! $Header$
1103 !
1104 !
1105 ! ATTENTION!!!!: ce fichier include est compatible format fixe/format libre
1106 ! veillez n'utiliser que des ! pour les commentaires
1107 ! et bien positionner les & des lignes de continuation
1108 ! (les placer en colonne 6 et en colonne 73)
1109 !
1110 !
1111 !-----------------------------------------------------------------------
1112 ! INCLUDE 'paramet.h'
1113
1114 INTEGER iip1,iip2,iip3,jjp1,llmp1,llmp2,llmm1
1115 INTEGER kftd,ip1jm,ip1jmp1,ip1jmi1,ijp1llm
1116 INTEGER ijmllm,mvar
1117 INTEGER jcfil,jcfllm
1118
1119 PARAMETER( iip1= iim+1,iip2=iim+2,iip3=iim+3 &
1120 & ,jjp1=jjm+1-1/jjm)
1121 PARAMETER( llmp1 = llm+1, llmp2 = llm+2, llmm1 = llm-1 )
1122 PARAMETER( kftd = iim/2 -ndm )
1123 PARAMETER( ip1jm = iip1*jjm, ip1jmp1= iip1*jjp1 )
1124 PARAMETER( ip1jmi1= ip1jm - iip1 )
1125 PARAMETER( ijp1llm= ip1jmp1 * llm, ijmllm= ip1jm * llm )
1126 PARAMETER( mvar= ip1jmp1*( 2*llm+1) + ijmllm )
1127 PARAMETER( jcfil=jjm/2+5, jcfllm=jcfil*llm )
1128
1129 !-----------------------------------------------------------------------
1130 !
1131 ! $Header$
1132 !
1133 !CDK comgeom
1134 COMMON/comgeom/ &
1135 & cu(ip1jmp1),cv(ip1jm),unscu2(ip1jmp1),unscv2(ip1jm), &
1136 & aire(ip1jmp1),airesurg(ip1jmp1),aireu(ip1jmp1), &
1137 & airev(ip1jm),unsaire(ip1jmp1),apoln,apols, &
1138 & unsairez(ip1jm),airuscv2(ip1jm),airvscu2(ip1jm), &
1139 & aireij1(ip1jmp1),aireij2(ip1jmp1),aireij3(ip1jmp1), &
1140 & aireij4(ip1jmp1),alpha1(ip1jmp1),alpha2(ip1jmp1), &
1141 & alpha3(ip1jmp1),alpha4(ip1jmp1),alpha1p2(ip1jmp1), &
1142 & alpha1p4(ip1jmp1),alpha2p3(ip1jmp1),alpha3p4(ip1jmp1), &
1143 & fext(ip1jm),constang(ip1jmp1),rlatu(jjp1),rlatv(jjm), &
1144 & rlonu(iip1),rlonv(iip1),cuvsurcv(ip1jm),cvsurcuv(ip1jm), &
1145 & cvusurcu(ip1jmp1),cusurcvu(ip1jmp1),cuvscvgam1(ip1jm), &
1146 & cuvscvgam2(ip1jm),cvuscugam1(ip1jmp1), &
1147 & cvuscugam2(ip1jmp1),cvscuvgam(ip1jm),cuscvugam(ip1jmp1), &
1148 & unsapolnga1,unsapolnga2,unsapolsga1,unsapolsga2, &
1149 & unsair_gam1(ip1jmp1),unsair_gam2(ip1jmp1),unsairz_gam(ip1jm), &
1150 & aivscu2gam(ip1jm),aiuscv2gam(ip1jm),xprimu(iip1),xprimv(iip1)
1151
1152 !
1153 REAL &
1154 & cu,cv,unscu2,unscv2,aire,airesurg,aireu,airev,unsaire,apoln ,&
1155 & apols,unsairez,airuscv2,airvscu2,aireij1,aireij2,aireij3,aireij4,&
1156 & alpha1,alpha2,alpha3,alpha4,alpha1p2,alpha1p4,alpha2p3,alpha3p4 ,&
1157 & fext,constang,rlatu,rlatv,rlonu,rlonv,cuvscvgam1,cuvscvgam2 ,&
1158 & cvuscugam1,cvuscugam2,cvscuvgam,cuscvugam,unsapolnga1,unsapolnga2&
1159 & ,unsapolsga1,unsapolsga2,unsair_gam1,unsair_gam2,unsairz_gam ,&
1160 & aivscu2gam ,aiuscv2gam,cuvsurcv,cvsurcuv,cvusurcu,cusurcvu,xprimu&
1161 & , xprimv
1162 !
1163 !
1164 ! $Header$
1165 !
1166 !
1167 ! gestion des impressions de sorties et de d�bogage
1168 ! lunout: unit� du fichier dans lequel se font les sorties
1169 ! (par defaut 6, la sortie standard)
1170 ! prt_level: niveau d'impression souhait� (0 = minimum)
1171 !
1172 INTEGER lunout, prt_level
1173 COMMON /comprint/ lunout, prt_level
1174 c
1175 c
1176 c Arguments:
1177 c ----------
1178 real masse(ip1jmp1,llm)
1179 real w_m( ip1jmp1,llm+1)
1180 real q(ip1jmp1,llm),qb(ip1jmp1,llm),qh(ip1jmp1,llm)
1181
1182 c
1183 c Local
1184 c ---------
1185 c
1186 INTEGER ij,l
1187 c
1188 real new_m,zdq,zz
1189 real zsigh(ip1jmp1,llm),zsigb(ip1jmp1,llm),zsig
1190 real w_mq(ip1jmp1,llm+1)
1191 real zm,zq,zsigm,zsigp,zqm,zqp
1192 real prec
1193 save prec
1194
1195 data prec/1.e-13/
1196
1197 do l=1,llm
1198 do ij=1,ip1jmp1
1199 zdq=qb(ij,l)-qh(ij,l)
1200 c if((qh(ij,l)-q(ij,l))*(q(ij,l)-qb(ij,l)).lt.0.) then
1201 c print*,'probleme au point ij=',ij,' l=',l
1202 c print*,qh(ij,l),q(ij,l),qb(ij,l)
1203 c qh(ij,l)=q(ij,l)
1204 c qb(ij,l)=q(ij,l)
1205 c endif
1206
1207 if(abs(zdq).gt.prec) then
1208 zsigb(ij,l)=(q(ij,l)-qh(ij,l))/zdq
1209 zsigh(ij,l)=1.-zsigb(ij,l)
1210 zsigb(ij,l)=min(max(zsigb(ij,l),0.),1.)
1211 else
1212 zsigb(ij,l)=0.5
1213 zsigh(ij,l)=0.5
1214 endif
1215 enddo
1216 enddo
1217
1218 c print*,'ok1'
1219 c calcul de la pente maximum dans la maille en valeur absolue
1220 do l=2,llm
1221 do ij=1,ip1jmp1
1222 if (w_m(ij,l).ge.0.) then
1223 zsigp=zsigb(ij,l)
1224 zsigm=zsigh(ij,l)
1225 zqp=qb(ij,l)
1226 zqm=qh(ij,l)
1227 zm=masse(ij,l)
1228 zq=q(ij,l)
1229 else
1230 zsigm=zsigb(ij,l-1)
1231 zsigp=zsigh(ij,l-1)
1232 zqm=qb(ij,l-1)
1233 zqp=qh(ij,l-1)
1234 zm=masse(ij,l-1)
1235 zq=q(ij,l-1)
1236 endif
1237 zsig=abs(w_m(ij,l))/zm
1238 if(zsig.eq.0.) zsigp=0.1
1239 if (zsig.le.zsigp) then
1240 w_mq(ij,l)=w_m(ij,l)*(zqp-0.5*zsig/zsigp*(zqp-zq))
1241 else
1242 zz=0.5*(zsig-zsigp)/zsigm
1243 w_mq(ij,l)=sign(zm,w_m(ij,l))*( 0.5*(zq+zqp)*zsigp
1244 s +(zsig-zsigp)*(zq+zz*(zqm-zq)) )
1245 endif
1246 enddo
1247 enddo
1248
1249 do ij=1,ip1jmp1
1250 w_mq(ij,llm+1)=0.
1251 w_mq(ij,1)=0.
1252 enddo
1253
1254 do l=1,llm
1255 do ij=1,ip1jmp1
1256 new_m=masse(ij,l)+w_m(ij,l+1)-w_m(ij,l)
1257 q(ij,l)=(q(ij,l)*masse(ij,l)+w_mq(ij,l+1)-w_mq(ij,l))
1258 & /new_m
1259 masse(ij,l)=new_m
1260 enddo
1261 enddo
1262 c print*,'ok3'
1263 RETURN
1264 END
1265