#: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 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 else ! ilu=1 do j = 0, k - 1 call stdlib${ii}$_classq( n-j-1, a( j+2+j*lda ), 1_${ik}$, scale, s ) ! trap l at a(1,0) end do 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 s = s + s ! double s for the off diagonal elements l = 0_${ik}$ ! -> l(k,k) at a(0,0) do i = 0, 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 - 1 call stdlib${ii}$_classq( j, a( 0_${ik}$+( k+1+j )*lda ), 1_${ik}$, scale, s ) ! u at a(0,k+1) end do do j = 0, k - 1 call stdlib${ii}$_classq( k, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! k by k rect. at a(0,0) end do do j = 0, k - 2 call stdlib${ii}$_classq( k-j-1, a( j+1+( j+k )*lda ), 1_${ik}$, scale,s ) ! l at a(0,k) end do s = s + s ! double s for the off diagonal elements l = 0_${ik}$ + k*lda ! -> u(k,k) at a(0,k) aa = real( a( l ),KIND=sp) ! u(k,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 l = l + lda ! -> u(0,0) at a(0,k+1) do j = k + 1, n - 1 aa = real( a( l ),KIND=sp) ! -> u(j-k-1,j-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 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 ! l=k-1+n*lda ! -> u(k-1,k-1) at a(k-1,n) aa = real( a( l ),KIND=sp) ! u(k,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 else ! a**h is lower do j = 1, k - 1 call stdlib${ii}$_classq( j, a( 0_${ik}$+( j+1 )*lda ), 1_${ik}$, scale, s ) ! u at a(0,1) end do do j = k + 1, n call stdlib${ii}$_classq( k, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! k by k rect. at a(0,k+1) end do do j = 0, k - 2 call stdlib${ii}$_classq( k-j-1, a( j+1+j*lda ), 1_${ik}$, scale, s ) ! l at a(0,0) end do s = s + s ! double s for the off diagonal elements l = 0_${ik}$ ! -> l(k,k) at a(0,0) aa = real( a( l ),KIND=sp) ! l(k,k) 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(0,0) at a(0,1) 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+1,k+i+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 + 1_${ik}$ end do ! l-> k - 1 + k*lda or l(k-1,k-1) at a(k-1,k) aa = real( a( l ),KIND=sp) ! l(k-1,k-1) at a(k-1,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 end if end if end if value = scale*sqrt( s ) end if stdlib${ii}$_clanhf = value return end function stdlib${ii}$_clanhf real(dp) module function stdlib${ii}$_zlanhf( norm, transr, uplo, n, a, work ) !! ZLANHF 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_dp, 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(dp), intent(out) :: work(0_${ik}$:*) complex(dp), intent(in) :: a(0_${ik}$:*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, ifm, ilu, noe, n1, k, l, lda real(dp) :: scale, s, value, aa, temp ! Intrinsic Functions ! Executable Statements if( n==0_${ik}$ ) then stdlib${ii}$_zlanhf = zero return else if( n==1_${ik}$ ) then stdlib${ii}$_zlanhf = abs(real(a(0_${ik}$),KIND=dp)) 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=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp do i = 1, n - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( 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}$_disnan( temp ) )value = temp end do i = j - 1_${ik}$ ! l(k+j,k+j) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp i = j ! -> l(j,j) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp do i = j + 1, n - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( 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}$_disnan( temp ) )value = temp end do i = k + j - 1_${ik}$ ! -> u(i,i) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp i = i + 1_${ik}$ ! =k+j; i -> u(j,j) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp do i = k + j + 1, n - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp end do end do do i = 0, n - 2 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp ! j=k-1 end do ! i=n-1 -> u(n-1,n-1) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( 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}$_disnan( temp ) )value = temp end do i = j ! l(i,i) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp i = j + 1_${ik}$ ! l(j+k,j+k) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp do i = j + 2, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( 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}$_disnan( 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=dp) ) if( value < temp .or. stdlib${ii}$_disnan( 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}$_disnan( 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}$_disnan( 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=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp do i = 1, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( 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}$_disnan( temp ) )value = temp end do i = j - k ! -> u(i,i) at a(i,j) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp i = j - k + 1_${ik}$ ! u(j,j) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp do i = j - k + 2, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( 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=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp temp = abs( real( a( j+1+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp do i = 2, n temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( 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}$_disnan( temp ) )value = temp end do i = j ! l(k+j,k+j) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp i = j + 1_${ik}$ ! -> l(j,j) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp do i = j + 2, n temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( 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}$_disnan( temp ) )value = temp end do i = k + j ! -> u(i,i) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp i = i + 1_${ik}$ ! =k+j+1; i -> u(j,j) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp do i = k + j + 2, n temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp end do end do do i = 0, n - 2 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp ! j=k-1 end do ! i=n-1 -> u(n-1,n-1) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp i = n ! -> u(k-1,k-1) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( 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=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp do i = 1, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( 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}$_disnan( temp ) )value = temp end do i = j - 1_${ik}$ ! l(i,i) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp i = j ! l(j+k,j+k) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp do i = j + 1, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( 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}$_disnan( 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=dp) ) if( value < temp .or. stdlib${ii}$_disnan( 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}$_disnan( 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}$_disnan( 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=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp do i = 1, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( 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}$_disnan( 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=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp i = j - k ! u(j,j) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp do i = j - k + 1, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( 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}$_disnan( temp ) )value = temp end do i = k - 1_${ik}$ ! u(k,k) at a(i,j) temp = abs( real( a( i+j*lda ),KIND=dp) ) if( value < temp .or. stdlib${ii}$_disnan( 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=dp) ) ! -> 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=dp) ) ! -> 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}$_disnan( 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=dp) ) ! -> 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=dp) ) ! -> 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}$_disnan( 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=dp) ) ! -> a(j+k,j+k) work( j+k ) = s + aa i = i + 1_${ik}$ aa = abs( real( a( i+j*lda ),KIND=dp) ) ! -> 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}$_disnan( 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=dp) ) ! -> 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=dp) ) ! -> 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}$_disnan( 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=dp) ) ! 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=dp) ) ! 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=dp) ) ! 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}$_disnan( 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=dp) ) ! 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=dp) ) 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=dp) ) ! 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}$_disnan( 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=dp) ) ! 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=dp) ) ! 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=dp) ) ! 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=dp) ) ! 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}$_disnan( 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=dp) ) ! 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=dp) ) ! 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=dp) ) 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=dp) ) ! 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}$_disnan( 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}$_zlassq( 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}$_zlassq( 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=dp) ! 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=dp) ! 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=dp) ! 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}$_zlassq( 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}$_zlassq( 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=dp) ! 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=dp) ! 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=dp) ! 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}$_zlassq( 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}$_zlassq( 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}$_zlassq( 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=dp) ! 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=dp) ! -> 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=dp) ! -> 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}$_zlassq( 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}$_zlassq( 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}$_zlassq( 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=dp) ! 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=dp) ! 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=dp) ! 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}$_zlassq( 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}$_zlassq( 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=dp) ! 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=dp) ! 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 else ! ilu=1 do j = 0, k - 1 call stdlib${ii}$_zlassq( n-j-1, a( j+2+j*lda ), 1_${ik}$, scale, s ) ! trap l at a(1,0) end do do j = 1, k - 1 call stdlib${ii}$_zlassq( j, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! u at a(0,0) end do s = s + s ! double s for the off diagonal elements l = 0_${ik}$ ! -> l(k,k) at a(0,0) do i = 0, k - 1 aa = real( a( l ),KIND=dp) ! 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=dp) ! 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 - 1 call stdlib${ii}$_zlassq( j, a( 0_${ik}$+( k+1+j )*lda ), 1_${ik}$, scale, s ) ! u at a(0,k+1) end do do j = 0, k - 1 call stdlib${ii}$_zlassq( k, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! k by k rect. at a(0,0) end do do j = 0, k - 2 call stdlib${ii}$_zlassq( k-j-1, a( j+1+( j+k )*lda ), 1_${ik}$, scale,s ) ! l at a(0,k) end do s = s + s ! double s for the off diagonal elements l = 0_${ik}$ + k*lda ! -> u(k,k) at a(0,k) aa = real( a( l ),KIND=dp) ! u(k,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 l = l + lda ! -> u(0,0) at a(0,k+1) do j = k + 1, n - 1 aa = real( a( l ),KIND=dp) ! -> u(j-k-1,j-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 aa = real( a( l+1 ),KIND=dp) ! -> 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 ! l=k-1+n*lda ! -> u(k-1,k-1) at a(k-1,n) aa = real( a( l ),KIND=dp) ! u(k,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 else ! a**h is lower do j = 1, k - 1 call stdlib${ii}$_zlassq( j, a( 0_${ik}$+( j+1 )*lda ), 1_${ik}$, scale, s ) ! u at a(0,1) end do do j = k + 1, n call stdlib${ii}$_zlassq( k, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! k by k rect. at a(0,k+1) end do do j = 0, k - 2 call stdlib${ii}$_zlassq( k-j-1, a( j+1+j*lda ), 1_${ik}$, scale, s ) ! l at a(0,0) end do s = s + s ! double s for the off diagonal elements l = 0_${ik}$ ! -> l(k,k) at a(0,0) aa = real( a( l ),KIND=dp) ! l(k,k) 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(0,0) at a(0,1) do i = 0, k - 2 aa = real( a( l ),KIND=dp) ! 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=dp) ! l(k+i+1,k+i+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 + 1_${ik}$ end do ! l-> k - 1 + k*lda or l(k-1,k-1) at a(k-1,k) aa = real( a( l ),KIND=dp) ! l(k-1,k-1) at a(k-1,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 end if end if end if value = scale*sqrt( s ) end if stdlib${ii}$_zlanhf = value return end function stdlib${ii}$_zlanhf #:for ck,ct,ci in CMPLX_KINDS_TYPES #:if not ck in ["sp","dp"] real(${ck}$) module function stdlib${ii}$_${ci}$lanhf( norm, transr, uplo, n, a, work ) !! ZLANHF: 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_${ck}$, 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(${ck}$), intent(out) :: work(0_${ik}$:*) complex(${ck}$), intent(in) :: a(0_${ik}$:*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, ifm, ilu, noe, n1, k, l, lda real(${ck}$) :: scale, s, value, aa, temp ! Intrinsic Functions ! Executable Statements if( n==0_${ik}$ ) then stdlib${ii}$_${ci}$lanhf = zero return else if( n==1_${ik}$ ) then stdlib${ii}$_${ci}$lanhf = abs(real(a(0_${ik}$),KIND=${ck}$)) 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=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp do i = 1, n - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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}$_${c2ri(ci)}$isnan( temp ) )value = temp end do i = j - 1_${ik}$ ! l(k+j,k+j) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp i = j ! -> l(j,j) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp do i = j + 1, n - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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}$_${c2ri(ci)}$isnan( temp ) )value = temp end do i = k + j - 1_${ik}$ ! -> u(i,i) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp i = i + 1_${ik}$ ! =k+j; i -> u(j,j) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp do i = k + j + 1, n - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp end do end do do i = 0, n - 2 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp ! j=k-1 end do ! i=n-1 -> u(n-1,n-1) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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}$_${c2ri(ci)}$isnan( temp ) )value = temp end do i = j ! l(i,i) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp i = j + 1_${ik}$ ! l(j+k,j+k) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp do i = j + 2, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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}$_${c2ri(ci)}$isnan( 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=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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}$_${c2ri(ci)}$isnan( 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}$_${c2ri(ci)}$isnan( 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=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp do i = 1, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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}$_${c2ri(ci)}$isnan( temp ) )value = temp end do i = j - k ! -> u(i,i) at a(i,j) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp i = j - k + 1_${ik}$ ! u(j,j) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp do i = j - k + 2, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp temp = abs( real( a( j+1+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp do i = 2, n temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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}$_${c2ri(ci)}$isnan( temp ) )value = temp end do i = j ! l(k+j,k+j) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp i = j + 1_${ik}$ ! -> l(j,j) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp do i = j + 2, n temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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}$_${c2ri(ci)}$isnan( temp ) )value = temp end do i = k + j ! -> u(i,i) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp i = i + 1_${ik}$ ! =k+j+1; i -> u(j,j) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp do i = k + j + 2, n temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp end do end do do i = 0, n - 2 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp ! j=k-1 end do ! i=n-1 -> u(n-1,n-1) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp i = n ! -> u(k-1,k-1) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp do i = 1, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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}$_${c2ri(ci)}$isnan( temp ) )value = temp end do i = j - 1_${ik}$ ! l(i,i) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp i = j ! l(j+k,j+k) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp do i = j + 1, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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}$_${c2ri(ci)}$isnan( 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=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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}$_${c2ri(ci)}$isnan( 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}$_${c2ri(ci)}$isnan( 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=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp do i = 1, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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}$_${c2ri(ci)}$isnan( 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=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp i = j - k ! u(j,j) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( temp ) )value = temp do i = j - k + 1, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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}$_${c2ri(ci)}$isnan( temp ) )value = temp end do i = k - 1_${ik}$ ! u(k,k) at a(i,j) temp = abs( real( a( i+j*lda ),KIND=${ck}$) ) if( value < temp .or. stdlib${ii}$_${c2ri(ci)}$isnan( 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=${ck}$) ) ! -> 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=${ck}$) ) ! -> 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}$_${c2ri(ci)}$isnan( 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=${ck}$) ) ! -> 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=${ck}$) ) ! -> 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}$_${c2ri(ci)}$isnan( 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=${ck}$) ) ! -> a(j+k,j+k) work( j+k ) = s + aa i = i + 1_${ik}$ aa = abs( real( a( i+j*lda ),KIND=${ck}$) ) ! -> 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}$_${c2ri(ci)}$isnan( 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=${ck}$) ) ! -> 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=${ck}$) ) ! -> 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}$_${c2ri(ci)}$isnan( 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=${ck}$) ) ! 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=${ck}$) ) ! 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=${ck}$) ) ! 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}$_${c2ri(ci)}$isnan( 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=${ck}$) ) ! 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=${ck}$) ) 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=${ck}$) ) ! 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}$_${c2ri(ci)}$isnan( 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=${ck}$) ) ! 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=${ck}$) ) ! 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=${ck}$) ) ! 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=${ck}$) ) ! 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}$_${c2ri(ci)}$isnan( 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=${ck}$) ) ! 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=${ck}$) ) ! 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=${ck}$) ) 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=${ck}$) ) ! 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}$_${c2ri(ci)}$isnan( 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}$_${ci}$lassq( 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}$_${ci}$lassq( 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=${ck}$) ! 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=${ck}$) ! 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=${ck}$) ! 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}$_${ci}$lassq( 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}$_${ci}$lassq( 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=${ck}$) ! 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=${ck}$) ! 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=${ck}$) ! 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}$_${ci}$lassq( 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}$_${ci}$lassq( 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}$_${ci}$lassq( 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=${ck}$) ! 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=${ck}$) ! -> 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=${ck}$) ! -> 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}$_${ci}$lassq( 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}$_${ci}$lassq( 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}$_${ci}$lassq( 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=${ck}$) ! 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=${ck}$) ! 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=${ck}$) ! 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}$_${ci}$lassq( 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}$_${ci}$lassq( 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=${ck}$) ! 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=${ck}$) ! 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 else ! ilu=1 do j = 0, k - 1 call stdlib${ii}$_${ci}$lassq( n-j-1, a( j+2+j*lda ), 1_${ik}$, scale, s ) ! trap l at a(1,0) end do do j = 1, k - 1 call stdlib${ii}$_${ci}$lassq( j, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! u at a(0,0) end do s = s + s ! double s for the off diagonal elements l = 0_${ik}$ ! -> l(k,k) at a(0,0) do i = 0, k - 1 aa = real( a( l ),KIND=${ck}$) ! 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=${ck}$) ! 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 - 1 call stdlib${ii}$_${ci}$lassq( j, a( 0_${ik}$+( k+1+j )*lda ), 1_${ik}$, scale, s ) ! u at a(0,k+1) end do do j = 0, k - 1 call stdlib${ii}$_${ci}$lassq( k, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! k by k rect. at a(0,0) end do do j = 0, k - 2 call stdlib${ii}$_${ci}$lassq( k-j-1, a( j+1+( j+k )*lda ), 1_${ik}$, scale,s ) ! l at a(0,k) end do s = s + s ! double s for the off diagonal elements l = 0_${ik}$ + k*lda ! -> u(k,k) at a(0,k) aa = real( a( l ),KIND=${ck}$) ! u(k,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 l = l + lda ! -> u(0,0) at a(0,k+1) do j = k + 1, n - 1 aa = real( a( l ),KIND=${ck}$) ! -> u(j-k-1,j-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 aa = real( a( l+1 ),KIND=${ck}$) ! -> 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 ! l=k-1+n*lda ! -> u(k-1,k-1) at a(k-1,n) aa = real( a( l ),KIND=${ck}$) ! u(k,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 else ! a**h is lower do j = 1, k - 1 call stdlib${ii}$_${ci}$lassq( j, a( 0_${ik}$+( j+1 )*lda ), 1_${ik}$, scale, s ) ! u at a(0,1) end do do j = k + 1, n call stdlib${ii}$_${ci}$lassq( k, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! k by k rect. at a(0,k+1) end do do j = 0, k - 2 call stdlib${ii}$_${ci}$lassq( k-j-1, a( j+1+j*lda ), 1_${ik}$, scale, s ) ! l at a(0,0) end do s = s + s ! double s for the off diagonal elements l = 0_${ik}$ ! -> l(k,k) at a(0,0) aa = real( a( l ),KIND=${ck}$) ! l(k,k) 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(0,0) at a(0,1) do i = 0, k - 2 aa = real( a( l ),KIND=${ck}$) ! 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=${ck}$) ! l(k+i+1,k+i+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 + 1_${ik}$ end do ! l-> k - 1 + k*lda or l(k-1,k-1) at a(k-1,k) aa = real( a( l ),KIND=${ck}$) ! l(k-1,k-1) at a(k-1,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 end if end if end if value = scale*sqrt( s ) end if stdlib${ii}$_${ci}$lanhf = value return end function stdlib${ii}$_${ci}$lanhf #:endif #:endfor real(sp) module function stdlib${ii}$_slansf( norm, transr, uplo, n, a, work ) !! SLANSF 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 symmetric 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(in) :: a(0_${ik}$:*) real(sp), intent(out) :: work(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}$_slansf = zero return else if( n==1_${ik}$ ) then stdlib${ii}$_slansf = abs( a(0_${ik}$) ) 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='t or 't' and 1 otherwise ifm = 1_${ik}$ if( stdlib_lsame( transr, 'T' ) )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 do j = 0, k - 1 do i = 0, n - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp end do end do else ! xpose case; a is k by n do j = 0, 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 end if else ! n is even if( ifm==1_${ik}$ ) then ! a is n+1 by k do j = 0, k - 1 do i = 0, n temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_sisnan( temp ) )value = temp end do end do else ! xpose case; a is k by n+1 do j = 0, 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 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 symmetric). if( ifm==1_${ik}$ ) then k = n / 2_${ik}$ if( noe==1_${ik}$ ) then ! n is odd if( ilu==0_${ik}$ ) then 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( a( i+j*lda ) ) ! -> a(j+k,j+k) work( j+k ) = s + aa if( i==k+k )go to 10 i = i + 1_${ik}$ aa = abs( a( i+j*lda ) ) ! -> 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( a( i+j*lda ) ) ! -> 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( a( i+j*lda ) ) ! -> 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 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( a( i+j*lda ) ) ! -> a(j+k,j+k) work( j+k ) = s + aa i = i + 1_${ik}$ aa = abs( a( i+j*lda ) ) ! -> 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( a( i+j*lda ) ) ! -> a(j+k,j+k) s = s + aa work( i+k ) = work( i+k ) + s ! i=j i = i + 1_${ik}$ aa = abs( a( i+j*lda ) ) ! -> 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 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( a( 0_${ik}$+j*lda ) ) ! 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( a( i+j*lda ) ) ! a(j-k,j-k) s = s + aa work( j-k ) = work( j-k ) + s i = i + 1_${ik}$ s = abs( a( i+j*lda ) ) ! 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( a( i+j*lda ) ) ! 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( a( i+j*lda ) ) 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( a( i+j*lda ) ) ! 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 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( a( 0_${ik}$+j*lda ) ) ! 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( a( i+j*lda ) ) ! 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( a( i+j*lda ) ) ! 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( a( i+j*lda ) ) ! 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( a( 0_${ik}$ ) ) ! 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( a( i+j*lda ) ) ! 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( a( i+j*lda ) ) 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( a( i+j*lda ) ) ! 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}$_slassq( 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}$_slassq( 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 call stdlib${ii}$_slassq( k-1, a( k ), lda+1, scale, s ) ! tri l at a(k,0) call stdlib${ii}$_slassq( k, a( k-1 ), lda+1, scale, s ) ! tri u at a(k-1,0) else ! ilu=1 do j = 0, k - 1 call stdlib${ii}$_slassq( n-j-1, a( j+1+j*lda ), 1_${ik}$, scale, s ) ! trap l at a(0,0) end do do j = 0, k - 2 call stdlib${ii}$_slassq( 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 call stdlib${ii}$_slassq( k, a( 0_${ik}$ ), lda+1, scale, s ) ! tri l at a(0,0) call stdlib${ii}$_slassq( k-1, a( 0_${ik}$+lda ), lda+1, scale, s ) ! tri u at a(0,1) end if else ! a is xpose if( ilu==0_${ik}$ ) then ! a**t is upper do j = 1, k - 2 call stdlib${ii}$_slassq( 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}$_slassq( 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}$_slassq( 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 call stdlib${ii}$_slassq( k-1, a( 0_${ik}$+k*lda ), lda+1, scale, s ) ! tri u at a(0,k) call stdlib${ii}$_slassq( k, a( 0_${ik}$+( k-1 )*lda ), lda+1, scale, s ) ! tri l at a(0,k-1) else ! a**t is lower do j = 1, k - 1 call stdlib${ii}$_slassq( 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}$_slassq( 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}$_slassq( 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 call stdlib${ii}$_slassq( k, a( 0_${ik}$ ), lda+1, scale, s ) ! tri u at a(0,0) call stdlib${ii}$_slassq( k-1, a( 1_${ik}$ ), lda+1, scale, s ) ! tri l at a(1,0) 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}$_slassq( 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}$_slassq( 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 call stdlib${ii}$_slassq( k, a( k+1 ), lda+1, scale, s ) ! tri l at a(k+1,0) call stdlib${ii}$_slassq( k, a( k ), lda+1, scale, s ) ! tri u at a(k,0) else ! ilu=1 do j = 0, k - 1 call stdlib${ii}$_slassq( n-j-1, a( j+2+j*lda ), 1_${ik}$, scale, s ) ! trap l at a(1,0) end do do j = 1, k - 1 call stdlib${ii}$_slassq( j, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! u at a(0,0) end do s = s + s ! double s for the off diagonal elements call stdlib${ii}$_slassq( k, a( 1_${ik}$ ), lda+1, scale, s ) ! tri l at a(1,0) call stdlib${ii}$_slassq( k, a( 0_${ik}$ ), lda+1, scale, s ) ! tri u at a(0,0) end if else ! a is xpose if( ilu==0_${ik}$ ) then ! a**t is upper do j = 1, k - 1 call stdlib${ii}$_slassq( j, a( 0_${ik}$+( k+1+j )*lda ), 1_${ik}$, scale, s ) ! u at a(0,k+1) end do do j = 0, k - 1 call stdlib${ii}$_slassq( k, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! k by k rect. at a(0,0) end do do j = 0, k - 2 call stdlib${ii}$_slassq( k-j-1, a( j+1+( j+k )*lda ), 1_${ik}$, scale,s ) ! l at a(0,k) end do s = s + s ! double s for the off diagonal elements call stdlib${ii}$_slassq( k, a( 0_${ik}$+( k+1 )*lda ), lda+1, scale, s ) ! tri u at a(0,k+1) call stdlib${ii}$_slassq( k, a( 0_${ik}$+k*lda ), lda+1, scale, s ) ! tri l at a(0,k) else ! a**t is lower do j = 1, k - 1 call stdlib${ii}$_slassq( j, a( 0_${ik}$+( j+1 )*lda ), 1_${ik}$, scale, s ) ! u at a(0,1) end do do j = k + 1, n call stdlib${ii}$_slassq( k, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! k by k rect. at a(0,k+1) end do do j = 0, k - 2 call stdlib${ii}$_slassq( k-j-1, a( j+1+j*lda ), 1_${ik}$, scale, s ) ! l at a(0,0) end do s = s + s ! double s for the off diagonal elements call stdlib${ii}$_slassq( k, a( lda ), lda+1, scale, s ) ! tri l at a(0,1) call stdlib${ii}$_slassq( k, a( 0_${ik}$ ), lda+1, scale, s ) ! tri u at a(0,0) end if end if end if value = scale*sqrt( s ) end if stdlib${ii}$_slansf = value return end function stdlib${ii}$_slansf real(dp) module function stdlib${ii}$_dlansf( norm, transr, uplo, n, a, work ) !! DLANSF 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 symmetric 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_dp, 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(dp), intent(in) :: a(0_${ik}$:*) real(dp), intent(out) :: work(0_${ik}$:*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, ifm, ilu, noe, n1, k, l, lda real(dp) :: scale, s, value, aa, temp ! Intrinsic Functions ! Executable Statements if( n==0_${ik}$ ) then stdlib${ii}$_dlansf = zero return else if( n==1_${ik}$ ) then stdlib${ii}$_dlansf = abs( a(0_${ik}$) ) 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='t or 't' and 1 otherwise ifm = 1_${ik}$ if( stdlib_lsame( transr, 'T' ) )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 do j = 0, k - 1 do i = 0, n - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp end do end do else ! xpose case; a is k by n do j = 0, n - 1 do i = 0, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp end do end do end if else ! n is even if( ifm==1_${ik}$ ) then ! a is n+1 by k do j = 0, k - 1 do i = 0, n temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp end do end do else ! xpose case; a is k by n+1 do j = 0, n do i = 0, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_disnan( temp ) )value = temp end do end do 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 symmetric). if( ifm==1_${ik}$ ) then k = n / 2_${ik}$ if( noe==1_${ik}$ ) then ! n is odd if( ilu==0_${ik}$ ) then 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( a( i+j*lda ) ) ! -> a(j+k,j+k) work( j+k ) = s + aa if( i==k+k )go to 10 i = i + 1_${ik}$ aa = abs( a( i+j*lda ) ) ! -> 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}$_disnan( 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( a( i+j*lda ) ) ! -> 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( a( i+j*lda ) ) ! -> 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}$_disnan( temp ) )value = temp end do end if else ! n is even if( ilu==0_${ik}$ ) then 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( a( i+j*lda ) ) ! -> a(j+k,j+k) work( j+k ) = s + aa i = i + 1_${ik}$ aa = abs( a( i+j*lda ) ) ! -> 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}$_disnan( 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( a( i+j*lda ) ) ! -> a(j+k,j+k) s = s + aa work( i+k ) = work( i+k ) + s ! i=j i = i + 1_${ik}$ aa = abs( a( i+j*lda ) ) ! -> 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}$_disnan( 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 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( a( 0_${ik}$+j*lda ) ) ! 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( a( i+j*lda ) ) ! a(j-k,j-k) s = s + aa work( j-k ) = work( j-k ) + s i = i + 1_${ik}$ s = abs( a( i+j*lda ) ) ! 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}$_disnan( 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( a( i+j*lda ) ) ! 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( a( i+j*lda ) ) 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( a( i+j*lda ) ) ! 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}$_disnan( temp ) )value = temp end do end if else ! n is even if( ilu==0_${ik}$ ) then 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( a( 0_${ik}$+j*lda ) ) ! 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( a( i+j*lda ) ) ! 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( a( i+j*lda ) ) ! 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( a( i+j*lda ) ) ! 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}$_disnan( 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( a( 0_${ik}$ ) ) ! 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( a( i+j*lda ) ) ! 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( a( i+j*lda ) ) 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( a( i+j*lda ) ) ! 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}$_disnan( 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}$_dlassq( 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}$_dlassq( 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 call stdlib${ii}$_dlassq( k-1, a( k ), lda+1, scale, s ) ! tri l at a(k,0) call stdlib${ii}$_dlassq( k, a( k-1 ), lda+1, scale, s ) ! tri u at a(k-1,0) else ! ilu=1 do j = 0, k - 1 call stdlib${ii}$_dlassq( n-j-1, a( j+1+j*lda ), 1_${ik}$, scale, s ) ! trap l at a(0,0) end do do j = 0, k - 2 call stdlib${ii}$_dlassq( 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 call stdlib${ii}$_dlassq( k, a( 0_${ik}$ ), lda+1, scale, s ) ! tri l at a(0,0) call stdlib${ii}$_dlassq( k-1, a( 0_${ik}$+lda ), lda+1, scale, s ) ! tri u at a(0,1) end if else ! a is xpose if( ilu==0_${ik}$ ) then ! a**t is upper do j = 1, k - 2 call stdlib${ii}$_dlassq( 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}$_dlassq( 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}$_dlassq( 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 call stdlib${ii}$_dlassq( k-1, a( 0_${ik}$+k*lda ), lda+1, scale, s ) ! tri u at a(0,k) call stdlib${ii}$_dlassq( k, a( 0_${ik}$+( k-1 )*lda ), lda+1, scale, s ) ! tri l at a(0,k-1) else ! a**t is lower do j = 1, k - 1 call stdlib${ii}$_dlassq( 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}$_dlassq( 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}$_dlassq( 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 call stdlib${ii}$_dlassq( k, a( 0_${ik}$ ), lda+1, scale, s ) ! tri u at a(0,0) call stdlib${ii}$_dlassq( k-1, a( 1_${ik}$ ), lda+1, scale, s ) ! tri l at a(1,0) 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}$_dlassq( 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}$_dlassq( 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 call stdlib${ii}$_dlassq( k, a( k+1 ), lda+1, scale, s ) ! tri l at a(k+1,0) call stdlib${ii}$_dlassq( k, a( k ), lda+1, scale, s ) ! tri u at a(k,0) else ! ilu=1 do j = 0, k - 1 call stdlib${ii}$_dlassq( n-j-1, a( j+2+j*lda ), 1_${ik}$, scale, s ) ! trap l at a(1,0) end do do j = 1, k - 1 call stdlib${ii}$_dlassq( j, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! u at a(0,0) end do s = s + s ! double s for the off diagonal elements call stdlib${ii}$_dlassq( k, a( 1_${ik}$ ), lda+1, scale, s ) ! tri l at a(1,0) call stdlib${ii}$_dlassq( k, a( 0_${ik}$ ), lda+1, scale, s ) ! tri u at a(0,0) end if else ! a is xpose if( ilu==0_${ik}$ ) then ! a**t is upper do j = 1, k - 1 call stdlib${ii}$_dlassq( j, a( 0_${ik}$+( k+1+j )*lda ), 1_${ik}$, scale, s ) ! u at a(0,k+1) end do do j = 0, k - 1 call stdlib${ii}$_dlassq( k, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! k by k rect. at a(0,0) end do do j = 0, k - 2 call stdlib${ii}$_dlassq( k-j-1, a( j+1+( j+k )*lda ), 1_${ik}$, scale,s ) ! l at a(0,k) end do s = s + s ! double s for the off diagonal elements call stdlib${ii}$_dlassq( k, a( 0_${ik}$+( k+1 )*lda ), lda+1, scale, s ) ! tri u at a(0,k+1) call stdlib${ii}$_dlassq( k, a( 0_${ik}$+k*lda ), lda+1, scale, s ) ! tri l at a(0,k) else ! a**t is lower do j = 1, k - 1 call stdlib${ii}$_dlassq( j, a( 0_${ik}$+( j+1 )*lda ), 1_${ik}$, scale, s ) ! u at a(0,1) end do do j = k + 1, n call stdlib${ii}$_dlassq( k, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! k by k rect. at a(0,k+1) end do do j = 0, k - 2 call stdlib${ii}$_dlassq( k-j-1, a( j+1+j*lda ), 1_${ik}$, scale, s ) ! l at a(0,0) end do s = s + s ! double s for the off diagonal elements call stdlib${ii}$_dlassq( k, a( lda ), lda+1, scale, s ) ! tri l at a(0,1) call stdlib${ii}$_dlassq( k, a( 0_${ik}$ ), lda+1, scale, s ) ! tri u at a(0,0) end if end if end if value = scale*sqrt( s ) end if stdlib${ii}$_dlansf = value return end function stdlib${ii}$_dlansf #:for rk,rt,ri in REAL_KINDS_TYPES #:if not rk in ["sp","dp"] real(${rk}$) module function stdlib${ii}$_${ri}$lansf( norm, transr, uplo, n, a, work ) !! DLANSF: 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 symmetric 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_${rk}$, 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(${rk}$), intent(in) :: a(0_${ik}$:*) real(${rk}$), intent(out) :: work(0_${ik}$:*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, ifm, ilu, noe, n1, k, l, lda real(${rk}$) :: scale, s, value, aa, temp ! Intrinsic Functions ! Executable Statements if( n==0_${ik}$ ) then stdlib${ii}$_${ri}$lansf = zero return else if( n==1_${ik}$ ) then stdlib${ii}$_${ri}$lansf = abs( a(0_${ik}$) ) 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='t or 't' and 1 otherwise ifm = 1_${ik}$ if( stdlib_lsame( transr, 'T' ) )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 do j = 0, k - 1 do i = 0, n - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${ri}$isnan( temp ) )value = temp end do end do else ! xpose case; a is k by n do j = 0, n - 1 do i = 0, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${ri}$isnan( temp ) )value = temp end do end do end if else ! n is even if( ifm==1_${ik}$ ) then ! a is n+1 by k do j = 0, k - 1 do i = 0, n temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${ri}$isnan( temp ) )value = temp end do end do else ! xpose case; a is k by n+1 do j = 0, n do i = 0, k - 1 temp = abs( a( i+j*lda ) ) if( value < temp .or. stdlib${ii}$_${ri}$isnan( temp ) )value = temp end do end do 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 symmetric). if( ifm==1_${ik}$ ) then k = n / 2_${ik}$ if( noe==1_${ik}$ ) then ! n is odd if( ilu==0_${ik}$ ) then 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( a( i+j*lda ) ) ! -> a(j+k,j+k) work( j+k ) = s + aa if( i==k+k )go to 10 i = i + 1_${ik}$ aa = abs( a( i+j*lda ) ) ! -> 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}$_${ri}$isnan( 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( a( i+j*lda ) ) ! -> 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( a( i+j*lda ) ) ! -> 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}$_${ri}$isnan( temp ) )value = temp end do end if else ! n is even if( ilu==0_${ik}$ ) then 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( a( i+j*lda ) ) ! -> a(j+k,j+k) work( j+k ) = s + aa i = i + 1_${ik}$ aa = abs( a( i+j*lda ) ) ! -> 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}$_${ri}$isnan( 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( a( i+j*lda ) ) ! -> a(j+k,j+k) s = s + aa work( i+k ) = work( i+k ) + s ! i=j i = i + 1_${ik}$ aa = abs( a( i+j*lda ) ) ! -> 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}$_${ri}$isnan( 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 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( a( 0_${ik}$+j*lda ) ) ! 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( a( i+j*lda ) ) ! a(j-k,j-k) s = s + aa work( j-k ) = work( j-k ) + s i = i + 1_${ik}$ s = abs( a( i+j*lda ) ) ! 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}$_${ri}$isnan( 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( a( i+j*lda ) ) ! 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( a( i+j*lda ) ) 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( a( i+j*lda ) ) ! 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}$_${ri}$isnan( temp ) )value = temp end do end if else ! n is even if( ilu==0_${ik}$ ) then 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( a( 0_${ik}$+j*lda ) ) ! 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( a( i+j*lda ) ) ! 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( a( i+j*lda ) ) ! 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( a( i+j*lda ) ) ! 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}$_${ri}$isnan( 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( a( 0_${ik}$ ) ) ! 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( a( i+j*lda ) ) ! 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( a( i+j*lda ) ) 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( a( i+j*lda ) ) ! 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}$_${ri}$isnan( 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}$_${ri}$lassq( 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}$_${ri}$lassq( 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 call stdlib${ii}$_${ri}$lassq( k-1, a( k ), lda+1, scale, s ) ! tri l at a(k,0) call stdlib${ii}$_${ri}$lassq( k, a( k-1 ), lda+1, scale, s ) ! tri u at a(k-1,0) else ! ilu=1 do j = 0, k - 1 call stdlib${ii}$_${ri}$lassq( n-j-1, a( j+1+j*lda ), 1_${ik}$, scale, s ) ! trap l at a(0,0) end do do j = 0, k - 2 call stdlib${ii}$_${ri}$lassq( 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 call stdlib${ii}$_${ri}$lassq( k, a( 0_${ik}$ ), lda+1, scale, s ) ! tri l at a(0,0) call stdlib${ii}$_${ri}$lassq( k-1, a( 0_${ik}$+lda ), lda+1, scale, s ) ! tri u at a(0,1) end if else ! a is xpose if( ilu==0_${ik}$ ) then ! a**t is upper do j = 1, k - 2 call stdlib${ii}$_${ri}$lassq( 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}$_${ri}$lassq( 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}$_${ri}$lassq( 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 call stdlib${ii}$_${ri}$lassq( k-1, a( 0_${ik}$+k*lda ), lda+1, scale, s ) ! tri u at a(0,k) call stdlib${ii}$_${ri}$lassq( k, a( 0_${ik}$+( k-1 )*lda ), lda+1, scale, s ) ! tri l at a(0,k-1) else ! a**t is lower do j = 1, k - 1 call stdlib${ii}$_${ri}$lassq( 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}$_${ri}$lassq( 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}$_${ri}$lassq( 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 call stdlib${ii}$_${ri}$lassq( k, a( 0_${ik}$ ), lda+1, scale, s ) ! tri u at a(0,0) call stdlib${ii}$_${ri}$lassq( k-1, a( 1_${ik}$ ), lda+1, scale, s ) ! tri l at a(1,0) 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}$_${ri}$lassq( 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}$_${ri}$lassq( 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 call stdlib${ii}$_${ri}$lassq( k, a( k+1 ), lda+1, scale, s ) ! tri l at a(k+1,0) call stdlib${ii}$_${ri}$lassq( k, a( k ), lda+1, scale, s ) ! tri u at a(k,0) else ! ilu=1 do j = 0, k - 1 call stdlib${ii}$_${ri}$lassq( n-j-1, a( j+2+j*lda ), 1_${ik}$, scale, s ) ! trap l at a(1,0) end do do j = 1, k - 1 call stdlib${ii}$_${ri}$lassq( j, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! u at a(0,0) end do s = s + s ! double s for the off diagonal elements call stdlib${ii}$_${ri}$lassq( k, a( 1_${ik}$ ), lda+1, scale, s ) ! tri l at a(1,0) call stdlib${ii}$_${ri}$lassq( k, a( 0_${ik}$ ), lda+1, scale, s ) ! tri u at a(0,0) end if else ! a is xpose if( ilu==0_${ik}$ ) then ! a**t is upper do j = 1, k - 1 call stdlib${ii}$_${ri}$lassq( j, a( 0_${ik}$+( k+1+j )*lda ), 1_${ik}$, scale, s ) ! u at a(0,k+1) end do do j = 0, k - 1 call stdlib${ii}$_${ri}$lassq( k, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! k by k rect. at a(0,0) end do do j = 0, k - 2 call stdlib${ii}$_${ri}$lassq( k-j-1, a( j+1+( j+k )*lda ), 1_${ik}$, scale,s ) ! l at a(0,k) end do s = s + s ! double s for the off diagonal elements call stdlib${ii}$_${ri}$lassq( k, a( 0_${ik}$+( k+1 )*lda ), lda+1, scale, s ) ! tri u at a(0,k+1) call stdlib${ii}$_${ri}$lassq( k, a( 0_${ik}$+k*lda ), lda+1, scale, s ) ! tri l at a(0,k) else ! a**t is lower do j = 1, k - 1 call stdlib${ii}$_${ri}$lassq( j, a( 0_${ik}$+( j+1 )*lda ), 1_${ik}$, scale, s ) ! u at a(0,1) end do do j = k + 1, n call stdlib${ii}$_${ri}$lassq( k, a( 0_${ik}$+j*lda ), 1_${ik}$, scale, s ) ! k by k rect. at a(0,k+1) end do do j = 0, k - 2 call stdlib${ii}$_${ri}$lassq( k-j-1, a( j+1+j*lda ), 1_${ik}$, scale, s ) ! l at a(0,0) end do s = s + s ! double s for the off diagonal elements call stdlib${ii}$_${ri}$lassq( k, a( lda ), lda+1, scale, s ) ! tri l at a(0,1) call stdlib${ii}$_${ri}$lassq( k, a( 0_${ik}$ ), lda+1, scale, s ) ! tri u at a(0,0) end if end if end if value = scale*sqrt( s ) end if stdlib${ii}$_${ri}$lansf = value return end function stdlib${ii}$_${ri}$lansf #:endif #:endfor real(sp) module function stdlib${ii}$_clanhp( norm, uplo, n, ap, work ) !! CLANHP 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, supplied in packed form. ! -- 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, uplo integer(${ik}$), intent(in) :: n ! Array Arguments real(sp), intent(out) :: work(*) complex(sp), intent(in) :: ap(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, k real(sp) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then k = 0_${ik}$ do j = 1, n do i = k + 1, k + j - 1 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do k = k + j sum = abs( real( ap( k ),KIND=sp) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else k = 1_${ik}$ do j = 1, n sum = abs( real( ap( k ),KIND=sp) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum do i = k + 1, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do 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). value = zero k = 1_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do work( j ) = sum + abs( real( ap( k ),KIND=sp) ) k = k + 1_${ik}$ end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( real( ap( k ),KIND=sp) ) k = k + 1_${ik}$ do i = j + 1, n absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one k = 2_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_classq( j-1, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do else do j = 1, n - 1 call stdlib${ii}$_classq( n-j, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do end if sum = 2_${ik}$*sum k = 1_${ik}$ do i = 1, n if( real( ap( k ),KIND=sp)/=zero ) then absa = abs( real( ap( k ),KIND=sp) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if if( stdlib_lsame( uplo, 'U' ) ) then k = k + i + 1_${ik}$ else k = k + n - i + 1_${ik}$ end if end do value = scale*sqrt( sum ) end if stdlib${ii}$_clanhp = value return end function stdlib${ii}$_clanhp real(dp) module function stdlib${ii}$_zlanhp( norm, uplo, n, ap, work ) !! ZLANHP 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, supplied in packed form. ! -- 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, uplo integer(${ik}$), intent(in) :: n ! Array Arguments real(dp), intent(out) :: work(*) complex(dp), intent(in) :: ap(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, k real(dp) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then k = 0_${ik}$ do j = 1, n do i = k + 1, k + j - 1 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do k = k + j sum = abs( real( ap( k ),KIND=dp) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else k = 1_${ik}$ do j = 1, n sum = abs( real( ap( k ),KIND=dp) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum do i = k + 1, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do 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). value = zero k = 1_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do work( j ) = sum + abs( real( ap( k ),KIND=dp) ) k = k + 1_${ik}$ end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( real( ap( k ),KIND=dp) ) k = k + 1_${ik}$ do i = j + 1, n absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one k = 2_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_zlassq( j-1, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do else do j = 1, n - 1 call stdlib${ii}$_zlassq( n-j, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do end if sum = 2_${ik}$*sum k = 1_${ik}$ do i = 1, n if( real( ap( k ),KIND=dp)/=zero ) then absa = abs( real( ap( k ),KIND=dp) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if if( stdlib_lsame( uplo, 'U' ) ) then k = k + i + 1_${ik}$ else k = k + n - i + 1_${ik}$ end if end do value = scale*sqrt( sum ) end if stdlib${ii}$_zlanhp = value return end function stdlib${ii}$_zlanhp #:for ck,ct,ci in CMPLX_KINDS_TYPES #:if not ck in ["sp","dp"] real(${ck}$) module function stdlib${ii}$_${ci}$lanhp( norm, uplo, n, ap, work ) !! ZLANHP: 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, supplied in packed form. ! -- 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, uplo integer(${ik}$), intent(in) :: n ! Array Arguments real(${ck}$), intent(out) :: work(*) complex(${ck}$), intent(in) :: ap(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, k real(${ck}$) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then k = 0_${ik}$ do j = 1, n do i = k + 1, k + j - 1 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do k = k + j sum = abs( real( ap( k ),KIND=${ck}$) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do else k = 1_${ik}$ do j = 1, n sum = abs( real( ap( k ),KIND=${ck}$) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum do i = k + 1, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do 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). value = zero k = 1_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do work( j ) = sum + abs( real( ap( k ),KIND=${ck}$) ) k = k + 1_${ik}$ end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( real( ap( k ),KIND=${ck}$) ) k = k + 1_${ik}$ do i = j + 1, n absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one k = 2_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_${ci}$lassq( j-1, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do else do j = 1, n - 1 call stdlib${ii}$_${ci}$lassq( n-j, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do end if sum = 2_${ik}$*sum k = 1_${ik}$ do i = 1, n if( real( ap( k ),KIND=${ck}$)/=zero ) then absa = abs( real( ap( k ),KIND=${ck}$) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if if( stdlib_lsame( uplo, 'U' ) ) then k = k + i + 1_${ik}$ else k = k + n - i + 1_${ik}$ end if end do value = scale*sqrt( sum ) end if stdlib${ii}$_${ci}$lanhp = value return end function stdlib${ii}$_${ci}$lanhp #:endif #:endfor real(sp) module function stdlib${ii}$_slansp( norm, uplo, n, ap, work ) !! SLANSP 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 symmetric matrix A, supplied in packed form. ! -- 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, uplo integer(${ik}$), intent(in) :: n ! Array Arguments real(sp), intent(in) :: ap(*) real(sp), intent(out) :: work(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, k real(sp) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then k = 1_${ik}$ do j = 1, n do i = k, k + j - 1 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do k = k + j end do else k = 1_${ik}$ do j = 1, n do i = k, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do 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 symmetric). value = zero k = 1_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do work( j ) = sum + abs( ap( k ) ) k = k + 1_${ik}$ end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( ap( k ) ) k = k + 1_${ik}$ do i = j + 1, n absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one k = 2_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_slassq( j-1, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do else do j = 1, n - 1 call stdlib${ii}$_slassq( n-j, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do end if sum = 2_${ik}$*sum k = 1_${ik}$ do i = 1, n if( ap( k )/=zero ) then absa = abs( ap( k ) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if if( stdlib_lsame( uplo, 'U' ) ) then k = k + i + 1_${ik}$ else k = k + n - i + 1_${ik}$ end if end do value = scale*sqrt( sum ) end if stdlib${ii}$_slansp = value return end function stdlib${ii}$_slansp real(dp) module function stdlib${ii}$_dlansp( norm, uplo, n, ap, work ) !! DLANSP 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 symmetric matrix A, supplied in packed form. ! -- 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, uplo integer(${ik}$), intent(in) :: n ! Array Arguments real(dp), intent(in) :: ap(*) real(dp), intent(out) :: work(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, k real(dp) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then k = 1_${ik}$ do j = 1, n do i = k, k + j - 1 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do k = k + j end do else k = 1_${ik}$ do j = 1, n do i = k, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do 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 symmetric). value = zero k = 1_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do work( j ) = sum + abs( ap( k ) ) k = k + 1_${ik}$ end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( ap( k ) ) k = k + 1_${ik}$ do i = j + 1, n absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one k = 2_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_dlassq( j-1, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do else do j = 1, n - 1 call stdlib${ii}$_dlassq( n-j, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do end if sum = 2_${ik}$*sum k = 1_${ik}$ do i = 1, n if( ap( k )/=zero ) then absa = abs( ap( k ) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if if( stdlib_lsame( uplo, 'U' ) ) then k = k + i + 1_${ik}$ else k = k + n - i + 1_${ik}$ end if end do value = scale*sqrt( sum ) end if stdlib${ii}$_dlansp = value return end function stdlib${ii}$_dlansp #:for rk,rt,ri in REAL_KINDS_TYPES #:if not rk in ["sp","dp"] real(${rk}$) module function stdlib${ii}$_${ri}$lansp( norm, uplo, n, ap, work ) !! DLANSP: 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 symmetric matrix A, supplied in packed form. ! -- 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, uplo integer(${ik}$), intent(in) :: n ! Array Arguments real(${rk}$), intent(in) :: ap(*) real(${rk}$), intent(out) :: work(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, k real(${rk}$) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then k = 1_${ik}$ do j = 1, n do i = k, k + j - 1 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do k = k + j end do else k = 1_${ik}$ do j = 1, n do i = k, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do 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 symmetric). value = zero k = 1_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do work( j ) = sum + abs( ap( k ) ) k = k + 1_${ik}$ end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( ap( k ) ) k = k + 1_${ik}$ do i = j + 1, n absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one k = 2_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_${ri}$lassq( j-1, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do else do j = 1, n - 1 call stdlib${ii}$_${ri}$lassq( n-j, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do end if sum = 2_${ik}$*sum k = 1_${ik}$ do i = 1, n if( ap( k )/=zero ) then absa = abs( ap( k ) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if if( stdlib_lsame( uplo, 'U' ) ) then k = k + i + 1_${ik}$ else k = k + n - i + 1_${ik}$ end if end do value = scale*sqrt( sum ) end if stdlib${ii}$_${ri}$lansp = value return end function stdlib${ii}$_${ri}$lansp #:endif #:endfor real(sp) module function stdlib${ii}$_clansp( norm, uplo, n, ap, work ) !! CLANSP 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 symmetric matrix A, supplied in packed form. ! -- 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, uplo integer(${ik}$), intent(in) :: n ! Array Arguments real(sp), intent(out) :: work(*) complex(sp), intent(in) :: ap(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, k real(sp) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then k = 1_${ik}$ do j = 1, n do i = k, k + j - 1 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do k = k + j end do else k = 1_${ik}$ do j = 1, n do i = k, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do 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 symmetric). value = zero k = 1_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do work( j ) = sum + abs( ap( k ) ) k = k + 1_${ik}$ end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( ap( k ) ) k = k + 1_${ik}$ do i = j + 1, n absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one k = 2_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_classq( j-1, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do else do j = 1, n - 1 call stdlib${ii}$_classq( n-j, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do end if sum = 2_${ik}$*sum k = 1_${ik}$ do i = 1, n if( real( ap( k ),KIND=sp)/=zero ) then absa = abs( real( ap( k ),KIND=sp) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if if( aimag( ap( k ) )/=zero ) then absa = abs( aimag( ap( k ) ) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if if( stdlib_lsame( uplo, 'U' ) ) then k = k + i + 1_${ik}$ else k = k + n - i + 1_${ik}$ end if end do value = scale*sqrt( sum ) end if stdlib${ii}$_clansp = value return end function stdlib${ii}$_clansp real(dp) module function stdlib${ii}$_zlansp( norm, uplo, n, ap, work ) !! ZLANSP 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 symmetric matrix A, supplied in packed form. ! -- 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, uplo integer(${ik}$), intent(in) :: n ! Array Arguments real(dp), intent(out) :: work(*) complex(dp), intent(in) :: ap(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, k real(dp) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then k = 1_${ik}$ do j = 1, n do i = k, k + j - 1 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do k = k + j end do else k = 1_${ik}$ do j = 1, n do i = k, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do 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 symmetric). value = zero k = 1_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do work( j ) = sum + abs( ap( k ) ) k = k + 1_${ik}$ end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( ap( k ) ) k = k + 1_${ik}$ do i = j + 1, n absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one k = 2_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_zlassq( j-1, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do else do j = 1, n - 1 call stdlib${ii}$_zlassq( n-j, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do end if sum = 2_${ik}$*sum k = 1_${ik}$ do i = 1, n if( real( ap( k ),KIND=dp)/=zero ) then absa = abs( real( ap( k ),KIND=dp) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if if( aimag( ap( k ) )/=zero ) then absa = abs( aimag( ap( k ) ) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if if( stdlib_lsame( uplo, 'U' ) ) then k = k + i + 1_${ik}$ else k = k + n - i + 1_${ik}$ end if end do value = scale*sqrt( sum ) end if stdlib${ii}$_zlansp = value return end function stdlib${ii}$_zlansp #:for ck,ct,ci in CMPLX_KINDS_TYPES #:if not ck in ["sp","dp"] real(${ck}$) module function stdlib${ii}$_${ci}$lansp( norm, uplo, n, ap, work ) !! ZLANSP: 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 symmetric matrix A, supplied in packed form. ! -- 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, uplo integer(${ik}$), intent(in) :: n ! Array Arguments real(${ck}$), intent(out) :: work(*) complex(${ck}$), intent(in) :: ap(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, k real(${ck}$) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then k = 1_${ik}$ do j = 1, n do i = k, k + j - 1 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do k = k + j end do else k = 1_${ik}$ do j = 1, n do i = k, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do 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 symmetric). value = zero k = 1_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do work( j ) = sum + abs( ap( k ) ) k = k + 1_${ik}$ end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( ap( k ) ) k = k + 1_${ik}$ do i = j + 1, n absa = abs( ap( k ) ) sum = sum + absa work( i ) = work( i ) + absa k = k + 1_${ik}$ end do if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one k = 2_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_${ci}$lassq( j-1, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do else do j = 1, n - 1 call stdlib${ii}$_${ci}$lassq( n-j, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do end if sum = 2_${ik}$*sum k = 1_${ik}$ do i = 1, n if( real( ap( k ),KIND=${ck}$)/=zero ) then absa = abs( real( ap( k ),KIND=${ck}$) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if if( aimag( ap( k ) )/=zero ) then absa = abs( aimag( ap( k ) ) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if if( stdlib_lsame( uplo, 'U' ) ) then k = k + i + 1_${ik}$ else k = k + n - i + 1_${ik}$ end if end do value = scale*sqrt( sum ) end if stdlib${ii}$_${ci}$lansp = value return end function stdlib${ii}$_${ci}$lansp #:endif #:endfor real(sp) module function stdlib${ii}$_clanhb( norm, uplo, n, k, ab, ldab,work ) !! CLANHB 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 hermitian band matrix A, with k 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, uplo integer(${ik}$), intent(in) :: k, ldab, n ! Array Arguments real(sp), intent(out) :: work(*) complex(sp), intent(in) :: ab(ldab,*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, l real(sp) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do sum = abs( real( ab( k+1, j ),KIND=sp) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do j = 1, n sum = abs( real( ab( 1_${ik}$, j ),KIND=sp) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum do i = 2, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do 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). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero l = k + 1_${ik}$ - j do i = max( 1, j-k ), j - 1 absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( real( ab( k+1, j ),KIND=sp) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( real( ab( 1_${ik}$, j ),KIND=sp) ) l = 1_${ik}$ - j do i = j + 1, min( n, j+k ) absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( k>0_${ik}$ ) then if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_classq( min( j-1, k ), ab( max( k+2-j, 1_${ik}$ ), j ),1_${ik}$, scale, sum ) end do l = k + 1_${ik}$ else do j = 1, n - 1 call stdlib${ii}$_classq( min( n-j, k ), ab( 2_${ik}$, j ), 1_${ik}$, scale,sum ) end do l = 1_${ik}$ end if sum = 2_${ik}$*sum else l = 1_${ik}$ end if do j = 1, n if( real( ab( l, j ),KIND=sp)/=zero ) then absa = abs( real( ab( l, j ),KIND=sp) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if end do value = scale*sqrt( sum ) end if stdlib${ii}$_clanhb = value return end function stdlib${ii}$_clanhb real(dp) module function stdlib${ii}$_zlanhb( norm, uplo, n, k, ab, ldab,work ) !! ZLANHB 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 hermitian band matrix A, with k 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, uplo integer(${ik}$), intent(in) :: k, ldab, n ! Array Arguments real(dp), intent(out) :: work(*) complex(dp), intent(in) :: ab(ldab,*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, l real(dp) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do sum = abs( real( ab( k+1, j ),KIND=dp) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do j = 1, n sum = abs( real( ab( 1_${ik}$, j ),KIND=dp) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum do i = 2, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do 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). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero l = k + 1_${ik}$ - j do i = max( 1, j-k ), j - 1 absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( real( ab( k+1, j ),KIND=dp) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( real( ab( 1_${ik}$, j ),KIND=dp) ) l = 1_${ik}$ - j do i = j + 1, min( n, j+k ) absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( k>0_${ik}$ ) then if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_zlassq( min( j-1, k ), ab( max( k+2-j, 1_${ik}$ ), j ),1_${ik}$, scale, sum ) end do l = k + 1_${ik}$ else do j = 1, n - 1 call stdlib${ii}$_zlassq( min( n-j, k ), ab( 2_${ik}$, j ), 1_${ik}$, scale,sum ) end do l = 1_${ik}$ end if sum = 2_${ik}$*sum else l = 1_${ik}$ end if do j = 1, n if( real( ab( l, j ),KIND=dp)/=zero ) then absa = abs( real( ab( l, j ),KIND=dp) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if end do value = scale*sqrt( sum ) end if stdlib${ii}$_zlanhb = value return end function stdlib${ii}$_zlanhb #:for ck,ct,ci in CMPLX_KINDS_TYPES #:if not ck in ["sp","dp"] real(${ck}$) module function stdlib${ii}$_${ci}$lanhb( norm, uplo, n, k, ab, ldab,work ) !! ZLANHB: 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 hermitian band matrix A, with k 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, uplo integer(${ik}$), intent(in) :: k, ldab, n ! Array Arguments real(${ck}$), intent(out) :: work(*) complex(${ck}$), intent(in) :: ab(ldab,*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, l real(${ck}$) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do sum = abs( real( ab( k+1, j ),KIND=${ck}$) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do else do j = 1, n sum = abs( real( ab( 1_${ik}$, j ),KIND=${ck}$) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum do i = 2, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end do 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). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero l = k + 1_${ik}$ - j do i = max( 1, j-k ), j - 1 absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( real( ab( k+1, j ),KIND=${ck}$) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( real( ab( 1_${ik}$, j ),KIND=${ck}$) ) l = 1_${ik}$ - j do i = j + 1, min( n, j+k ) absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( k>0_${ik}$ ) then if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_${ci}$lassq( min( j-1, k ), ab( max( k+2-j, 1_${ik}$ ), j ),1_${ik}$, scale, sum ) end do l = k + 1_${ik}$ else do j = 1, n - 1 call stdlib${ii}$_${ci}$lassq( min( n-j, k ), ab( 2_${ik}$, j ), 1_${ik}$, scale,sum ) end do l = 1_${ik}$ end if sum = 2_${ik}$*sum else l = 1_${ik}$ end if do j = 1, n if( real( ab( l, j ),KIND=${ck}$)/=zero ) then absa = abs( real( ab( l, j ),KIND=${ck}$) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if end do value = scale*sqrt( sum ) end if stdlib${ii}$_${ci}$lanhb = value return end function stdlib${ii}$_${ci}$lanhb #:endif #:endfor real(sp) module function stdlib${ii}$_slansb( norm, uplo, n, k, ab, ldab,work ) !! SLANSB 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 symmetric band matrix A, with k 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, uplo integer(${ik}$), intent(in) :: k, ldab, n ! Array Arguments real(sp), intent(in) :: ab(ldab,*) real(sp), intent(out) :: work(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, l real(sp) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k + 1 sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do else do j = 1, n do i = 1, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do 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 symmetric). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero l = k + 1_${ik}$ - j do i = max( 1, j-k ), j - 1 absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( ab( k+1, j ) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( ab( 1_${ik}$, j ) ) l = 1_${ik}$ - j do i = j + 1, min( n, j+k ) absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( k>0_${ik}$ ) then if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_slassq( min( j-1, k ), ab( max( k+2-j, 1_${ik}$ ), j ),1_${ik}$, scale, sum ) end do l = k + 1_${ik}$ else do j = 1, n - 1 call stdlib${ii}$_slassq( min( n-j, k ), ab( 2_${ik}$, j ), 1_${ik}$, scale,sum ) end do l = 1_${ik}$ end if sum = 2_${ik}$*sum else l = 1_${ik}$ end if call stdlib${ii}$_slassq( n, ab( l, 1_${ik}$ ), ldab, scale, sum ) value = scale*sqrt( sum ) end if stdlib${ii}$_slansb = value return end function stdlib${ii}$_slansb real(dp) module function stdlib${ii}$_dlansb( norm, uplo, n, k, ab, ldab,work ) !! DLANSB 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 symmetric band matrix A, with k 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, uplo integer(${ik}$), intent(in) :: k, ldab, n ! Array Arguments real(dp), intent(in) :: ab(ldab,*) real(dp), intent(out) :: work(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, l real(dp) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k + 1 sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do else do j = 1, n do i = 1, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do 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 symmetric). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero l = k + 1_${ik}$ - j do i = max( 1, j-k ), j - 1 absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( ab( k+1, j ) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( ab( 1_${ik}$, j ) ) l = 1_${ik}$ - j do i = j + 1, min( n, j+k ) absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( k>0_${ik}$ ) then if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_dlassq( min( j-1, k ), ab( max( k+2-j, 1_${ik}$ ), j ),1_${ik}$, scale, sum ) end do l = k + 1_${ik}$ else do j = 1, n - 1 call stdlib${ii}$_dlassq( min( n-j, k ), ab( 2_${ik}$, j ), 1_${ik}$, scale,sum ) end do l = 1_${ik}$ end if sum = 2_${ik}$*sum else l = 1_${ik}$ end if call stdlib${ii}$_dlassq( n, ab( l, 1_${ik}$ ), ldab, scale, sum ) value = scale*sqrt( sum ) end if stdlib${ii}$_dlansb = value return end function stdlib${ii}$_dlansb #:for rk,rt,ri in REAL_KINDS_TYPES #:if not rk in ["sp","dp"] real(${rk}$) module function stdlib${ii}$_${ri}$lansb( norm, uplo, n, k, ab, ldab,work ) !! DLANSB: 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 symmetric band matrix A, with k 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, uplo integer(${ik}$), intent(in) :: k, ldab, n ! Array Arguments real(${rk}$), intent(in) :: ab(ldab,*) real(${rk}$), intent(out) :: work(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, l real(${rk}$) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k + 1 sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end do else do j = 1, n do i = 1, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end do 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 symmetric). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero l = k + 1_${ik}$ - j do i = max( 1, j-k ), j - 1 absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( ab( k+1, j ) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( ab( 1_${ik}$, j ) ) l = 1_${ik}$ - j do i = j + 1, min( n, j+k ) absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( k>0_${ik}$ ) then if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_${ri}$lassq( min( j-1, k ), ab( max( k+2-j, 1_${ik}$ ), j ),1_${ik}$, scale, sum ) end do l = k + 1_${ik}$ else do j = 1, n - 1 call stdlib${ii}$_${ri}$lassq( min( n-j, k ), ab( 2_${ik}$, j ), 1_${ik}$, scale,sum ) end do l = 1_${ik}$ end if sum = 2_${ik}$*sum else l = 1_${ik}$ end if call stdlib${ii}$_${ri}$lassq( n, ab( l, 1_${ik}$ ), ldab, scale, sum ) value = scale*sqrt( sum ) end if stdlib${ii}$_${ri}$lansb = value return end function stdlib${ii}$_${ri}$lansb #:endif #:endfor real(sp) module function stdlib${ii}$_clansb( norm, uplo, n, k, ab, ldab,work ) !! CLANSB 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 symmetric band matrix A, with k 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, uplo integer(${ik}$), intent(in) :: k, ldab, n ! Array Arguments real(sp), intent(out) :: work(*) complex(sp), intent(in) :: ab(ldab,*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, l real(sp) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k + 1 sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do else do j = 1, n do i = 1, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do 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 symmetric). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero l = k + 1_${ik}$ - j do i = max( 1, j-k ), j - 1 absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( ab( k+1, j ) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( ab( 1_${ik}$, j ) ) l = 1_${ik}$ - j do i = j + 1, min( n, j+k ) absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( k>0_${ik}$ ) then if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_classq( min( j-1, k ), ab( max( k+2-j, 1_${ik}$ ), j ),1_${ik}$, scale, sum ) end do l = k + 1_${ik}$ else do j = 1, n - 1 call stdlib${ii}$_classq( min( n-j, k ), ab( 2_${ik}$, j ), 1_${ik}$, scale,sum ) end do l = 1_${ik}$ end if sum = 2_${ik}$*sum else l = 1_${ik}$ end if call stdlib${ii}$_classq( n, ab( l, 1_${ik}$ ), ldab, scale, sum ) value = scale*sqrt( sum ) end if stdlib${ii}$_clansb = value return end function stdlib${ii}$_clansb real(dp) module function stdlib${ii}$_zlansb( norm, uplo, n, k, ab, ldab,work ) !! ZLANSB 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 symmetric band matrix A, with k 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, uplo integer(${ik}$), intent(in) :: k, ldab, n ! Array Arguments real(dp), intent(out) :: work(*) complex(dp), intent(in) :: ab(ldab,*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, l real(dp) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k + 1 sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do else do j = 1, n do i = 1, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do 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 symmetric). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero l = k + 1_${ik}$ - j do i = max( 1, j-k ), j - 1 absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( ab( k+1, j ) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( ab( 1_${ik}$, j ) ) l = 1_${ik}$ - j do i = j + 1, min( n, j+k ) absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( k>0_${ik}$ ) then if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_zlassq( min( j-1, k ), ab( max( k+2-j, 1_${ik}$ ), j ),1_${ik}$, scale, sum ) end do l = k + 1_${ik}$ else do j = 1, n - 1 call stdlib${ii}$_zlassq( min( n-j, k ), ab( 2_${ik}$, j ), 1_${ik}$, scale,sum ) end do l = 1_${ik}$ end if sum = 2_${ik}$*sum else l = 1_${ik}$ end if call stdlib${ii}$_zlassq( n, ab( l, 1_${ik}$ ), ldab, scale, sum ) value = scale*sqrt( sum ) end if stdlib${ii}$_zlansb = value return end function stdlib${ii}$_zlansb #:for ck,ct,ci in CMPLX_KINDS_TYPES #:if not ck in ["sp","dp"] real(${ck}$) module function stdlib${ii}$_${ci}$lansb( norm, uplo, n, k, ab, ldab,work ) !! ZLANSB: 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 symmetric band matrix A, with k 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, uplo integer(${ik}$), intent(in) :: k, ldab, n ! Array Arguments real(${ck}$), intent(out) :: work(*) complex(${ck}$), intent(in) :: ab(ldab,*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i, j, l real(${ck}$) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k + 1 sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end do else do j = 1, n do i = 1, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end do 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 symmetric). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero l = k + 1_${ik}$ - j do i = max( 1, j-k ), j - 1 absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( ab( k+1, j ) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( ab( 1_${ik}$, j ) ) l = 1_${ik}$ - j do i = j + 1, min( n, j+k ) absa = abs( ab( l+i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( k>0_${ik}$ ) then if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_${ci}$lassq( min( j-1, k ), ab( max( k+2-j, 1_${ik}$ ), j ),1_${ik}$, scale, sum ) end do l = k + 1_${ik}$ else do j = 1, n - 1 call stdlib${ii}$_${ci}$lassq( min( n-j, k ), ab( 2_${ik}$, j ), 1_${ik}$, scale,sum ) end do l = 1_${ik}$ end if sum = 2_${ik}$*sum else l = 1_${ik}$ end if call stdlib${ii}$_${ci}$lassq( n, ab( l, 1_${ik}$ ), ldab, scale, sum ) value = scale*sqrt( sum ) end if stdlib${ii}$_${ci}$lansb = value return end function stdlib${ii}$_${ci}$lansb #:endif #:endfor pure real(sp) module function stdlib${ii}$_clanht( norm, n, d, e ) !! CLANHT 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 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(*) complex(sp), intent(in) :: e(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i real(sp) :: anorm, scale, sum ! 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 sum = abs( d( i ) ) if( anorm < sum .or. stdlib${ii}$_sisnan( sum ) ) anorm = sum sum = abs( e( i ) ) if( anorm < sum .or. stdlib${ii}$_sisnan( sum ) ) anorm = sum end do else if( stdlib_lsame( norm, 'O' ) .or. norm=='1' .or.stdlib_lsame( norm, 'I' ) ) & then ! find norm1(a). if( n==1_${ik}$ ) then anorm = abs( d( 1_${ik}$ ) ) else anorm = abs( d( 1_${ik}$ ) )+abs( e( 1_${ik}$ ) ) sum = abs( e( n-1 ) )+abs( d( n ) ) if( anorm < sum .or. stdlib${ii}$_sisnan( sum ) ) anorm = sum do i = 2, n - 1 sum = abs( d( i ) )+abs( e( i ) )+abs( e( i-1 ) ) if( anorm < sum .or. stdlib${ii}$_sisnan( sum ) ) anorm = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( n>1_${ik}$ ) then call stdlib${ii}$_classq( n-1, e, 1_${ik}$, scale, sum ) sum = 2_${ik}$*sum end if call stdlib${ii}$_slassq( n, d, 1_${ik}$, scale, sum ) anorm = scale*sqrt( sum ) end if stdlib${ii}$_clanht = anorm return end function stdlib${ii}$_clanht pure real(dp) module function stdlib${ii}$_zlanht( norm, n, d, e ) !! ZLANHT 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 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(*) complex(dp), intent(in) :: e(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i real(dp) :: anorm, scale, sum ! 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 sum = abs( d( i ) ) if( anorm < sum .or. stdlib${ii}$_disnan( sum ) ) anorm = sum sum = abs( e( i ) ) if( anorm < sum .or. stdlib${ii}$_disnan( sum ) ) anorm = sum end do else if( stdlib_lsame( norm, 'O' ) .or. norm=='1' .or.stdlib_lsame( norm, 'I' ) ) & then ! find norm1(a). if( n==1_${ik}$ ) then anorm = abs( d( 1_${ik}$ ) ) else anorm = abs( d( 1_${ik}$ ) )+abs( e( 1_${ik}$ ) ) sum = abs( e( n-1 ) )+abs( d( n ) ) if( anorm < sum .or. stdlib${ii}$_disnan( sum ) ) anorm = sum do i = 2, n - 1 sum = abs( d( i ) )+abs( e( i ) )+abs( e( i-1 ) ) if( anorm < sum .or. stdlib${ii}$_disnan( sum ) ) anorm = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( n>1_${ik}$ ) then call stdlib${ii}$_zlassq( n-1, e, 1_${ik}$, scale, sum ) sum = 2_${ik}$*sum end if call stdlib${ii}$_dlassq( n, d, 1_${ik}$, scale, sum ) anorm = scale*sqrt( sum ) end if stdlib${ii}$_zlanht = anorm return end function stdlib${ii}$_zlanht #:for ck,ct,ci in CMPLX_KINDS_TYPES #:if not ck in ["sp","dp"] pure real(${ck}$) module function stdlib${ii}$_${ci}$lanht( norm, n, d, e ) !! ZLANHT: 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 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 real(${ck}$), intent(in) :: d(*) complex(${ck}$), intent(in) :: e(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i real(${ck}$) :: anorm, scale, sum ! 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 sum = abs( d( i ) ) if( anorm < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) anorm = sum sum = abs( e( i ) ) if( anorm < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) anorm = sum end do else if( stdlib_lsame( norm, 'O' ) .or. norm=='1' .or.stdlib_lsame( norm, 'I' ) ) & then ! find norm1(a). if( n==1_${ik}$ ) then anorm = abs( d( 1_${ik}$ ) ) else anorm = abs( d( 1_${ik}$ ) )+abs( e( 1_${ik}$ ) ) sum = abs( e( n-1 ) )+abs( d( n ) ) if( anorm < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) anorm = sum do i = 2, n - 1 sum = abs( d( i ) )+abs( e( i ) )+abs( e( i-1 ) ) if( anorm < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) anorm = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( n>1_${ik}$ ) then call stdlib${ii}$_${ci}$lassq( n-1, e, 1_${ik}$, scale, sum ) sum = 2_${ik}$*sum end if call stdlib${ii}$_${c2ri(ci)}$lassq( n, d, 1_${ik}$, scale, sum ) anorm = scale*sqrt( sum ) end if stdlib${ii}$_${ci}$lanht = anorm return end function stdlib${ii}$_${ci}$lanht #:endif #:endfor pure real(sp) module function stdlib${ii}$_slanst( norm, n, d, e ) !! SLANST 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 symmetric 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(*), e(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i real(sp) :: anorm, scale, sum ! 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 sum = abs( d( i ) ) if( anorm < sum .or. stdlib${ii}$_sisnan( sum ) ) anorm = sum sum = abs( e( i ) ) if( anorm < sum .or. stdlib${ii}$_sisnan( sum ) ) anorm = sum end do else if( stdlib_lsame( norm, 'O' ) .or. norm=='1' .or.stdlib_lsame( norm, 'I' ) ) & then ! find norm1(a). if( n==1_${ik}$ ) then anorm = abs( d( 1_${ik}$ ) ) else anorm = abs( d( 1_${ik}$ ) )+abs( e( 1_${ik}$ ) ) sum = abs( e( n-1 ) )+abs( d( n ) ) if( anorm < sum .or. stdlib${ii}$_sisnan( sum ) ) anorm = sum do i = 2, n - 1 sum = abs( d( i ) )+abs( e( i ) )+abs( e( i-1 ) ) if( anorm < sum .or. stdlib${ii}$_sisnan( sum ) ) anorm = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( n>1_${ik}$ ) then call stdlib${ii}$_slassq( n-1, e, 1_${ik}$, scale, sum ) sum = 2_${ik}$*sum end if call stdlib${ii}$_slassq( n, d, 1_${ik}$, scale, sum ) anorm = scale*sqrt( sum ) end if stdlib${ii}$_slanst = anorm return end function stdlib${ii}$_slanst pure real(dp) module function stdlib${ii}$_dlanst( norm, n, d, e ) !! DLANST 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 symmetric 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(*), e(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i real(dp) :: anorm, scale, sum ! 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 sum = abs( d( i ) ) if( anorm < sum .or. stdlib${ii}$_disnan( sum ) ) anorm = sum sum = abs( e( i ) ) if( anorm < sum .or. stdlib${ii}$_disnan( sum ) ) anorm = sum end do else if( stdlib_lsame( norm, 'O' ) .or. norm=='1' .or.stdlib_lsame( norm, 'I' ) ) & then ! find norm1(a). if( n==1_${ik}$ ) then anorm = abs( d( 1_${ik}$ ) ) else anorm = abs( d( 1_${ik}$ ) )+abs( e( 1_${ik}$ ) ) sum = abs( e( n-1 ) )+abs( d( n ) ) if( anorm < sum .or. stdlib${ii}$_disnan( sum ) ) anorm = sum do i = 2, n - 1 sum = abs( d( i ) )+abs( e( i ) )+abs( e( i-1 ) ) if( anorm < sum .or. stdlib${ii}$_disnan( sum ) ) anorm = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( n>1_${ik}$ ) then call stdlib${ii}$_dlassq( n-1, e, 1_${ik}$, scale, sum ) sum = 2_${ik}$*sum end if call stdlib${ii}$_dlassq( n, d, 1_${ik}$, scale, sum ) anorm = scale*sqrt( sum ) end if stdlib${ii}$_dlanst = anorm return end function stdlib${ii}$_dlanst #:for rk,rt,ri in REAL_KINDS_TYPES #:if not rk in ["sp","dp"] pure real(${rk}$) module function stdlib${ii}$_${ri}$lanst( norm, n, d, e ) !! DLANST: 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 symmetric 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(*), e(*) ! ===================================================================== ! Local Scalars integer(${ik}$) :: i real(${rk}$) :: anorm, scale, sum ! 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 sum = abs( d( i ) ) if( anorm < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) anorm = sum sum = abs( e( i ) ) if( anorm < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) anorm = sum end do else if( stdlib_lsame( norm, 'O' ) .or. norm=='1' .or.stdlib_lsame( norm, 'I' ) ) & then ! find norm1(a). if( n==1_${ik}$ ) then anorm = abs( d( 1_${ik}$ ) ) else anorm = abs( d( 1_${ik}$ ) )+abs( e( 1_${ik}$ ) ) sum = abs( e( n-1 ) )+abs( d( n ) ) if( anorm < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) anorm = sum do i = 2, n - 1 sum = abs( d( i ) )+abs( e( i ) )+abs( e( i-1 ) ) if( anorm < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) anorm = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( n>1_${ik}$ ) then call stdlib${ii}$_${ri}$lassq( n-1, e, 1_${ik}$, scale, sum ) sum = 2_${ik}$*sum end if call stdlib${ii}$_${ri}$lassq( n, d, 1_${ik}$, scale, sum ) anorm = scale*sqrt( sum ) end if stdlib${ii}$_${ri}$lanst = anorm return end function stdlib${ii}$_${ri}$lanst #:endif #:endfor real(sp) module function stdlib${ii}$_slantr( norm, uplo, diag, m, n, a, lda,work ) !! SLANTR returns the value of the one norm, or the Frobenius norm, or !! the infinity norm, or the element of largest absolute value of a !! trapezoidal or triangular 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: lda, m, n ! Array Arguments real(sp), intent(in) :: a(lda,*) real(sp), intent(out) :: work(*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j real(sp) :: scale, sum, value ! 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))). if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, min( m, j-1 ) sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do else do j = 1, n do i = j + 1, m sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, min( m, j ) sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do else do j = 1, n do i = j, m sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( ( udiag ) .and. ( j<=m ) ) then sum = one do i = 1, j - 1 sum = sum + abs( a( i, j ) ) end do else sum = zero do i = 1, min( m, j ) sum = sum + abs( a( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = j + 1, m sum = sum + abs( a( i, j ) ) end do else sum = zero do i = j, m sum = sum + abs( a( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, m work( i ) = one end do do j = 1, n do i = 1, min( m, j-1 ) work( i ) = work( i ) + abs( a( i, j ) ) end do end do else do i = 1, m work( i ) = zero end do do j = 1, n do i = 1, min( m, j ) work( i ) = work( i ) + abs( a( i, j ) ) end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, min( m, n ) work( i ) = one end do do i = n + 1, m work( i ) = zero end do do j = 1, n do i = j + 1, m work( i ) = work( i ) + abs( a( i, j ) ) end do end do else do i = 1, m work( i ) = zero end do do j = 1, n do i = j, m work( i ) = work( i ) + abs( a( i, j ) ) end do end do end if end if value = zero do i = 1, m 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = min( m, n ) do j = 2, n call stdlib${ii}$_slassq( min( m, j-1 ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do else scale = zero sum = one do j = 1, n call stdlib${ii}$_slassq( min( m, j ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = min( m, n ) do j = 1, n call stdlib${ii}$_slassq( m-j, a( min( m, j+1 ), j ), 1_${ik}$, scale,sum ) end do else scale = zero sum = one do j = 1, n call stdlib${ii}$_slassq( m-j+1, a( j, j ), 1_${ik}$, scale, sum ) end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_slantr = value return end function stdlib${ii}$_slantr real(dp) module function stdlib${ii}$_dlantr( norm, uplo, diag, m, n, a, lda,work ) !! DLANTR returns the value of the one norm, or the Frobenius norm, or !! the infinity norm, or the element of largest absolute value of a !! trapezoidal or triangular 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: lda, m, n ! Array Arguments real(dp), intent(in) :: a(lda,*) real(dp), intent(out) :: work(*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j real(dp) :: scale, sum, value ! 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))). if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, min( m, j-1 ) sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do else do j = 1, n do i = j + 1, m sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, min( m, j ) sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do else do j = 1, n do i = j, m sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( ( udiag ) .and. ( j<=m ) ) then sum = one do i = 1, j - 1 sum = sum + abs( a( i, j ) ) end do else sum = zero do i = 1, min( m, j ) sum = sum + abs( a( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = j + 1, m sum = sum + abs( a( i, j ) ) end do else sum = zero do i = j, m sum = sum + abs( a( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, m work( i ) = one end do do j = 1, n do i = 1, min( m, j-1 ) work( i ) = work( i ) + abs( a( i, j ) ) end do end do else do i = 1, m work( i ) = zero end do do j = 1, n do i = 1, min( m, j ) work( i ) = work( i ) + abs( a( i, j ) ) end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, min( m, n ) work( i ) = one end do do i = n + 1, m work( i ) = zero end do do j = 1, n do i = j + 1, m work( i ) = work( i ) + abs( a( i, j ) ) end do end do else do i = 1, m work( i ) = zero end do do j = 1, n do i = j, m work( i ) = work( i ) + abs( a( i, j ) ) end do end do end if end if value = zero do i = 1, m 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = min( m, n ) do j = 2, n call stdlib${ii}$_dlassq( min( m, j-1 ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do else scale = zero sum = one do j = 1, n call stdlib${ii}$_dlassq( min( m, j ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = min( m, n ) do j = 1, n call stdlib${ii}$_dlassq( m-j, a( min( m, j+1 ), j ), 1_${ik}$, scale,sum ) end do else scale = zero sum = one do j = 1, n call stdlib${ii}$_dlassq( m-j+1, a( j, j ), 1_${ik}$, scale, sum ) end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_dlantr = value return end function stdlib${ii}$_dlantr #:for rk,rt,ri in REAL_KINDS_TYPES #:if not rk in ["sp","dp"] real(${rk}$) module function stdlib${ii}$_${ri}$lantr( norm, uplo, diag, m, n, a, lda,work ) !! DLANTR: returns the value of the one norm, or the Frobenius norm, or !! the infinity norm, or the element of largest absolute value of a !! trapezoidal or triangular 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: lda, m, n ! Array Arguments real(${rk}$), intent(in) :: a(lda,*) real(${rk}$), intent(out) :: work(*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j real(${rk}$) :: scale, sum, value ! 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))). if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, min( m, j-1 ) sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end do else do j = 1, n do i = j + 1, m sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, min( m, j ) sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end do else do j = 1, n do i = j, m sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( ( udiag ) .and. ( j<=m ) ) then sum = one do i = 1, j - 1 sum = sum + abs( a( i, j ) ) end do else sum = zero do i = 1, min( m, j ) sum = sum + abs( a( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = j + 1, m sum = sum + abs( a( i, j ) ) end do else sum = zero do i = j, m sum = sum + abs( a( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, m work( i ) = one end do do j = 1, n do i = 1, min( m, j-1 ) work( i ) = work( i ) + abs( a( i, j ) ) end do end do else do i = 1, m work( i ) = zero end do do j = 1, n do i = 1, min( m, j ) work( i ) = work( i ) + abs( a( i, j ) ) end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, min( m, n ) work( i ) = one end do do i = n + 1, m work( i ) = zero end do do j = 1, n do i = j + 1, m work( i ) = work( i ) + abs( a( i, j ) ) end do end do else do i = 1, m work( i ) = zero end do do j = 1, n do i = j, m work( i ) = work( i ) + abs( a( i, j ) ) end do end do end if end if value = zero do i = 1, m 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = min( m, n ) do j = 2, n call stdlib${ii}$_${ri}$lassq( min( m, j-1 ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do else scale = zero sum = one do j = 1, n call stdlib${ii}$_${ri}$lassq( min( m, j ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = min( m, n ) do j = 1, n call stdlib${ii}$_${ri}$lassq( m-j, a( min( m, j+1 ), j ), 1_${ik}$, scale,sum ) end do else scale = zero sum = one do j = 1, n call stdlib${ii}$_${ri}$lassq( m-j+1, a( j, j ), 1_${ik}$, scale, sum ) end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_${ri}$lantr = value return end function stdlib${ii}$_${ri}$lantr #:endif #:endfor real(sp) module function stdlib${ii}$_clantr( norm, uplo, diag, m, n, a, lda,work ) !! CLANTR returns the value of the one norm, or the Frobenius norm, or !! the infinity norm, or the element of largest absolute value of a !! trapezoidal or triangular 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: lda, m, n ! Array Arguments real(sp), intent(out) :: work(*) complex(sp), intent(in) :: a(lda,*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j real(sp) :: scale, sum, value ! 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))). if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, min( m, j-1 ) sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do else do j = 1, n do i = j + 1, m sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, min( m, j ) sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do else do j = 1, n do i = j, m sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( ( udiag ) .and. ( j<=m ) ) then sum = one do i = 1, j - 1 sum = sum + abs( a( i, j ) ) end do else sum = zero do i = 1, min( m, j ) sum = sum + abs( a( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = j + 1, m sum = sum + abs( a( i, j ) ) end do else sum = zero do i = j, m sum = sum + abs( a( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, m work( i ) = one end do do j = 1, n do i = 1, min( m, j-1 ) work( i ) = work( i ) + abs( a( i, j ) ) end do end do else do i = 1, m work( i ) = zero end do do j = 1, n do i = 1, min( m, j ) work( i ) = work( i ) + abs( a( i, j ) ) end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, min( m, n ) work( i ) = one end do do i = n + 1, m work( i ) = zero end do do j = 1, n do i = j + 1, m work( i ) = work( i ) + abs( a( i, j ) ) end do end do else do i = 1, m work( i ) = zero end do do j = 1, n do i = j, m work( i ) = work( i ) + abs( a( i, j ) ) end do end do end if end if value = zero do i = 1, m 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = min( m, n ) do j = 2, n call stdlib${ii}$_classq( min( m, j-1 ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do else scale = zero sum = one do j = 1, n call stdlib${ii}$_classq( min( m, j ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = min( m, n ) do j = 1, n call stdlib${ii}$_classq( m-j, a( min( m, j+1 ), j ), 1_${ik}$, scale,sum ) end do else scale = zero sum = one do j = 1, n call stdlib${ii}$_classq( m-j+1, a( j, j ), 1_${ik}$, scale, sum ) end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_clantr = value return end function stdlib${ii}$_clantr real(dp) module function stdlib${ii}$_zlantr( norm, uplo, diag, m, n, a, lda,work ) !! ZLANTR returns the value of the one norm, or the Frobenius norm, or !! the infinity norm, or the element of largest absolute value of a !! trapezoidal or triangular 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: lda, m, n ! Array Arguments real(dp), intent(out) :: work(*) complex(dp), intent(in) :: a(lda,*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j real(dp) :: scale, sum, value ! 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))). if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, min( m, j-1 ) sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do else do j = 1, n do i = j + 1, m sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, min( m, j ) sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do else do j = 1, n do i = j, m sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( ( udiag ) .and. ( j<=m ) ) then sum = one do i = 1, j - 1 sum = sum + abs( a( i, j ) ) end do else sum = zero do i = 1, min( m, j ) sum = sum + abs( a( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = j + 1, m sum = sum + abs( a( i, j ) ) end do else sum = zero do i = j, m sum = sum + abs( a( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, m work( i ) = one end do do j = 1, n do i = 1, min( m, j-1 ) work( i ) = work( i ) + abs( a( i, j ) ) end do end do else do i = 1, m work( i ) = zero end do do j = 1, n do i = 1, min( m, j ) work( i ) = work( i ) + abs( a( i, j ) ) end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, min( m, n ) work( i ) = one end do do i = n + 1, m work( i ) = zero end do do j = 1, n do i = j + 1, m work( i ) = work( i ) + abs( a( i, j ) ) end do end do else do i = 1, m work( i ) = zero end do do j = 1, n do i = j, m work( i ) = work( i ) + abs( a( i, j ) ) end do end do end if end if value = zero do i = 1, m 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = min( m, n ) do j = 2, n call stdlib${ii}$_zlassq( min( m, j-1 ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do else scale = zero sum = one do j = 1, n call stdlib${ii}$_zlassq( min( m, j ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = min( m, n ) do j = 1, n call stdlib${ii}$_zlassq( m-j, a( min( m, j+1 ), j ), 1_${ik}$, scale,sum ) end do else scale = zero sum = one do j = 1, n call stdlib${ii}$_zlassq( m-j+1, a( j, j ), 1_${ik}$, scale, sum ) end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_zlantr = value return end function stdlib${ii}$_zlantr #:for ck,ct,ci in CMPLX_KINDS_TYPES #:if not ck in ["sp","dp"] real(${ck}$) module function stdlib${ii}$_${ci}$lantr( norm, uplo, diag, m, n, a, lda,work ) !! ZLANTR: returns the value of the one norm, or the Frobenius norm, or !! the infinity norm, or the element of largest absolute value of a !! trapezoidal or triangular 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: lda, m, n ! Array Arguments real(${ck}$), intent(out) :: work(*) complex(${ck}$), intent(in) :: a(lda,*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j real(${ck}$) :: scale, sum, value ! 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))). if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, min( m, j-1 ) sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end do else do j = 1, n do i = j + 1, m sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, min( m, j ) sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end do else do j = 1, n do i = j, m sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( ( udiag ) .and. ( j<=m ) ) then sum = one do i = 1, j - 1 sum = sum + abs( a( i, j ) ) end do else sum = zero do i = 1, min( m, j ) sum = sum + abs( a( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = j + 1, m sum = sum + abs( a( i, j ) ) end do else sum = zero do i = j, m sum = sum + abs( a( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, m work( i ) = one end do do j = 1, n do i = 1, min( m, j-1 ) work( i ) = work( i ) + abs( a( i, j ) ) end do end do else do i = 1, m work( i ) = zero end do do j = 1, n do i = 1, min( m, j ) work( i ) = work( i ) + abs( a( i, j ) ) end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, min( m, n ) work( i ) = one end do do i = n + 1, m work( i ) = zero end do do j = 1, n do i = j + 1, m work( i ) = work( i ) + abs( a( i, j ) ) end do end do else do i = 1, m work( i ) = zero end do do j = 1, n do i = j, m work( i ) = work( i ) + abs( a( i, j ) ) end do end do end if end if value = zero do i = 1, m 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = min( m, n ) do j = 2, n call stdlib${ii}$_${ci}$lassq( min( m, j-1 ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do else scale = zero sum = one do j = 1, n call stdlib${ii}$_${ci}$lassq( min( m, j ), a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = min( m, n ) do j = 1, n call stdlib${ii}$_${ci}$lassq( m-j, a( min( m, j+1 ), j ), 1_${ik}$, scale,sum ) end do else scale = zero sum = one do j = 1, n call stdlib${ii}$_${ci}$lassq( m-j+1, a( j, j ), 1_${ik}$, scale, sum ) end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_${ci}$lantr = value return end function stdlib${ii}$_${ci}$lantr #:endif #:endfor real(sp) module function stdlib${ii}$_slantp( norm, uplo, diag, n, ap, work ) !! SLANTP returns the value of the one norm, or the Frobenius norm, or !! the infinity norm, or the element of largest absolute value of a !! triangular matrix A, supplied in packed form. ! -- 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: n ! Array Arguments real(sp), intent(in) :: ap(*) real(sp), intent(out) :: work(*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j, k 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))). k = 1_${ik}$ if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = k, k + j - 2 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do k = k + j end do else do j = 1, n do i = k + 1, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = k, k + j - 1 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do k = k + j end do else do j = 1, n do i = k, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero k = 1_${ik}$ udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( udiag ) then sum = one do i = k, k + j - 2 sum = sum + abs( ap( i ) ) end do else sum = zero do i = k, k + j - 1 sum = sum + abs( ap( i ) ) end do end if k = k + j if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = k + 1, k + n - j sum = sum + abs( ap( i ) ) end do else sum = zero do i = k, k + n - j sum = sum + abs( ap( i ) ) end do end if k = k + n - j + 1_${ik}$ if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). k = 1_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n do i = 1, j - 1 work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do k = k + 1_${ik}$ end do else do i = 1, n work( i ) = zero end do do j = 1, n do i = 1, j work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n k = k + 1_${ik}$ do i = j + 1, n work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do else do i = 1, n work( i ) = zero end do do j = 1, n do i = j, n work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do end if end if 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n k = 2_${ik}$ do j = 2, n call stdlib${ii}$_slassq( j-1, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do else scale = zero sum = one k = 1_${ik}$ do j = 1, n call stdlib${ii}$_slassq( j, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n k = 2_${ik}$ do j = 1, n - 1 call stdlib${ii}$_slassq( n-j, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do else scale = zero sum = one k = 1_${ik}$ do j = 1, n call stdlib${ii}$_slassq( n-j+1, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_slantp = value return end function stdlib${ii}$_slantp real(dp) module function stdlib${ii}$_dlantp( norm, uplo, diag, n, ap, work ) !! DLANTP returns the value of the one norm, or the Frobenius norm, or !! the infinity norm, or the element of largest absolute value of a !! triangular matrix A, supplied in packed form. ! -- 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: n ! Array Arguments real(dp), intent(in) :: ap(*) real(dp), intent(out) :: work(*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j, k 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))). k = 1_${ik}$ if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = k, k + j - 2 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do k = k + j end do else do j = 1, n do i = k + 1, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = k, k + j - 1 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do k = k + j end do else do j = 1, n do i = k, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero k = 1_${ik}$ udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( udiag ) then sum = one do i = k, k + j - 2 sum = sum + abs( ap( i ) ) end do else sum = zero do i = k, k + j - 1 sum = sum + abs( ap( i ) ) end do end if k = k + j if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = k + 1, k + n - j sum = sum + abs( ap( i ) ) end do else sum = zero do i = k, k + n - j sum = sum + abs( ap( i ) ) end do end if k = k + n - j + 1_${ik}$ if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). k = 1_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n do i = 1, j - 1 work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do k = k + 1_${ik}$ end do else do i = 1, n work( i ) = zero end do do j = 1, n do i = 1, j work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n k = k + 1_${ik}$ do i = j + 1, n work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do else do i = 1, n work( i ) = zero end do do j = 1, n do i = j, n work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do end if end if 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n k = 2_${ik}$ do j = 2, n call stdlib${ii}$_dlassq( j-1, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do else scale = zero sum = one k = 1_${ik}$ do j = 1, n call stdlib${ii}$_dlassq( j, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n k = 2_${ik}$ do j = 1, n - 1 call stdlib${ii}$_dlassq( n-j, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do else scale = zero sum = one k = 1_${ik}$ do j = 1, n call stdlib${ii}$_dlassq( n-j+1, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_dlantp = value return end function stdlib${ii}$_dlantp #:for rk,rt,ri in REAL_KINDS_TYPES #:if not rk in ["sp","dp"] real(${rk}$) module function stdlib${ii}$_${ri}$lantp( norm, uplo, diag, n, ap, work ) !! DLANTP: returns the value of the one norm, or the Frobenius norm, or !! the infinity norm, or the element of largest absolute value of a !! triangular matrix A, supplied in packed form. ! -- 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: n ! Array Arguments real(${rk}$), intent(in) :: ap(*) real(${rk}$), intent(out) :: work(*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j, k 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))). k = 1_${ik}$ if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = k, k + j - 2 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do k = k + j end do else do j = 1, n do i = k + 1, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = k, k + j - 1 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do k = k + j end do else do j = 1, n do i = k, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero k = 1_${ik}$ udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( udiag ) then sum = one do i = k, k + j - 2 sum = sum + abs( ap( i ) ) end do else sum = zero do i = k, k + j - 1 sum = sum + abs( ap( i ) ) end do end if k = k + j if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = k + 1, k + n - j sum = sum + abs( ap( i ) ) end do else sum = zero do i = k, k + n - j sum = sum + abs( ap( i ) ) end do end if k = k + n - j + 1_${ik}$ if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). k = 1_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n do i = 1, j - 1 work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do k = k + 1_${ik}$ end do else do i = 1, n work( i ) = zero end do do j = 1, n do i = 1, j work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n k = k + 1_${ik}$ do i = j + 1, n work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do else do i = 1, n work( i ) = zero end do do j = 1, n do i = j, n work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do end if end if 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n k = 2_${ik}$ do j = 2, n call stdlib${ii}$_${ri}$lassq( j-1, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do else scale = zero sum = one k = 1_${ik}$ do j = 1, n call stdlib${ii}$_${ri}$lassq( j, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n k = 2_${ik}$ do j = 1, n - 1 call stdlib${ii}$_${ri}$lassq( n-j, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do else scale = zero sum = one k = 1_${ik}$ do j = 1, n call stdlib${ii}$_${ri}$lassq( n-j+1, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_${ri}$lantp = value return end function stdlib${ii}$_${ri}$lantp #:endif #:endfor real(sp) module function stdlib${ii}$_clantp( norm, uplo, diag, n, ap, work ) !! CLANTP returns the value of the one norm, or the Frobenius norm, or !! the infinity norm, or the element of largest absolute value of a !! triangular matrix A, supplied in packed form. ! -- 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: n ! Array Arguments real(sp), intent(out) :: work(*) complex(sp), intent(in) :: ap(*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j, k 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))). k = 1_${ik}$ if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = k, k + j - 2 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do k = k + j end do else do j = 1, n do i = k + 1, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = k, k + j - 1 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do k = k + j end do else do j = 1, n do i = k, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero k = 1_${ik}$ udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( udiag ) then sum = one do i = k, k + j - 2 sum = sum + abs( ap( i ) ) end do else sum = zero do i = k, k + j - 1 sum = sum + abs( ap( i ) ) end do end if k = k + j if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = k + 1, k + n - j sum = sum + abs( ap( i ) ) end do else sum = zero do i = k, k + n - j sum = sum + abs( ap( i ) ) end do end if k = k + n - j + 1_${ik}$ if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). k = 1_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n do i = 1, j - 1 work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do k = k + 1_${ik}$ end do else do i = 1, n work( i ) = zero end do do j = 1, n do i = 1, j work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n k = k + 1_${ik}$ do i = j + 1, n work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do else do i = 1, n work( i ) = zero end do do j = 1, n do i = j, n work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do end if end if 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n k = 2_${ik}$ do j = 2, n call stdlib${ii}$_classq( j-1, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do else scale = zero sum = one k = 1_${ik}$ do j = 1, n call stdlib${ii}$_classq( j, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n k = 2_${ik}$ do j = 1, n - 1 call stdlib${ii}$_classq( n-j, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do else scale = zero sum = one k = 1_${ik}$ do j = 1, n call stdlib${ii}$_classq( n-j+1, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_clantp = value return end function stdlib${ii}$_clantp real(dp) module function stdlib${ii}$_zlantp( norm, uplo, diag, n, ap, work ) !! ZLANTP returns the value of the one norm, or the Frobenius norm, or !! the infinity norm, or the element of largest absolute value of a !! triangular matrix A, supplied in packed form. ! -- 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: n ! Array Arguments real(dp), intent(out) :: work(*) complex(dp), intent(in) :: ap(*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j, k 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))). k = 1_${ik}$ if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = k, k + j - 2 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do k = k + j end do else do j = 1, n do i = k + 1, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = k, k + j - 1 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do k = k + j end do else do j = 1, n do i = k, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero k = 1_${ik}$ udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( udiag ) then sum = one do i = k, k + j - 2 sum = sum + abs( ap( i ) ) end do else sum = zero do i = k, k + j - 1 sum = sum + abs( ap( i ) ) end do end if k = k + j if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = k + 1, k + n - j sum = sum + abs( ap( i ) ) end do else sum = zero do i = k, k + n - j sum = sum + abs( ap( i ) ) end do end if k = k + n - j + 1_${ik}$ if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). k = 1_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n do i = 1, j - 1 work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do k = k + 1_${ik}$ end do else do i = 1, n work( i ) = zero end do do j = 1, n do i = 1, j work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n k = k + 1_${ik}$ do i = j + 1, n work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do else do i = 1, n work( i ) = zero end do do j = 1, n do i = j, n work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do end if end if 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n k = 2_${ik}$ do j = 2, n call stdlib${ii}$_zlassq( j-1, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do else scale = zero sum = one k = 1_${ik}$ do j = 1, n call stdlib${ii}$_zlassq( j, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n k = 2_${ik}$ do j = 1, n - 1 call stdlib${ii}$_zlassq( n-j, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do else scale = zero sum = one k = 1_${ik}$ do j = 1, n call stdlib${ii}$_zlassq( n-j+1, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_zlantp = value return end function stdlib${ii}$_zlantp #:for ck,ct,ci in CMPLX_KINDS_TYPES #:if not ck in ["sp","dp"] real(${ck}$) module function stdlib${ii}$_${ci}$lantp( norm, uplo, diag, n, ap, work ) !! ZLANTP: returns the value of the one norm, or the Frobenius norm, or !! the infinity norm, or the element of largest absolute value of a !! triangular matrix A, supplied in packed form. ! -- 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: n ! Array Arguments real(${ck}$), intent(out) :: work(*) complex(${ck}$), intent(in) :: ap(*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j, k 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))). k = 1_${ik}$ if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = k, k + j - 2 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do k = k + j end do else do j = 1, n do i = k + 1, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = k, k + j - 1 sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do k = k + j end do else do j = 1, n do i = k, k + n - j sum = abs( ap( i ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do k = k + n - j + 1_${ik}$ end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero k = 1_${ik}$ udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( udiag ) then sum = one do i = k, k + j - 2 sum = sum + abs( ap( i ) ) end do else sum = zero do i = k, k + j - 1 sum = sum + abs( ap( i ) ) end do end if k = k + j if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = k + 1, k + n - j sum = sum + abs( ap( i ) ) end do else sum = zero do i = k, k + n - j sum = sum + abs( ap( i ) ) end do end if k = k + n - j + 1_${ik}$ if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). k = 1_${ik}$ if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n do i = 1, j - 1 work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do k = k + 1_${ik}$ end do else do i = 1, n work( i ) = zero end do do j = 1, n do i = 1, j work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n k = k + 1_${ik}$ do i = j + 1, n work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do else do i = 1, n work( i ) = zero end do do j = 1, n do i = j, n work( i ) = work( i ) + abs( ap( k ) ) k = k + 1_${ik}$ end do end do end if end if 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n k = 2_${ik}$ do j = 2, n call stdlib${ii}$_${ci}$lassq( j-1, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do else scale = zero sum = one k = 1_${ik}$ do j = 1, n call stdlib${ii}$_${ci}$lassq( j, ap( k ), 1_${ik}$, scale, sum ) k = k + j end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n k = 2_${ik}$ do j = 1, n - 1 call stdlib${ii}$_${ci}$lassq( n-j, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do else scale = zero sum = one k = 1_${ik}$ do j = 1, n call stdlib${ii}$_${ci}$lassq( n-j+1, ap( k ), 1_${ik}$, scale, sum ) k = k + n - j + 1_${ik}$ end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_${ci}$lantp = value return end function stdlib${ii}$_${ci}$lantp #:endif #:endfor real(sp) module function stdlib${ii}$_slantb( norm, uplo, diag, n, k, ab,ldab, work ) !! SLANTB 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 triangular band matrix A, with ( k + 1 ) 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: k, ldab, n ! Array Arguments real(sp), intent(in) :: ab(ldab,*) real(sp), intent(out) :: work(*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j, l 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))). if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do else do j = 1, n do i = 2, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k + 1 sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do else do j = 1, n do i = 1, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( udiag ) then sum = one do i = max( k+2-j, 1 ), k sum = sum + abs( ab( i, j ) ) end do else sum = zero do i = max( k+2-j, 1 ), k + 1 sum = sum + abs( ab( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = 2, min( n+1-j, k+1 ) sum = sum + abs( ab( i, j ) ) end do else sum = zero do i = 1, min( n+1-j, k+1 ) sum = sum + abs( ab( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). value = zero if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n l = k + 1_${ik}$ - j do i = max( 1, j-k ), j - 1 work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do else do i = 1, n work( i ) = zero end do do j = 1, n l = k + 1_${ik}$ - j do i = max( 1, j-k ), j work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n l = 1_${ik}$ - j do i = j + 1, min( n, j+k ) work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do else do i = 1, n work( i ) = zero end do do j = 1, n l = 1_${ik}$ - j do i = j, min( n, j+k ) work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do end if end if 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n if( k>0_${ik}$ ) then do j = 2, n call stdlib${ii}$_slassq( min( j-1, k ),ab( max( k+2-j, 1_${ik}$ ), j ), 1_${ik}$, scale,& sum ) end do end if else scale = zero sum = one do j = 1, n call stdlib${ii}$_slassq( min( j, k+1 ), ab( max( k+2-j, 1_${ik}$ ), j ),1_${ik}$, scale, sum ) end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n if( k>0_${ik}$ ) then do j = 1, n - 1 call stdlib${ii}$_slassq( min( n-j, k ), ab( 2_${ik}$, j ), 1_${ik}$, scale,sum ) end do end if else scale = zero sum = one do j = 1, n call stdlib${ii}$_slassq( min( n-j+1, k+1 ), ab( 1_${ik}$, j ), 1_${ik}$, scale,sum ) end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_slantb = value return end function stdlib${ii}$_slantb real(dp) module function stdlib${ii}$_dlantb( norm, uplo, diag, n, k, ab,ldab, work ) !! DLANTB 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 triangular band matrix A, with ( k + 1 ) 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: k, ldab, n ! Array Arguments real(dp), intent(in) :: ab(ldab,*) real(dp), intent(out) :: work(*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j, l 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))). if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do else do j = 1, n do i = 2, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k + 1 sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do else do j = 1, n do i = 1, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( udiag ) then sum = one do i = max( k+2-j, 1 ), k sum = sum + abs( ab( i, j ) ) end do else sum = zero do i = max( k+2-j, 1 ), k + 1 sum = sum + abs( ab( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = 2, min( n+1-j, k+1 ) sum = sum + abs( ab( i, j ) ) end do else sum = zero do i = 1, min( n+1-j, k+1 ) sum = sum + abs( ab( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). value = zero if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n l = k + 1_${ik}$ - j do i = max( 1, j-k ), j - 1 work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do else do i = 1, n work( i ) = zero end do do j = 1, n l = k + 1_${ik}$ - j do i = max( 1, j-k ), j work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n l = 1_${ik}$ - j do i = j + 1, min( n, j+k ) work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do else do i = 1, n work( i ) = zero end do do j = 1, n l = 1_${ik}$ - j do i = j, min( n, j+k ) work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do end if end if 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n if( k>0_${ik}$ ) then do j = 2, n call stdlib${ii}$_dlassq( min( j-1, k ),ab( max( k+2-j, 1_${ik}$ ), j ), 1_${ik}$, scale,& sum ) end do end if else scale = zero sum = one do j = 1, n call stdlib${ii}$_dlassq( min( j, k+1 ), ab( max( k+2-j, 1_${ik}$ ), j ),1_${ik}$, scale, sum ) end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n if( k>0_${ik}$ ) then do j = 1, n - 1 call stdlib${ii}$_dlassq( min( n-j, k ), ab( 2_${ik}$, j ), 1_${ik}$, scale,sum ) end do end if else scale = zero sum = one do j = 1, n call stdlib${ii}$_dlassq( min( n-j+1, k+1 ), ab( 1_${ik}$, j ), 1_${ik}$, scale,sum ) end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_dlantb = value return end function stdlib${ii}$_dlantb #:for rk,rt,ri in REAL_KINDS_TYPES #:if not rk in ["sp","dp"] real(${rk}$) module function stdlib${ii}$_${ri}$lantb( norm, uplo, diag, n, k, ab,ldab, work ) !! DLANTB: 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 triangular band matrix A, with ( k + 1 ) 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: k, ldab, n ! Array Arguments real(${rk}$), intent(in) :: ab(ldab,*) real(${rk}$), intent(out) :: work(*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j, l 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))). if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end do else do j = 1, n do i = 2, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k + 1 sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end do else do j = 1, n do i = 1, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( udiag ) then sum = one do i = max( k+2-j, 1 ), k sum = sum + abs( ab( i, j ) ) end do else sum = zero do i = max( k+2-j, 1 ), k + 1 sum = sum + abs( ab( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = 2, min( n+1-j, k+1 ) sum = sum + abs( ab( i, j ) ) end do else sum = zero do i = 1, min( n+1-j, k+1 ) sum = sum + abs( ab( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). value = zero if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n l = k + 1_${ik}$ - j do i = max( 1, j-k ), j - 1 work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do else do i = 1, n work( i ) = zero end do do j = 1, n l = k + 1_${ik}$ - j do i = max( 1, j-k ), j work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n l = 1_${ik}$ - j do i = j + 1, min( n, j+k ) work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do else do i = 1, n work( i ) = zero end do do j = 1, n l = 1_${ik}$ - j do i = j, min( n, j+k ) work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do end if end if 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n if( k>0_${ik}$ ) then do j = 2, n call stdlib${ii}$_${ri}$lassq( min( j-1, k ),ab( max( k+2-j, 1_${ik}$ ), j ), 1_${ik}$, scale,& sum ) end do end if else scale = zero sum = one do j = 1, n call stdlib${ii}$_${ri}$lassq( min( j, k+1 ), ab( max( k+2-j, 1_${ik}$ ), j ),1_${ik}$, scale, sum ) end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n if( k>0_${ik}$ ) then do j = 1, n - 1 call stdlib${ii}$_${ri}$lassq( min( n-j, k ), ab( 2_${ik}$, j ), 1_${ik}$, scale,sum ) end do end if else scale = zero sum = one do j = 1, n call stdlib${ii}$_${ri}$lassq( min( n-j+1, k+1 ), ab( 1_${ik}$, j ), 1_${ik}$, scale,sum ) end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_${ri}$lantb = value return end function stdlib${ii}$_${ri}$lantb #:endif #:endfor real(sp) module function stdlib${ii}$_clantb( norm, uplo, diag, n, k, ab,ldab, work ) !! CLANTB 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 triangular band matrix A, with ( k + 1 ) 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: k, ldab, n ! Array Arguments real(sp), intent(out) :: work(*) complex(sp), intent(in) :: ab(ldab,*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j, l 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))). if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do else do j = 1, n do i = 2, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k + 1 sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do else do j = 1, n do i = 1, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( udiag ) then sum = one do i = max( k+2-j, 1 ), k sum = sum + abs( ab( i, j ) ) end do else sum = zero do i = max( k+2-j, 1 ), k + 1 sum = sum + abs( ab( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = 2, min( n+1-j, k+1 ) sum = sum + abs( ab( i, j ) ) end do else sum = zero do i = 1, min( n+1-j, k+1 ) sum = sum + abs( ab( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). value = zero if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n l = k + 1_${ik}$ - j do i = max( 1, j-k ), j - 1 work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do else do i = 1, n work( i ) = zero end do do j = 1, n l = k + 1_${ik}$ - j do i = max( 1, j-k ), j work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n l = 1_${ik}$ - j do i = j + 1, min( n, j+k ) work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do else do i = 1, n work( i ) = zero end do do j = 1, n l = 1_${ik}$ - j do i = j, min( n, j+k ) work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do end if end if 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n if( k>0_${ik}$ ) then do j = 2, n call stdlib${ii}$_classq( min( j-1, k ),ab( max( k+2-j, 1_${ik}$ ), j ), 1_${ik}$, scale,& sum ) end do end if else scale = zero sum = one do j = 1, n call stdlib${ii}$_classq( min( j, k+1 ), ab( max( k+2-j, 1_${ik}$ ), j ),1_${ik}$, scale, sum ) end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n if( k>0_${ik}$ ) then do j = 1, n - 1 call stdlib${ii}$_classq( min( n-j, k ), ab( 2_${ik}$, j ), 1_${ik}$, scale,sum ) end do end if else scale = zero sum = one do j = 1, n call stdlib${ii}$_classq( min( n-j+1, k+1 ), ab( 1_${ik}$, j ), 1_${ik}$, scale,sum ) end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_clantb = value return end function stdlib${ii}$_clantb real(dp) module function stdlib${ii}$_zlantb( norm, uplo, diag, n, k, ab,ldab, work ) !! ZLANTB 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 triangular band matrix A, with ( k + 1 ) 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: k, ldab, n ! Array Arguments real(dp), intent(out) :: work(*) complex(dp), intent(in) :: ab(ldab,*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j, l 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))). if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do else do j = 1, n do i = 2, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k + 1 sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do else do j = 1, n do i = 1, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( udiag ) then sum = one do i = max( k+2-j, 1 ), k sum = sum + abs( ab( i, j ) ) end do else sum = zero do i = max( k+2-j, 1 ), k + 1 sum = sum + abs( ab( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = 2, min( n+1-j, k+1 ) sum = sum + abs( ab( i, j ) ) end do else sum = zero do i = 1, min( n+1-j, k+1 ) sum = sum + abs( ab( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). value = zero if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n l = k + 1_${ik}$ - j do i = max( 1, j-k ), j - 1 work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do else do i = 1, n work( i ) = zero end do do j = 1, n l = k + 1_${ik}$ - j do i = max( 1, j-k ), j work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n l = 1_${ik}$ - j do i = j + 1, min( n, j+k ) work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do else do i = 1, n work( i ) = zero end do do j = 1, n l = 1_${ik}$ - j do i = j, min( n, j+k ) work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do end if end if 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n if( k>0_${ik}$ ) then do j = 2, n call stdlib${ii}$_zlassq( min( j-1, k ),ab( max( k+2-j, 1_${ik}$ ), j ), 1_${ik}$, scale,& sum ) end do end if else scale = zero sum = one do j = 1, n call stdlib${ii}$_zlassq( min( j, k+1 ), ab( max( k+2-j, 1_${ik}$ ), j ),1_${ik}$, scale, sum ) end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n if( k>0_${ik}$ ) then do j = 1, n - 1 call stdlib${ii}$_zlassq( min( n-j, k ), ab( 2_${ik}$, j ), 1_${ik}$, scale,sum ) end do end if else scale = zero sum = one do j = 1, n call stdlib${ii}$_zlassq( min( n-j+1, k+1 ), ab( 1_${ik}$, j ), 1_${ik}$, scale,sum ) end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_zlantb = value return end function stdlib${ii}$_zlantb #:for ck,ct,ci in CMPLX_KINDS_TYPES #:if not ck in ["sp","dp"] real(${ck}$) module function stdlib${ii}$_${ci}$lantb( norm, uplo, diag, n, k, ab,ldab, work ) !! ZLANTB: 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 triangular band matrix A, with ( k + 1 ) 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) :: diag, norm, uplo integer(${ik}$), intent(in) :: k, ldab, n ! Array Arguments real(${ck}$), intent(out) :: work(*) complex(${ck}$), intent(in) :: ab(ldab,*) ! ===================================================================== ! Local Scalars logical(lk) :: udiag integer(${ik}$) :: i, j, l 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))). if( stdlib_lsame( diag, 'U' ) ) then value = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end do else do j = 1, n do i = 2, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end do end if else value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = max( k+2-j, 1 ), k + 1 sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end do else do j = 1, n do i = 1, min( n+1-j, k+1 ) sum = abs( ab( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end do end if end if else if( ( stdlib_lsame( norm, 'O' ) ) .or. ( norm=='1' ) ) then ! find norm1(a). value = zero udiag = stdlib_lsame( diag, 'U' ) if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n if( udiag ) then sum = one do i = max( k+2-j, 1 ), k sum = sum + abs( ab( i, j ) ) end do else sum = zero do i = max( k+2-j, 1 ), k + 1 sum = sum + abs( ab( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do else do j = 1, n if( udiag ) then sum = one do i = 2, min( n+1-j, k+1 ) sum = sum + abs( ab( i, j ) ) end do else sum = zero do i = 1, min( n+1-j, k+1 ) sum = sum + abs( ab( i, j ) ) end do end if if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end if else if( stdlib_lsame( norm, 'I' ) ) then ! find normi(a). value = zero if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n l = k + 1_${ik}$ - j do i = max( 1, j-k ), j - 1 work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do else do i = 1, n work( i ) = zero end do do j = 1, n l = k + 1_${ik}$ - j do i = max( 1, j-k ), j work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do end if else if( stdlib_lsame( diag, 'U' ) ) then do i = 1, n work( i ) = one end do do j = 1, n l = 1_${ik}$ - j do i = j + 1, min( n, j+k ) work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do else do i = 1, n work( i ) = zero end do do j = 1, n l = 1_${ik}$ - j do i = j, min( n, j+k ) work( i ) = work( i ) + abs( ab( l+i, j ) ) end do end do end if end if 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). if( stdlib_lsame( uplo, 'U' ) ) then if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n if( k>0_${ik}$ ) then do j = 2, n call stdlib${ii}$_${ci}$lassq( min( j-1, k ),ab( max( k+2-j, 1_${ik}$ ), j ), 1_${ik}$, scale,& sum ) end do end if else scale = zero sum = one do j = 1, n call stdlib${ii}$_${ci}$lassq( min( j, k+1 ), ab( max( k+2-j, 1_${ik}$ ), j ),1_${ik}$, scale, sum ) end do end if else if( stdlib_lsame( diag, 'U' ) ) then scale = one sum = n if( k>0_${ik}$ ) then do j = 1, n - 1 call stdlib${ii}$_${ci}$lassq( min( n-j, k ), ab( 2_${ik}$, j ), 1_${ik}$, scale,sum ) end do end if else scale = zero sum = one do j = 1, n call stdlib${ii}$_${ci}$lassq( min( n-j+1, k+1 ), ab( 1_${ik}$, j ), 1_${ik}$, scale,sum ) end do end if end if value = scale*sqrt( sum ) end if stdlib${ii}$_${ci}$lantb = value return end function stdlib${ii}$_${ci}$lantb #:endif #:endfor real(sp) module function stdlib${ii}$_slansy( norm, uplo, n, a, lda, work ) !! SLANSY 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 symmetric 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, uplo 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) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, j sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do else do j = 1, n do i = j, n sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do 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 symmetric). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( a( j, j ) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( a( j, j ) ) do i = j + 1, n absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_slassq( j-1, a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do else do j = 1, n - 1 call stdlib${ii}$_slassq( n-j, a( j+1, j ), 1_${ik}$, scale, sum ) end do end if sum = 2_${ik}$*sum call stdlib${ii}$_slassq( n, a, lda+1, scale, sum ) value = scale*sqrt( sum ) end if stdlib${ii}$_slansy = value return end function stdlib${ii}$_slansy real(dp) module function stdlib${ii}$_dlansy( norm, uplo, n, a, lda, work ) !! DLANSY 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 symmetric 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, uplo 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) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, j sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do else do j = 1, n do i = j, n sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do 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 symmetric). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( a( j, j ) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( a( j, j ) ) do i = j + 1, n absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_dlassq( j-1, a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do else do j = 1, n - 1 call stdlib${ii}$_dlassq( n-j, a( j+1, j ), 1_${ik}$, scale, sum ) end do end if sum = 2_${ik}$*sum call stdlib${ii}$_dlassq( n, a, lda+1, scale, sum ) value = scale*sqrt( sum ) end if stdlib${ii}$_dlansy = value return end function stdlib${ii}$_dlansy #:for rk,rt,ri in REAL_KINDS_TYPES #:if not rk in ["sp","dp"] real(${rk}$) module function stdlib${ii}$_${ri}$lansy( norm, uplo, n, a, lda, work ) !! DLANSY: 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 symmetric 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, uplo 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}$) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, j sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end do else do j = 1, n do i = j, n sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end do 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 symmetric). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( a( j, j ) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( a( j, j ) ) do i = j + 1, n absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_${ri}$isnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_${ri}$lassq( j-1, a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do else do j = 1, n - 1 call stdlib${ii}$_${ri}$lassq( n-j, a( j+1, j ), 1_${ik}$, scale, sum ) end do end if sum = 2_${ik}$*sum call stdlib${ii}$_${ri}$lassq( n, a, lda+1, scale, sum ) value = scale*sqrt( sum ) end if stdlib${ii}$_${ri}$lansy = value return end function stdlib${ii}$_${ri}$lansy #:endif #:endfor real(sp) module function stdlib${ii}$_clansy( norm, uplo, n, a, lda, work ) !! CLANSY 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 symmetric 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, uplo 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) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, j sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do else do j = 1, n do i = j, n sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do 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 symmetric). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( a( j, j ) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( a( j, j ) ) do i = j + 1, n absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_classq( j-1, a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do else do j = 1, n - 1 call stdlib${ii}$_classq( n-j, a( j+1, j ), 1_${ik}$, scale, sum ) end do end if sum = 2_${ik}$*sum call stdlib${ii}$_classq( n, a, lda+1, scale, sum ) value = scale*sqrt( sum ) end if stdlib${ii}$_clansy = value return end function stdlib${ii}$_clansy real(dp) module function stdlib${ii}$_zlansy( norm, uplo, n, a, lda, work ) !! ZLANSY 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 symmetric 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, uplo 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) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, j sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do else do j = 1, n do i = j, n sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do 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 symmetric). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( a( j, j ) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( a( j, j ) ) do i = j + 1, n absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_zlassq( j-1, a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do else do j = 1, n - 1 call stdlib${ii}$_zlassq( n-j, a( j+1, j ), 1_${ik}$, scale, sum ) end do end if sum = 2_${ik}$*sum call stdlib${ii}$_zlassq( n, a, lda+1, scale, sum ) value = scale*sqrt( sum ) end if stdlib${ii}$_zlansy = value return end function stdlib${ii}$_zlansy #:for ck,ct,ci in CMPLX_KINDS_TYPES #:if not ck in ["sp","dp"] real(${ck}$) module function stdlib${ii}$_${ci}$lansy( norm, uplo, n, a, lda, work ) !! ZLANSY: 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 symmetric 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, uplo 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}$) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, j sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end do else do j = 1, n do i = j, n sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end do 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 symmetric). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( a( j, j ) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( a( j, j ) ) do i = j + 1, n absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_${ci}$lassq( j-1, a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do else do j = 1, n - 1 call stdlib${ii}$_${ci}$lassq( n-j, a( j+1, j ), 1_${ik}$, scale, sum ) end do end if sum = 2_${ik}$*sum call stdlib${ii}$_${ci}$lassq( n, a, lda+1, scale, sum ) value = scale*sqrt( sum ) end if stdlib${ii}$_${ci}$lansy = value return end function stdlib${ii}$_${ci}$lansy #:endif #:endfor real(sp) module function stdlib${ii}$_clanhe( norm, uplo, n, a, lda, work ) !! CLANHE 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. ! -- 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, uplo 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) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, j - 1 sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do sum = abs( real( a( j, j ),KIND=sp) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do j = 1, n sum = abs( real( a( j, j ),KIND=sp) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum do i = j + 1, n sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end do 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). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( real( a( j, j ),KIND=sp) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( real( a( j, j ),KIND=sp) ) do i = j + 1, n absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_sisnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_classq( j-1, a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do else do j = 1, n - 1 call stdlib${ii}$_classq( n-j, a( j+1, j ), 1_${ik}$, scale, sum ) end do end if sum = 2_${ik}$*sum do i = 1, n if( real( a( i, i ),KIND=sp)/=zero ) then absa = abs( real( a( i, i ),KIND=sp) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if end do value = scale*sqrt( sum ) end if stdlib${ii}$_clanhe = value return end function stdlib${ii}$_clanhe real(dp) module function stdlib${ii}$_zlanhe( norm, uplo, n, a, lda, work ) !! ZLANHE 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. ! -- 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, uplo 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) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, j - 1 sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do sum = abs( real( a( j, j ),KIND=dp) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do j = 1, n sum = abs( real( a( j, j ),KIND=dp) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum do i = j + 1, n sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end do 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). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( real( a( j, j ),KIND=dp) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( real( a( j, j ),KIND=dp) ) do i = j + 1, n absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_disnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_zlassq( j-1, a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do else do j = 1, n - 1 call stdlib${ii}$_zlassq( n-j, a( j+1, j ), 1_${ik}$, scale, sum ) end do end if sum = 2_${ik}$*sum do i = 1, n if( real( a( i, i ),KIND=dp)/=zero ) then absa = abs( real( a( i, i ),KIND=dp) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if end do value = scale*sqrt( sum ) end if stdlib${ii}$_zlanhe = value return end function stdlib${ii}$_zlanhe #:for ck,ct,ci in CMPLX_KINDS_TYPES #:if not ck in ["sp","dp"] real(${ck}$) module function stdlib${ii}$_${ci}$lanhe( norm, uplo, n, a, lda, work ) !! ZLANHE: 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. ! -- 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, uplo 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}$) :: absa, 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 if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n do i = 1, j - 1 sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do sum = abs( real( a( j, j ),KIND=${ck}$) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do else do j = 1, n sum = abs( real( a( j, j ),KIND=${ck}$) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum do i = j + 1, n sum = abs( a( i, j ) ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end do 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). value = zero if( stdlib_lsame( uplo, 'U' ) ) then do j = 1, n sum = zero do i = 1, j - 1 absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do work( j ) = sum + abs( real( a( j, j ),KIND=${ck}$) ) end do do i = 1, n sum = work( i ) if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do else do i = 1, n work( i ) = zero end do do j = 1, n sum = work( j ) + abs( real( a( j, j ),KIND=${ck}$) ) do i = j + 1, n absa = abs( a( i, j ) ) sum = sum + absa work( i ) = work( i ) + absa end do if( value < sum .or. stdlib${ii}$_${c2ri(ci)}$isnan( sum ) ) value = sum end do end if else if( ( stdlib_lsame( norm, 'F' ) ) .or. ( stdlib_lsame( norm, 'E' ) ) ) & then ! find normf(a). scale = zero sum = one if( stdlib_lsame( uplo, 'U' ) ) then do j = 2, n call stdlib${ii}$_${ci}$lassq( j-1, a( 1_${ik}$, j ), 1_${ik}$, scale, sum ) end do else do j = 1, n - 1 call stdlib${ii}$_${ci}$lassq( n-j, a( j+1, j ), 1_${ik}$, scale, sum ) end do end if sum = 2_${ik}$*sum do i = 1, n if( real( a( i, i ),KIND=${ck}$)/=zero ) then absa = abs( real( a( i, i ),KIND=${ck}$) ) if( scale<absa ) then sum = one + sum*( scale / absa )**2_${ik}$ scale = absa else sum = sum + ( absa / scale )**2_${ik}$ end if end if end do value = scale*sqrt( sum ) end if stdlib${ii}$_${ci}$lanhe = value return end function stdlib${ii}$_${ci}$lanhe #:endif #:endfor #:endfor end submodule stdlib_lapack_blas_like_mnorm