Program zggrqf_example
! ZGGRQF Example Program Text
! Copyright 2017, Numerical Algorithms Group Ltd. http://www.nag.com
! .. Use Statements ..
Use blas_interfaces, Only: dznrm2, zgemv, ztrmv
Use lapack_interfaces, Only: zggrqf, ztrtrs, zunmqr, zunmrq
Use lapack_precision, Only: dp
! .. Implicit None Statement ..
Implicit None
! .. Parameters ..
Complex (Kind=dp), Parameter :: one = (1.0E0_dp, 0.0E0_dp)
Integer, Parameter :: nb = 64, nin = 5, nout = 6
! .. Local Scalars ..
Real (Kind=dp) :: rnorm
Integer :: i, info, lda, ldb, lwork, m, n, p
! .. Local Arrays ..
Complex (Kind=dp), Allocatable :: a(:, :), b(:, :), c(:), d(:), taua(:), &
taub(:), work(:), x(:)
! .. Intrinsic Procedures ..
Intrinsic :: min
! .. Executable Statements ..
Write (nout, *) 'ZGGRQF Example Program Results'
Write (nout, *)
! Skip heading in data file
Read (nin, *)
Read (nin, *) m, n, p
lda = m
ldb = p
lwork = nb*(p+n)
Allocate (a(lda,n), b(ldb,n), c(m), d(p), taua(n), taub(n), work(lwork), &
x(n))
! Read A, B, C and D from data file
Read (nin, *)(a(i,1:n), i=1, m)
Read (nin, *)(b(i,1:n), i=1, p)
Read (nin, *) c(1:m)
Read (nin, *) d(1:p)
! Compute the generalized RQ factorization of (B,A) as
! B = (0 T12)*Q, A = Z*(R11 R12)*Q, where T12 and R11
! ( 0 R22)
! are upper triangular
Call zggrqf(p, m, n, b, ldb, taub, a, lda, taua, work, lwork, info)
! Set Qx = y. The problem then reduces to:
! minimize (Ry - Z^Hc) subject to Ty = d
! Update c = Z^H*c -> minimize (Ry-c)
Call zunmqr('Left', 'Conjugate transpose', m, 1, min(m,n), a, lda, taua, &
c, m, work, lwork, info)
! Putting y = (y1), solve T12*w = d for w, storing result in d
! (w )
Call ztrtrs('Upper', 'No transpose', 'Non-unit', p, 1, b(1,n-p+1), ldb, &
d, p, info)
If (info>0) Then
Write (nout, *) 'The upper triangular factor of B is singular, '
Write (nout, *) 'the least squares solution could not be computed'
Go To 100
End If
! From first n-p rows of (Ry-c) we have
! R11*y1 + R12*w = c(1:n-p) = c1
! Form c1 = c1 - R12*w = R11*y1
Call zgemv('No transpose', n-p, p, -one, a(1,n-p+1), lda, d, 1, one, c, &
1)
! Solve R11*y1 = c1 for y1, storing result in c(1:n-p)
Call ztrtrs('Upper', 'No transpose', 'Non-unit', n-p, 1, a, lda, c, n-p, &
info)
If (info>0) Then
Write (nout, *) 'The upper triangular factor of A is singular, '
Write (nout, *) 'the least squares solution could not be computed'
Go To 100
End If
! Copy y into x (first y1, then w)
x(1:n-p) = c(1:n-p)
x(n-p+1:n) = d(1:p)
! Compute x = (Q**H)*y
Call zunmrq('Left', 'Conjugate transpose', n, 1, p, b, ldb, taub, x, n, &
work, lwork, info)
! The least squares solution is in x, the remainder here is to compute
! the residual, which equals c2 - R22*w.
! Upper triangular part of R22 first
Call ztrmv('Upper', 'No transpose', 'Non-unit', min(m,n)-n+p, &
a(n-p+1,n-p+1), lda, d, 1)
Do i = 1, min(m, n) - n + p
c(n-p+i) = c(n-p+i) - d(i)
End Do
If (m<n) Then
! Additional rectangular part of R22
Call zgemv('No transpose', m-n+p, n-m, -one, a(n-p+1,m+1), lda, &
d(m-n+p+1), 1, one, c(n-p+1), 1)
End If
! Compute norm of residual sum of squares.
rnorm = dznrm2(m-(n-p), c(n-p+1), 1)
! Print least squares solution x
Write (nout, *) 'Constrained least squares solution'
Write (nout, 110) x(1:n)
! Print estimate of the square root of the residual sum of
! squares
Write (nout, *)
Write (nout, *) 'Square root of the residual sum of squares'
Write (nout, 120) rnorm
100 Continue
110 Format (4(' (',F7.4,',',F7.4,')',:))
120 Format (1X, 1P, E10.2)
End Program