private int findClosest(ArrayDouble.D2 boundsForRun , double target) { double minDiff = Double.MAX_VALUE; int idxFound = -1; int n = boundsForRun.getShape()[0]; for (int i = 0; i < n; i++) { double midpoint = (boundsForRun.get(i,0) + boundsForRun.get(i,1))/2.0; double diff = Math.abs(midpoint - target); if (diff < minDiff) { minDiff = diff; idxFound = i; } } return idxFound; }
int[] shape = midy.getShape(); int ny = shape[0]; int nx = shape[1];
int[] shape = midy.getShape(); int ny = shape[0]; int nx = shape[1];
int[] shape = midy.getShape(); int ny = shape[0]; int nx = shape[1];
/** * Experimental: for WRF rotated (NMM "E") Grids * @param midx x coordinates of midpoints * @return x coordinates of edges with shape (ny+2, nx+1) */ static public ArrayDouble.D2 makeXEdgesRotated(ArrayDouble.D2 midx) { int[] shape = midx.getShape(); int ny = shape[0]; int nx = shape[1]; ArrayDouble.D2 edgex = new ArrayDouble.D2(ny+2, nx+1); // compute the interior rows for (int y=0; y<ny; y++) { for (int x=1; x<nx; x++) { double xval = (midx.get(y,x-1) + midx.get(y,x))/2; edgex.set(y+1, x, xval); } edgex.set(y+1, 0, midx.get(y,0) - (edgex.get(y+1,1) - midx.get(y,0))); edgex.set(y+1, nx, midx.get(y, nx-1) - (edgex.get(y+1,nx-1) - midx.get(y,nx-1))); } // compute the first row for (int x=0; x<nx; x++) { edgex.set(0, x, midx.get(0,x)); } // compute the last row for (int x=0; x<nx-1; x++) { edgex.set(ny+1, x, midx.get(ny-1,x)); } return edgex; }
int[] shape = midy.getShape(); int ny = shape[0]; int nx = shape[1];
/** * Normal case: do something reasonable in deciding on the edges when we have the midpoints of a 2D coordinate. * * @param midy y coordinates of midpoints * @return y coordinates of edges with shape (ny+1, nx+1) */ static public ArrayDouble.D2 makeYEdges(ArrayDouble.D2 midy) { int[] shape = midy.getShape(); int ny = shape[0]; int nx = shape[1]; ArrayDouble.D2 edgey = new ArrayDouble.D2(ny + 1, nx + 1); for (int y = 0; y < ny - 1; y++) { for (int x = 0; x < nx - 1; x++) { // the interior edges are the average of the 4 surrounding midpoints double xval = (midy.get(y, x) + midy.get(y, x + 1) + midy.get(y + 1, x) + midy.get(y + 1, x + 1)) / 4; edgey.set(y + 1, x + 1, xval); } // extrapolate to exterior points edgey.set(y + 1, 0, edgey.get(y + 1, 1) - (edgey.get(y + 1, 2) - edgey.get(y + 1, 1))); edgey.set(y + 1, nx, edgey.get(y + 1, nx - 1) + (edgey.get(y + 1, nx - 1) - edgey.get(y + 1, nx - 2))); } // extrapolate to the first and last row for (int x = 0; x < nx + 1; x++) { edgey.set(0, x, edgey.get(1, x) - (edgey.get(2, x) - edgey.get(1, x))); edgey.set(ny, x, edgey.get(ny - 1, x) + (edgey.get(ny - 1, x) - edgey.get(ny - 2, x))); } return edgey; }
/** * Normal case: do something reasonable in deciding on the edges when we have the midpoints of a 2D coordinate. * @param midx x coordinates of midpoints * @return x coordinates of edges with shape (ny+1, nx+1) */ static public ArrayDouble.D2 makeXEdges(ArrayDouble.D2 midx) { int[] shape = midx.getShape(); int ny = shape[0]; int nx = shape[1]; ArrayDouble.D2 edgex = new ArrayDouble.D2(ny+1, nx+1); for (int y=0; y<ny-1; y++) { for (int x=0; x<nx-1; x++) { // the interior edges are the average of the 4 surrounding midpoints double xval = (midx.get(y,x) + midx.get(y,x+1) + midx.get(y+1,x) + midx.get(y+1,x+1))/4; edgex.set(y+1, x+1, xval); } // extrapolate to exterior points edgex.set(y+1, 0, edgex.get(y+1,1) - (edgex.get(y+1,2) - edgex.get(y+1,1))); edgex.set(y+1, nx, edgex.get(y+1,nx-1) + (edgex.get(y+1,nx-1) - edgex.get(y+1,nx-2))); } // extrapolate to the first and last row for (int x=0; x<nx+1; x++) { edgex.set(0, x, edgex.get(1,x) - (edgex.get(2,x) - edgex.get(1,x))); edgex.set(ny, x, edgex.get(ny-1,x) + (edgex.get(ny-1,x) - edgex.get(ny-2,x))); } return edgex; }
/** * Experimental: for WRF rotated (NMM "E") Grids * * @param midx x coordinates of midpoints * @return x coordinates of edges with shape (ny+2, nx+1) */ static public ArrayDouble.D2 makeXEdgesRotated(ArrayDouble.D2 midx) { int[] shape = midx.getShape(); int ny = shape[0]; int nx = shape[1]; ArrayDouble.D2 edgex = new ArrayDouble.D2(ny + 2, nx + 1); // compute the interior rows for (int y = 0; y < ny; y++) { for (int x = 1; x < nx; x++) { double xval = (midx.get(y, x - 1) + midx.get(y, x)) / 2; edgex.set(y + 1, x, xval); } edgex.set(y + 1, 0, midx.get(y, 0) - (edgex.get(y + 1, 1) - midx.get(y, 0))); edgex.set(y + 1, nx, midx.get(y, nx - 1) - (edgex.get(y + 1, nx - 1) - midx.get(y, nx - 1))); } // compute the first row for (int x = 0; x < nx; x++) { edgex.set(0, x, midx.get(0, x)); } // compute the last row for (int x = 0; x < nx - 1; x++) { edgex.set(ny + 1, x, midx.get(ny - 1, x)); } return edgex; }
/** * Experimental: for WRF rotated (NMM "E") Grids * * @param midx x coordinates of midpoints * @return x coordinates of edges with shape (ny+2, nx+1) */ static public ArrayDouble.D2 makeXEdgesRotated(ArrayDouble.D2 midx) { int[] shape = midx.getShape(); int ny = shape[0]; int nx = shape[1]; ArrayDouble.D2 edgex = new ArrayDouble.D2(ny + 2, nx + 1); // compute the interior rows for (int y = 0; y < ny; y++) { for (int x = 1; x < nx; x++) { double xval = (midx.get(y, x - 1) + midx.get(y, x)) / 2; edgex.set(y + 1, x, xval); } edgex.set(y + 1, 0, midx.get(y, 0) - (edgex.get(y + 1, 1) - midx.get(y, 0))); edgex.set(y + 1, nx, midx.get(y, nx - 1) - (edgex.get(y + 1, nx - 1) - midx.get(y, nx - 1))); } // compute the first row for (int x = 0; x < nx; x++) { edgex.set(0, x, midx.get(0, x)); } // compute the last row for (int x = 0; x < nx - 1; x++) { edgex.set(ny + 1, x, midx.get(ny - 1, x)); } return edgex; }
/** * Normal case: do something reasonable in deciding on the edges when we have the midpoints of a 2D coordinate. * * @param midx x coordinates of midpoints * @return x coordinates of edges with shape (ny+1, nx+1) */ static public ArrayDouble.D2 makeXEdges(ArrayDouble.D2 midx) { int[] shape = midx.getShape(); int ny = shape[0]; int nx = shape[1]; ArrayDouble.D2 edgex = new ArrayDouble.D2(ny + 1, nx + 1); for (int y = 0; y < ny - 1; y++) { for (int x = 0; x < nx - 1; x++) { // the interior edges are the average of the 4 surrounding midpoints double xval = (midx.get(y, x) + midx.get(y, x + 1) + midx.get(y + 1, x) + midx.get(y + 1, x + 1)) / 4; edgex.set(y + 1, x + 1, xval); } // extrapolate to exterior points edgex.set(y + 1, 0, edgex.get(y + 1, 1) - (edgex.get(y + 1, 2) - edgex.get(y + 1, 1))); edgex.set(y + 1, nx, edgex.get(y + 1, nx - 1) + (edgex.get(y + 1, nx - 1) - edgex.get(y + 1, nx - 2))); } // extrapolate to the first and last row for (int x = 0; x < nx + 1; x++) { edgex.set(0, x, edgex.get(1, x) - (edgex.get(2, x) - edgex.get(1, x))); edgex.set(ny, x, edgex.get(ny - 1, x) + (edgex.get(ny - 1, x) - edgex.get(ny - 2, x))); } return edgex; }
/** * Normal case: do something reasonable in deciding on the edges when we have the midpoints of a 2D coordinate. * * @param midpoints values of midpoints with shape (ny, nx) * @return values of edges with shape (ny+1, nx+1) */ static public ArrayDouble.D2 makeEdges(ArrayDouble.D2 midpoints) { int[] shape = midpoints.getShape(); int ny = shape[0]; int nx = shape[1]; ArrayDouble.D2 edge = new ArrayDouble.D2(ny + 1, nx + 1); for (int y = 0; y < ny - 1; y++) { for (int x = 0; x < nx - 1; x++) { // the interior edges are the average of the 4 surrounding midpoints double xval = (midpoints.get(y, x) + midpoints.get(y, x + 1) + midpoints.get(y + 1, x) + midpoints.get(y + 1, x + 1)) / 4; edge.set(y + 1, x + 1, xval); } // extrapolate to exterior points edge.set(y + 1, 0, edge.get(y + 1, 1) - (edge.get(y + 1, 2) - edge.get(y + 1, 1))); edge.set(y + 1, nx, edge.get(y + 1, nx - 1) + (edge.get(y + 1, nx - 1) - edge.get(y + 1, nx - 2))); } // extrapolate to the first and last row for (int x = 0; x < nx + 1; x++) { edge.set(0, x, edge.get(1, x) - (edge.get(2, x) - edge.get(1, x))); edge.set(ny, x, edge.get(ny - 1, x) + (edge.get(ny - 1, x) - edge.get(ny - 2, x))); } return edge; }
private void makeConnectedLon(ArrayDouble.D2 mid) { int[] shape = mid.getShape(); int ny = shape[0]; int nx = shape[1]; // first row double connect = mid.get(0, 0); for (int i = 1; i < nx; i++) { connect = connectLon(connect, mid.get(0, i)); mid.set(0, i, connect); } // other rows for (int j = 1; j < ny; j++) { connect = mid.get(j - 1, 0); for (int i = 0; i < nx; i++) { connect = connectLon(connect, mid.get(j, i)); mid.set(j, i, connect); } } }
private void makeConnectedLon(ArrayDouble.D2 mid) { int[] shape = mid.getShape(); int ny = shape[0]; int nx = shape[1]; // first row double connect = mid.get(0, 0); for (int i = 1; i < nx; i++) { connect = connectLon(connect, mid.get(0, i)); mid.set(0, i, connect); } // other rows for (int j = 1; j < ny; j++) { connect = mid.get(j - 1, 0); for (int i = 0; i < nx; i++) { connect = connectLon(connect, mid.get(j, i)); mid.set(j, i, connect); } } }
private void makeConnectedLon(ArrayDouble.D2 mid) { int[] shape = mid.getShape(); int ny = shape[0]; int nx = shape[1]; // first row double connect = mid.get(0, 0); for (int i = 1; i < nx; i++) { connect = connectLon(connect, mid.get(0,i)); mid.set(0,i,connect); } // other rows for (int j = 1; j <ny; j++) { connect = mid.get(j-1, 0); for (int i = 0; i < nx; i++) { connect = connectLon(connect, mid.get(j,i)); mid.set(j,i,connect); } } }
private int findSingleHit(ArrayDouble.D2 boundsForRun, double target) { int hits = 0; int idxFound = -1; int n = boundsForRun.getShape()[0]; for (int i = 0; i < n; i++) { if (contains(target, boundsForRun.get(i,0), boundsForRun.get(i,1))) { hits++; idxFound = i; } } if (hits == 1) return idxFound; if (hits == 0) return -1; return -hits; }