code: public static void solveL( double L[] , double []b ,
                                 int m , int n ,
                                 int strideL , int offsetL , int offsetB )
      {
          for( int j = 0; j < n; j++ ) {
              for( int i = 0; i < m; i++ ) {
                  double sum = b[offsetB + i*n+j];
                  for( int k=0; k<i; k++ ) {
                      sum -= L[offsetL + i*strideL+k]* b[offsetB + k*n+j];
                  }
                  b[offsetB + i*n+j] = sum / L[offsetL + i*strideL+i];
              }
          }
      }
docs: <p>
  Solves for non-singular lower triangular matrices using forward substitution.
  <br>
  B = L<sup>-1</sup>B<br>
  <br>
  where B is a (m by n) matrix, L is a lower triangular (m by m) matrix.
  </p>
  
  @param L An m by m non-singular lower triangular matrix. Not modified.
  @param b An m by n matrix. Modified.
  @param m size of the L matrix
  @param n number of columns in the B matrix.
  @param strideL number of elements that need to be added to go to the next row in L
  @param offsetL initial index in L where the matrix starts
  @param offsetB initial index in B where the matrix starts