program name definitions of (nonglobal) variables state of the data space before execution transformations by the program { state of the data space after execution } program Inner-Product-1 m: integer σ : real x, y: array [0..M 1] of real ; m : 0 m < M :: x[m], y[m] = x m, ỹ m σ := +m : 0 m < M :: x[m] y[m] { σ = σ } 1 2 0..P 1 p program Vector-Sum-4 i: integer; x, y, z: array [0..I p 1] of real ; i : 0 i < I p :: x[i], y[i] = x µ 1 (p,i), ỹ µ 1 (p,i) ; i : 0 i < I p :: z[i] := αx[i] + βy[i] { ; i : 0 i < I p :: z[i] = z µ 1 (p,i) } 0..P 1 p program Inner-Product-3 i: integer; σ : real; x, y: array [0..I p 1] of real; ω: array [0..P 1] of real ; i : 0 i < I p :: x[i], y[i] = x µ 1 (p,i), ỹ µ 1 (p,i) ω[p] := +i : 0 i < I p :: x[i] y[i]; s ω[p] to all; ; q : 0 q < P and q p :: receive ω[q] from q ; σ := +q : 0 q < P :: ω[q] { σ = σ } 3 4
0..P 1 p program Recursive-Doubling-2 d: integer ω, h: real ω = ω p ; d : 0 d < D :: s ω to bitflip(p, d); receive h from bitflip(p, d); ω := ω + h ; {ω = +q : 0 q < P :: ω q } 0..P 1 0..Q 1 (p, q) program Matrix-Vector-5 i, j, d: integer x: array [0..J q 1] of real y: array [0..I p 1] of real a: array [0..I p 1, 0..J q 1] of real t: array [0..I p 1] of real ; j : 0 j < J q :: x[j] = x ν 1 (q,j); ; (i, j) : 0 i < I p, 0 j < J q :: a[i, j] = ã µ 1 (p,i),ν 1 (q,j) {local sum} ; i : 0 i < I p :: y[i] := +j : 0 j < J q :: a[i, j] x[j] ; {recursive doubling} ; d : 0 d < D :: s {y[i] : 0 i < I p } to (p, bitflip(q, d)); receive {t[i] : 0 i < I p } from (p, bitflip(q, d)); ; i : 0 i < I p :: y[i] := y[i] + t[i] ; { ; i : 0 i < I p :: y[i] = ỹ µ 1 (p,i)} 5 6 0..P 1 0..Q 1 (p, q) program Convert-Vector-2 i, j, d, s: integer v: array [0..J q 1] of real y: array [0..I p 1] of real t: array [0..I p 1] of real ; i : 0 i < I p :: y[i] = ĩµ 1 (p,i); ; j : 0 j < J q :: v[j] = 0; {local ment} ; i : 0 i < I p :: (s, j) := ν(µ 1 (p, i)); if q = s then v[j] := y[i] ; {recursive doubling} ; d : 0 d < D :: s {v[j] : 0 j < J q } to (bitflip(p, d), q); receive {t[j] : 0 j < J q } from (bitflip(p, d), q); ; j : 0 j < J q :: v[j] := v[j] + t[j] ; { ; j : 0 j < J q :: v[j] = ṽ ν 1 (q,j)} 7 program Power k: integer; α, β, ε, π xx, π xy, π xz, π yy, π yz : real; x, y, z: array [0..M 1] of real;{x k, x k+1, x k+2} λ: complex; v: array [0..M 1] of complex; π xx := (x, x); x := x/ π xx; y := Ax; π xy := (x, y); π yy := (y, y); if π yy πxy 2 < τ 2 π yy then begin λ := π xy ; {x normalized to one} v := y/ π yy; return; z := Ay; π xz := (x, z); π yz := (y, z); π zz := (z, z); α := (π yz π xyπ xz)/(π yy πxy); 2 β := (π xy π yz π yy π xz )/(π yy πxy 2 ); ε := π zz + α 2 π yy + β 2 + 2(απ yz + βπ xz + αβπ xy); if ε < τ 2 π zz and 4β α 2 > 0 then begin λ := (α i 4β α 2 )/2; v := ( λy z)/ βπ yy + απ yz + π zz ; return; x := y/ π yy; y := z/ π yy ; π xy := π yz/ π yy; π yy := π zz / π yy ; {Error: No convergence} 8
program LU-4 k, m, n: integer; M, N : set of integer; r : array [0..M 1] of integer; c: array [0..N 1] of integer; a: array [0..M 1, 0..N 1] of real; a c: array [0..M 1] of real; {pivot row} a r : array [0..N 1] of real; {multiplier column} a r c: real {pivot element} M, N = 0,.., M 1, 0..N 1; ; m, n : (m, n) M, N :: a[m, n] = ã m,n ; k : 0 k < min(m, N) :: Pivot-Strategy-4(k, M, N, a, a r c, r [k], c[k]); if a r c = 0.0 then quit; M := M \ {r [k]}; N := N \ {c[k]}; {Copy the pivot row} n : n N :: a r [n] := a[r [k], n]; {Compute the multiplier column} m : m M :: a c[m] := a[m, c[k]]/a r c; {Elimination} m, n : (m, n) M N :: a[m, n] := a[m, n] a c [m] a r [n] { ; m, n : (m, n) M, N :: if r 1 [m] > c 1 [n] then a[m, n] = l[m, n] a[m, n] = ũ[m, n] } 9 0..P 1 0..Q 1 (p, q)program LU-5 k, i, j, ˆp, î, ˆq, ĵ: integer; I, J: set of integer; r : array [0..M 1] of integer; c: array [0..N 1] of integer; a: array [0..I p 1, 0..J q 1] of real; a c: array [0..I p 1] of real; a r : array [0..J q 1] of real; a r c: real I, J = I p, J q; ; i, j : (i, j) I, J :: a[i, j] = ã µ 1 (p,i),ν 1 (q,j) ; k : 0 k < min(m, N) :: Pivot-Strategy-5(k, I, J, a, a r c, ˆp, î, ˆq, ĵ); if a r c = 0.0 then quit; if p = ˆp then I := I \ {î}; if q = ˆq then J := J \ {ĵ}; r [k] := µ 1 ( ˆp, î); {global indeces} c[k] := ν 1 (ˆq, ĵ); {Broadcast the pivot row} if p = ˆp then begin ; j : j J :: a r [j] := a[î, j]; s {a r [j] : j J} to (all, q); receive {a r [j] : j J} from ( ˆp, q); {Compute and broadcast the multiplier column} if q = ˆq then begin ; i : i I :: a c [i] := a[i, ĵ] := a[i, ĵ]/a r c ; s {a c[i] : i I} to (p, all); receive {a c [i] : i I} from (p, ˆq); {Elimination} i, j : (i, j) I J :: a[i, j] := a[i, j] a c [i] a r [j] 10 0..P 1 0..Q 1 (p, q) program No-Pivoting(k, I, J, a, a r c, ˆp, î, ˆq, ĵ) k, ˆp, î, ˆq, ĵ : integer; I, J: set of integer; a: array [0..I p 1, 0..J q 1] of real; a r c : real ( ˆp, î) := µ(k); (ˆq, ĵ) := ν(k); if p = ˆp and q = ˆq then a r c := a[î, ĵ]; 0..P 1 0..Q 1 (p, q) program Complete-Pivoting(k, I, J, a, a r c, ˆp, î, ˆq, ĵ) k, d, u, i, j, ˆp, p 0, î, i 0, ˆq, q 0, ĵ, j 0, p u, q u : integer; I, J: set of integer; a: array [0..I p 1, 0..J q 1] of real; a r c, h: real a r c, ˆp, î, ˆq, ĵ := 0.0, p, 1, q, 1; ; i, j : (i, j) I J :: if a[i, j] > a r c then a r c, î, ĵ := a[i, j], i, j ; ; d : 0 d < D :: {Note: PQ = 2 D } u := bitflip(pq + q, d); p u, q u := u/q, u mod Q; s a r c, ˆp, î, ˆq, ĵ to (p u, q u ); receive h, p 0, i 0, q 0, j 0 from (p u, q u ); if h > a r c or h = a r c and p 0 < ˆp or h = a r c and p 0 = ˆp and q 0 < ˆq then a r c, ˆp, î, ˆq, ĵ := h, p 0, i 0, q 0, j 0 11 12
program Back-Solve-4 k, m, n: integer; M: set of integer; r : array [0..M 1] of integer; c: array [0..N 1] of integer; a: array [0..M 1, 0..N 1] of real; b: array [0..M 1] of real; x: array [0..N 1] of real; {Final state of LU-4} ; m : 0 m < M :: b[m] = b m M := k : 0 k < K :: {r [k]}; ; k : K > k 0 :: M := M \ {r [k]}; x[c[k]] := b[r [k]]/a[r [k], c[k]]; m : m M :: b[m] := b[m] a[m, c[k]] x[c[k]] { ; n : 0 n < N :: x[n] = x n } 13 0..P 1 0..Q 1 (p, q)program Back-Solve-5 k, i, j, ˆp, î, ˆq, ˆq +, ˆq, ĵ, ĵ +, ĵ : integer; I: set of integer; r : array [0..M 1] of integer; c: array [0..N 1] of integer; a: array [0..I p 1, 0..J q 1] of real; b: array [0..I p 1] of real; x: array [0..J q 1] of real; {Final state of LU-5} ; b[i] : 0 i < I p :: b[i] = b µ 1 (p,i) I := ; ( ˆp, î) := µ(r [k]); if p = ˆp then I := I {î} ; ; k : K > k 0 :: if k < K 1 then ˆq +, ĵ + := ν(c[k + 1]); ˆq, ĵ := ν(c[k]); if k > 0 then ˆq, ĵ := ν(c[k 1]); ˆp, î := µ(r [k]); if q = ˆq then begin if k < K 1 and q ˆq + then receive I, {b[i] : i I} from (p, ˆq + ); if p = ˆp then begin I := I \ {î}; x[ĵ] := b[ĵ]/a[î, ĵ]; s x[ĵ] to (all, q) receive x[ĵ] from ( ˆp, q); i : i I :: b[i] := b[i] a[i, ĵ] x[ĵ]; if k > 0 and q ˆq then s I, {b[i] : i I} to (p, ˆq ) { ; j : 0 j < J q :: x[j] = x ν 1 (q,j)} 14 0..P 1 p program Full-Recursive-Doubling-2 d: integer; ω, t: real ω = ω p ; d : 0 d D :: if p + 2 d < P then s ω to p + 2 d ; if p 2 d 0 then begin receive t from p 2 d ; ω := t ω {ω = σ p } 0..P 1 p program Full-Recursive-Doubling-3 i, d: integer; β, t: real; ω: array [0..I p 1] of real ; i : 0 i < I p :: ω[i] = ω µ 1 (p,i) {Sequential recursion} ; i : 0 < i < I p :: ω[i] := ω[i 1] ω[i]; {Full recursive doubling} β := ω[i p 1]; ; d : 0 d D :: if p + 2 d < P then s β to p + 2 d ; if p 2 d 0 then begin receive t from p 2 d ; β := t β ; {Combine step} s β to p + 1; begin receive β from p 1; ; i : 0 i < I p :: ω[i] := β ω[i]; { ; i : 0 i < I p :: ω[i] = σ µ 1 (p,i)} 15 16
program Tridiagonal-LU-1 m: integer; σ, ρ, λ, ν: array [0..M 1] of real; µ: array [ 1..M 1] of real σ [0], ρ[0], ν[0] = σ 0, 0, 0; ; m : 0 < m < M :: σ [m], ρ[m], ν[m] = σ m, ρ m, τ m µ[ 1] = 1.0; ; m : 0 m < M :: λ[m] := ρ[m]/µ[m 1]; µ[m] := σ [m] λ[m] ν[m] { ; m : 0 < m < M :: λ[m], µ[m] = λ m, µ m ; λ[0] = λ 0 } 0..P 1 p program Tridiagonal-LU-2 i, d: integer; σ, ρ, λ, ν: array [0..I p 1] of real; µ: array [ 1..I p 1] of real S, T : array [0..1, 0..1] of real ; i : 0 i < I p :: σ [i], ρ[i], ν[i] = σ Mp+i, ρ Mp+i, τ Mp+i {Sequential recursion} S := ( 1 0 0 1 ) ; ; i : 0 i < I p :: S := ( ) σ [i] ν[i] ρ[i] 1 0 S; {Full recursive doubling} ; d : 0 d D :: if p + 2 d < P then s S to p + 2 d ; if p 2 d 0 then begin receive T from p 2 d ; S := S T ; ; 17 {Combine step} µ[i p 1] := (S[0, 0] + S[0, 1])/(S[1, 0] + S[1, 1]); {µ[ 1] = 1.0!!} s µ[i p 1] to p + 1; if p = 0 then µ[ 1] = 1.0 receive µ[ 1] from p 1; ; i : 0 i < I p :: λ[i] := ρ[i]/µ[i 1]; µ[i] := σ [i] λ[i] ν[i] 18 { ; i : 0 i < I p :: λ[i], µ[i] = λ Mp+i, µ Mp+i; µ[ 1] = µ Mp 1} program Fast-Fourier-1 m, t: integer; ε: array [0..2 n 1 1] of complex; b: array [0..2 n 1 1] of complex ; t : 0 t < 2 n 1 :: ε[t] = exp(it 2π 2 n ; ; t : 0 t < 2 n :: b[ρ n (t)] = f t ; ; m : 0 m < n :: t : t 0..2 n 1 :: if t 2 m = 0 then b[t] = b[t] + ε[2 n m 1 t mod 2 n 1 ] b[t + 2 m ] b[t] = b[t 2 m ] ε[2 n m 1 t mod 2 n 1 ] b[t] { ; t : 0 t < 2 n :: ˆf t = b[t]} t : t 0..2 n 1 :: if t 2 m = 0 then b[t] = b[t] + ε[2 n m 1 t mod 2 n 1 ] b[t + 2 m ] b[t] = b[t 2 m ] ε[2 n m 1 t mod 2 n 1 ] b[t] if m T D then t D, t l : t D 0..2 D 1 and t l 0..2 n D 1 :: if t l (2 m ) l = 0 then b[t D, t l ] = b[t D, t l ] + ε[t m ] b[t D, t l + (2 m ) l ] b[t D, t l ] = b[t D, t l (2 m ) l ] ε[t m ] b[t D, t l ] t D, t l : t D 0..2 D 1 and t l 0..2 n D 1 :: if t D (2 m ) D = 0 then b[t D, t l ] = b[t D, t l ] + ε[t m ] b[t D + (2 m ) D, t l ] b[t D, t l ] = b[t D (2 m ) D, t l ] ε[t m ] b[t D, t l ] 19 20
if m T D then t D, t l : t D 0..2 D 1 and t l 0..2 n D 1 :: if t l (2 m ) l = 0 then b[t D, t l ] = b[t D, t l ] + ε[t m ] b[t D, t l + (2 m ) l ] b[t D, t l ] = b[t D, t l (2 m ) l ] ε[t m ] b[t D, t l ] begin s {b[t D, t l ] : t D = p and t l 0..2 n D 1} to p (2 m ) D ; receive {x[t D, t l ] : t D = p and t l 0..2 n D 1} from p (2 m ) D ; t D, t l : t D 0..2 D 1 and t l 0..2 n D 1 :: if t D (2 m ) D = 0 then b[t D, t l ] = b[t D, t l ] + ε[t m ] x[t D, t l ] b[t D, t l ] = x[t D, t l ] ε[t m ] b[t D, t l ] 0..P 1 p program Fast-Fourier-2 m, j: integer; ε: array [0..2 n 1 1] of complex; b, x: array [0..2 n D ] of complex ; m : 0 m < n :: if m T D then ; j ( 0..2 n D 1 and ) j ( (2 m ) l = 0 :: ) ( ) b[j] 1 ε[tm (p, j)] b[j] b[j + (2 m := ) l ] 1 ε[t m (p, j)] b[j + (2 m ) l ] begin s {b[j] : j 0..2 n D 1} to p (2 m ) D ; receive {x[j] : j 0..2 n D 1} from p (2 m ) D ; if p (2 m ) D = 0 then ; j : j 0..2 n D 1 :: b[j] = b[j] + ε[t m (p, j)] x[j] ; j : j 0..2 n D 1 :: b[j] = x[j] ε[t m (p, j)] b[j] 21 22 program Jacobi-1 k, m, n: integer; u, f : array [0..M, 0..N] of real ; m, n : (m, n) 0..M 0..N :: f [m, n] = f m,n ; ; m, n : (m, n) 1..M 1 1..N 1 :: u[m, n] = ũ (0) m,n; ; n : n 0..N :: u[0, n], u[m, n] = g 0,n, g M,n ; ; m : m 0..M :: u[m, 0], u[m, N] = g m,0, g m,n m, n : (m, n) 1..M 1 1..N 1 :: u[m, n] := 0.25 (h 2 f [m, n] + u[m 1, n] + u[m + 1, n] +u[m, n 1] + u[m, n + 1]) { ; m, n : (m, n) 0..M 0..N :: u[m, n] = ũ (K) m,n} 0..P 1 0..Q 1 (p, q) program Jacobi-2 k, ; u: array [ 1..Ip, 1..Jq] of real; f : array [0..Ip 1, 0..Jq 1] of real; b1, b2: array [ 1..Jq 1] of real ; i, j : (i, j) 0..Ip 1 0..Jq 1 :: f [i, j] = fmp+i,nq+j; ; i, j : (i, j) 1..Ip 1..Jq :: u[i, j] = ũ (0) Mp+i,Nq+j ; if p = 0 then ; j : j 1..Jq :: u[ 1, j] = g0,nq+j; if p = P 1 then ; j : j 1..Jq :: u[ip, j] = gm,nq+j; if q = 0 then ; i : i 1..Ip :: u[i, 1] = gmp+i,0; if q = Q 1 then ; i : i 1..Ip :: u[i, Jq] = gmp+i,n {Local Relaxation} ; j : j 0..Jq 1 :: b2[j] := u[ 1, j]; ; i : i 0..Ip 1 :: ; j : j 1..Jq 1 :: b1[j] := u[i, j]; ; j : j 1..Jq 1 :: u[i, j] := 0.25 (h 2 f [i, j] + b1[j 1] + b2[j] + u[i, j + 1] + u[i + 1, j]) ; ; j : j 0..Jq 1 :: b2[j] := b1[j] ; {Ghost-Boundary Exchange} s {u[i, Jq 1] : i 0..Ip 1} to (p, q + 1); receive {u[i, 1] : i 0..Ip 1} from (p, q 1); s {u[i, 0] : i 0..Ip 1} to (p, q 1); receive {u[i, Jq] : j 0..Ip 1} from (p + 1, q); s {u[ip 1, j] : i 1..Jq} to (p + 1, q); receive {u[ 1, j] : i 1..Jq} from (p 1, q); s {u[0, j] : i 1..Jq} to (p 1, q); receive {u[ip, j] : i 1..Jq} from (p, q + 1); 23 24
program Gauss-Seidel-1 k, m, n: integer; u, f : array [0..M, 0..N] of real ; m, n : (m, n) 0..M 0..N :: f [m, n] = f m,n ; ; m, n : (m, n) 1..M 1 1..N 1 :: u[m, n] = ũ (0) m,n; ; n : n 0..N :: u[0, n], u[m, n] = g 0,n, g M,n ; ; m : m 0..M :: u[m, 0], u[m, N] = g m,0, g m,n ; n : n 1..N 1 :: ; m : m 1..M 1 :: u[m, n] := 0.25 (h 2 f [m, n] + u[m 1, n] + u[m + 1, n] +u[m, n 1] + u[m, n + 1]) { ; m, n : (m, n) 0..M 0..N :: u[m, n] = ũ (K) m,n} 0..P 1 0..Q 1 (p, q) program Gauss-Seidel-2 k, ; u: array [ 1..Ip, 1..Jq] of real; f : array [0..Ip 1, 0..Jq 1] of real; b1, b2: array [ 1..Jq 1] of real ; i, j : (i, j) 0..Ip 1 0..Jq 1 :: f [i, j] = fmp+i,nq+j; ; i, j : (i, j) 1..Ip 1..Jq :: u[i, j] = ũ (0) Mp+i,Nq+j ; if p = 0 then ; j : j 1..Jq :: u[ 1, j] = g0,nq+j; if p = P 1 then ; j : j 1..Jq :: u[ip, j] = gm,nq+j; if q = 0 then ; i : i 1..Ip :: u[i, 1] = gmp+i,0; if q = Q 1 then ; i : i 1..Ip :: u[i, Jq] = gmp+i,n receive {u[ 1, j] : i 0..Jq 1} from (p 1, q); receive {u[i, 1] : i 0..Ip 1} from (p, q 1); ; j : j 0..Jq 1 :: ; i : i 0..Ip 1 :: u[i, j] := 0.25 (h 2 f [i, j] + u[i 1, j] + u[i + 1, j] +u[i, j 1] + u[i, j + 1]) ; s {u[ip 1, j] : i 0..Jq 1} to (p + 1, q); s {u[i, Jq 1] : i 0..Ip 1} to (p, q + 1); s {u[0, j] : i 0..Jq 1} to (p 1, q); s {u[i, 0] : i 0..Ip 1} to (p, q 1); receive {u[ip, j] : i 0..Jq 1} from (p, q + 1); receive {u[i, Jq] : j 0..Ip 1} from (p + 1, q); 25 26 program Conjugate-Gradient k: integer; ξ, β, Π 0 r r, π 1 r r, π pw: real; p, r, w, x: vector r := r Ax; p := r ; π 0 r r := r T r ; w := Ap; π pw := p T w; ξ := π 0 r r /π pw; x := x + ξp; r := r ξw; π 1 r r := r T r ; β := π 1 r r /π 0 r r ; p := r + βp; π 0 r r := π 1 r r ; 0..P 1 0..Q 1 (p, q) program Assign(u, g u, v, g v ) {u(g u ) := v(g v )} u, v: array [ 3..I p + 2, 3..J q + 2] of real; g u, u n, u e, u s, u w : integer; g v, v n, v e, v s, v w : integer; u n, u e, u s, u w := J q + g u, I p + g u, 1 g u, 1 g u ; v n, v e, v s, v w := J q + g v, I p + g v, 1 g v, 1 g v ; ; i : 0 i < I p :: u[i, u s ] := v[i, v s ]; ; i : 0 i < I p :: u[i, u n ] := v[i, v n ]; ; i : 0 j < J q :: u[u w, j] := v[v w, j]; ; i : 0 j < J q :: u[u e, j] := v[v e, j]; u[u w, u s ] := v[v w, v s ]; u[u w, u n ] := v[v w, v n ]; u[u e, u s ] := v[v e, v s ]; u[u e, u n ] := v[v e, v n ] 27 28
0..P 1 0..Q 1 (p, q) program Vector-Sum(u, g u, v, g v, α, w, g w ) {u(g u ) := v(g v ) + αw(g w )} α: real; u, v, w: array [ 3..I p + 2, 3..J q + 2] of real; g u, u n, u e, u s, u w : integer; g v, v n, v e, v s, v w : integer; g w, w n, w e, w s, w w : integer; u n, u e, u s, u w := J q + g u, I p + g u, 1 g u, 1 g u ; v n, v e, v s, v w := J q + g v, I p + g v, 1 g v, 1 g v ; w n, w e, w s, w w := J q + g w, I p + g w, 1 g w, 1 g w ; ; i : 0 i < I p :: u[i, u s ] := v[i, v s ] + αw[i, w s ]; ; i : 0 i < I p :: u[i, u n ] := v[i, v n ] + αw[i, w n ]; ; i : 0 j < J q :: u[u w, j] := v[v w, j] + αw[w w, j]; ; i : 0 j < J q :: u[u e, j] := v[v e, j] + αw[w e, j]; u[u w, u s ] := v[v w, v s ] + αw[w w, w s ]; u[u w, u n ] := v[v w, v n ] + αw[w w, w n ]; u[u e, u s ] := v[v e, v s ] + αw[w e, w s ]; u[u e, u n ] := v[v e, v n ] + αw[w e, w n ] 0..P 1 0..Q 1 (p, q) program Inner-Product(π uv, u, g u, v, g v ) {π uv := u(g u ) T v(g v )} u, v: array [ 3..I p + 2, 3..J q + 2] of real; g u, u n, u e : integer; g v, v n, v e : integer; {Outer-boundary variables are assumed to be 0!} u n, u e := J q + g u, I p + g u, 1 g u ; v n, v e := J q + g v, I p + g v, 1 g v ; π uv := u[u e, u n ]v[v e, v n ]; π uv := π uv + +i : 0 i < I p :: u[i, u n ]v[i, v n ]; π uv := π uv + +i : 0 j < J q :: u[u e, j]v[v e, j]; Recursive-Double-Sum(π uv ) 29 30 0..P 1 0..Q 1 (p, q) program Zero-Exterior(u, g u ) u: array [ 3..I p + 2, 3..J q + 2] of real; g u, u n, u e, u s, u w : integer; u n, u e, u s, u w := J q + g u, I p + g u, 1 g u, 1 g u, 1 g u ; if q = 0 then begin ; i : 0 i < I p :: u[i, u s ] := 0; u[u w, u s ], u[u e, u s ] := 0, 0; if p = 0 then begin ; j : 0 j < J q :: u[u w, j] := 0; u[u w, u s ], u[u w, u n ] := 0, 0; if q = Q 1 then begin ; i : 0 i < I p :: u[i, u n ] := 0; u[u w, u n ], u[u e, u n ] := 0, 0; if p = P 1 then begin ; j : 0 j < J q :: u[u e, j] := 0; u[u e, u s ], u[u e, u n ] := 0, 0; 0..P 1 0..Q 1 (p, q) program Poisson-Solver(u, f ) u, f : array [ 3..I p + 2, 3..J q + 2] of real; i, j, k: integer {The inner ghost boundary is assumed to carry the u-information!} ; i, j : 0 j < J q and 0 i < I p :: u[i, j] := 0.25 (h 2 f [i, j] + u[i 1, j] + u[i + 1, j]+ u[i, j 1] + u[i, j + 1]) 0..P 1 0..Q 1 (p, q) program Laplace-Solver(u) u: array [ 3..I p + 2, 3..J q + 2] of real; i, j, k: integer {The inner ghost boundary is assumed to carry the u-information!} ; i, j : 0 j < J q and 0 i < I p :: u[i, j] := 0.25 (u[i 1, j] + u[i + 1, j]+ u[i, j 1] + u[i, j + 1]) 31 32
0..P 1 0..Q 1 (p, q) program Update-Ghost-Boundary(u) u: array [ 3..I p + 2, 3..J q + 2] of real; s {u[i, J q 1] : i 1..I p } to (p, q + 1); receive {u[i, 2] : i 1..I p } from (p, q 1); s {u[i, 0] : i 1..I p } to (p, q 1); receive {u[i, J q + 1] : i 1..I p } from (p, q + 1); s {u[i p 1, j] : j 1..J q } to (p + 1, q); receive {u[ 2, j] : j 1..J q } from (p 1, q); s {u[0, j] : j 1..J q } to (p 1, q); receive {u[i p + 1, j] : j 1..J q } from (p + 1, q); 0..P 1 0..Q 1 (p, q) program Residual(u, f ) u, f : array [ 3..I p + 2, 3..J q + 2] of real; Poisson-Solver(u, f ); Update-Ghost-Boundary(u); ; i : 1 i I p :: f [i, 1] := f [i, 1] h 2 (4u[i, 1] u[i 1, 1] u[i + 1, 1] u[i, 2] u[i, 0]); f [i, J q ] := f [i, J q ] h 2 (4u[i, J q ] u[i 1, J q ] u[i + 1, J q ] u[i, J q 1] u[i, J q + 1]) ; ; j : 0 i < j q :: f [ 1, j] := f [ 1, j] h 2 (4u[ 1, j] u[ 1, j 1] u[ 1, j + 1] u[ 2, j] u[0, j]); f [I p, j] := f [I p, j] h 2 (4u[I p, j] u[i p, j 1] u[i p, j + 1] u[i p 1, j] u[i p + 1, j]) ; Zero-Exterior(f, 0) 33 34 0..P 1 0..Q 1 (p, q) program Apply-Capacitance-Matrix(u, f ) u, f : array [ 3..I p + 2, 3..J q + 2] of real; Laplace-Solver(u); Update-Ghost-Boundary(u); ; i : 1 i I p :: f [i, 1] := h 2 (4u[i, 1] u[i 1, 1] u[i + 1, 1] u[i, 2] u[i, 0]); f [i, J q ] := h 2 (4u[i, J q ] u[i 1, J q ] u[i + 1, J q ] u[i, J q 1] u[i, J q + 1]) ; ; j : 0 i < j q :: f [ 1, j] := h 2 (4u[ 1, j] u[ 1, j 1] u[ 1, j + 1] u[ 2, j] u[0, j]); f [I p, j] := h 2 (4u[I p, j] u[i p, j 1] u[i p, j + 1] u[i p 1, j] u[i p + 1, j]) ; Zero-Exterior(f, 0) 35 0..P 1 0..Q 1 (p, q) program Domain-Decomposition u, f : array [ 3..I p + 2, 3..J q + 2] of real; ξ, β, Πr 0 r, π r 1 r, π pw: real; k: integer ; i, j : (i, j) 3..I p + 2 3..J q + 2 :: u[i, j], f [i, j] = 0, 0; ; i, j : (i, j) 1..I p 1..J q :: f [i, j] = f Mp+i+1,Nq+j+1; ; i, j : (i, j) 1..I p 1..J q :: u[i, j] = ũ (0) M ; p+i+1,n q+j+1 if p = 0 then ; j : j 0..J q :: u[ 1, j] = g 0,Nq+j+1; if p = P 1 then ; j : j 0..J q :: u[i p, j] = g M,Nq+j+1; if q = 0 then ; i : i 0..I p :: u[i, 1] = g Mp+i+1,0; if q = Q 1 then ; i : i 0..I p :: u[i, J q ] = g Mp+i+1,N Residual(u, f ); Assign(u, 2, u, 0); Assign(f, 1, f, 0); Assign(u, 0, f, 0); Inner-Product(πr 0 r, f, 0, f, 0); Apply-Capacitance-Matrix(u, f ); Inner-Product(π pw, u, 0, f, 0); ξ := πr 0 r /π pw; Vector-Sum(u, 2, u, 2, ξ, u, 0); Vector-Sum(f, 1, f, 1, ξ, f, 0); Inner-Product(πr 1 r, f, 1, f, 1); β := πr 1 r /π r 0 r ; Vector-Sum(u, 0, f, 1, β, u, 0); πr 0 r := π r 1 r ; ; Assign(u, 0, u, 2); 36 Poisson-Solver(u, f )