code: public static void solveLTransB( 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 + j*m+i];
  //                for( int k=0; k<i; k++ ) {
  //                    sum -= L[offsetL + i*m+k]* b[offsetB + j*m+k];
  //                }
  //                b[offsetB + j*m+i] = sum / L[offsetL + i*m+i];
  //            }
  //        }
          for( int j = 0; j < n; j++ ) {
              for( int i = 0; i < m; i++ ) {
                  double sum = b[offsetB + j*m+i];
                  int l = offsetL+i*strideL;
                  int bb = offsetB +j*m;
                  int endL = l+i;
                  while( l != endL ) {
  //                for( int k=0; k<i; k++ ) {
                      sum -= L[l++]* b[bb++];
                  }
                  b[offsetB + j*m+i] = sum / L[offsetL + i*strideL+i];
              }
          }
      }
docs: <p>
  Solves for non-singular lower triangular matrices using forward substitution.
  <br>
  B<sup>T</sup> = L<sup>-1</sup>B<sup>T</sup><br>
  <br>
  where B is a (n by m) 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 n by m matrix. Modified.
  @param m size of the L matrix
  @param n number of columns in the B matrix.
  @param offsetL initial index in L where the matrix starts
  @param offsetB initial index in B where the matrix starts