stdlib_lapack_blas_like_mnorm.fypp Source File


Source Code

#:include "common.fypp" 
submodule(stdlib_lapack_base) stdlib_lapack_blas_like_mnorm
  implicit none


  contains
#:for ik,it,ii in LINALG_INT_KINDS_TYPES

     real(sp) module function stdlib${ii}$_slange( norm, m, n, a, lda, work )
     !! SLANGE returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! real matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_sp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: lda, m, n
           ! Array Arguments 
           real(sp), intent(in) :: a(lda,*)
           real(sp), intent(out) :: work(*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j
           real(sp) :: scale, sum, value, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( min( m, n )==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = 1, m
                    temp = abs( a( i, j ) )
                    if( value<temp .or. stdlib${ii}$_sisnan( temp ) ) value = temp
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = 1, m
                    sum = sum + abs( a( i, j ) )
                 end do
                 if( value<sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, m
                 work( i ) = zero
              end do
              do j = 1, n
                 do i = 1, m
                    work( i ) = work( i ) + abs( a( i, j ) )
                 end do
              end do
              value = zero
              do i = 1, m
                 temp = work( i )
                 if( value<temp .or. stdlib${ii}$_sisnan( temp ) ) value = temp
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 call stdlib${ii}$_slassq( m, a( 1_${ik}$, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_slange = value
           return
     end function stdlib${ii}$_slange

     real(dp) module function stdlib${ii}$_dlange( norm, m, n, a, lda, work )
     !! DLANGE returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! real matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_dp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: lda, m, n
           ! Array Arguments 
           real(dp), intent(in) :: a(lda,*)
           real(dp), intent(out) :: work(*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j
           real(dp) :: scale, sum, value, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( min( m, n )==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = 1, m
                    temp = abs( a( i, j ) )
                    if( value<temp .or. stdlib${ii}$_disnan( temp ) ) value = temp
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = 1, m
                    sum = sum + abs( a( i, j ) )
                 end do
                 if( value<sum .or. stdlib${ii}$_disnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, m
                 work( i ) = zero
              end do
              do j = 1, n
                 do i = 1, m
                    work( i ) = work( i ) + abs( a( i, j ) )
                 end do
              end do
              value = zero
              do i = 1, m
                 temp = work( i )
                 if( value<temp .or. stdlib${ii}$_disnan( temp ) ) value = temp
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 call stdlib${ii}$_dlassq( m, a( 1_${ik}$, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_dlange = value
           return
     end function stdlib${ii}$_dlange

#:for rk,rt,ri in REAL_KINDS_TYPES
#:if not rk in ["sp","dp"]
     real(${rk}$) module function stdlib${ii}$_${ri}$lange( norm, m, n, a, lda, work )
     !! DLANGE:  returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! real matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_${rk}$, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: lda, m, n
           ! Array Arguments 
           real(${rk}$), intent(in) :: a(lda,*)
           real(${rk}$), intent(out) :: work(*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j
           real(${rk}$) :: scale, sum, value, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( min( m, n )==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = 1, m
                    temp = abs( a( i, j ) )
                    if( value<temp .or. stdlib${ii}$_${ri}$isnan( temp ) ) value = temp
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = 1, m
                    sum = sum + abs( a( i, j ) )
                 end do
                 if( value<sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, m
                 work( i ) = zero
              end do
              do j = 1, n
                 do i = 1, m
                    work( i ) = work( i ) + abs( a( i, j ) )
                 end do
              end do
              value = zero
              do i = 1, m
                 temp = work( i )
                 if( value<temp .or. stdlib${ii}$_${ri}$isnan( temp ) ) value = temp
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 call stdlib${ii}$_${ri}$lassq( m, a( 1_${ik}$, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_${ri}$lange = value
           return
     end function stdlib${ii}$_${ri}$lange

#:endif
#:endfor

     real(sp) module function stdlib${ii}$_clange( norm, m, n, a, lda, work )
     !! CLANGE returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! complex matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_sp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: lda, m, n
           ! Array Arguments 
           real(sp), intent(out) :: work(*)
           complex(sp), intent(in) :: a(lda,*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j
           real(sp) :: scale, sum, value, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( min( m, n )==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = 1, m
                    temp = abs( a( i, j ) )
                    if( value<temp .or. stdlib${ii}$_sisnan( temp ) ) value = temp
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = 1, m
                    sum = sum + abs( a( i, j ) )
                 end do
                 if( value<sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, m
                 work( i ) = zero
              end do
              do j = 1, n
                 do i = 1, m
                    work( i ) = work( i ) + abs( a( i, j ) )
                 end do
              end do
              value = zero
              do i = 1, m
                 temp = work( i )
                 if( value<temp .or. stdlib${ii}$_sisnan( temp ) ) value = temp
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 call stdlib${ii}$_classq( m, a( 1_${ik}$, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_clange = value
           return
     end function stdlib${ii}$_clange

     real(dp) module function stdlib${ii}$_zlange( norm, m, n, a, lda, work )
     !! ZLANGE returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! complex matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_dp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: lda, m, n
           ! Array Arguments 
           real(dp), intent(out) :: work(*)
           complex(dp), intent(in) :: a(lda,*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j
           real(dp) :: scale, sum, value, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( min( m, n )==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = 1, m
                    temp = abs( a( i, j ) )
                    if( value<temp .or. stdlib${ii}$_disnan( temp ) ) value = temp
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = 1, m
                    sum = sum + abs( a( i, j ) )
                 end do
                 if( value<sum .or. stdlib${ii}$_disnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, m
                 work( i ) = zero
              end do
              do j = 1, n
                 do i = 1, m
                    work( i ) = work( i ) + abs( a( i, j ) )
                 end do
              end do
              value = zero
              do i = 1, m
                 temp = work( i )
                 if( value<temp .or. stdlib${ii}$_disnan( temp ) ) value = temp
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 call stdlib${ii}$_zlassq( m, a( 1_${ik}$, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_zlange = value
           return
     end function stdlib${ii}$_zlange

#:for ck,ct,ci in CMPLX_KINDS_TYPES
#:if not ck in ["sp","dp"]
     real(${ck}$) module function stdlib${ii}$_${ci}$lange( norm, m, n, a, lda, work )
     !! ZLANGE:  returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! complex matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_${ck}$, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: lda, m, n
           ! Array Arguments 
           real(${ck}$), intent(out) :: work(*)
           complex(${ck}$), intent(in) :: a(lda,*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j
           real(${ck}$) :: scale, sum, value, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( min( m, n )==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = 1, m
                    temp = abs( a( i, j ) )
                    if( value<temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) ) value = temp
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = 1, m
                    sum = sum + abs( a( i, j ) )
                 end do
                 if( value<sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, m
                 work( i ) = zero
              end do
              do j = 1, n
                 do i = 1, m
                    work( i ) = work( i ) + abs( a( i, j ) )
                 end do
              end do
              value = zero
              do i = 1, m
                 temp = work( i )
                 if( value<temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) ) value = temp
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 call stdlib${ii}$_${ci}$lassq( m, a( 1_${ik}$, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_${ci}$lange = value
           return
     end function stdlib${ii}$_${ci}$lange

#:endif
#:endfor



     real(sp) module function stdlib${ii}$_slangb( norm, n, kl, ku, ab, ldab,work )
     !! SLANGB returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the element of  largest absolute value  of an
     !! n by n band matrix  A,  with kl sub-diagonals and ku super-diagonals.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_sp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: kl, ku, ldab, n
           ! Array Arguments 
           real(sp), intent(in) :: ab(ldab,*)
           real(sp), intent(out) :: work(*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j, k, l
           real(sp) :: scale, sum, value, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = max( ku+2-j, 1 ), min( n+ku+1-j, kl+ku+1 )
                    temp = abs( ab( i, j ) )
                    if( value<temp .or. stdlib${ii}$_sisnan( temp ) ) value = temp
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = max( ku+2-j, 1 ), min( n+ku+1-j, kl+ku+1 )
                    sum = sum + abs( ab( i, j ) )
                 end do
                 if( value<sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, n
                 work( i ) = zero
              end do
              do j = 1, n
                 k = ku + 1_${ik}$ - j
                 do i = max( 1, j-ku ), min( n, j+kl )
                    work( i ) = work( i ) + abs( ab( k+i, j ) )
                 end do
              end do
              value = zero
              do i = 1, n
                 temp = work( i )
                 if( value<temp .or. stdlib${ii}$_sisnan( temp ) ) value = temp
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 l = max( 1_${ik}$, j-ku )
                 k = ku + 1_${ik}$ - j + l
                 call stdlib${ii}$_slassq( min( n, j+kl )-l+1, ab( k, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_slangb = value
           return
     end function stdlib${ii}$_slangb

     real(dp) module function stdlib${ii}$_dlangb( norm, n, kl, ku, ab, ldab,work )
     !! DLANGB returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the element of  largest absolute value  of an
     !! n by n band matrix  A,  with kl sub-diagonals and ku super-diagonals.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_dp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: kl, ku, ldab, n
           ! Array Arguments 
           real(dp), intent(in) :: ab(ldab,*)
           real(dp), intent(out) :: work(*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j, k, l
           real(dp) :: scale, sum, value, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = max( ku+2-j, 1 ), min( n+ku+1-j, kl+ku+1 )
                    temp = abs( ab( i, j ) )
                    if( value<temp .or. stdlib${ii}$_disnan( temp ) ) value = temp
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = max( ku+2-j, 1 ), min( n+ku+1-j, kl+ku+1 )
                    sum = sum + abs( ab( i, j ) )
                 end do
                 if( value<sum .or. stdlib${ii}$_disnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, n
                 work( i ) = zero
              end do
              do j = 1, n
                 k = ku + 1_${ik}$ - j
                 do i = max( 1, j-ku ), min( n, j+kl )
                    work( i ) = work( i ) + abs( ab( k+i, j ) )
                 end do
              end do
              value = zero
              do i = 1, n
                 temp = work( i )
                 if( value<temp .or. stdlib${ii}$_disnan( temp ) ) value = temp
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 l = max( 1_${ik}$, j-ku )
                 k = ku + 1_${ik}$ - j + l
                 call stdlib${ii}$_dlassq( min( n, j+kl )-l+1, ab( k, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_dlangb = value
           return
     end function stdlib${ii}$_dlangb

#:for rk,rt,ri in REAL_KINDS_TYPES
#:if not rk in ["sp","dp"]
     real(${rk}$) module function stdlib${ii}$_${ri}$langb( norm, n, kl, ku, ab, ldab,work )
     !! DLANGB:  returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the element of  largest absolute value  of an
     !! n by n band matrix  A,  with kl sub-diagonals and ku super-diagonals.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_${rk}$, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: kl, ku, ldab, n
           ! Array Arguments 
           real(${rk}$), intent(in) :: ab(ldab,*)
           real(${rk}$), intent(out) :: work(*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j, k, l
           real(${rk}$) :: scale, sum, value, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = max( ku+2-j, 1 ), min( n+ku+1-j, kl+ku+1 )
                    temp = abs( ab( i, j ) )
                    if( value<temp .or. stdlib${ii}$_${ri}$isnan( temp ) ) value = temp
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = max( ku+2-j, 1 ), min( n+ku+1-j, kl+ku+1 )
                    sum = sum + abs( ab( i, j ) )
                 end do
                 if( value<sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, n
                 work( i ) = zero
              end do
              do j = 1, n
                 k = ku + 1_${ik}$ - j
                 do i = max( 1, j-ku ), min( n, j+kl )
                    work( i ) = work( i ) + abs( ab( k+i, j ) )
                 end do
              end do
              value = zero
              do i = 1, n
                 temp = work( i )
                 if( value<temp .or. stdlib${ii}$_${ri}$isnan( temp ) ) value = temp
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 l = max( 1_${ik}$, j-ku )
                 k = ku + 1_${ik}$ - j + l
                 call stdlib${ii}$_${ri}$lassq( min( n, j+kl )-l+1, ab( k, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_${ri}$langb = value
           return
     end function stdlib${ii}$_${ri}$langb

#:endif
#:endfor

     real(sp) module function stdlib${ii}$_clangb( norm, n, kl, ku, ab, ldab,work )
     !! CLANGB returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the element of  largest absolute value  of an
     !! n by n band matrix  A,  with kl sub-diagonals and ku super-diagonals.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_sp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: kl, ku, ldab, n
           ! Array Arguments 
           real(sp), intent(out) :: work(*)
           complex(sp), intent(in) :: ab(ldab,*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j, k, l
           real(sp) :: scale, sum, value, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = max( ku+2-j, 1 ), min( n+ku+1-j, kl+ku+1 )
                    temp = abs( ab( i, j ) )
                    if( value<temp .or. stdlib${ii}$_sisnan( temp ) ) value = temp
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = max( ku+2-j, 1 ), min( n+ku+1-j, kl+ku+1 )
                    sum = sum + abs( ab( i, j ) )
                 end do
                 if( value<sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, n
                 work( i ) = zero
              end do
              do j = 1, n
                 k = ku + 1_${ik}$ - j
                 do i = max( 1, j-ku ), min( n, j+kl )
                    work( i ) = work( i ) + abs( ab( k+i, j ) )
                 end do
              end do
              value = zero
              do i = 1, n
                 temp = work( i )
                 if( value<temp .or. stdlib${ii}$_sisnan( temp ) ) value = temp
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 l = max( 1_${ik}$, j-ku )
                 k = ku + 1_${ik}$ - j + l
                 call stdlib${ii}$_classq( min( n, j+kl )-l+1, ab( k, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_clangb = value
           return
     end function stdlib${ii}$_clangb

     real(dp) module function stdlib${ii}$_zlangb( norm, n, kl, ku, ab, ldab,work )
     !! ZLANGB returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the element of  largest absolute value  of an
     !! n by n band matrix  A,  with kl sub-diagonals and ku super-diagonals.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_dp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: kl, ku, ldab, n
           ! Array Arguments 
           real(dp), intent(out) :: work(*)
           complex(dp), intent(in) :: ab(ldab,*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j, k, l
           real(dp) :: scale, sum, value, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = max( ku+2-j, 1 ), min( n+ku+1-j, kl+ku+1 )
                    temp = abs( ab( i, j ) )
                    if( value<temp .or. stdlib${ii}$_disnan( temp ) ) value = temp
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = max( ku+2-j, 1 ), min( n+ku+1-j, kl+ku+1 )
                    sum = sum + abs( ab( i, j ) )
                 end do
                 if( value<sum .or. stdlib${ii}$_disnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, n
                 work( i ) = zero
              end do
              do j = 1, n
                 k = ku + 1_${ik}$ - j
                 do i = max( 1, j-ku ), min( n, j+kl )
                    work( i ) = work( i ) + abs( ab( k+i, j ) )
                 end do
              end do
              value = zero
              do i = 1, n
                 temp = work( i )
                 if( value<temp .or. stdlib${ii}$_disnan( temp ) ) value = temp
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 l = max( 1_${ik}$, j-ku )
                 k = ku + 1_${ik}$ - j + l
                 call stdlib${ii}$_zlassq( min( n, j+kl )-l+1, ab( k, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_zlangb = value
           return
     end function stdlib${ii}$_zlangb

#:for ck,ct,ci in CMPLX_KINDS_TYPES
#:if not ck in ["sp","dp"]
     real(${ck}$) module function stdlib${ii}$_${ci}$langb( norm, n, kl, ku, ab, ldab,work )
     !! ZLANGB:  returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the element of  largest absolute value  of an
     !! n by n band matrix  A,  with kl sub-diagonals and ku super-diagonals.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_${ck}$, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: kl, ku, ldab, n
           ! Array Arguments 
           real(${ck}$), intent(out) :: work(*)
           complex(${ck}$), intent(in) :: ab(ldab,*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j, k, l
           real(${ck}$) :: scale, sum, value, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = max( ku+2-j, 1 ), min( n+ku+1-j, kl+ku+1 )
                    temp = abs( ab( i, j ) )
                    if( value<temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) ) value = temp
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = max( ku+2-j, 1 ), min( n+ku+1-j, kl+ku+1 )
                    sum = sum + abs( ab( i, j ) )
                 end do
                 if( value<sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, n
                 work( i ) = zero
              end do
              do j = 1, n
                 k = ku + 1_${ik}$ - j
                 do i = max( 1, j-ku ), min( n, j+kl )
                    work( i ) = work( i ) + abs( ab( k+i, j ) )
                 end do
              end do
              value = zero
              do i = 1, n
                 temp = work( i )
                 if( value<temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) ) value = temp
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 l = max( 1_${ik}$, j-ku )
                 k = ku + 1_${ik}$ - j + l
                 call stdlib${ii}$_${ci}$lassq( min( n, j+kl )-l+1, ab( k, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_${ci}$langb = value
           return
     end function stdlib${ii}$_${ci}$langb

#:endif
#:endfor



     pure real(sp) module function stdlib${ii}$_slangt( norm, n, dl, d, du )
     !! SLANGT returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! real tridiagonal matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_sp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: n
           ! Array Arguments 
           real(sp), intent(in) :: d(*), dl(*), du(*)
        ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i
           real(sp) :: anorm, scale, sum, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n<=0_${ik}$ ) then
              anorm = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              anorm = abs( d( n ) )
              do i = 1, n - 1
                 if( anorm<abs( dl( i ) ) .or. stdlib${ii}$_sisnan( abs( dl( i ) ) ) )anorm = abs(dl(i))
                           
                 if( anorm<abs( d( i ) ) .or. stdlib${ii}$_sisnan( abs( d( i ) ) ) )anorm = abs(d(i))
                           
                 if( anorm<abs( du( i ) ) .or. stdlib${ii}$_sisnan (abs( du( i ) ) ) )anorm = abs(du(i))
                           
              end do
           else if( stdlib_lsame( norm, 'O' ) .or. norm=='1' ) then
              ! find norm1(a).
              if( n==1_${ik}$ ) then
                 anorm = abs( d( 1_${ik}$ ) )
              else
                 anorm = abs( d( 1_${ik}$ ) )+abs( dl( 1_${ik}$ ) )
                 temp = abs( d( n ) )+abs( du( n-1 ) )
                 if( anorm < temp .or. stdlib${ii}$_sisnan( temp ) ) anorm = temp
                 do i = 2, n - 1
                    temp = abs( d( i ) )+abs( dl( i ) )+abs( du( i-1 ) )
                    if( anorm < temp .or. stdlib${ii}$_sisnan( temp ) ) anorm = temp
                 end do
              end if
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              if( n==1_${ik}$ ) then
                 anorm = abs( d( 1_${ik}$ ) )
              else
                 anorm = abs( d( 1_${ik}$ ) )+abs( du( 1_${ik}$ ) )
                 temp = abs( d( n ) )+abs( dl( n-1 ) )
                 if( anorm < temp .or. stdlib${ii}$_sisnan( temp ) ) anorm = temp
                 do i = 2, n - 1
                    temp = abs( d( i ) )+abs( du( i ) )+abs( dl( i-1 ) )
                    if( anorm < temp .or. stdlib${ii}$_sisnan( temp ) ) anorm = temp
                 end do
              end if
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              call stdlib${ii}$_slassq( n, d, 1_${ik}$, scale, sum )
              if( n>1_${ik}$ ) then
                 call stdlib${ii}$_slassq( n-1, dl, 1_${ik}$, scale, sum )
                 call stdlib${ii}$_slassq( n-1, du, 1_${ik}$, scale, sum )
              end if
              anorm = scale*sqrt( sum )
           end if
           stdlib${ii}$_slangt = anorm
           return
     end function stdlib${ii}$_slangt

     pure real(dp) module function stdlib${ii}$_dlangt( norm, n, dl, d, du )
     !! DLANGT returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! real tridiagonal matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_dp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: n
           ! Array Arguments 
           real(dp), intent(in) :: d(*), dl(*), du(*)
        ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i
           real(dp) :: anorm, scale, sum, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n<=0_${ik}$ ) then
              anorm = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              anorm = abs( d( n ) )
              do i = 1, n - 1
                 if( anorm<abs( dl( i ) ) .or. stdlib${ii}$_disnan( abs( dl( i ) ) ) )anorm = abs(dl(i))
                           
                 if( anorm<abs( d( i ) ) .or. stdlib${ii}$_disnan( abs( d( i ) ) ) )anorm = abs(d(i))
                           
                 if( anorm<abs( du( i ) ) .or. stdlib${ii}$_disnan (abs( du( i ) ) ) )anorm = abs(du(i))
                           
              end do
           else if( stdlib_lsame( norm, 'O' ) .or. norm=='1' ) then
              ! find norm1(a).
              if( n==1_${ik}$ ) then
                 anorm = abs( d( 1_${ik}$ ) )
              else
                 anorm = abs( d( 1_${ik}$ ) )+abs( dl( 1_${ik}$ ) )
                 temp = abs( d( n ) )+abs( du( n-1 ) )
                 if( anorm < temp .or. stdlib${ii}$_disnan( temp ) ) anorm = temp
                 do i = 2, n - 1
                    temp = abs( d( i ) )+abs( dl( i ) )+abs( du( i-1 ) )
                    if( anorm < temp .or. stdlib${ii}$_disnan( temp ) ) anorm = temp
                 end do
              end if
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              if( n==1_${ik}$ ) then
                 anorm = abs( d( 1_${ik}$ ) )
              else
                 anorm = abs( d( 1_${ik}$ ) )+abs( du( 1_${ik}$ ) )
                 temp = abs( d( n ) )+abs( dl( n-1 ) )
                 if( anorm < temp .or. stdlib${ii}$_disnan( temp ) ) anorm = temp
                 do i = 2, n - 1
                    temp = abs( d( i ) )+abs( du( i ) )+abs( dl( i-1 ) )
                    if( anorm < temp .or. stdlib${ii}$_disnan( temp ) ) anorm = temp
                 end do
              end if
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              call stdlib${ii}$_dlassq( n, d, 1_${ik}$, scale, sum )
              if( n>1_${ik}$ ) then
                 call stdlib${ii}$_dlassq( n-1, dl, 1_${ik}$, scale, sum )
                 call stdlib${ii}$_dlassq( n-1, du, 1_${ik}$, scale, sum )
              end if
              anorm = scale*sqrt( sum )
           end if
           stdlib${ii}$_dlangt = anorm
           return
     end function stdlib${ii}$_dlangt

#:for rk,rt,ri in REAL_KINDS_TYPES
#:if not rk in ["sp","dp"]
     pure real(${rk}$) module function stdlib${ii}$_${ri}$langt( norm, n, dl, d, du )
     !! DLANGT:  returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! real tridiagonal matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_${rk}$, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: n
           ! Array Arguments 
           real(${rk}$), intent(in) :: d(*), dl(*), du(*)
        ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i
           real(${rk}$) :: anorm, scale, sum, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n<=0_${ik}$ ) then
              anorm = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              anorm = abs( d( n ) )
              do i = 1, n - 1
                 if( anorm<abs( dl( i ) ) .or. stdlib${ii}$_${ri}$isnan( abs( dl( i ) ) ) )anorm = abs(dl(i))
                           
                 if( anorm<abs( d( i ) ) .or. stdlib${ii}$_${ri}$isnan( abs( d( i ) ) ) )anorm = abs(d(i))
                           
                 if( anorm<abs( du( i ) ) .or. stdlib${ii}$_${ri}$isnan (abs( du( i ) ) ) )anorm = abs(du(i))
                           
              end do
           else if( stdlib_lsame( norm, 'O' ) .or. norm=='1' ) then
              ! find norm1(a).
              if( n==1_${ik}$ ) then
                 anorm = abs( d( 1_${ik}$ ) )
              else
                 anorm = abs( d( 1_${ik}$ ) )+abs( dl( 1_${ik}$ ) )
                 temp = abs( d( n ) )+abs( du( n-1 ) )
                 if( anorm < temp .or. stdlib${ii}$_${ri}$isnan( temp ) ) anorm = temp
                 do i = 2, n - 1
                    temp = abs( d( i ) )+abs( dl( i ) )+abs( du( i-1 ) )
                    if( anorm < temp .or. stdlib${ii}$_${ri}$isnan( temp ) ) anorm = temp
                 end do
              end if
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              if( n==1_${ik}$ ) then
                 anorm = abs( d( 1_${ik}$ ) )
              else
                 anorm = abs( d( 1_${ik}$ ) )+abs( du( 1_${ik}$ ) )
                 temp = abs( d( n ) )+abs( dl( n-1 ) )
                 if( anorm < temp .or. stdlib${ii}$_${ri}$isnan( temp ) ) anorm = temp
                 do i = 2, n - 1
                    temp = abs( d( i ) )+abs( du( i ) )+abs( dl( i-1 ) )
                    if( anorm < temp .or. stdlib${ii}$_${ri}$isnan( temp ) ) anorm = temp
                 end do
              end if
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              call stdlib${ii}$_${ri}$lassq( n, d, 1_${ik}$, scale, sum )
              if( n>1_${ik}$ ) then
                 call stdlib${ii}$_${ri}$lassq( n-1, dl, 1_${ik}$, scale, sum )
                 call stdlib${ii}$_${ri}$lassq( n-1, du, 1_${ik}$, scale, sum )
              end if
              anorm = scale*sqrt( sum )
           end if
           stdlib${ii}$_${ri}$langt = anorm
           return
     end function stdlib${ii}$_${ri}$langt

#:endif
#:endfor

     pure real(sp) module function stdlib${ii}$_clangt( norm, n, dl, d, du )
     !! CLANGT returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! complex tridiagonal matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_sp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: n
           ! Array Arguments 
           complex(sp), intent(in) :: d(*), dl(*), du(*)
        ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i
           real(sp) :: anorm, scale, sum, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n<=0_${ik}$ ) then
              anorm = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              anorm = abs( d( n ) )
              do i = 1, n - 1
                 if( anorm<abs( dl( i ) ) .or. stdlib${ii}$_sisnan( abs( dl( i ) ) ) )anorm = abs(dl(i))
                           
                 if( anorm<abs( d( i ) ) .or. stdlib${ii}$_sisnan( abs( d( i ) ) ) )anorm = abs(d(i))
                           
                 if( anorm<abs( du( i ) ) .or. stdlib${ii}$_sisnan (abs( du( i ) ) ) )anorm = abs(du(i))
                           
              end do
           else if( stdlib_lsame( norm, 'O' ) .or. norm=='1' ) then
              ! find norm1(a).
              if( n==1_${ik}$ ) then
                 anorm = abs( d( 1_${ik}$ ) )
              else
                 anorm = abs( d( 1_${ik}$ ) )+abs( dl( 1_${ik}$ ) )
                 temp = abs( d( n ) )+abs( du( n-1 ) )
                 if( anorm < temp .or. stdlib${ii}$_sisnan( temp ) ) anorm = temp
                 do i = 2, n - 1
                    temp = abs( d( i ) )+abs( dl( i ) )+abs( du( i-1 ) )
                    if( anorm < temp .or. stdlib${ii}$_sisnan( temp ) ) anorm = temp
                 end do
              end if
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              if( n==1_${ik}$ ) then
                 anorm = abs( d( 1_${ik}$ ) )
              else
                 anorm = abs( d( 1_${ik}$ ) )+abs( du( 1_${ik}$ ) )
                 temp = abs( d( n ) )+abs( dl( n-1 ) )
                 if( anorm < temp .or. stdlib${ii}$_sisnan( temp ) ) anorm = temp
                 do i = 2, n - 1
                    temp = abs( d( i ) )+abs( du( i ) )+abs( dl( i-1 ) )
                    if( anorm < temp .or. stdlib${ii}$_sisnan( temp ) ) anorm = temp
                 end do
              end if
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              call stdlib${ii}$_classq( n, d, 1_${ik}$, scale, sum )
              if( n>1_${ik}$ ) then
                 call stdlib${ii}$_classq( n-1, dl, 1_${ik}$, scale, sum )
                 call stdlib${ii}$_classq( n-1, du, 1_${ik}$, scale, sum )
              end if
              anorm = scale*sqrt( sum )
           end if
           stdlib${ii}$_clangt = anorm
           return
     end function stdlib${ii}$_clangt

     pure real(dp) module function stdlib${ii}$_zlangt( norm, n, dl, d, du )
     !! ZLANGT returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! complex tridiagonal matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_dp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: n
           ! Array Arguments 
           complex(dp), intent(in) :: d(*), dl(*), du(*)
        ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i
           real(dp) :: anorm, scale, sum, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n<=0_${ik}$ ) then
              anorm = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              anorm = abs( d( n ) )
              do i = 1, n - 1
                 if( anorm<abs( dl( i ) ) .or. stdlib${ii}$_disnan( abs( dl( i ) ) ) )anorm = abs(dl(i))
                           
                 if( anorm<abs( d( i ) ) .or. stdlib${ii}$_disnan( abs( d( i ) ) ) )anorm = abs(d(i))
                           
                 if( anorm<abs( du( i ) ) .or. stdlib${ii}$_disnan (abs( du( i ) ) ) )anorm = abs(du(i))
                           
              end do
           else if( stdlib_lsame( norm, 'O' ) .or. norm=='1' ) then
              ! find norm1(a).
              if( n==1_${ik}$ ) then
                 anorm = abs( d( 1_${ik}$ ) )
              else
                 anorm = abs( d( 1_${ik}$ ) )+abs( dl( 1_${ik}$ ) )
                 temp = abs( d( n ) )+abs( du( n-1 ) )
                 if( anorm < temp .or. stdlib${ii}$_disnan( temp ) ) anorm = temp
                 do i = 2, n - 1
                    temp = abs( d( i ) )+abs( dl( i ) )+abs( du( i-1 ) )
                    if( anorm < temp .or. stdlib${ii}$_disnan( temp ) ) anorm = temp
                 end do
              end if
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              if( n==1_${ik}$ ) then
                 anorm = abs( d( 1_${ik}$ ) )
              else
                 anorm = abs( d( 1_${ik}$ ) )+abs( du( 1_${ik}$ ) )
                 temp = abs( d( n ) )+abs( dl( n-1 ) )
                 if( anorm < temp .or. stdlib${ii}$_disnan( temp ) ) anorm = temp
                 do i = 2, n - 1
                    temp = abs( d( i ) )+abs( du( i ) )+abs( dl( i-1 ) )
                    if( anorm < temp .or. stdlib${ii}$_disnan( temp ) ) anorm = temp
                 end do
              end if
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              call stdlib${ii}$_zlassq( n, d, 1_${ik}$, scale, sum )
              if( n>1_${ik}$ ) then
                 call stdlib${ii}$_zlassq( n-1, dl, 1_${ik}$, scale, sum )
                 call stdlib${ii}$_zlassq( n-1, du, 1_${ik}$, scale, sum )
              end if
              anorm = scale*sqrt( sum )
           end if
           stdlib${ii}$_zlangt = anorm
           return
     end function stdlib${ii}$_zlangt

#:for ck,ct,ci in CMPLX_KINDS_TYPES
#:if not ck in ["sp","dp"]
     pure real(${ck}$) module function stdlib${ii}$_${ci}$langt( norm, n, dl, d, du )
     !! ZLANGT:  returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! complex tridiagonal matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_${ck}$, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: n
           ! Array Arguments 
           complex(${ck}$), intent(in) :: d(*), dl(*), du(*)
        ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i
           real(${ck}$) :: anorm, scale, sum, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n<=0_${ik}$ ) then
              anorm = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              anorm = abs( d( n ) )
              do i = 1, n - 1
                 if( anorm<abs( dl( i ) ) .or. stdlib${ii}$_${c2ri(ci)}$isnan( abs( dl( i ) ) ) )anorm = abs(dl(i))
                           
                 if( anorm<abs( d( i ) ) .or. stdlib${ii}$_${c2ri(ci)}$isnan( abs( d( i ) ) ) )anorm = abs(d(i))
                           
                 if( anorm<abs( du( i ) ) .or. stdlib${ii}$_${c2ri(ci)}$isnan (abs( du( i ) ) ) )anorm = abs(du(i))
                           
              end do
           else if( stdlib_lsame( norm, 'O' ) .or. norm=='1' ) then
              ! find norm1(a).
              if( n==1_${ik}$ ) then
                 anorm = abs( d( 1_${ik}$ ) )
              else
                 anorm = abs( d( 1_${ik}$ ) )+abs( dl( 1_${ik}$ ) )
                 temp = abs( d( n ) )+abs( du( n-1 ) )
                 if( anorm < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) ) anorm = temp
                 do i = 2, n - 1
                    temp = abs( d( i ) )+abs( dl( i ) )+abs( du( i-1 ) )
                    if( anorm < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) ) anorm = temp
                 end do
              end if
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              if( n==1_${ik}$ ) then
                 anorm = abs( d( 1_${ik}$ ) )
              else
                 anorm = abs( d( 1_${ik}$ ) )+abs( du( 1_${ik}$ ) )
                 temp = abs( d( n ) )+abs( dl( n-1 ) )
                 if( anorm < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) ) anorm = temp
                 do i = 2, n - 1
                    temp = abs( d( i ) )+abs( du( i ) )+abs( dl( i-1 ) )
                    if( anorm < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) ) anorm = temp
                 end do
              end if
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              call stdlib${ii}$_${ci}$lassq( n, d, 1_${ik}$, scale, sum )
              if( n>1_${ik}$ ) then
                 call stdlib${ii}$_${ci}$lassq( n-1, dl, 1_${ik}$, scale, sum )
                 call stdlib${ii}$_${ci}$lassq( n-1, du, 1_${ik}$, scale, sum )
              end if
              anorm = scale*sqrt( sum )
           end if
           stdlib${ii}$_${ci}$langt = anorm
           return
     end function stdlib${ii}$_${ci}$langt

#:endif
#:endfor



     real(sp) module function stdlib${ii}$_slanhs( norm, n, a, lda, work )
     !! SLANHS returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! Hessenberg matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_sp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: lda, n
           ! Array Arguments 
           real(sp), intent(in) :: a(lda,*)
           real(sp), intent(out) :: work(*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j
           real(sp) :: scale, sum, value
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = 1, min( n, j+1 )
                    sum = abs( a( i, j ) )
                    if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = 1, min( n, j+1 )
                    sum = sum + abs( a( i, j ) )
                 end do
                 if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, n
                 work( i ) = zero
              end do
              do j = 1, n
                 do i = 1, min( n, j+1 )
                    work( i ) = work( i ) + abs( a( i, j ) )
                 end do
              end do
              value = zero
              do i = 1, n
                 sum = work( i )
                 if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 call stdlib${ii}$_slassq( min( n, j+1 ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_slanhs = value
           return
     end function stdlib${ii}$_slanhs

     real(dp) module function stdlib${ii}$_dlanhs( norm, n, a, lda, work )
     !! DLANHS returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! Hessenberg matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_dp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: lda, n
           ! Array Arguments 
           real(dp), intent(in) :: a(lda,*)
           real(dp), intent(out) :: work(*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j
           real(dp) :: scale, sum, value
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = 1, min( n, j+1 )
                    sum = abs( a( i, j ) )
                    if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = 1, min( n, j+1 )
                    sum = sum + abs( a( i, j ) )
                 end do
                 if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, n
                 work( i ) = zero
              end do
              do j = 1, n
                 do i = 1, min( n, j+1 )
                    work( i ) = work( i ) + abs( a( i, j ) )
                 end do
              end do
              value = zero
              do i = 1, n
                 sum = work( i )
                 if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 call stdlib${ii}$_dlassq( min( n, j+1 ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_dlanhs = value
           return
     end function stdlib${ii}$_dlanhs

#:for rk,rt,ri in REAL_KINDS_TYPES
#:if not rk in ["sp","dp"]
     real(${rk}$) module function stdlib${ii}$_${ri}$lanhs( norm, n, a, lda, work )
     !! DLANHS:  returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! Hessenberg matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_${rk}$, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: lda, n
           ! Array Arguments 
           real(${rk}$), intent(in) :: a(lda,*)
           real(${rk}$), intent(out) :: work(*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j
           real(${rk}$) :: scale, sum, value
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = 1, min( n, j+1 )
                    sum = abs( a( i, j ) )
                    if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = 1, min( n, j+1 )
                    sum = sum + abs( a( i, j ) )
                 end do
                 if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, n
                 work( i ) = zero
              end do
              do j = 1, n
                 do i = 1, min( n, j+1 )
                    work( i ) = work( i ) + abs( a( i, j ) )
                 end do
              end do
              value = zero
              do i = 1, n
                 sum = work( i )
                 if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 call stdlib${ii}$_${ri}$lassq( min( n, j+1 ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_${ri}$lanhs = value
           return
     end function stdlib${ii}$_${ri}$lanhs

#:endif
#:endfor

     real(sp) module function stdlib${ii}$_clanhs( norm, n, a, lda, work )
     !! CLANHS returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! Hessenberg matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_sp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: lda, n
           ! Array Arguments 
           real(sp), intent(out) :: work(*)
           complex(sp), intent(in) :: a(lda,*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j
           real(sp) :: scale, sum, value
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = 1, min( n, j+1 )
                    sum = abs( a( i, j ) )
                    if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = 1, min( n, j+1 )
                    sum = sum + abs( a( i, j ) )
                 end do
                 if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, n
                 work( i ) = zero
              end do
              do j = 1, n
                 do i = 1, min( n, j+1 )
                    work( i ) = work( i ) + abs( a( i, j ) )
                 end do
              end do
              value = zero
              do i = 1, n
                 sum = work( i )
                 if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 call stdlib${ii}$_classq( min( n, j+1 ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_clanhs = value
           return
     end function stdlib${ii}$_clanhs

     real(dp) module function stdlib${ii}$_zlanhs( norm, n, a, lda, work )
     !! ZLANHS returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! Hessenberg matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_dp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: lda, n
           ! Array Arguments 
           real(dp), intent(out) :: work(*)
           complex(dp), intent(in) :: a(lda,*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j
           real(dp) :: scale, sum, value
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = 1, min( n, j+1 )
                    sum = abs( a( i, j ) )
                    if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = 1, min( n, j+1 )
                    sum = sum + abs( a( i, j ) )
                 end do
                 if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, n
                 work( i ) = zero
              end do
              do j = 1, n
                 do i = 1, min( n, j+1 )
                    work( i ) = work( i ) + abs( a( i, j ) )
                 end do
              end do
              value = zero
              do i = 1, n
                 sum = work( i )
                 if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 call stdlib${ii}$_zlassq( min( n, j+1 ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_zlanhs = value
           return
     end function stdlib${ii}$_zlanhs

#:for ck,ct,ci in CMPLX_KINDS_TYPES
#:if not ck in ["sp","dp"]
     real(${ck}$) module function stdlib${ii}$_${ci}$lanhs( norm, n, a, lda, work )
     !! ZLANHS:  returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! Hessenberg matrix A.
        ! -- lapack auxiliary routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_${ck}$, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm
           integer(${ik}$), intent(in) :: lda, n
           ! Array Arguments 
           real(${ck}$), intent(out) :: work(*)
           complex(${ck}$), intent(in) :: a(lda,*)
       ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j
           real(${ck}$) :: scale, sum, value
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n==0_${ik}$ ) then
              value = zero
           else if( stdlib_lsame( norm, 'M' ) ) then
              ! find max(abs(a(i,j))).
              value = zero
              do j = 1, n
                 do i = 1, min( n, j+1 )
                    sum = abs( a( i, j ) )
                    if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum
                 end do
              end do
           else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then
              ! find norm1(a).
              value = zero
              do j = 1, n
                 sum = zero
                 do i = 1, min( n, j+1 )
                    sum = sum + abs( a( i, j ) )
                 end do
                 if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum
              end do
           else if( stdlib_lsame( norm, 'I' ) ) then
              ! find normi(a).
              do i = 1, n
                 work( i ) = zero
              end do
              do j = 1, n
                 do i = 1, min( n, j+1 )
                    work( i ) = work( i ) + abs( a( i, j ) )
                 end do
              end do
              value = zero
              do i = 1, n
                 sum = work( i )
                 if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum
              end do
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
              ! find normf(a).
              scale = zero
              sum = one
              do j = 1, n
                 call stdlib${ii}$_${ci}$lassq( min( n, j+1 ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum )
              end do
              value = scale*sqrt( sum )
           end if
           stdlib${ii}$_${ci}$lanhs = value
           return
     end function stdlib${ii}$_${ci}$lanhs

#:endif
#:endfor



     real(sp) module function stdlib${ii}$_clanhf( norm, transr, uplo, n, a, work )
     !! CLANHF returns the value of the one norm,  or the Frobenius norm, or
     !! the  infinity norm,  or the  element of  largest absolute value  of a
     !! complex Hermitian matrix A in RFP format.
        ! -- lapack computational routine --
        ! -- lapack is a software package provided by univ. of tennessee,    --
        ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
           use stdlib_blas_constants_sp, only: negone, zero, half, one, two, three, four, eight, ten, czero, chalf, cone, cnegone
           ! Scalar Arguments 
           character, intent(in) :: norm, transr, uplo
           integer(${ik}$), intent(in) :: n
           ! Array Arguments 
           real(sp), intent(out) :: work(0_${ik}$:*)
           complex(sp), intent(in) :: a(0_${ik}$:*)
        ! =====================================================================
           
           ! Local Scalars 
           integer(${ik}$) :: i, j, ifm, ilu, noe, n1, k, l, lda
           real(sp) :: scale, s, value, aa, temp
           ! Intrinsic Functions 
           ! Executable Statements 
           if( n==0_${ik}$ ) then
              stdlib${ii}$_clanhf = zero
              return
           else if( n==1_${ik}$ ) then
              stdlib${ii}$_clanhf = abs(real(a(0_${ik}$),KIND=sp))
              return
           end if
           ! set noe = 1 if n is odd. if n is even set noe=0
           noe = 1_${ik}$
           if( mod( n, 2_${ik}$ )==0_${ik}$ )noe = 0_${ik}$
           ! set ifm = 0 when form='c' or 'c' and 1 otherwise
           ifm = 1_${ik}$
           if( stdlib_lsame( transr, 'C' ) )ifm = 0_${ik}$
           ! set ilu = 0 when uplo='u or 'u' and 1 otherwise
           ilu = 1_${ik}$
           if( stdlib_lsame( uplo, 'U' ) )ilu = 0_${ik}$
           ! set lda = (n+1)/2 when ifm = 0
           ! set lda = n when ifm = 1 and noe = 1
           ! set lda = n+1 when ifm = 1 and noe = 0
           if( ifm==1_${ik}$ ) then
              if( noe==1_${ik}$ ) then
                 lda = n
              else
                 ! noe=0
                 lda = n + 1_${ik}$
              end if
           else
              ! ifm=0
              lda = ( n+1 ) / 2_${ik}$
           end if
           if( stdlib_lsame( norm, 'M' ) ) then
             ! find max(abs(a(i,j))).
              k = ( n+1 ) / 2_${ik}$
              value = zero
              if( noe==1_${ik}$ ) then
                 ! n is odd
                 if( ifm==1_${ik}$ ) then
                    ! a is n by k
                    if( ilu==1_${ik}$ ) then
                       ! uplo ='l'
                       j = 0_${ik}$
                       ! -> l(0,0)
                       temp = abs( real( a( j+j*lda ),KIND=sp) )
                       if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       do i = 1, n - 1
                          temp = abs( a( i+j*lda ) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                       do j = 1, k - 1
                          do i = 0, j - 2
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                          i = j - 1_${ik}$
                          ! l(k+j,k+j)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          i = j
                          ! -> l(j,j)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          do i = j + 1, n - 1
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                       end do
                    else
                       ! uplo = 'u'
                       do j = 0, k - 2
                          do i = 0, k + j - 2
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                          i = k + j - 1_${ik}$
                          ! -> u(i,i)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          i = i + 1_${ik}$
                          ! =k+j; i -> u(j,j)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          do i = k + j + 1, n - 1
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                       end do
                       do i = 0, n - 2
                          temp = abs( a( i+j*lda ) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          ! j=k-1
                       end do
                       ! i=n-1 -> u(n-1,n-1)
                       temp = abs( real( a( i+j*lda ),KIND=sp) )
                       if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                    end if
                 else
                    ! xpose case; a is k by n
                    if( ilu==1_${ik}$ ) then
                       ! uplo ='l'
                       do j = 0, k - 2
                          do i = 0, j - 1
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                          i = j
                          ! l(i,i)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          i = j + 1_${ik}$
                          ! l(j+k,j+k)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          do i = j + 2, k - 1
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                       end do
                       j = k - 1_${ik}$
                       do i = 0, k - 2
                          temp = abs( a( i+j*lda ) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                       i = k - 1_${ik}$
                       ! -> l(i,i) is at a(i,j)
                       temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       do j = k, n - 1
                          do i = 0, k - 1
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                       end do
                    else
                       ! uplo = 'u'
                       do j = 0, k - 2
                          do i = 0, k - 1
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                       end do
                       j = k - 1_${ik}$
                       ! -> u(j,j) is at a(0,j)
                       temp = abs( real( a( 0_${ik}$+j*lda ),KIND=sp) )
                       if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       do i = 1, k - 1
                          temp = abs( a( i+j*lda ) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                       do j = k, n - 1
                          do i = 0, j - k - 1
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                          i = j - k
                          ! -> u(i,i) at a(i,j)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          i = j - k + 1_${ik}$
                          ! u(j,j)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          do i = j - k + 2, k - 1
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                       end do
                    end if
                 end if
              else
                 ! n is even
                 if( ifm==1_${ik}$ ) then
                    ! a is n+1 by k
                    if( ilu==1_${ik}$ ) then
                       ! uplo ='l'
                       j = 0_${ik}$
                       ! -> l(k,k)
                       temp = abs( real( a( j+j*lda ),KIND=sp) )
                       if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       temp = abs( real( a( j+1+j*lda ),KIND=sp) )
                       if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       do i = 2, n
                          temp = abs( a( i+j*lda ) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                       do j = 1, k - 1
                          do i = 0, j - 1
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                          i = j
                          ! l(k+j,k+j)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          i = j + 1_${ik}$
                          ! -> l(j,j)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          do i = j + 2, n
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                       end do
                    else
                       ! uplo = 'u'
                       do j = 0, k - 2
                          do i = 0, k + j - 1
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                          i = k + j
                          ! -> u(i,i)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          i = i + 1_${ik}$
                          ! =k+j+1; i -> u(j,j)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          do i = k + j + 2, n
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                       end do
                       do i = 0, n - 2
                          temp = abs( a( i+j*lda ) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       ! j=k-1
                       end do
                       ! i=n-1 -> u(n-1,n-1)
                       temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       i = n
                       ! -> u(k-1,k-1)
                       temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                    end if
                 else
                    ! xpose case; a is k by n+1
                    if( ilu==1_${ik}$ ) then
                       ! uplo ='l'
                       j = 0_${ik}$
                       ! -> l(k,k) at a(0,0)
                       temp = abs( real( a( j+j*lda ),KIND=sp) )
                       if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       do i = 1, k - 1
                          temp = abs( a( i+j*lda ) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                       do j = 1, k - 1
                          do i = 0, j - 2
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                          i = j - 1_${ik}$
                          ! l(i,i)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          i = j
                          ! l(j+k,j+k)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          do i = j + 1, k - 1
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                       end do
                       j = k
                       do i = 0, k - 2
                          temp = abs( a( i+j*lda ) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                       i = k - 1_${ik}$
                       ! -> l(i,i) is at a(i,j)
                       temp = abs( real( a( i+j*lda ),KIND=sp) )
                       if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       do j = k + 1, n
                          do i = 0, k - 1
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                       end do
                    else
                       ! uplo = 'u'
                       do j = 0, k - 1
                          do i = 0, k - 1
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                       end do
                       j = k
                       ! -> u(j,j) is at a(0,j)
                       temp = abs( real( a( 0_${ik}$+j*lda ),KIND=sp) )
                       if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       do i = 1, k - 1
                          temp = abs( a( i+j*lda ) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                       do j = k + 1, n - 1
                          do i = 0, j - k - 2
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                          i = j - k - 1_${ik}$
                          ! -> u(i,i) at a(i,j)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          i = j - k
                          ! u(j,j)
                          temp = abs( real( a( i+j*lda ),KIND=sp) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          do i = j - k + 1, k - 1
                             temp = abs( a( i+j*lda ) )
                             if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                          end do
                       end do
                       j = n
                       do i = 0, k - 2
                          temp = abs( a( i+j*lda ) )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                       i = k - 1_${ik}$
                       ! u(k,k) at a(i,j)
                       temp = abs( real( a( i+j*lda ),KIND=sp) )
                       if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                    end if
                 end if
              end if
           else if( ( stdlib_lsame( norm, 'I' ) ) .or. ( stdlib_lsame( norm, 'O' ) ) .or.( &
                     norm=='1' ) ) then
             ! find normi(a) ( = norm1(a), since a is hermitian).
              if( ifm==1_${ik}$ ) then
                 ! a is 'n'
                 k = n / 2_${ik}$
                 if( noe==1_${ik}$ ) then
                    ! n is odd
                    if( ilu==0_${ik}$ ) then
                       ! uplo = 'u'
                       do i = 0, k - 1
                          work( i ) = zero
                       end do
                       do j = 0, k
                          s = zero
                          do i = 0, k + j - 1
                             aa = abs( a( i+j*lda ) )
                             ! -> a(i,j+k)
                             s = s + aa
                             work( i ) = work( i ) + aa
                          end do
                          aa = abs( real( a( i+j*lda ),KIND=sp) )
                          ! -> a(j+k,j+k)
                          work( j+k ) = s + aa
                          if( i==k+k )go to 10
                          i = i + 1_${ik}$
                          aa = abs( real( a( i+j*lda ),KIND=sp) )
                          ! -> a(j,j)
                          work( j ) = work( j ) + aa
                          s = zero
                          do l = j + 1, k - 1
                             i = i + 1_${ik}$
                             aa = abs( a( i+j*lda ) )
                             ! -> a(l,j)
                             s = s + aa
                             work( l ) = work( l ) + aa
                          end do
                          work( j ) = work( j ) + s
                       end do
                       10 continue
                       value = work( 0_${ik}$ )
                       do i = 1, n-1
                          temp = work( i )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                    else
                       ! ilu = 1
                       k = k + 1_${ik}$
                       ! k=(n+1)/2 for n odd and ilu=1
                       do i = k, n - 1
                          work( i ) = zero
                       end do
                       do j = k - 1, 0, -1
                          s = zero
                          do i = 0, j - 2
                             aa = abs( a( i+j*lda ) )
                             ! -> a(j+k,i+k)
                             s = s + aa
                             work( i+k ) = work( i+k ) + aa
                          end do
                          if( j>0_${ik}$ ) then
                             aa = abs( real( a( i+j*lda ),KIND=sp) )
                             ! -> a(j+k,j+k)
                             s = s + aa
                             work( i+k ) = work( i+k ) + s
                             ! i=j
                             i = i + 1_${ik}$
                          end if
                          aa = abs( real( a( i+j*lda ),KIND=sp) )
                          ! -> a(j,j)
                          work( j ) = aa
                          s = zero
                          do l = j + 1, n - 1
                             i = i + 1_${ik}$
                             aa = abs( a( i+j*lda ) )
                             ! -> a(l,j)
                             s = s + aa
                             work( l ) = work( l ) + aa
                          end do
                          work( j ) = work( j ) + s
                       end do
                       value = work( 0_${ik}$ )
                       do i = 1, n-1
                          temp = work( i )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                    end if
                 else
                    ! n is even
                    if( ilu==0_${ik}$ ) then
                       ! uplo = 'u'
                       do i = 0, k - 1
                          work( i ) = zero
                       end do
                       do j = 0, k - 1
                          s = zero
                          do i = 0, k + j - 1
                             aa = abs( a( i+j*lda ) )
                             ! -> a(i,j+k)
                             s = s + aa
                             work( i ) = work( i ) + aa
                          end do
                          aa = abs( real( a( i+j*lda ),KIND=sp) )
                          ! -> a(j+k,j+k)
                          work( j+k ) = s + aa
                          i = i + 1_${ik}$
                          aa = abs( real( a( i+j*lda ),KIND=sp) )
                          ! -> a(j,j)
                          work( j ) = work( j ) + aa
                          s = zero
                          do l = j + 1, k - 1
                             i = i + 1_${ik}$
                             aa = abs( a( i+j*lda ) )
                             ! -> a(l,j)
                             s = s + aa
                             work( l ) = work( l ) + aa
                          end do
                          work( j ) = work( j ) + s
                       end do
                       value = work( 0_${ik}$ )
                       do i = 1, n-1
                          temp = work( i )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                    else
                       ! ilu = 1
                       do i = k, n - 1
                          work( i ) = zero
                       end do
                       do j = k - 1, 0, -1
                          s = zero
                          do i = 0, j - 1
                             aa = abs( a( i+j*lda ) )
                             ! -> a(j+k,i+k)
                             s = s + aa
                             work( i+k ) = work( i+k ) + aa
                          end do
                          aa = abs( real( a( i+j*lda ),KIND=sp) )
                          ! -> a(j+k,j+k)
                          s = s + aa
                          work( i+k ) = work( i+k ) + s
                          ! i=j
                          i = i + 1_${ik}$
                          aa = abs( real( a( i+j*lda ),KIND=sp) )
                          ! -> a(j,j)
                          work( j ) = aa
                          s = zero
                          do l = j + 1, n - 1
                             i = i + 1_${ik}$
                             aa = abs( a( i+j*lda ) )
                             ! -> a(l,j)
                             s = s + aa
                             work( l ) = work( l ) + aa
                          end do
                          work( j ) = work( j ) + s
                       end do
                       value = work( 0_${ik}$ )
                       do i = 1, n-1
                          temp = work( i )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                    end if
                 end if
              else
                 ! ifm=0
                 k = n / 2_${ik}$
                 if( noe==1_${ik}$ ) then
                    ! n is odd
                    if( ilu==0_${ik}$ ) then
                       ! uplo = 'u'
                       n1 = k
                       ! n/2
                       k = k + 1_${ik}$
                       ! k is the row size and lda
                       do i = n1, n - 1
                          work( i ) = zero
                       end do
                       do j = 0, n1 - 1
                          s = zero
                          do i = 0, k - 1
                             aa = abs( a( i+j*lda ) )
                             ! a(j,n1+i)
                             work( i+n1 ) = work( i+n1 ) + aa
                             s = s + aa
                          end do
                          work( j ) = s
                       end do
                       ! j=n1=k-1 is special
                       s = abs( real( a( 0_${ik}$+j*lda ),KIND=sp) )
                       ! a(k-1,k-1)
                       do i = 1, k - 1
                          aa = abs( a( i+j*lda ) )
                          ! a(k-1,i+n1)
                          work( i+n1 ) = work( i+n1 ) + aa
                          s = s + aa
                       end do
                       work( j ) = work( j ) + s
                       do j = k, n - 1
                          s = zero
                          do i = 0, j - k - 1
                             aa = abs( a( i+j*lda ) )
                             ! a(i,j-k)
                             work( i ) = work( i ) + aa
                             s = s + aa
                          end do
                          ! i=j-k
                          aa = abs( real( a( i+j*lda ),KIND=sp) )
                          ! a(j-k,j-k)
                          s = s + aa
                          work( j-k ) = work( j-k ) + s
                          i = i + 1_${ik}$
                          s = abs( real( a( i+j*lda ),KIND=sp) )
                          ! a(j,j)
                          do l = j + 1, n - 1
                             i = i + 1_${ik}$
                             aa = abs( a( i+j*lda ) )
                             ! a(j,l)
                             work( l ) = work( l ) + aa
                             s = s + aa
                          end do
                          work( j ) = work( j ) + s
                       end do
                       value = work( 0_${ik}$ )
                       do i = 1, n-1
                          temp = work( i )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                    else
                       ! ilu=1
                       k = k + 1_${ik}$
                       ! k=(n+1)/2 for n odd and ilu=1
                       do i = k, n - 1
                          work( i ) = zero
                       end do
                       do j = 0, k - 2
                          ! process
                          s = zero
                          do i = 0, j - 1
                             aa = abs( a( i+j*lda ) )
                             ! a(j,i)
                             work( i ) = work( i ) + aa
                             s = s + aa
                          end do
                          aa = abs( real( a( i+j*lda ),KIND=sp) )
                          ! i=j so process of a(j,j)
                          s = s + aa
                          work( j ) = s
                          ! is initialised here
                          i = i + 1_${ik}$
                          ! i=j process a(j+k,j+k)
                          aa = abs( real( a( i+j*lda ),KIND=sp) )
                          s = aa
                          do l = k + j + 1, n - 1
                             i = i + 1_${ik}$
                             aa = abs( a( i+j*lda ) )
                             ! a(l,k+j)
                             s = s + aa
                             work( l ) = work( l ) + aa
                          end do
                          work( k+j ) = work( k+j ) + s
                       end do
                       ! j=k-1 is special :process col a(k-1,0:k-1)
                       s = zero
                       do i = 0, k - 2
                          aa = abs( a( i+j*lda ) )
                          ! a(k,i)
                          work( i ) = work( i ) + aa
                          s = s + aa
                       end do
                       ! i=k-1
                       aa = abs( real( a( i+j*lda ),KIND=sp) )
                       ! a(k-1,k-1)
                       s = s + aa
                       work( i ) = s
                       ! done with col j=k+1
                       do j = k, n - 1
                          ! process col j of a = a(j,0:k-1)
                          s = zero
                          do i = 0, k - 1
                             aa = abs( a( i+j*lda ) )
                             ! a(j,i)
                             work( i ) = work( i ) + aa
                             s = s + aa
                          end do
                          work( j ) = work( j ) + s
                       end do
                       value = work( 0_${ik}$ )
                       do i = 1, n-1
                          temp = work( i )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                    end if
                 else
                    ! n is even
                    if( ilu==0_${ik}$ ) then
                       ! uplo = 'u'
                       do i = k, n - 1
                          work( i ) = zero
                       end do
                       do j = 0, k - 1
                          s = zero
                          do i = 0, k - 1
                             aa = abs( a( i+j*lda ) )
                             ! a(j,i+k)
                             work( i+k ) = work( i+k ) + aa
                             s = s + aa
                          end do
                          work( j ) = s
                       end do
                       ! j=k
                       aa = abs( real( a( 0_${ik}$+j*lda ),KIND=sp) )
                       ! a(k,k)
                       s = aa
                       do i = 1, k - 1
                          aa = abs( a( i+j*lda ) )
                          ! a(k,k+i)
                          work( i+k ) = work( i+k ) + aa
                          s = s + aa
                       end do
                       work( j ) = work( j ) + s
                       do j = k + 1, n - 1
                          s = zero
                          do i = 0, j - 2 - k
                             aa = abs( a( i+j*lda ) )
                             ! a(i,j-k-1)
                             work( i ) = work( i ) + aa
                             s = s + aa
                          end do
                          ! i=j-1-k
                          aa = abs( real( a( i+j*lda ),KIND=sp) )
                          ! a(j-k-1,j-k-1)
                          s = s + aa
                          work( j-k-1 ) = work( j-k-1 ) + s
                          i = i + 1_${ik}$
                          aa = abs( real( a( i+j*lda ),KIND=sp) )
                          ! a(j,j)
                          s = aa
                          do l = j + 1, n - 1
                             i = i + 1_${ik}$
                             aa = abs( a( i+j*lda ) )
                             ! a(j,l)
                             work( l ) = work( l ) + aa
                             s = s + aa
                          end do
                          work( j ) = work( j ) + s
                       end do
                       ! j=n
                       s = zero
                       do i = 0, k - 2
                          aa = abs( a( i+j*lda ) )
                          ! a(i,k-1)
                          work( i ) = work( i ) + aa
                          s = s + aa
                       end do
                       ! i=k-1
                       aa = abs( real( a( i+j*lda ),KIND=sp) )
                       ! a(k-1,k-1)
                       s = s + aa
                       work( i ) = work( i ) + s
                       value = work( 0_${ik}$ )
                       do i = 1, n-1
                          temp = work( i )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                    else
                       ! ilu=1
                       do i = k, n - 1
                          work( i ) = zero
                       end do
                       ! j=0 is special :process col a(k:n-1,k)
                       s = abs( real( a( 0_${ik}$ ),KIND=sp) )
                       ! a(k,k)
                       do i = 1, k - 1
                          aa = abs( a( i ) )
                          ! a(k+i,k)
                          work( i+k ) = work( i+k ) + aa
                          s = s + aa
                       end do
                       work( k ) = work( k ) + s
                       do j = 1, k - 1
                          ! process
                          s = zero
                          do i = 0, j - 2
                             aa = abs( a( i+j*lda ) )
                             ! a(j-1,i)
                             work( i ) = work( i ) + aa
                             s = s + aa
                          end do
                          aa = abs( real( a( i+j*lda ),KIND=sp) )
                          ! i=j-1 so process of a(j-1,j-1)
                          s = s + aa
                          work( j-1 ) = s
                          ! is initialised here
                          i = i + 1_${ik}$
                          ! i=j process a(j+k,j+k)
                          aa = abs( real( a( i+j*lda ),KIND=sp) )
                          s = aa
                          do l = k + j + 1, n - 1
                             i = i + 1_${ik}$
                             aa = abs( a( i+j*lda ) )
                             ! a(l,k+j)
                             s = s + aa
                             work( l ) = work( l ) + aa
                          end do
                          work( k+j ) = work( k+j ) + s
                       end do
                       ! j=k is special :process col a(k,0:k-1)
                       s = zero
                       do i = 0, k - 2
                          aa = abs( a( i+j*lda ) )
                          ! a(k,i)
                          work( i ) = work( i ) + aa
                          s = s + aa
                       end do
                       ! i=k-1
                       aa = abs( real( a( i+j*lda ),KIND=sp) )
                       ! a(k-1,k-1)
                       s = s + aa
                       work( i ) = s
                       ! done with col j=k+1
                       do j = k + 1, n
                          ! process col j-1 of a = a(j-1,0:k-1)
                          s = zero
                          do i = 0, k - 1
                             aa = abs( a( i+j*lda ) )
                             ! a(j-1,i)
                             work( i ) = work( i ) + aa
                             s = s + aa
                          end do
                          work( j-1 ) = work( j-1 ) + s
                       end do
                       value = work( 0_${ik}$ )
                       do i = 1, n-1
                          temp = work( i )
                          if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp
                       end do
                    end if
                 end if
              end if
           else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) &
                     then
             ! find normf(a).
              k = ( n+1 ) / 2_${ik}$
              scale = zero
              s = one
              if( noe==1_${ik}$ ) then
                 ! n is odd
                 if( ifm==1_${ik}$ ) then
                    ! a is normal
                    if( ilu==0_${ik}$ ) then
                       ! a is upper
                       do j = 0, k - 3
                          call stdlib${ii}$_classq( k-j-2, a( k+j+1+j*lda ), 1_${ik}$, scale, s )
                          ! l at a(k,0)
                       end do
                       do j = 0, k - 1
                          call stdlib${ii}$_classq( k+j-1, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s )
                          ! trap u at a(0,0)
                       end do
                       s = s + s
                       ! double s for the off diagonal elements
                       l = k - 1_${ik}$
                       ! -> u(k,k) at a(k-1,0)
                       do i = 0, k - 2
                          aa = real( a( l ),KIND=sp)
                          ! u(k+i,k+i)
                          if( aa/=zero ) then
                             if( scale<aa ) then
                                s = one + s*( scale / aa )**2_${ik}$
                                scale = aa
                             else
                                s = s + ( aa / scale )**2_${ik}$
                             end if
                          end if
                          aa = real( a( l+1 ),KIND=sp)
                          ! u(i,i)
                          if( aa/=zero ) then
                             if( scale<aa ) then
                                s = one + s*( scale / aa )**2_${ik}$
                                scale = aa
                             else
                                s = s + ( aa / scale )**2_${ik}$
                             end if
                          end if
                          l = l + lda + 1_${ik}$
                       end do
                       aa = real( a( l ),KIND=sp)
                       ! u(n-1,n-1)
                       if( aa/=zero ) then
                          if( scale<aa ) then
                             s = one + s*( scale / aa )**2_${ik}$
                             scale = aa
                          else
                             s = s + ( aa / scale )**2_${ik}$
                          end if
                       end if
                    else
                       ! ilu=1
                       do j = 0, k - 1
                          call stdlib${ii}$_classq( n-j-1, a( j+1+j*lda ), 1_${ik}$, scale, s )
                          ! trap l at a(0,0)
                       end do
                       do j = 1, k - 2
                          call stdlib${ii}$_classq( j, a( 0_${ik}$+( 1_${ik}$+j )*lda ), 1_${ik}$, scale, s )
                          ! u at a(0,1)
                       end do
                       s = s + s
                       ! double s for the off diagonal elements
                       aa = real( a( 0_${ik}$ ),KIND=sp)
                       ! l(0,0) at a(0,0)
                       if( aa/=zero ) then
                          if( scale<aa ) then
                             s = one + s*( scale / aa )**2_${ik}$
                             scale = aa
                          else
                             s = s + ( aa / scale )**2_${ik}$
                          end if
                       end if
                       l = lda
                       ! -> l(k,k) at a(0,1)
                       do i = 1, k - 1
                          aa = real( a( l ),KIND=sp)
                          ! l(k-1+i,k-1+i)
                          if( aa/=zero ) then
                             if( scale<aa ) then
                                s = one + s*( scale / aa )**2_${ik}$
                                scale = aa
                             else
                                s = s + ( aa / scale )**2_${ik}$
                             end if
                          end if
                          aa = real( a( l+1 ),KIND=sp)
                          ! l(i,i)
                          if( aa/=zero ) then
                             if( scale<aa ) then
                                s = one + s*( scale / aa )**2_${ik}$
                                scale = aa
                             else
                                s = s + ( aa / scale )**2_${ik}$
                             end if
                          end if
                          l = l + lda + 1_${ik}$
                       end do
                    end if
                 else
                    ! a is xpose
                    if( ilu==0_${ik}$ ) then
                       ! a**h is upper
                       do j = 1, k - 2
                          call stdlib${ii}$_classq( j, a( 0_${ik}$+( k+j )*lda ), 1_${ik}$, scale, s )
                          ! u at a(0,k)
                       end do
                       do j = 0, k - 2
                          call stdlib${ii}$_classq( k, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s )
                          ! k by k-1 rect. at a(0,0)
                       end do
                       do j = 0, k - 2
                          call stdlib${ii}$_classq( k-j-1, a( j+1+( j+k-1 )*lda ), 1_${ik}$,scale, s )
                          ! l at a(0,k-1)
                       end do
                       s = s + s
                       ! double s for the off diagonal elements
                       l = 0_${ik}$ + k*lda - lda
                       ! -> u(k-1,k-1) at a(0,k-1)
                       aa = real( a( l ),KIND=sp)
                       ! u(k-1,k-1)
                       if( aa/=zero ) then
                          if( scale<aa ) then
                             s = one + s*( scale / aa )**2_${ik}$
                             scale = aa
                          else
                             s = s + ( aa / scale )**2_${ik}$
                          end if
                       end if
                       l = l + lda
                       ! -> u(0,0) at a(0,k)
                       do j = k, n - 1
                          aa = real( a( l ),KIND=sp)
                          ! -> u(j-k,j-k)
                          if( aa/=zero ) then
                             if( scale<aa ) then
                                s = one + s*( scale / aa )**2_${ik}$
                                scale = aa
                             else
                                s = s + ( aa / scale )**2_${ik}$
                             end if
                          end if
                          aa = real( a( l+1 ),KIND=sp)
                          ! -> u(j,j)
                          if( aa/=zero ) then
                             if( scale<aa ) then
                                s = one + s*( scale / aa )**2_${ik}$
                                scale = aa
                             else
                                s = s + ( aa / scale )**2_${ik}$
                             end if
                          end if
                          l = l + lda + 1_${ik}$
                       end do
                    else
                       ! a**h is lower
                       do j = 1, k - 1
                          call stdlib${ii}$_classq( j, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s )
                          ! u at a(0,0)
                       end do
                       do j = k, n - 1
                          call stdlib${ii}$_classq( k, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s )
                          ! k by k-1 rect. at a(0,k)
                       end do
                       do j = 0, k - 3
                          call stdlib${ii}$_classq( k-j-2, a( j+2+j*lda ), 1_${ik}$, scale, s )
                          ! l at a(1,0)
                       end do
                       s = s + s
                       ! double s for the off diagonal elements
                       l = 0_${ik}$
                       ! -> l(0,0) at a(0,0)
                       do i = 0, k - 2
                          aa = real( a( l ),KIND=sp)
                          ! l(i,i)
                          if( aa/=zero ) then
                             if( scale<aa ) then
                                s = one + s*( scale / aa )**2_${ik}$
                                scale = aa
                             else
                                s = s + ( aa / scale )**2_${ik}$
                             end if
                          end if
                          aa = real( a( l+1 ),KIND=sp)
                          ! l(k+i,k+i)
                          if( aa/=zero ) then
                             if( scale<aa ) then
                                s = one + s*( scale / aa )**2_${ik}$
                                scale = aa
                             else
                                s = s + ( aa / scale )**2_${ik}$
                             end if
                          end if
                          l = l + lda + 1_${ik}$
                       end do
                       ! l-> k-1 + (k-1)*lda or l(k-1,k-1) at a(k-1,k-1)
                       aa = real( a( l ),KIND=sp)
                       ! l(k-1,k-1) at a(k-1,k-1)
                       if( aa/=zero ) then
                          if( scale<aa ) then
                             s = one + s*( scale / aa )**2_${ik}$
                             scale = aa
                          else
                             s = s + ( aa / scale )**2_${ik}$
                          end if
                       end if
                    end if
                 end if
              else
                 ! n is even
                 if( ifm==1_${ik}$ ) then
                    ! a is normal
                    if( ilu==0_${ik}$ ) then
                       ! a is upper
                       do j = 0, k - 2
                          call stdlib${ii}$_classq( k-j-1, a( k+j+2+j*lda ), 1_${ik}$, scale, s )
                       ! l at a(k+1,0)
                       end do
                       do j = 0, k - 1
                          call stdlib${ii}$_classq( k+j, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s )
                       ! trap u at a(0,0)
                       end do
                       s = s + s
                       ! double s for the off diagonal elements
                       l = k
                       ! -> u(k,k) at a(k,0)
                       do i = 0, k - 1
                          aa = real( a( l ),KIND=sp)
                          ! u(k+i,k+i)
                          if( aa/=zero ) then
                             if( scale<aa ) then
                                s = one + s*( scale / aa )**2_${ik}$
                                scale = aa
                             else
                                s = s + ( aa / scale )**2_${ik}$
                             end if