public class PR499 { public static void main(String[] args) { double [2d] G = new double [0 : 4, 0 : 4]; String s1, s2; foreach (p in G.domain()) G[p] = p[1] * 100 + p[2]; s1 = execute1(0.5, G, 1); System.out.println(s1); foreach (p in G.domain()) G[p] = p[1] * 100 + p[2]; s2 = execute2(0.5, G, 1); System.out.println(s1.equals(s2) ? "ok" : s2); } public static final String execute1(double omega, double [2d] G, int num_iterations) { String result = ""; int M = G.slice(1, 1).domain().size(); // row number int N = G.slice(2, 1).domain().size(); // column number double omega_over_four = omega * 0.25; double one_minus_omega = 1.0 - omega; // update interior points int Mm1 = M-1; int Nm1 = N-1; foreach (q in [0 : num_iterations - 1]) { // constructing redbox array // redodd starts at (1,1), redeven starts at (2,2) Domain <2> redodd = [1:M-2:2, 1:N-2:2]; Domain <2> redeven = [2:M-2:2,2:N-2:2]; Domain <2> red = redodd + redeven; Point<2> right=[0,1], up=[1,0], left=[0,-1], down=[-1,0]; //update red elements foreach (p in red) { G[p] = omega_over_four * (G[p+down] + G[p+up] + G[p+left] + G[p+right]) + one_minus_omega * G[p]; result += " " + G[p]; } } return result; } public static final String execute2(double omega, double [2d] G, int num_iterations) { String result = ""; int M = G.slice(1, 1).domain().size(); // row number int N = G.slice(2, 1).domain().size(); // column number double omega_over_four = omega * 0.25; double one_minus_omega = 1.0 - omega; // update interior points int Mm1 = M-1; int Nm1 = N-1; for (int q = 0; q < num_iterations; q++) { // constructing redbox array // redodd starts at (1,1), redeven starts at (2,2) Domain <2> redodd = [1:M-2:2, 1:N-2:2]; Domain <2> redeven = [2:M-2:2,2:N-2:2]; Domain <2> red = redodd + redeven; Point<2> right=[0,1], up=[1,0], left=[0,-1], down=[-1,0]; //update red elements foreach (p in red) { G[p] = omega_over_four * (G[p+down] + G[p+up] + G[p+left] + G[p+right]) + one_minus_omega * G[p]; result += " " + G[p]; } } return result; } }