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;
  }
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 ) ; 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 ) ) ) ; } for ( int x = 0 ; x < nx ; x ++ ) { edgex . set ( 0 , x , midx . get ( 0 , x ) ) ; } 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)