
 
 Purpose
 =======
 
        LA_GGGLM solves the general (Gauss-Markov) linear model (GLM) 
 problem:
      min ||y||2  subject to d=A*x + B*y
       x
 where A and B are real or complex rectangular matrices and d is a real
 or complex vector. Further, A is n by m, B is n by p, and d is n by 1,
 and it is assumed that m <= n <= m+p, rank(A) = m, rank(A, B) = n.
 These conditions ensure that the GLM problem has unique solution 
 vectors x and y. The problem is solved using the generalized QR 
 factorization of A and B.
        If matrix B is square and nonsingular, then the GLM problem is 
 equivalent to the weighted linear least squares problem
         min ||B^-1 * (d-A*x)||2 
 	   x
 
 =========
 
       SUBROUTINE LA_GGGLM( A, B, D, X, Y, INFO=info )
           <type>(<wp>), INTENT( INOUT ) :: A(:,:), B(:,:), D(:)
           <type>(<wp>), INTENT( OUT ) :: X(:), Y(:)
           INTEGER, INTENT(OUT), OPTIONAL :: INFO
       where
           <type> ::= REAL | COMPLEX
           <wp>   ::= KIND(1.0) | KIND(1.0D0)
 
 
 Arguments
 =========
 
 A     (input/output) REAL or COMPLEX array, shape (:,:) with 
       size(A,1) = n and size(A,2) = m.
       On entry, the matrix A.
       On exit, the contents of A are destroyed.
 B     (input/output) REAL or COMPLEX array, shape (:,:) with 
       size(B,1) = n and size(B,2) = p.
       On entry, the matrix B.
       On exit, the contents of B are destroyed.
 D     (input/output) REAL or COMPLEX array, shape (:) with 
       size(D) = n.
       On entry, the vector d.
       On exit, the contents of D are destroyed.
 X     (output) REAL or COMPLEX array, shape (:) with size(X) = m.
       The solution vector x.
 Y     (output) REAL or COMPLEX array, shape (:) with size(Y) = p.
       The solution vector y.
 INFO  Optional (output) INTEGER.
       = 0: successful exit
       < 0: if INFO = -i, the i-th argument had an illegal value.
       If INFO is not present and an error occurs, then the program is
       terminated with an error message.

