/**
  * Receive as many items as possible from the given byte buffer to this buffer.
  *
  * <p>The <TT>receiveItems()</TT> method must not block the calling thread; if it does, all
  * message I/O in MP will be blocked.
  *
  * @param i Index of first item to receive, in the range 0 .. <TT>length</TT>-1.
  * @param num Maximum number of items to receive.
  * @param buffer Byte buffer.
  * @return Number of items received.
  */
 protected int receiveItems(int i, int num, ByteBuffer buffer) {
   LongBuffer longbuffer = buffer.asLongBuffer();
   int n = 0;
   int r = i / myColCount;
   int row = r * myRowStride + myLowerRow;
   int c = i % myColCount;
   int col = c * myColStride + myLowerCol;
   int ncols = Math.min(myColCount - c, longbuffer.remaining());
   while (r < myRowCount && ncols > 0) {
     long[] myMatrix_row = myMatrix[row];
     while (c < ncols) {
       myMatrix_row[col] = myOp.op(myMatrix_row[col], longbuffer.get());
       ++c;
       col += myColStride;
     }
     n += ncols;
     ++r;
     row += myRowStride;
     c = 0;
     col = myLowerCol;
     ncols = Math.min(myColCount, longbuffer.remaining());
   }
   buffer.position(buffer.position() + 8 * n);
   return n;
 }
 /**
  * Store the given item in this buffer.
  *
  * <p>The <TT>put()</TT> method must not block the calling thread; if it does, all message I/O in
  * MP will be blocked.
  *
  * @param i Item index in the range 0 .. <TT>length()</TT>-1.
  * @param item Item to be stored at index <TT>i</TT>.
  */
 public void put(int i, long item) {
   int row = (i / myColCount) * myRowStride + myLowerRow;
   int col = (i % myColCount) * myColStride + myLowerCol;
   myMatrix[row][col] = myOp.op(myMatrix[row][col], item);
 }