docs: @Override
      public void solve(DMatrixRBlock B, DMatrixRBlock X) {
          if( B.blockLength != blockLength )
              throw new IllegalArgumentException("Unexpected blocklength in B.");
  
          DSubmatrixD1 L = new DSubmatrixD1(decomposer.getT(null));
  
          if( X != null ) {
              if( X.blockLength != blockLength )
                  throw new IllegalArgumentException("Unexpected blocklength in X.");
              if( X.numRows != L.col1 ) throw new IllegalArgumentException("Not enough rows in X");
          }
          
          if( B.numRows != L.col1 ) throw new IllegalArgumentException("Not enough rows in B");
  
          //  L * L^T*X = B
  
          // Solve for Y:  L*Y = B
          TriangularSolver_DDRB.solve(blockLength,false,L,new DSubmatrixD1(B),false);
  
          // L^T * X = Y
          TriangularSolver_DDRB.solve(blockLength,false,L,new DSubmatrixD1(B),true);
  
          if( X != null ) {
              // copy the solution from B into X
              MatrixOps_DDRB.extractAligned(B,X);
          }
  
      }