1 |
SUBROUTINE xadv(imr, jnp, j1, j2, p, ua, js, jn, iml, adx, iad) |
2 |
REAL p(imr, jnp), adx(imr, jnp), qtmp(-imr:imr+imr), ua(imr, jnp) |
3 |
|
4 |
jmr = jnp - 1 |
5 |
DO j = j1, j2 |
6 |
IF (j>js .AND. j<jn) GO TO 1309 |
7 |
|
8 |
DO i = 1, imr |
9 |
qtmp(i) = p(i, j) |
10 |
END DO |
11 |
|
12 |
DO i = -iml, 0 |
13 |
qtmp(i) = p(imr+i, j) |
14 |
qtmp(imr+1-i) = p(1-i, j) |
15 |
END DO |
16 |
|
17 |
IF (iad==2) THEN |
18 |
DO i = 1, imr |
19 |
ip = nint(ua(i,j)) |
20 |
ru = ip - ua(i, j) |
21 |
ip = i - ip |
22 |
a1 = 0.5*(qtmp(ip+1)+qtmp(ip-1)) - qtmp(ip) |
23 |
b1 = 0.5*(qtmp(ip+1)-qtmp(ip-1)) |
24 |
adx(i, j) = qtmp(ip) + ru*(a1*ru+b1) |
25 |
END DO |
26 |
ELSE IF (iad==1) THEN |
27 |
DO i = 1, imr |
28 |
iu = ua(i, j) |
29 |
ru = ua(i, j) - iu |
30 |
iiu = i - iu |
31 |
IF (ua(i,j)>=0.) THEN |
32 |
adx(i, j) = qtmp(iiu) + ru*(qtmp(iiu-1)-qtmp(iiu)) |
33 |
ELSE |
34 |
adx(i, j) = qtmp(iiu) + ru*(qtmp(iiu)-qtmp(iiu+1)) |
35 |
END IF |
36 |
END DO |
37 |
END IF |
38 |
|
39 |
DO i = 1, imr |
40 |
adx(i, j) = adx(i, j) - p(i, j) |
41 |
END DO |
42 |
1309 END DO |
43 |
|
44 |
! Eulerian upwind |
45 |
|
46 |
DO j = js + 1, jn - 1 |
47 |
|
48 |
DO i = 1, imr |
49 |
qtmp(i) = p(i, j) |
50 |
END DO |
51 |
|
52 |
qtmp(0) = p(imr, j) |
53 |
qtmp(imr+1) = p(1, j) |
54 |
|
55 |
IF (iad==2) THEN |
56 |
qtmp(-1) = p(imr-1, j) |
57 |
qtmp(imr+2) = p(2, j) |
58 |
DO i = 1, imr |
59 |
ip = nint(ua(i,j)) |
60 |
ru = ip - ua(i, j) |
61 |
ip = i - ip |
62 |
a1 = 0.5*(qtmp(ip+1)+qtmp(ip-1)) - qtmp(ip) |
63 |
b1 = 0.5*(qtmp(ip+1)-qtmp(ip-1)) |
64 |
adx(i, j) = qtmp(ip) - p(i, j) + ru*(a1*ru+b1) |
65 |
END DO |
66 |
ELSE IF (iad==1) THEN |
67 |
! 1st order |
68 |
DO i = 1, imr |
69 |
ip = i - ua(i, j) |
70 |
adx(i, j) = ua(i, j)*(qtmp(ip)-qtmp(ip+1)) |
71 |
END DO |
72 |
END IF |
73 |
END DO |
74 |
|
75 |
IF (j1/=2) THEN |
76 |
DO i = 1, imr |
77 |
adx(i, 2) = 0. |
78 |
adx(i, jmr) = 0. |
79 |
END DO |
80 |
END IF |
81 |
! set cross term due to x-adv at the poles to zero. |
82 |
DO i = 1, imr |
83 |
adx(i, 1) = 0. |
84 |
adx(i, jnp) = 0. |
85 |
END DO |
86 |
RETURN |
87 |
END SUBROUTINE xadv |
88 |
|