subroutine schmd(v, m, n, ldv, x)
use, intrinsic :: iso_fortran_env, only: real64
use messages, only: show_message, WITH_ABORT
implicit none
integer, intent(IN) :: ldv, m, n
real(real64), intent(INOUT) :: v(ldv, n), x(n)
real(real64), allocatable :: work(:)
integer :: lwork
integer :: info
real(real64) :: wrksize(1)
if (M > N) then
call show_message("SCHMD: M > N", WITH_ABORT)
end if
if (N > LDV) then
call show_message("SCHMD: N > LDV", WITH_ABORT)
end if
! Householder QR-based version using LAPACK:
call dgeqrf(n, m, v, ldv, x, wrksize, -1, info)
lwork = max(int(wrksize(1)), n)
allocate (work(lwork))
call dgeqrf(n, m, v, ldv, x, work, lwork, info)
call dorgqr(n, n, m, v, ldv, x, work, lwork, info)
end subroutine schmd