1 |
SUBROUTINE advnqx(q, qg, qd) |
2 |
|
3 |
! Auteurs: Calcul des valeurs de q aux point u. |
4 |
|
5 |
! -------------------------------------------------------------------- |
6 |
USE dimensions |
7 |
USE paramet_m |
8 |
USE conf_gcm_m |
9 |
IMPLICIT NONE |
10 |
|
11 |
|
12 |
|
13 |
! Arguments: |
14 |
! ---------- |
15 |
REAL q(ip1jmp1, llm), qg(ip1jmp1, llm), qd(ip1jmp1, llm) |
16 |
|
17 |
! Local |
18 |
! --------- |
19 |
|
20 |
INTEGER ij, l |
21 |
|
22 |
REAL dxqu(ip1jmp1), zqu(ip1jmp1) |
23 |
REAL zqmax(ip1jmp1), zqmin(ip1jmp1) |
24 |
LOGICAL extremum(ip1jmp1) |
25 |
|
26 |
INTEGER mode |
27 |
SAVE mode |
28 |
DATA mode/1/ |
29 |
|
30 |
! calcul des pentes en u: |
31 |
! ----------------------- |
32 |
IF (mode==0) THEN |
33 |
DO l = 1, llm |
34 |
DO ij = 1, ip1jm |
35 |
qd(ij, l) = q(ij, l) |
36 |
qg(ij, l) = q(ij, l) |
37 |
END DO |
38 |
END DO |
39 |
ELSE |
40 |
DO l = 1, llm |
41 |
DO ij = iip2, ip1jm - 1 |
42 |
dxqu(ij) = q(ij+1, l) - q(ij, l) |
43 |
zqu(ij) = 0.5*(q(ij+1,l)+q(ij,l)) |
44 |
END DO |
45 |
DO ij = iip1 + iip1, ip1jm, iip1 |
46 |
dxqu(ij) = dxqu(ij-iim) |
47 |
zqu(ij) = zqu(ij-iim) |
48 |
END DO |
49 |
DO ij = iip2, ip1jm - 1 |
50 |
zqu(ij) = zqu(ij) - dxqu(ij+1)/12. |
51 |
END DO |
52 |
DO ij = iip1 + iip1, ip1jm, iip1 |
53 |
zqu(ij) = zqu(ij-iim) |
54 |
END DO |
55 |
DO ij = iip2 + 1, ip1jm |
56 |
zqu(ij) = zqu(ij) + dxqu(ij-1)/12. |
57 |
END DO |
58 |
DO ij = iip1 + iip1, ip1jm, iip1 |
59 |
zqu(ij-iim) = zqu(ij) |
60 |
END DO |
61 |
|
62 |
! calcul des valeurs max et min acceptees aux interfaces |
63 |
|
64 |
DO ij = iip2, ip1jm - 1 |
65 |
zqmax(ij) = max(q(ij+1,l), q(ij,l)) |
66 |
zqmin(ij) = min(q(ij+1,l), q(ij,l)) |
67 |
END DO |
68 |
DO ij = iip1 + iip1, ip1jm, iip1 |
69 |
zqmax(ij) = zqmax(ij-iim) |
70 |
zqmin(ij) = zqmin(ij-iim) |
71 |
END DO |
72 |
DO ij = iip2 + 1, ip1jm |
73 |
extremum(ij) = dxqu(ij)*dxqu(ij-1) <= 0. |
74 |
END DO |
75 |
DO ij = iip1 + iip1, ip1jm, iip1 |
76 |
extremum(ij-iim) = extremum(ij) |
77 |
END DO |
78 |
DO ij = iip2, ip1jm |
79 |
zqu(ij) = min(max(zqmin(ij),zqu(ij)), zqmax(ij)) |
80 |
END DO |
81 |
DO ij = iip2 + 1, ip1jm |
82 |
IF (extremum(ij)) THEN |
83 |
qg(ij, l) = q(ij, l) |
84 |
qd(ij, l) = q(ij, l) |
85 |
ELSE |
86 |
qd(ij, l) = zqu(ij) |
87 |
qg(ij, l) = zqu(ij-1) |
88 |
END IF |
89 |
END DO |
90 |
DO ij = iip1 + iip1, ip1jm, iip1 |
91 |
qd(ij-iim, l) = qd(ij, l) |
92 |
qg(ij-iim, l) = qg(ij, l) |
93 |
END DO |
94 |
|
95 |
GO TO 8888 |
96 |
|
97 |
DO ij = iip2 + 1, ip1jm |
98 |
IF (extremum(ij) .AND. .NOT. extremum(ij-1)) qd(ij-1, l) = q(ij, l) |
99 |
END DO |
100 |
|
101 |
DO ij = iip1 + iip1, ip1jm, iip1 |
102 |
qd(ij-iim, l) = qd(ij, l) |
103 |
END DO |
104 |
DO ij = iip2, ip1jm - 1 |
105 |
IF (extremum(ij) .AND. .NOT. extremum(ij+1)) qg(ij+1, l) = q(ij, l) |
106 |
END DO |
107 |
|
108 |
DO ij = iip1 + iip1, ip1jm, iip1 |
109 |
qg(ij, l) = qg(ij-iim, l) |
110 |
END DO |
111 |
8888 CONTINUE |
112 |
END DO |
113 |
END IF |
114 |
RETURN |
115 |
END SUBROUTINE advnqx |