test5.c
来自「shpf 1.9一个并行编译器」· C语言 代码 · 共 94 行
C
94 行
// integer n
// parameter(n = 8)
//
// real u(n, n)
//
// !hpf$ distribute u (block, block) onto p
// !hpf$ processors p (2, 2)
//
// integer i, j
// integer iter
//
// do i = 1, n
// do j = 1, n
// if(i == 1 .or. i == n .or. j == 1 .or. j == n) then
// u(i, j) = 1.0
// else
// u(i, j) = 0.0
// endif
// enddo
// enddo
//
// do iter = 1, 5
// u(2 : n - 1, 2 : n - 1) = &
// 0.25 * (u(2 : n - 1, 1 : n - 2) + u(2 : n - 1, 3 : n) + &
// u(1 : n - 2, 2 : n - 1) + u(3 : n, 2 : n - 1))
// print *, "iteration =", iter
// do i = 2, n - 1
// print "(10f7.3)", u(i, 2 : n - 1)
// enddo
// enddo
//
// end
#include <stdio.h>
#include "ad++.h"
#include "admacros.h"
const int n = 8 ;
void main(int argc, char* argv[]) {
AdlibInit(argc, argv) ;
Procs2 p(2, 2) ;
on(p) {
Range x(n, p.dim(0), BLK) ;
Range y(n, p.dim(1), BLK) ;
Array2<float> u(x, y) ;
where(x) {
where(y) {
if(x == 0 || x == n - 1 || y == 0 || y == n - 1)
u(x, y) = 1.0 ;
else
u(x, y) = 0.0 ;
} erewh(y) ;
} erewh(x) ;
Range xc = x.subrng(n - 2, 1) ;
Range yc = y.subrng(n - 2, 1) ;
Array2<float> uLC = u.sect(x.subrng(n - 2, 0), yc) ;
Array2<float> uRC = u.sect(x.subrng(n - 2, 2), yc) ;
Array2<float> uCL = u.sect(xc, y.subrng(n - 2, 0)) ;
Array2<float> uCR = u.sect(xc, y.subrng(n - 2, 2)) ;
Array2<float> tmp1(xc, yc), tmp2(xc, yc), tmp3(xc, yc), tmp4(xc, yc) ;
for(int iter = 1 ; iter <= 5 ; iter++) {
remap(tmp1, uLC) ;
remap(tmp2, uRC) ;
remap(tmp3, uCL) ;
remap(tmp4, uCR) ;
where(xc) {
where(yc) {
u(xc, yc) = 0.25 * (tmp1(xc, yc) + tmp2(xc, yc) +
tmp3(xc, yc) + tmp4(xc, yc)) ;
} erewh(yc) ;
} erewh(xc) ;
gprintf("iteration = %d\n", iter) ;
aprintf("%7.3f%*N", u, n) ;
}
} no(p) ;
AdlibFinalize() ;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?