docs: public static double innerProdCol( int blockLength, DSubmatrixD1 A,
                                            int colA, int widthA,
                                            int colB, int widthB ) {
          double total = 0;
  
          final double data[] = A.original.data;
          // first column in the blocks
          final int colBlockA = A.col0 + colA - colA % blockLength;
          final int colBlockB = A.col0 + colB - colB % blockLength;
          colA = colA % blockLength;
          colB = colB % blockLength;
  
          // compute dot product down column vectors
          for( int i = A.row0; i < A.row1; i += blockLength ) {
  
              int height = Math.min( blockLength , A.row1 - i );
  
              int indexA = i*A.original.numCols + height*colBlockA + colA;
              int indexB = i*A.original.numCols + height*colBlockB + colB;
  
              if( i == A.row0 ) {
                  // handle leading zeros
                  indexA += widthA*(colA + 1);
                  indexB += widthB*colA;
  
                  // handle leading one
                  total = data[indexB];
  
                  indexB += widthB;
  
                  // standard vector dot product
                  int endA = indexA + (height - colA - 1)*widthA;
                  for( ; indexA != endA; indexA += widthA, indexB += widthB ) {
  //                    for( int k = col+1; k < height; k++ , indexU += width, indexA += width ) {
                      total += data[indexA] * data[indexB];
                  }
              } else {
                  // standard vector dot product
                  int endA = indexA + widthA*height;
  //                    for( int k = 0; k < height; k++ ) {
                  for( ; indexA != endA; indexA += widthA, indexB += widthB ) {
                      total += data[indexA] * data[indexB];
                  }
              }
          }
          return total;
      }