package DPJBenchmarks; import java.util.Formatter; import DPJRuntime.ArrayDouble; /** * Vector operations */ public class Vector<region R> { static arrayclass Array<region R> { Vector<R> in R; } public final ArrayDouble<R> elts in R = new ArrayDouble<R>(Constants.NDIM); public void CLRV() writes R { for (int i = 0; i < Constants.NDIM; ++i) elts[i] = 0.0; } public void UNITV(int coord) writes R { for (int i = 0; i < Constants.NDIM; ++i) elts[i] = (coord == i) ? 1.0 : 0.0; } public <region Ru>void SETV(Vector<Ru> u) reads Ru writes R { for (int i = 0; i < Constants.NDIM; i++) elts[i] = u.elts[i]; } public <region Ru,Rw>void ADDV(Vector<Ru> u, Vector<Rw> w) reads Ru, Rw writes R { for (int i = 0; i < Constants.NDIM; ++i) elts[i] = u.elts[i] + w.elts[i]; } public <region Ru,Rw>void SUBV(Vector<Ru> u, Vector<Rw> w) reads R, Ru, Rw writes R { for (int i = 0; i < Constants.NDIM; i++) elts[i] = u.elts[i] - w.elts[i]; } /** * MULtiply Vector by Scalar */ public <region Ru>void MULVS(Vector<Ru> u, double s) reads Ru writes R { int i; for (i = 0; i < Constants.NDIM; i++) elts[i] = u.elts[i] * s; } public <region Ru>void DIVVS(Vector<Ru> u, double s) reads Ru writes R { int i; for (i = 0; i < Constants.NDIM; i++) elts[i] = u.elts[i] / s; } public <region Ru>double DOTVP(Vector<Ru> u) reads Ru writes R { int i; double s = 0.0; for (i = 0; i < Constants.NDIM; i++) s += elts[i] * u.elts[i]; return s; } public void ABSV(double s) reads R { double tmp; int i; tmp = 0.0; for (i = 0; i < Constants.NDIM; i++) tmp += elts[i] * elts[i]; s = Math.sqrt(tmp); } public <region Ru>void DISTV(double s, Vector<Ru> u) reads R, Ru { double tmp; int i; tmp = 0.0; for (i = 0; i < Constants.NDIM; i++) tmp += (u.elts[i]-elts[i]) * (u.elts[i]-elts[i]); s = Math.sqrt(tmp); } public <region Ru,Rw>void CROSSVP(Vector<Ru> u, Vector<Rw> w) reads Ru, Rw, Ru, Rw writes R { elts[0] = u.elts[1]*w.elts[2] - u.elts[2]*w.elts[1]; elts[1] = u.elts[2]*w.elts[0] - u.elts[0]*w.elts[2]; elts[2] = u.elts[0]*w.elts[1] - u.elts[1]*w.elts[0]; } public <region Ru>void INCADDV(Vector<Ru> u) reads Ru writes R { int i; for (i = 0; i < Constants.NDIM; i++) elts[i] += u.elts[i]; } public <region Ru>void INCSUBV(Vector<Ru> u) reads Ru writes R { int i; for (i = 0; i < Constants.NDIM; i++) elts[i] -= u.elts[i]; } public void INCMULVS(double s) writes R { int i; for (i = 0; i < Constants.NDIM; i++) elts[i] *= s; } public void INCDIVVS(double s) writes R { int i; for (i = 0; i < Constants.NDIM; i++) elts[i] /= s; } public void SETVS(double s) writes R { int i; for (i = 0; i < Constants.NDIM; i++) elts[i] = s; } public <region Ru>void ADDVS(Vector<Ru> u, double s) reads Ru writes R { int i; for (i = 0; i < Constants.NDIM; i++) elts[i] = u.elts[i] + s; } public String toString() { StringBuffer sb = new StringBuffer(); Formatter f = new Formatter(sb); sb.append("<"); f.format("%f", elts[0]); for (int i = 1; i < elts.length; ++i) { f.format(",%f", elts[i]); } sb.append(">"); return sb.toString(); } public <region Rv>boolean EQUAL(Vector<Rv> v) reads Rv, R { for (int i = 0; i < Constants.NDIM; ++i) if (elts[i] != v.elts[i]) return false; return true; } }