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