package x10; public class HeatTransferv1 { static final int n = 3; static final int epsilon = 1; //double epsilon = 1.0e-5; int BigD[][];// = new int[n+1][n+1]; int D[][];// = new int[n][n]; int LastRow[][];// = new int[1][n]; double A[][];// = new double[n+1][n+1]; double Temp[][];// = new double[n+1][n+1]; public HeatTransferv1(int n) { //for (int i=0; i<n; i++) { // LastRow[0][i] = i; //} //for (int j=0; j<n+1; j++) { // A[0][j] = 1.0; //} for (int i=1; i<n+1; i++) { for (int j=0; j<n+1; j++) { // A[i][j] = 0.0; } } } public static double stencil1(HeatTransferv1 s, int x, int y) { double aux = 0.0; if (x>0) aux += s.A[x-1][y]; if (y>0) aux += s.A[x][y-1]; if (x<n) aux += s.A[x+1][y]; if (y<n) aux += s.A[x][y+1]; return aux/4; } public static void run(HeatTransferv1 s,int n) { // I'm trying to have it working on int values , in order to // be easier for COSTA to get a ranking function for(int delta=100000; delta>0; delta--) { //do { Conc.finish_begin(); run1(s,n); Conc.finish_end(); double aux[] = new double[1]; aux[0] = 0.0; double B[][] = new double[n][n]; for (int i=0; i<n; i++) { Conc.async_begin(); run2(s,n); Conc.async_end(); run3(s,n,i,aux,B); } //delta = (int) (aux*100000); // this ensures termination, // but clearly alters the total task-level Conc.finish_begin(); run2(s,n); Conc.finish_end(); //} while (delta > epsilon); } } public static void run1(HeatTransferv1 s, int n) { for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { Conc.async_begin(); run11(s,n,i,j); Conc.async_end(); } } } public static void run11(HeatTransferv1 s, int n, int i, int j) { s.Temp[i][j] = stencil1(s,i,j); } public static void run2(HeatTransferv1 s, int n) { for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { Conc.async_begin(); run21(s,n,i,j); Conc.async_end(); } } } public static void run21(HeatTransferv1 s, int n, int i, int j) { s.A[i][j] = s.Temp[i][j]; } public static void run3(HeatTransferv1 s, int n, int i, double aux[], double B[][]) { for (int j=0; j<n; j++) { // // B[i][j] = ( s.A[i][j]>s.Temp[i][j] ? (s.A[i][j]-s.Temp[i][j]) : (s.Temp[i][j]-s.A[i][j]) ); Conc.async_begin(); mymax(aux,B[i][0]); Conc.async_end(); } } public static void mymax(double a[],double b) { if (a[0]<b) a[0] = b; } //public static void prettyPrintResult(HeatTransferv1 s) { //for ((i) in A.region.projection(0)) { // for ((j) in A.region.projection(1)) { // val pt = Point.make(i,j); // at (BigD(pt)) { // val tmp = A(pt); // at (Place.FIRST_PLACE) Console.OUT.printf("%1.4f ",tmp); // } // } // Console.OUT.println(); //} //} public static void main(String args[]) { int n = args.length; HeatTransferv1 s = new HeatTransferv1(n); run(s,n); //prettyPrintResult(s); } }