docs: public static void copyTriangle(boolean upper , DMatrixRBlock src , DMatrixRBlock dst )
      {
          if( src.blockLength != dst.blockLength )
              throw new IllegalArgumentException("Block size is different");
          if( src.numRows < dst.numRows )
              throw new IllegalArgumentException("The src has fewer rows than dst");
          if( src.numCols < dst.numCols )
              throw new IllegalArgumentException("The src has fewer columns than dst");
  
          int blockLength = src.blockLength;
  
          int numRows = Math.min(src.numRows,dst.numRows);
          int numCols = Math.min(src.numCols,dst.numCols);
  
          if( upper ) {
              for( int i = 0; i < numRows; i += blockLength ) {
                  int heightSrc = Math.min(blockLength,src.numRows-i);
                  int heightDst = Math.min(blockLength,dst.numRows-i);
  
                  for( int j = i; j < numCols; j += blockLength ) {
                      int widthSrc = Math.min(blockLength,src.numCols-j);
                      int widthDst = Math.min(blockLength,dst.numCols-j);
  
                      int indexSrc = i*src.numCols + heightSrc*j;
                      int indexDst = i*dst.numCols + heightDst*j;
  
                      if( j == i ) {
                          for( int k = 0; k < heightDst; k++ ) {
                              for( int l = k; l < widthDst; l++ ) {
                                  dst.data[indexDst + widthDst*k+l ] = src.data[indexSrc + widthSrc*k+l ];
                              }
                          }
                      } else {
                          for( int k = 0; k < heightDst; k++ ) {
                              System.arraycopy(src.data, indexSrc + widthSrc * k, dst.data, indexDst + widthDst * k, widthDst);
                          }
                      }
                  }
              }
          } else {
              for( int i = 0; i < numRows; i += blockLength ) {
                  int heightSrc = Math.min(blockLength,src.numRows-i);
                  int heightDst = Math.min(blockLength,dst.numRows-i);
  
                  for( int j = 0; j <= i; j += blockLength ) {
                      int widthSrc = Math.min(blockLength,src.numCols-j);
                      int widthDst = Math.min(blockLength,dst.numCols-j);
  
                      int indexSrc = i*src.numCols + heightSrc*j;
                      int indexDst = i*dst.numCols + heightDst*j;
  
                      if( j == i ) {
                          for( int k = 0; k < heightDst; k++ ) {
                              int z = Math.min(k+1,widthDst);
                              for( int l = 0; l < z; l++ ) {
                                  dst.data[indexDst + widthDst*k+l ] = src.data[indexSrc + widthSrc*k+l ];
                              }
                          }
                      } else {
                          for( int k = 0; k < heightDst; k++ ) {
                              System.arraycopy(src.data, indexSrc + widthSrc * k, dst.data, indexDst + widthDst * k, widthDst);
                          }
                      }
                  }
              }
          }
      }